/* * This file is part of ORY Editor. * * ORY Editor is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ORY Editor is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with ORY Editor. If not, see . * * @license LGPL-3.0 * @copyright 2016-2018 Aeneas Rekkas * @author Aeneas Rekkas * */ import * as React from 'react'; import * as unexpected from 'unexpected'; import PluginService from '../index'; import { Migration, LayoutPluginConfig, ContentPluginConfig } from '../classes'; const FOO = 'foo'; const OLDEST_VERSION = '0.0.1'; const OLDER_VERSION = '0.0.2'; const MATCHING_VERSION = '0.0.3'; const expect = unexpected.clone(); const content = [ { name: FOO, version: MATCHING_VERSION, Component: () =>
, migrations: [ new Migration({ toVersion: OLDEST_VERSION, fromVersionRange: '0.0.0 - 0.0.0', migrate: state => ({ ...state, old: 1 }), }), new Migration({ toVersion: OLDER_VERSION, fromVersionRange: '0.0.1 - 0.0.1', migrate: state => ({ ...state, modified: 2 }), }), new Migration({ toVersion: MATCHING_VERSION, fromVersionRange: '0.0.2 - 0.0.2', migrate: state => ({ ...state, modified: 1 }), }), ], }, ] as ContentPluginConfig[]; const migrationEdgeCaseContent = [ { name: FOO, version: MATCHING_VERSION, Component: () =>
, migrations: [ new Migration({ toVersion: OLDEST_VERSION, fromVersionRange: '0.0.2 - 0.0.2', migrate: state => ({ ...state, old: 1 }), }), new Migration({ toVersion: OLDER_VERSION, fromVersionRange: '0.0.0 - 0.0.0', migrate: state => ({ ...state, modified: 2 }), }), new Migration({ toVersion: MATCHING_VERSION, fromVersionRange: '0.0.1 - 0.0.1', migrate: state => ({ ...state, modified: 1 }), }), ], }, ] as ContentPluginConfig[]; const layout = [ { name: 'bar', version: '0.0.2', Component: () =>
}, ] as LayoutPluginConfig[]; const plugins = new PluginService({ content, layout }); const migrationEdgeCasePlugins = new PluginService({ content: migrationEdgeCaseContent, layout, }); describe('PluginService', () => { content.forEach(p => { it(`should find plugin ${p.name} ${p.version}`, () => { expect( plugins.findContentPlugin(p.name, p.version).plugin.name, 'to equal', p.name ); }); }); it(`should find plugin different version ${FOO} ${OLDEST_VERSION}`, () => { expect( plugins.findContentPlugin(FOO, OLDEST_VERSION).pluginWrongVersion.name, 'to equal', FOO ); expect( plugins.findContentPlugin(FOO, OLDEST_VERSION).pluginWrongVersion.version, 'to equal', MATCHING_VERSION ); }); it(`should apply migrations`, () => { const plugin = plugins.findContentPlugin(FOO, OLDEST_VERSION) .pluginWrongVersion; const newState = plugins.migratePluginState({}, plugin, OLDEST_VERSION); expect(newState.modified, 'to equal', 1); expect(newState.old, 'to equal', undefined); }); it(`should apply migrations even in edge case`, () => { const plugin = migrationEdgeCasePlugins.findContentPlugin(FOO, '0.0.0') .pluginWrongVersion; const newState = migrationEdgeCasePlugins.migratePluginState( {}, plugin, '0.0.0' ); expect(newState.modified, 'to equal', 1); expect(newState.old, 'to equal', 1); }); layout.forEach(p => { it(`should find plugin ${p.name} ${p.version}`, () => { expect( plugins.findLayoutPlugin(p.name, p.version).plugin.name, 'to equal', p.name ); }); }); const np = { name: 'baz', version: '0.0.1', Component: () =>
, } as ContentPluginConfig; it('should add a content plugin', () => { plugins.addContentPlugin(np); expect( plugins.findContentPlugin(np.name, np.version).plugin.name, 'to equal', np.name ); expect(plugins.plugins.content.length, 'to equal', 3); }); it('should remove a content plugin', () => { plugins.removeContentPlugin(np.name); expect(plugins.plugins.content.length, 'to equal', 2); }); it('should set content plugins', () => { plugins.setContentPlugins([np]); expect( plugins.findContentPlugin(np.name, np.version).plugin.name, 'to equal', np.name ); expect(plugins.plugins.content.length, 'to equal', 2); }); it('should add a layout plugin', () => { plugins.addLayoutPlugin(np); expect( plugins.findLayoutPlugin(np.name, np.version).plugin.name, 'to equal', np.name ); expect(plugins.plugins.layout.length, 'to equal', 2); }); it('should remove a layout plugin', () => { plugins.removeLayoutPlugin(np.name); expect(plugins.plugins.layout.length, 'to equal', 1); }); it('should set layout plugins', () => { plugins.setLayoutPlugins([np]); expect( plugins.findLayoutPlugin(np.name, np.version).plugin.name, 'to equal', np.name ); expect(plugins.plugins.layout.length, 'to equal', 1); }); it('should tell me when no native plugin is set', () => { expect(plugins.hasNativePlugin(), 'to be falsy'); }); it('should tell me when no native plugin is set', () => { const p = new PluginService({ content, layout, native: () => ({ Component: () =>
, name: 'ory/editor/core/content/default-native', version: '0.0.1', createInitialState: () => ({}), }), }); expect(p.hasNativePlugin(), 'to be truthy'); expect(p.createNativePlugin(), 'to be defined'); }); });