Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
121 changes: 119 additions & 2 deletions apps/portal-api/src/modules/subcription/subscription.app.test.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,131 @@
import { v4 as uuidv4 } from 'uuid';
import { describe, expect, it } from 'vitest';
import { beforeEach, describe, expect, it } from 'vitest';
import { db } from '../../../knexfile';
import {
FILIGRAN_ORGA_ID,
INTEGRATION_FEED_SERVICE_CAPABILITY_DELETE,
INTEGRATION_FEED_SERVICE_CAPABILITY_UPLOAD,
SERVICE_CSV_FEEDS_ID,
} from '../../../tests/tests.const';
import { SubscriptionId } from '../../model/kanel/public/Subscription';
import { ServiceCapabilityId } from '../../model/kanel/public/ServiceCapability';
import ServiceInstance, {
ServiceInstanceId,
} from '../../model/kanel/public/ServiceInstance';
import Subscription, {
SubscriptionId,
} from '../../model/kanel/public/Subscription';
import { PLATFORM_ORGANIZATION_UUID } from '../../portal.const';
import { ErrorCode } from '../../utils/error/error.code';
import { SubscriptionStatus } from '../subscription.const';
import { loadSubscriptionCapabilities } from '../user_service/service-capability/subscription-capability.domain';
import { subscriptionApp } from './subscription.app';
import { createSubscription } from './subscription.domain';

