UNPKG

unleash-server

Version:

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

283 lines • 11.7 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const unique_connection_service_1 = require("./unique-connection-service"); const fake_unique_connection_store_1 = require("./fake-unique-connection-store"); const no_logger_1 = __importDefault(require("../../../test/fixtures/no-logger")); const metric_events_1 = require("../../metric-events"); const date_fns_1 = require("date-fns"); const events_1 = __importDefault(require("events")); const unique_connection_read_model_1 = require("./unique-connection-read-model"); const alwaysOnFlagResolver = { isEnabled() { return true; }, }; test('sync first current bucket', async () => { const eventBus = new events_1.default(); const config = { flagResolver: alwaysOnFlagResolver, getLogger: no_logger_1.default, eventBus }; const uniqueConnectionStore = new fake_unique_connection_store_1.FakeUniqueConnectionStore(); const uniqueConnectionService = new unique_connection_service_1.UniqueConnectionService({ uniqueConnectionStore }, config); const uniqueConnectionReadModel = new unique_connection_read_model_1.UniqueConnectionReadModel(uniqueConnectionStore); uniqueConnectionService.listen(); eventBus.emit(metric_events_1.SDK_CONNECTION_ID_RECEIVED, { connectionId: 'connection1', type: 'backend', }); eventBus.emit(metric_events_1.SDK_CONNECTION_ID_RECEIVED, { connectionId: 'connection1', type: 'backend', }); eventBus.emit(metric_events_1.SDK_CONNECTION_ID_RECEIVED, { connectionId: 'connection2', type: 'backend', }); eventBus.emit(metric_events_1.SDK_CONNECTION_ID_RECEIVED, { connectionId: 'connection2', type: 'backend', }); eventBus.emit(metric_events_1.SDK_CONNECTION_ID_RECEIVED, { connectionId: 'connection2', type: 'backend', }); await uniqueConnectionService.sync(); const stats = await uniqueConnectionReadModel.getStats(); expect(stats).toEqual({ previous: 0, current: 2, previousBackend: 0, currentBackend: 2, previousFrontend: 0, currentFrontend: 0, }); }); test('sync first previous bucket', async () => { const eventBus = new events_1.default(); const config = { flagResolver: alwaysOnFlagResolver, getLogger: no_logger_1.default, eventBus }; const uniqueConnectionStore = new fake_unique_connection_store_1.FakeUniqueConnectionStore(); const uniqueConnectionService = new unique_connection_service_1.UniqueConnectionService({ uniqueConnectionStore }, config); uniqueConnectionService.listen(); const uniqueConnectionReadModel = new unique_connection_read_model_1.UniqueConnectionReadModel(uniqueConnectionStore); eventBus.emit(metric_events_1.SDK_CONNECTION_ID_RECEIVED, { connectionId: 'connection1', type: 'backend', }); eventBus.emit(metric_events_1.SDK_CONNECTION_ID_RECEIVED, { connectionId: 'connection2', type: 'backend', }); await uniqueConnectionService.sync(); eventBus.emit(metric_events_1.SDK_CONNECTION_ID_RECEIVED, { connectionId: 'connection3', type: 'backend', }); await uniqueConnectionService.sync((0, date_fns_1.addHours)(new Date(), 1)); const stats = await uniqueConnectionReadModel.getStats(); expect(stats).toEqual({ previous: 3, current: 0, previousBackend: 3, currentBackend: 0, previousFrontend: 0, currentFrontend: 0, }); }); test('sync to existing current bucket from the same service', async () => { const eventBus = new events_1.default(); const config = { flagResolver: alwaysOnFlagResolver, getLogger: no_logger_1.default, eventBus }; const uniqueConnectionStore = new fake_unique_connection_store_1.FakeUniqueConnectionStore(); const uniqueConnectionService = new unique_connection_service_1.UniqueConnectionService({ uniqueConnectionStore }, config); uniqueConnectionService.listen(); const uniqueConnectionReadModel = new unique_connection_read_model_1.UniqueConnectionReadModel(uniqueConnectionStore); uniqueConnectionService.count({ connectionId: 'connection1', type: 'backend', }); uniqueConnectionService.count({ connectionId: 'connection2', type: 'backend', }); await uniqueConnectionService.sync(); uniqueConnectionService.count({ connectionId: 'connection1', type: 'backend', }); uniqueConnectionService.count({ connectionId: 'connection3', type: 'backend', }); const stats = await uniqueConnectionReadModel.getStats(); expect(stats).toEqual({ previous: 0, current: 3, previousBackend: 0, currentBackend: 3, previousFrontend: 0, currentFrontend: 0, }); }); test('sync to existing current bucket from another service', async () => { const eventBus = new events_1.default(); const config = { flagResolver: alwaysOnFlagResolver, getLogger: no_logger_1.default, eventBus: eventBus, }; const uniqueConnectionStore = new fake_unique_connection_store_1.FakeUniqueConnectionStore(); const uniqueConnectionService1 = new unique_connection_service_1.UniqueConnectionService({ uniqueConnectionStore }, config); const uniqueConnectionService2 = new unique_connection_service_1.UniqueConnectionService({ uniqueConnectionStore }, config); const uniqueConnectionReadModel = new unique_connection_read_model_1.UniqueConnectionReadModel(uniqueConnectionStore); uniqueConnectionService1.count({ connectionId: 'connection1', type: 'backend', }); uniqueConnectionService1.count({ connectionId: 'connection2', type: 'backend', }); await uniqueConnectionService1.sync(); uniqueConnectionService2.count({ connectionId: 'connection1', type: 'backend', }); uniqueConnectionService2.count({ connectionId: 'connection3', type: 'backend', }); await uniqueConnectionService2.sync(); const stats = await uniqueConnectionReadModel.getStats(); expect(stats).toEqual({ previous: 0, current: 3, previousBackend: 0, currentBackend: 3, previousFrontend: 0, currentFrontend: 0, }); }); test('sync to existing previous bucket from another service', async () => { const eventBus = new events_1.default(); const config = { flagResolver: alwaysOnFlagResolver, getLogger: no_logger_1.default, eventBus: eventBus, }; const uniqueConnectionStore = new fake_unique_connection_store_1.FakeUniqueConnectionStore(); const uniqueConnectionReadModel = new unique_connection_read_model_1.UniqueConnectionReadModel(uniqueConnectionStore); const uniqueConnectionService1 = new unique_connection_service_1.UniqueConnectionService({ uniqueConnectionStore }, config); const uniqueConnectionService2 = new unique_connection_service_1.UniqueConnectionService({ uniqueConnectionStore }, config); uniqueConnectionService1.count({ connectionId: 'connection1', type: 'backend', }); uniqueConnectionService1.count({ connectionId: 'connection2', type: 'backend', }); await uniqueConnectionService1.sync((0, date_fns_1.addHours)(new Date(), 1)); uniqueConnectionService2.count({ connectionId: 'connection1', type: 'backend', }); uniqueConnectionService2.count({ connectionId: 'connection3', type: 'backend', }); await uniqueConnectionService2.sync((0, date_fns_1.addHours)(new Date(), 1)); const stats = await uniqueConnectionReadModel.getStats(); expect(stats).toEqual({ previous: 3, current: 0, previousBackend: 3, currentBackend: 0, previousFrontend: 0, currentFrontend: 0, }); }); test('populate previous and current', async () => { const eventBus = new events_1.default(); const config = { flagResolver: alwaysOnFlagResolver, getLogger: no_logger_1.default, eventBus }; const uniqueConnectionStore = new fake_unique_connection_store_1.FakeUniqueConnectionStore(); const uniqueConnectionService = new unique_connection_service_1.UniqueConnectionService({ uniqueConnectionStore }, config); const uniqueConnectionReadModel = new unique_connection_read_model_1.UniqueConnectionReadModel(uniqueConnectionStore); uniqueConnectionService.count({ connectionId: 'connection1', type: 'backend', }); uniqueConnectionService.count({ connectionId: 'connection2', type: 'backend', }); await uniqueConnectionService.sync(); await uniqueConnectionService.sync(); uniqueConnectionService.count({ connectionId: 'connection3', type: 'backend', }); await uniqueConnectionService.sync((0, date_fns_1.addHours)(new Date(), 1)); await uniqueConnectionService.sync((0, date_fns_1.addHours)(new Date(), 1)); // deliberate duplicate call uniqueConnectionService.count({ connectionId: 'connection3', type: 'backend', }); uniqueConnectionService.count({ connectionId: 'connection4', type: 'backend', }); await uniqueConnectionService.sync((0, date_fns_1.addHours)(new Date(), 1)); await uniqueConnectionService.sync((0, date_fns_1.addHours)(new Date(), 1)); // deliberate duplicate call const stats = await uniqueConnectionReadModel.getStats(); expect(stats).toEqual({ previous: 3, current: 2, previousBackend: 3, currentBackend: 2, previousFrontend: 0, currentFrontend: 0, }); }); test('populate all buckets', async () => { const eventBus = new events_1.default(); const config = { flagResolver: alwaysOnFlagResolver, getLogger: no_logger_1.default, eventBus }; const uniqueConnectionStore = new fake_unique_connection_store_1.FakeUniqueConnectionStore(); const uniqueConnectionService = new unique_connection_service_1.UniqueConnectionService({ uniqueConnectionStore }, config); const uniqueConnectionReadModel = new unique_connection_read_model_1.UniqueConnectionReadModel(uniqueConnectionStore); uniqueConnectionService.count({ connectionId: 'connection1', type: 'backend', }); uniqueConnectionService.count({ connectionId: 'connection2', type: 'frontend', }); await uniqueConnectionService.sync(); await uniqueConnectionService.sync(); uniqueConnectionService.count({ connectionId: 'connection3', type: 'backend', }); await uniqueConnectionService.sync((0, date_fns_1.addHours)(new Date(), 1)); await uniqueConnectionService.sync((0, date_fns_1.addHours)(new Date(), 1)); // deliberate duplicate call uniqueConnectionService.count({ connectionId: 'connection3', type: 'backend', }); uniqueConnectionService.count({ connectionId: 'connection4', type: 'frontend', }); await uniqueConnectionService.sync((0, date_fns_1.addHours)(new Date(), 1)); await uniqueConnectionService.sync((0, date_fns_1.addHours)(new Date(), 1)); // deliberate duplicate call const stats = await uniqueConnectionReadModel.getStats(); expect(stats).toEqual({ previous: 3, current: 2, previousBackend: 2, currentBackend: 1, previousFrontend: 1, currentFrontend: 1, }); }); //# sourceMappingURL=unique-connection-service.test.js.map