UNPKG

unleash-server

Version:

Unleash is an enterprise ready feature flag service. It provides different strategies for handling feature flags.

305 lines • 9.84 kB
import nock from 'nock'; import createStores from '../../test/fixtures/store.js'; import version from '../util/version.js'; import getLogger from '../../test/fixtures/no-logger.js'; import VersionService from './version-service.js'; import { randomId } from '../util/random-id.js'; beforeAll(() => { nock.disableNetConnect(); }); afterAll(() => { nock.enableNetConnect(); }); const fakeTelemetryData = { featureToggles: 0, users: 0, projects: 1, contextFields: 3, groups: 0, roles: 5, customRootRoles: 0, customRootRolesInUse: 0, environments: 1, segments: 0, strategies: 3, SAMLenabled: false, OIDCenabled: false, featureExports: 0, featureImports: 0, customStrategies: 3, customStrategiesInUse: 0, instanceId: '1460588e-d5f4-4ac2-9962-c8631f6b8dad', versionOSS: '6.4.1', versionEnterprise: '', activeUsers30: 0, activeUsers60: 0, activeUsers90: 0, productionChanges30: 0, productionChanges60: 0, productionChanges90: 0, postgresVersion: '17.1 (Debian 17.1-1.pgdg120+1)', licenseType: 'test', hostedBy: 'self-hosted', }; test('yields current versions', async () => { const url = `https://${randomId()}.example.com`; const stores = createStores(); const latest = { oss: '5.0.0', enterprise: '5.0.0', }; const scope = nock(url) .post('/') .reply(() => [ 200, JSON.stringify({ latest: false, versions: latest, }), ]); const service = new VersionService(stores, { getLogger, versionCheck: { url, enable: true }, telemetry: true, }); await service.checkLatestVersion(() => Promise.resolve(fakeTelemetryData)); const versionInfo = await service.getVersionInfo(); expect(scope.isDone()).toEqual(true); expect(versionInfo.current.oss).toBe(version); expect(versionInfo.current.enterprise).toBeFalsy(); expect(versionInfo.latest.oss).toBe(latest.oss); expect(versionInfo.latest.enterprise).toBe(latest.enterprise); }); test('supports setting enterprise version as well', async () => { const url = `https://${randomId()}.example.com`; const stores = createStores(); const enterpriseVersion = '3.7.0'; const latest = { oss: '4.0.0', enterprise: '4.0.0', }; const scope = nock(url) .post('/') .reply(() => [ 200, JSON.stringify({ latest: false, versions: latest, }), ]); const service = new VersionService(stores, { getLogger, versionCheck: { url, enable: true }, enterpriseVersion, telemetry: true, }); await service.checkLatestVersion(() => Promise.resolve(fakeTelemetryData)); const versionInfo = await service.getVersionInfo(); expect(scope.isDone()).toEqual(true); expect(versionInfo.current.oss).toBe(version); expect(versionInfo.current.enterprise).toBe(enterpriseVersion); expect(versionInfo.latest.oss).toBe(latest.oss); expect(versionInfo.latest.enterprise).toBe(latest.enterprise); }); test('if version check is not enabled should not make any calls', async () => { const url = `https://${randomId()}.example.com`; const stores = createStores(); const enterpriseVersion = '3.7.0'; const latest = { oss: '4.0.0', enterprise: '4.0.0', }; const scope = nock(url) .get('/') .reply(() => [ 200, JSON.stringify({ latest: false, versions: latest, }), ]); const service = new VersionService(stores, { getLogger, versionCheck: { url, enable: false }, enterpriseVersion, telemetry: true, }); await service.checkLatestVersion(() => Promise.resolve(fakeTelemetryData)); const versionInfo = await service.getVersionInfo(); expect(scope.isDone()).toEqual(false); expect(versionInfo.current.oss).toBe(version); expect(versionInfo.current.enterprise).toBe(enterpriseVersion); expect(versionInfo.latest.oss).toBeFalsy(); expect(versionInfo.latest.enterprise).toBeFalsy(); nock.cleanAll(); }); test('sets featureinfo', async () => { const url = `https://${randomId()}.example.com`; const stores = createStores(); const enterpriseVersion = '4.0.0'; const latest = { oss: '4.0.0', enterprise: '4.0.0', }; const scope = nock(url) .post('/', (body) => body.featureInfo && body.featureInfo.featureToggles === fakeTelemetryData.featureToggles && body.featureInfo.environments === fakeTelemetryData.environments) .reply(() => [ 200, JSON.stringify({ latest: true, versions: latest, }), ]); const service = new VersionService(stores, { getLogger, versionCheck: { url, enable: true }, enterpriseVersion, telemetry: true, }); await service.checkLatestVersion(() => Promise.resolve(fakeTelemetryData)); expect(scope.isDone()).toEqual(true); nock.cleanAll(); }); test('counts toggles', async () => { const url = `https://${randomId()}.example.com`; const stores = createStores(); const enterpriseVersion = '4.0.0'; const latest = { oss: '4.0.0', enterprise: '4.0.0', }; const scope = nock(url) .post('/', (body) => body.featureInfo && body.featureInfo.featureToggles === fakeTelemetryData.featureToggles && body.featureInfo.environments === fakeTelemetryData.environments && body.featureInfo.customStrategies === fakeTelemetryData.customStrategies && body.featureInfo.customStrategiesInUse === fakeTelemetryData.customRootRolesInUse && body.featureInfo.OIDCenabled === fakeTelemetryData.OIDCenabled) .reply(() => [ 200, JSON.stringify({ latest: true, versions: latest, }), ]); const service = new VersionService(stores, { getLogger, versionCheck: { url, enable: true }, enterpriseVersion, telemetry: true, }); await service.checkLatestVersion(() => Promise.resolve(fakeTelemetryData)); expect(scope.isDone()).toEqual(true); nock.cleanAll(); }); test('counts custom strategies', async () => { const url = `https://${randomId()}.example.com`; const stores = createStores(); const enterpriseVersion = '4.0.0'; const latest = { oss: '4.0.0', enterprise: '4.0.0', }; const scope = nock(url) .post('/', (body) => body.featureInfo && body.featureInfo.featureToggles === fakeTelemetryData.featureToggles && body.featureInfo.environments === fakeTelemetryData.environments && body.featureInfo.customStrategies === fakeTelemetryData.customStrategies && body.featureInfo.customStrategiesInUse === fakeTelemetryData.customRootRolesInUse && body.featureInfo.OIDCenabled === fakeTelemetryData.OIDCenabled) .reply(() => [ 200, JSON.stringify({ latest: true, versions: latest, }), ]); const service = new VersionService(stores, { getLogger, versionCheck: { url, enable: true }, enterpriseVersion, telemetry: true, }); await service.checkLatestVersion(() => Promise.resolve(fakeTelemetryData)); expect(scope.isDone()).toEqual(true); nock.cleanAll(); }); test('counts active users', async () => { const url = `https://${randomId()}.example.com`; const stores = createStores(); const enterpriseVersion = '4.0.0'; const latest = { oss: '4.0.0', enterprise: '4.0.0', }; const scope = nock(url) .post('/', (body) => body.featureInfo && body.featureInfo.activeUsers30 === fakeTelemetryData.activeUsers30 && body.featureInfo.activeUsers60 === fakeTelemetryData.activeUsers60 && body.featureInfo.activeUsers90 === fakeTelemetryData.activeUsers90) .reply(() => [ 200, JSON.stringify({ latest: true, versions: latest, }), ]); const service = new VersionService(stores, { getLogger, versionCheck: { url, enable: true }, enterpriseVersion, telemetry: true, }); await service.checkLatestVersion(() => Promise.resolve(fakeTelemetryData)); expect(scope.isDone()).toEqual(true); nock.cleanAll(); }); test('Counts production changes', async () => { const url = `https://${randomId()}.example.com`; const stores = createStores(); const enterpriseVersion = '4.0.0'; const latest = { oss: '4.0.0', enterprise: '4.0.0', }; const scope = nock(url) .post('/', (body) => body.featureInfo && body.featureInfo.productionChanges30 === fakeTelemetryData.productionChanges30 && body.featureInfo.productionChanges60 === fakeTelemetryData.productionChanges60 && body.featureInfo.productionChanges90 === fakeTelemetryData.productionChanges90) .reply(() => [ 200, JSON.stringify({ latest: true, versions: latest, }), ]); const service = new VersionService(stores, { getLogger, versionCheck: { url, enable: true }, enterpriseVersion, telemetry: true, }); await service.checkLatestVersion(() => Promise.resolve(fakeTelemetryData)); expect(scope.isDone()).toEqual(true); nock.cleanAll(); }); //# sourceMappingURL=version-service.test.js.map