describe('Subscription app', () => {
describe('subscribeOrganizationToService', async () => {
let serviceInstanceId: ServiceInstanceId;
beforeEach(async () => {
serviceInstanceId = uuidv4() as ServiceInstanceId;
await db<ServiceInstance>('ServiceInstance').insert({
id: serviceInstanceId,
name: 'test',
});
});

it('should throw an error when organization is already subscribed to the service instance', async () => {
const subscriptionId = uuidv4() as SubscriptionId;
const subscriptionData = {
id: subscriptionId,
service_instance_id: serviceInstanceId,
organization_id: PLATFORM_ORGANIZATION_UUID,
start_date: new Date(),
end_date: new Date(),
billing: 0,
status: SubscriptionStatus.ACCEPTED,
};
await createSubscription(subscriptionData);

const call = subscriptionApp.subscribeOrganizationToService({
organizationId: PLATFORM_ORGANIZATION_UUID,
serviceInstanceId,
startDate: new Date(),
endDate: new Date(),
capabilityIds: [],
});

await expect(call).rejects.toThrow(ErrorCode.AlreadySubscribed);
});

it('should subscribe the organization to the service instance (without capabilities)', async () => {
await subscriptionApp.subscribeOrganizationToService({
organizationId: PLATFORM_ORGANIZATION_UUID,
serviceInstanceId,
startDate: new Date(),
endDate: new Date(),
capabilityIds: [],
});

const createdSubscription = await db<Subscription>('Subscription')
.where({
organization_id: PLATFORM_ORGANIZATION_UUID,
service_instance_id: serviceInstanceId,
})
.select('*')
.first();

expect(createdSubscription).toBeDefined();

const capabilities: { service_capability_id: ServiceCapabilityId }[] =
await loadSubscriptionCapabilities(
createdSubscription?.id ?? ('' as SubscriptionId)
);
expect(capabilities.length).toBe(0);
});

it('should subscribe the organization to the service instance (with capabilities)', async () => {
await subscriptionApp.subscribeOrganizationToService({
organizationId: PLATFORM_ORGANIZATION_UUID,
serviceInstanceId,
startDate: new Date(),
endDate: new Date(),
capabilityIds: [
INTEGRATION_FEED_SERVICE_CAPABILITY_UPLOAD,
INTEGRATION_FEED_SERVICE_CAPABILITY_DELETE,
],
});

const createdSubscription = await db<Subscription>('Subscription')
.where({
organization_id: PLATFORM_ORGANIZATION_UUID,
service_instance_id: serviceInstanceId,
})
.select('*')
.first();

expect(createdSubscription).toBeDefined();

const capabilities: { service_capability_id: ServiceCapabilityId }[] =
await loadSubscriptionCapabilities(
createdSubscription?.id ?? ('' as SubscriptionId)
);
expect(capabilities.length).toBe(2);
expect(
capabilities.some(
(capa) =>
capa.service_capability_id ===
INTEGRATION_FEED_SERVICE_CAPABILITY_UPLOAD
)
).toBeTruthy();
expect(
capabilities.some(
(capa) =>
capa.service_capability_id ===
INTEGRATION_FEED_SERVICE_CAPABILITY_DELETE
)
).toBeTruthy();
});
});

describe(`${subscriptionApp.deleteSubscription.name}`, () => {
it('should delete the subscription', async () => {
const id = uuidv4() as SubscriptionId;
Expand Down
33 changes: 11 additions & 22 deletions apps/portal-api/src/modules/subcription/subscription.app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -146,29 +146,18 @@ export const subscriptionApp = {
organizationId,
});

const trx = await dbTx();
try {
const subscriptionData = {
id: uuidv4() as SubscriptionId,
service_instance_id: serviceInstanceId,
organization_id: organizationId,
start_date: startDate,
end_date: endDate,
billing: 0,
status: SubscriptionStatus.ACCEPTED,
};

const createdSubscription = await createSubscription(subscriptionData);
await addCapabilitiesToSubscription(
createdSubscription.id,
capabilityIds
);
const subscriptionData = {
id: uuidv4() as SubscriptionId,
service_instance_id: serviceInstanceId,
organization_id: organizationId,
start_date: startDate,
end_date: endDate,
billing: 0,
status: SubscriptionStatus.ACCEPTED,
};

await trx.commit();
} catch (error) {
await trx.rollback();
throw error;
}
const createdSubscription = await createSubscription(subscriptionData);
await addCapabilitiesToSubscription(createdSubscription.id, capabilityIds);
},

deleteSubscription: async (id: SubscriptionId): Promise<Subscription> => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,19 @@ import SubscriptionCapability from '../../../model/kanel/public/SubscriptionCapa
export const addCapabilitiesToSubscription = async (
subscriptionId: SubscriptionId,
capabilityIds: ServiceCapabilityId[]
) => {
const promises = capabilityIds.map((capabilityId) => {
const data = {
service_capability_id: capabilityId,
subscription_id: subscriptionId,
};
): Promise<SubscriptionCapability[]> => {
if (!capabilityIds.length) {
return [];
}

return db<SubscriptionCapability>('Subscription_Capability')
.insert(data)
.returning('*');
});
const data = capabilityIds.map((capabilityId) => ({
service_capability_id: capabilityId,
subscription_id: subscriptionId,
}));

await Promise.all(promises);
return db<SubscriptionCapability>('Subscription_Capability')
.insert(data)
.returning('*');
};

export const loadSubscriptionCapabilities = async (
Expand Down
6 changes: 6 additions & 0 deletions apps/portal-api/tests/tests.const.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Restriction } from '../src/__generated__/resolvers-types';

import { OrganizationId } from '../src/model/kanel/public/Organization';
import { ServiceCapabilityId } from '../src/model/kanel/public/ServiceCapability';
import { ServiceDefinitionId } from '../src/model/kanel/public/ServiceDefinition';
import { ServiceInstanceId } from '../src/model/kanel/public/ServiceInstance';
import { PortalContext } from '../src/model/portal-context';
Expand Down Expand Up @@ -36,6 +37,11 @@ export const SERVICE_OPENCTI_REGISTRATION =
export const THALES_SIMPLE_USER_ID = '154006e2-f24b-42da-b39c-e0fb17bead00';
export const THALES_SIMPLE_USER_EMAIL = '[email protected]';
export const FILIGRAN_USER_ID = '77b4b845-4ab4-4df8-8e12-0651da813ebb';
export const INTEGRATION_FEED_SERVICE_CAPABILITY_UPLOAD =
'26611d56-e443-45fb-9f6c-cc6b9b8a5de9' as ServiceCapabilityId;
export const INTEGRATION_FEED_SERVICE_CAPABILITY_DELETE =
'283e06b2-2d64-42c7-b432-890e69ac8b8f' as ServiceCapabilityId;

export const contextAdminUser: PortalContext = {
user: {
id: ADMIN_UUID,
Expand Down
Loading