unleash-server
Version:
Unleash is an enterprise ready feature flag service. It provides different strategies for handling feature flags.
87 lines • 3.68 kB
JavaScript
import { createFakeFeatureLinkService } from './createFeatureLinkService.js';
import getLogger from '../../../test/fixtures/no-logger.js';
import { BadDataError, NotFoundError, OperationDeniedError, } from '../../error/index.js';
import { fakeImpactMetricsResolver } from '../../../test/fixtures/fake-impact-metrics.js';
test('create, update and delete feature link', async () => {
const flagResolver = { impactMetrics: fakeImpactMetricsResolver() };
const { featureLinkStore, featureLinkService } = createFakeFeatureLinkService({
getLogger,
flagResolver,
});
flagResolver.impactMetrics.defineCounter('feature_link_count', 'Count of feature links');
const link = await featureLinkService.createLink('default', {
featureName: 'feature',
url: 'complex.example.com',
title: 'some title',
}, {});
expect(link).toMatchObject({
featureName: 'feature',
url: 'https://complex.example.com',
title: 'some title',
domain: 'example',
});
expect(flagResolver.impactMetrics.counters.get('feature_link_count').value).toBe(1);
const newLink = await featureLinkService.updateLink({ projectId: 'default', linkId: link.id }, {
title: 'new title',
url: 'https://example1.com',
featureName: 'feature',
}, {});
expect(newLink).toMatchObject({
featureName: 'feature',
url: 'https://example1.com',
title: 'new title',
domain: 'example1',
});
await featureLinkService.deleteLink({ projectId: 'default', linkId: link.id }, {});
expect(await featureLinkStore.getAll()).toMatchObject([]);
});
test('cannot delete/update non existent link', async () => {
const flagResolver = { impactMetrics: fakeImpactMetricsResolver() };
const { featureLinkService } = createFakeFeatureLinkService({
getLogger,
flagResolver,
});
await expect(featureLinkService.updateLink({ projectId: 'default', linkId: 'nonexistent' }, {
title: 'new title',
url: 'https://example1.com',
featureName: 'feature',
}, {})).rejects.toThrow(NotFoundError);
await expect(featureLinkService.deleteLink({ projectId: 'default', linkId: 'nonexistent' }, {})).rejects.toThrow(NotFoundError);
});
test('cannot create/update invalid link', async () => {
const flagResolver = { impactMetrics: fakeImpactMetricsResolver() };
const { featureLinkService } = createFakeFeatureLinkService({
getLogger,
flagResolver,
});
await expect(featureLinkService.createLink('irrelevant', {
featureName: 'irrelevant',
url: '%example.com',
title: 'irrelevant',
}, {})).rejects.toThrow(BadDataError);
await expect(featureLinkService.updateLink({ projectId: 'irrelevant', linkId: 'irrelevant' }, {
title: 'irrelevant',
url: '%example.com',
featureName: 'irrelevant',
}, {})).rejects.toThrow(BadDataError);
});
test('cannot exceed allowed link count', async () => {
const flagResolver = { impactMetrics: fakeImpactMetricsResolver() };
const { featureLinkService } = createFakeFeatureLinkService({
getLogger,
flagResolver,
});
for (let i = 0; i < 10; i++) {
await featureLinkService.createLink('default', {
featureName: 'feature',
url: 'example.com',
title: 'some title',
}, {});
}
await expect(featureLinkService.createLink('default', {
featureName: 'feature',
url: 'example.com',
title: 'some title',
}, {})).rejects.toThrow(OperationDeniedError);
});
//# sourceMappingURL=feature-link-service.test.js.map