mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	Instead of instructing users to do static calls in to Unleash, she should instead be allwed to specify the log provider as an option to Unleash. This commit introduces the "getLogger" option, a function responsible for creating a logger.
		
			
				
	
	
		
			151 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| const test = require('ava');
 | |
| 
 | |
| const store = require('./../test/fixtures/store');
 | |
| const getLogger = require('./../test/fixtures/no-logger');
 | |
| 
 | |
| const StateService = require('./state-service');
 | |
| const {
 | |
|     FEATURE_IMPORT,
 | |
|     DROP_FEATURES,
 | |
|     STRATEGY_IMPORT,
 | |
|     DROP_STRATEGIES,
 | |
| } = require('./event-type');
 | |
| 
 | |
| function getSetup() {
 | |
|     const stores = store.createStores();
 | |
|     return { stateService: new StateService({ stores, getLogger }), stores };
 | |
| }
 | |
| 
 | |
| test('should import a feature', async t => {
 | |
|     const { stateService, stores } = getSetup();
 | |
| 
 | |
|     const data = {
 | |
|         features: [
 | |
|             {
 | |
|                 name: 'new-feature',
 | |
|                 enabled: true,
 | |
|                 strategies: [{ name: 'default' }],
 | |
|             },
 | |
|         ],
 | |
|     };
 | |
| 
 | |
|     await stateService.import({ data });
 | |
| 
 | |
|     const events = await stores.eventStore.getEvents();
 | |
|     t.is(events.length, 1);
 | |
|     t.is(events[0].type, FEATURE_IMPORT);
 | |
|     t.is(events[0].data.name, 'new-feature');
 | |
| });
 | |
| 
 | |
| test('should drop feature before import if specified', async t => {
 | |
|     const { stateService, stores } = getSetup();
 | |
| 
 | |
|     const data = {
 | |
|         features: [
 | |
|             {
 | |
|                 name: 'new-feature',
 | |
|                 enabled: true,
 | |
|                 strategies: [{ name: 'default' }],
 | |
|             },
 | |
|         ],
 | |
|     };
 | |
| 
 | |
|     await stateService.import({ data, dropBeforeImport: true });
 | |
| 
 | |
|     const events = await stores.eventStore.getEvents();
 | |
|     t.is(events.length, 2);
 | |
|     t.is(events[0].type, DROP_FEATURES);
 | |
|     t.is(events[1].type, FEATURE_IMPORT);
 | |
|     t.is(events[1].data.name, 'new-feature');
 | |
| });
 | |
| 
 | |
| test('should import a strategy', async t => {
 | |
|     const { stateService, stores } = getSetup();
 | |
| 
 | |
|     const data = {
 | |
|         strategies: [
 | |
|             {
 | |
|                 name: 'new-strategy',
 | |
|                 parameters: [],
 | |
|             },
 | |
|         ],
 | |
|     };
 | |
| 
 | |
|     await stateService.import({ data });
 | |
| 
 | |
|     const events = await stores.eventStore.getEvents();
 | |
|     t.is(events.length, 1);
 | |
|     t.is(events[0].type, STRATEGY_IMPORT);
 | |
|     t.is(events[0].data.name, 'new-strategy');
 | |
| });
 | |
| 
 | |
| test('should drop strategies before import if specified', async t => {
 | |
|     const { stateService, stores } = getSetup();
 | |
| 
 | |
|     const data = {
 | |
|         strategies: [
 | |
|             {
 | |
|                 name: 'new-strategy',
 | |
|                 parameters: [],
 | |
|             },
 | |
|         ],
 | |
|     };
 | |
| 
 | |
|     await stateService.import({ data, dropBeforeImport: true });
 | |
| 
 | |
|     const events = await stores.eventStore.getEvents();
 | |
|     t.is(events.length, 2);
 | |
|     t.is(events[0].type, DROP_STRATEGIES);
 | |
|     t.is(events[1].type, STRATEGY_IMPORT);
 | |
|     t.is(events[1].data.name, 'new-strategy');
 | |
| });
 | |
| 
 | |
| test('should drop neither features nor strategies when neither is imported', async t => {
 | |
|     const { stateService, stores } = getSetup();
 | |
| 
 | |
|     const data = {};
 | |
| 
 | |
|     await stateService.import({ data, dropBeforeImport: true });
 | |
| 
 | |
|     const events = await stores.eventStore.getEvents();
 | |
|     t.is(events.length, 0);
 | |
| });
 | |
| 
 | |
| test('should not accept gibberish', async t => {
 | |
|     const { stateService } = getSetup();
 | |
| 
 | |
|     const data1 = {
 | |
|         type: 'gibberish',
 | |
|         flags: { evil: true },
 | |
|     };
 | |
|     const data2 = '{somerandomtext/';
 | |
| 
 | |
|     await t.throwsAsync(stateService.import({ data: data1 }));
 | |
| 
 | |
|     await t.throwsAsync(stateService.import({ data: data2 }));
 | |
| });
 | |
| 
 | |
| test('should export featureToggles', async t => {
 | |
|     const { stateService, stores } = getSetup();
 | |
| 
 | |
|     stores.featureToggleStore.addFeature({ name: 'a-feature' });
 | |
| 
 | |
|     const data = await stateService.export({ includeFeatureToggles: true });
 | |
| 
 | |
|     t.is(data.features.length, 1);
 | |
|     t.is(data.features[0].name, 'a-feature');
 | |
| });
 | |
| 
 | |
| test('should export strategies', async t => {
 | |
|     const { stateService, stores } = getSetup();
 | |
| 
 | |
|     stores.strategyStore.addStrategy({ name: 'a-strategy', editable: true });
 | |
| 
 | |
|     const data = await stateService.export({ includeStrategies: true });
 | |
| 
 | |
|     t.is(data.strategies.length, 1);
 | |
|     t.is(data.strategies[0].name, 'a-strategy');
 | |
| });
 |