mirror of
https://github.com/Unleash/unleash.git
synced 2024-10-18 20:09:08 +02:00
262 lines
6.5 KiB
JavaScript
262 lines
6.5 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
const test = require('ava');
|
||
|
const proxyquire = require('proxyquire').noCallThru();
|
||
|
|
||
|
const Addon = require('../addons/addon');
|
||
|
|
||
|
const store = require('../../test/fixtures/store');
|
||
|
const getLogger = require('../../test/fixtures/no-logger');
|
||
|
const TagTypeService = require('./tag-type-service');
|
||
|
const {
|
||
|
FEATURE_CREATED,
|
||
|
FEATURE_UPDATED,
|
||
|
FEATURE_ARCHIVED,
|
||
|
FEATURE_REVIVED,
|
||
|
ADDON_CONFIG_CREATED,
|
||
|
ADDON_CONFIG_UPDATED,
|
||
|
ADDON_CONFIG_DELETED,
|
||
|
} = require('../event-type');
|
||
|
|
||
|
const definition = {
|
||
|
name: 'simple',
|
||
|
displayName: 'Simple ADdon',
|
||
|
description: 'Some description',
|
||
|
parameters: [
|
||
|
{
|
||
|
name: 'url',
|
||
|
displayName: 'Some URL',
|
||
|
type: 'url',
|
||
|
required: true,
|
||
|
},
|
||
|
{
|
||
|
name: 'var',
|
||
|
displayName: 'Some var',
|
||
|
description: 'Some variable to inject',
|
||
|
type: 'text',
|
||
|
required: false,
|
||
|
},
|
||
|
],
|
||
|
events: [
|
||
|
FEATURE_CREATED,
|
||
|
FEATURE_UPDATED,
|
||
|
FEATURE_ARCHIVED,
|
||
|
FEATURE_REVIVED,
|
||
|
],
|
||
|
tagTypes: [
|
||
|
{
|
||
|
name: 'me',
|
||
|
description: 'Some tag',
|
||
|
icon: 'm',
|
||
|
},
|
||
|
],
|
||
|
};
|
||
|
|
||
|
class SimpleAddon extends Addon {
|
||
|
constructor() {
|
||
|
super(definition, { getLogger });
|
||
|
this.events = [];
|
||
|
}
|
||
|
|
||
|
getEvents() {
|
||
|
return this.events;
|
||
|
}
|
||
|
|
||
|
async handleEvent(event, parameters) {
|
||
|
this.events.push({
|
||
|
event,
|
||
|
parameters,
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const AddonService = proxyquire.load('./addon-service', {
|
||
|
'../addons': new Array(SimpleAddon),
|
||
|
});
|
||
|
|
||
|
function getSetup() {
|
||
|
const stores = store.createStores();
|
||
|
const tagTypeService = new TagTypeService(stores, { getLogger });
|
||
|
return {
|
||
|
addonService: new AddonService(stores, { getLogger }, tagTypeService),
|
||
|
stores,
|
||
|
tagTypeService,
|
||
|
};
|
||
|
}
|
||
|
|
||
|
test('should load addon configurations', async t => {
|
||
|
const { addonService } = getSetup();
|
||
|
|
||
|
const configs = await addonService.getAddons();
|
||
|
|
||
|
t.is(configs.length, 0);
|
||
|
});
|
||
|
|
||
|
test('should load provider definitions', async t => {
|
||
|
const { addonService } = getSetup();
|
||
|
|
||
|
const providerDefinitions = await addonService.getProviderDefinition();
|
||
|
|
||
|
const simple = providerDefinitions.find(p => p.name === 'simple');
|
||
|
|
||
|
t.is(providerDefinitions.length, 1);
|
||
|
t.is(simple.name, 'simple');
|
||
|
});
|
||
|
|
||
|
test('should not allow addon-config for unknown provider', async t => {
|
||
|
const { addonService } = getSetup();
|
||
|
|
||
|
const error = await t.throwsAsync(
|
||
|
async () => {
|
||
|
await addonService.createAddon({ provider: 'unknown' });
|
||
|
},
|
||
|
{ instanceOf: TypeError },
|
||
|
);
|
||
|
|
||
|
t.is(error.message, 'Unknown addon provider unknown');
|
||
|
});
|
||
|
|
||
|
test('should trigger simple-addon eventHandler', async t => {
|
||
|
const { addonService, stores } = getSetup();
|
||
|
|
||
|
const config = {
|
||
|
provider: 'simple',
|
||
|
enabled: true,
|
||
|
parameters: {
|
||
|
url: 'http://localhost/wh',
|
||
|
var: 'some-value',
|
||
|
},
|
||
|
events: [FEATURE_CREATED],
|
||
|
};
|
||
|
|
||
|
await addonService.createAddon(config, 'me@mail.com');
|
||
|
|
||
|
// Feature toggle was created
|
||
|
await stores.eventStore.store({
|
||
|
type: FEATURE_CREATED,
|
||
|
createdBy: 'some@user.com',
|
||
|
data: {
|
||
|
name: 'some-toggle',
|
||
|
enabled: false,
|
||
|
strategies: [{ name: 'default' }],
|
||
|
},
|
||
|
});
|
||
|
|
||
|
const simpleProvider = addonService.addonProviders.simple;
|
||
|
const events = simpleProvider.getEvents();
|
||
|
|
||
|
t.is(events.length, 1);
|
||
|
t.is(events[0].event.type, FEATURE_CREATED);
|
||
|
t.is(events[0].event.data.name, 'some-toggle');
|
||
|
});
|
||
|
|
||
|
test('should create simple-addon config', async t => {
|
||
|
const { addonService } = getSetup();
|
||
|
|
||
|
const config = {
|
||
|
provider: 'simple',
|
||
|
enabled: true,
|
||
|
parameters: {
|
||
|
url: 'http://localhost/wh',
|
||
|
var: 'some-value',
|
||
|
},
|
||
|
events: [FEATURE_CREATED],
|
||
|
};
|
||
|
|
||
|
await addonService.createAddon(config, 'me@mail.com');
|
||
|
const addons = await addonService.getAddons();
|
||
|
|
||
|
t.is(addons.length, 1);
|
||
|
t.is(addons[0].provider, 'simple');
|
||
|
});
|
||
|
|
||
|
test('should create tag type for simple-addon', async t => {
|
||
|
const { addonService, tagTypeService } = getSetup();
|
||
|
|
||
|
const config = {
|
||
|
provider: 'simple',
|
||
|
enabled: true,
|
||
|
parameters: {
|
||
|
url: 'http://localhost/wh',
|
||
|
var: 'some-value',
|
||
|
},
|
||
|
events: [FEATURE_CREATED],
|
||
|
};
|
||
|
|
||
|
await addonService.createAddon(config, 'me@mail.com');
|
||
|
const tagType = await tagTypeService.getTagType('me');
|
||
|
|
||
|
t.is(tagType.name, 'me');
|
||
|
});
|
||
|
|
||
|
test('should store ADDON_CONFIG_CREATE event', async t => {
|
||
|
const { addonService, stores } = getSetup();
|
||
|
|
||
|
const config = {
|
||
|
provider: 'simple',
|
||
|
enabled: true,
|
||
|
parameters: {
|
||
|
url: 'http://localhost/wh',
|
||
|
var: 'some-value',
|
||
|
},
|
||
|
events: [FEATURE_CREATED],
|
||
|
};
|
||
|
|
||
|
await addonService.createAddon(config, 'me@mail.com');
|
||
|
|
||
|
const events = await stores.eventStore.getEvents();
|
||
|
|
||
|
t.is(events.length, 2); // Also tag-types where created
|
||
|
t.is(events[1].type, ADDON_CONFIG_CREATED);
|
||
|
t.is(events[1].data.provider, 'simple');
|
||
|
});
|
||
|
|
||
|
test('should store ADDON_CONFIG_UPDATE event', async t => {
|
||
|
const { addonService, stores } = getSetup();
|
||
|
|
||
|
const config = {
|
||
|
provider: 'simple',
|
||
|
enabled: true,
|
||
|
parameters: {
|
||
|
url: 'http://localhost/wh',
|
||
|
var: 'some-value',
|
||
|
},
|
||
|
events: [FEATURE_CREATED],
|
||
|
};
|
||
|
|
||
|
const addonConfig = await addonService.createAddon(config, 'me@mail.com');
|
||
|
|
||
|
const updated = { ...addonConfig, description: 'test' };
|
||
|
await addonService.updateAddon(addonConfig.id, updated, 'me@mail.com');
|
||
|
|
||
|
const events = await stores.eventStore.getEvents();
|
||
|
|
||
|
t.is(events.length, 3);
|
||
|
t.is(events[2].type, ADDON_CONFIG_UPDATED);
|
||
|
t.is(events[2].data.provider, 'simple');
|
||
|
});
|
||
|
|
||
|
test('should store ADDON_CONFIG_REMOVE event', async t => {
|
||
|
const { addonService, stores } = getSetup();
|
||
|
|
||
|
const config = {
|
||
|
provider: 'simple',
|
||
|
enabled: true,
|
||
|
parameters: {
|
||
|
url: 'http://localhost/wh',
|
||
|
var: 'some-value',
|
||
|
},
|
||
|
events: [FEATURE_CREATED],
|
||
|
};
|
||
|
|
||
|
const addonConfig = await addonService.createAddon(config, 'me@mail.com');
|
||
|
|
||
|
await addonService.removeAddon(addonConfig.id, 'me@mail.com');
|
||
|
|
||
|
const events = await stores.eventStore.getEvents();
|
||
|
|
||
|
t.is(events.length, 3);
|
||
|
t.is(events[2].type, ADDON_CONFIG_DELETED);
|
||
|
t.is(events[2].data.id, addonConfig.id);
|
||
|
});
|