@stryker-mutator/core
Version:
The extendable JavaScript mutation testing framework
90 lines • 3.64 kB
JavaScript
import { expect } from 'chai';
import { PluginKind } from '@stryker-mutator/api/plugin';
import { factory, testInjector } from '@stryker-mutator/test-helpers';
import { coreTokens, PluginCreator } from '../../../src/di/index.js';
describe(PluginCreator.name, () => {
let sut;
let pluginsByKind;
beforeEach(() => {
pluginsByKind = new Map();
sut = testInjector.injector.provideValue(coreTokens.pluginsByKind, pluginsByKind).injectClass(PluginCreator);
});
it("should create a FactoryPlugin using it's factory method", () => {
// Arrange
const expectedReporter = factory.reporter('foo');
const factoryPlugin = {
kind: PluginKind.Reporter,
name: 'foo',
factory() {
return expectedReporter;
},
};
pluginsByKind.set(PluginKind.Reporter, [factoryPlugin]);
// Act
const actualReporter = sut.create(PluginKind.Reporter, 'foo');
// Assert
expect(actualReporter).eq(expectedReporter);
});
it("should create a ClassPlugin using it's constructor", () => {
// Arrange
class FooReporter {
}
const classPlugin = {
injectableClass: FooReporter,
kind: PluginKind.Reporter,
name: 'foo',
};
pluginsByKind.set(PluginKind.Reporter, [classPlugin]);
// Act
const actualReporter = sut.create(PluginKind.Reporter, 'foo');
// Assert
expect(actualReporter).instanceOf(FooReporter);
});
it('should match plugins on name ignore case', () => {
// Arrange
const expectedReporter = factory.reporter('bar');
pluginsByKind.set(PluginKind.Reporter, [
{
kind: PluginKind.Reporter,
name: 'foo',
factory: factory.reporter,
},
{
kind: PluginKind.Reporter,
name: 'bar',
factory() {
return expectedReporter;
},
},
{
kind: PluginKind.Reporter,
name: 'baz',
factory: factory.reporter,
},
]);
// Act
const actualReporter = sut.create(PluginKind.Reporter, 'bAr');
// Assert
expect(actualReporter).eq(expectedReporter);
});
it('should throw if plugin is not recognized', () => {
// @ts-expect-error
const errorPlugin = {
kind: PluginKind.Reporter,
name: 'foo',
};
pluginsByKind.set(PluginKind.Reporter, [errorPlugin]);
expect(() => sut.create(PluginKind.Reporter, 'foo')).throws('Plugin "Reporter:foo" could not be created, missing "factory" or "injectableClass" property.');
});
it('should throw if the plugin cannot be found', () => {
expect(() => sut.create(PluginKind.Checker, 'chess')).throws('Cannot find Checker plugin "chess". In fact, no Checker plugins were loaded. Did you forget to install it?');
});
it('should throw if the plugin cannot be found, but other plugins of its kind could', () => {
pluginsByKind.set(PluginKind.Reporter, [
{ kind: PluginKind.Reporter, factory: factory.reporter, name: 'foo' },
{ kind: PluginKind.Reporter, factory: factory.reporter, name: 'bar' },
]);
expect(() => sut.create(PluginKind.Reporter, 'chess')).throws('Cannot find Reporter plugin "chess". Did you forget to install it? Loaded Reporter plugins were: foo, bar');
});
});
//# sourceMappingURL=plugin-creator.spec.js.map