Add test documenting sub IP issue

Documented in: https://gitlab.com/guifi-exo/projectes/-/issues/775

When adding a circuit to a subscription with a manually assigned IP,
it does not get marked as not available.
This commit is contained in:
Evilham 2022-06-29 15:22:10 +02:00 committed by Evilham
parent 394c47f304
commit c92e21a015
Signed by: evilham
GPG key ID: AE3EE30D970886BF
2 changed files with 88 additions and 0 deletions

View file

@ -0,0 +1,64 @@
import { Client, expect } from '@loopback/testlab';
import { ExoApiApplication } from '../..';
import { setupApplication } from '../helpers/test-helper';
import { givenEmptyDatabase, givenSubscription, givenCircuit, givenIPv4Pool, givenIPv6Pool, getRADIUSUserInfo, getRADIUSRadCheck, getRADIUSRadUserGroup, getRADIUSRadReply, givenRADIUSUserInfo, givenRADIUSRadCheck, givenRADIUSRadUserGroup, givenRADIUSRadReply, getSubscriptionsManagerService } from '../helpers/database.helpers';
import { Circuit, Radusergroup, Userinfo, Radcheck, Radreply } from '../../models';
import { SimplexConfig } from '../../application';
import { SubscriptionsManagerService } from '../../services';
describe('SubscriptionsManagerService (Subscription)', () => {
let app: ExoApiApplication;
let client: Client;
let sms : SubscriptionsManagerService;
const id = 10;
const ipv4 = '10.0.0.1';
const ipv6 = 'fe80:1::';
before('setupApplication', async () => {
({ app, client } = await setupApplication());
});
// We load fixtures & helpers
beforeEach(async () => {
// Ensure clean database
await givenEmptyDatabase();
const config: SimplexConfig = <SimplexConfig>await app.get('config.simplex');
// This sets up the IP pools with the IPs marked as available
await givenIPv4Pool([{
ip: ipv4,
isAvailable: true
}]);
await givenIPv6Pool([{
prefix: ipv6,
isAvailable: true
}]);
sms = getSubscriptionsManagerService(config);
});
after(async () => {
await app.stop();
});
it('Should reserve manually assigned IPv6s to subscriber circuit', async () => {
// This helper function creates the subscription
await givenSubscription(id, 'test', 'circuit');
const circuitData = { hasManagement: false, ipv6: ipv6 };
await sms.addSubscriptionCircuit(id, circuitData);
// After adding circuit, ensure IP is registered and NOT available
const resv6 = await sms.ipv6PoolRepository.findById(ipv6);
expect(resv6).to.match({ prefix: ipv6, isAvailable: false });
});
it('Should reserve manually assigned IPv4s to subscriber circuit', async () => {
// This helper function creates the subscription
await givenSubscription(id, 'test', 'circuit');
const circuitData = { hasManagement: false, ipv4: ipv4 };
await sms.addSubscriptionCircuit(id, circuitData);
// After adding circuit, ensure IP is registered and NOT available
const resv4 = await sms.ipv4PoolRepository.findById(ipv4);
expect(resv4).to.match({ ip: ipv4, isAvailable: false });
});
});

View file

@ -13,6 +13,8 @@ import {
TransportRepository,
CarrierRepository
} from '../../repositories';
import { SubscriptionsManagerService } from '../../services';
import { SimplexConfig } from '../../application';
import { testdb } from '../datasources/radius.datasource';
import { testSimplexDb } from '../datasources/simplex.datasource';
@ -238,3 +240,25 @@ export async function getTransports() {
return transportRepository.find();
}
export function getSubscriptionsManagerService(config: SimplexConfig) {
let subscriptionRepository: SubscriptionRepository;
let circuitRepository: CircuitRepository;
let transportRepository: TransportRepository;
const radReplyRepository = new RadreplyRepository(testdb);
const subscriptionIdsRepository = new SubscriptionIdsRepository(testSimplexDb);
const userInfoRepository = new UserinfoRepository(testdb);
const radCheckRepository = new RadcheckRepository(testdb);
const radUserGroupRepository = new RadusergroupRepository(testdb);
const ipv4PoolRepository = new IPv4PoolRepository(testSimplexDb);
const ipv6PoolRepository = new IPv6PoolRepository(testSimplexDb);
subscriptionRepository = new SubscriptionRepository(testSimplexDb, async () => circuitRepository);
circuitRepository = new CircuitRepository(testSimplexDb, async () => subscriptionRepository, async () => transportRepository);
transportRepository = new TransportRepository(testSimplexDb, async () => circuitRepository);
return new SubscriptionsManagerService(radReplyRepository, subscriptionIdsRepository, userInfoRepository,
radCheckRepository, radUserGroupRepository,
subscriptionRepository, circuitRepository,
ipv4PoolRepository, ipv6PoolRepository,
transportRepository, config);
}