test: remove multiple mock (#212)

This commit is contained in:
Miralem Drek
2019-12-04 09:04:04 +01:00
committed by GitHub
parent 13a0879267
commit 3c6e8d1a83
9 changed files with 108 additions and 99 deletions

View File

@@ -1,25 +1,28 @@
const doMock = theme => aw.mock([['**/apis/theme/**/theme.js', () => theme]], ['../app-theme']);
describe('app-theme', () => {
let appThemeFn;
let internalAPI;
let logger;
let t;
beforeEach(() => {
const sandbox = sinon.createSandbox();
before(() => {
internalAPI = {
setTheme: sinon.spy(),
setTheme: sandbox.spy(),
};
t = () => ({
externalAPI: 'external',
internalAPI,
});
logger = {
error: sinon.spy(),
warn: sinon.spy(),
error: sandbox.spy(),
warn: sandbox.spy(),
};
const [{ default: create }] = doMock(t);
appThemeFn = create;
[{ default: appThemeFn }] = aw.mock([['**/apis/theme/**/theme.js', () => t]], ['../app-theme']);
});
afterEach(() => {
sandbox.reset();
});
it('should return external API', () => {
const at = appThemeFn({});
expect(at.externalAPI).to.equal('external');
@@ -27,7 +30,7 @@ describe('app-theme', () => {
describe('custom', () => {
it('should load and apply custom theme', async () => {
const root = { theme: sinon.spy() };
const root = { theme: sandbox.spy() };
const at = appThemeFn({
root,
logger,
@@ -62,11 +65,11 @@ describe('app-theme', () => {
},
],
});
const sandbox = sinon.createSandbox({ useFakeTimers: true });
const sb = sinon.createSandbox({ useFakeTimers: true });
const prom = at.setTheme('darkish');
sandbox.clock.tick(5500);
sb.clock.tick(5500);
await prom;
sandbox.restore();
sb.restore();
expect(logger.warn).to.have.been.calledWithExactly("Timeout when loading theme 'darkish'");
});
});

View File

@@ -1,24 +1,43 @@
const doMock = ({ appThemeFn, getObject, createObject }) =>
aw.mock(
[
['**/locale/app-locale.js', () => () => ({ translator: () => ({ add: () => {} }) })],
['**/selections/index.js', () => ({ createAppSelectionAPI: () => ({}) })],
['**/components/NebulaApp.jsx', () => () => ({})],
['**/components/selections/AppSelections.jsx', () => () => ({})],
['**/object/create-object.js', () => createObject],
['**/object/get-object.js', () => getObject],
['**/sn/types.js', () => ({ create: () => ({}) })],
['**/utils/logger.js', () => () => ({})],
['**/app-theme.js', () => appThemeFn],
],
['../index.js']
);
describe('nucleus', () => {
let appThemeFn;
let create;
let createObject;
let getObject;
let sandbox;
before(() => {
sandbox = sinon.createSandbox({ useFakeTimers: true });
createObject = sandbox.stub();
getObject = sandbox.stub();
appThemeFn = sandbox.stub();
[{ default: create }] = aw.mock(
[
['**/locale/app-locale.js', () => () => ({ translator: () => ({ add: () => {} }) })],
['**/selections/index.js', () => ({ createAppSelectionAPI: () => ({}) })],
['**/components/NebulaApp.jsx', () => () => ({})],
['**/components/selections/AppSelections.jsx', () => () => ({})],
['**/object/create-object.js', () => createObject],
['**/object/get-object.js', () => getObject],
['**/sn/types.js', () => ({ create: () => ({}) })],
['**/utils/logger.js', () => () => ({})],
['**/app-theme.js', () => appThemeFn],
],
['../index.js']
);
});
beforeEach(() => {
createObject.returns('created object');
getObject.returns('got object');
});
afterEach(() => {
sandbox.reset();
});
it('should wait for theme before creating object', async () => {
let waited = false;
const delay = 1000;
const appThemeFn = () => ({
appThemeFn.returns({
setTheme: () =>
new Promise(resolve => {
setTimeout(() => {
@@ -27,25 +46,19 @@ describe('nucleus', () => {
}, delay);
}),
});
const createObject = () => 'created object';
const [{ default: create }] = doMock({ appThemeFn, createObject });
const sandbox = sinon.createSandbox({ useFakeTimers: true });
const nuked = create();
const prom = nuked.create();
sandbox.clock.tick(delay + 100);
const c = await prom;
sandbox.clock.restore();
expect(waited).to.equal(true);
expect(c).to.equal('created object');
});
it('should wait for theme before getting object', async () => {
let waited = false;
const delay = 1000;
const appThemeFn = () => ({
const delay = 2000;
appThemeFn.returns({
setTheme: () =>
new Promise(resolve => {
setTimeout(() => {
@@ -54,11 +67,6 @@ describe('nucleus', () => {
}, delay);
}),
});
const getObject = () => 'got object';
const [{ default: create }] = doMock({ appThemeFn, getObject });
const sandbox = sinon.createSandbox({ useFakeTimers: true });
const nuked = create();
const prom = nuked.get();

View File

@@ -1,43 +1,50 @@
describe('create-object', () => {
const doMock = ({ populator = () => {} } = {}) =>
aw.mock([['**/populator.js', () => populator]], ['../create-object.js']);
let context = {};
let types;
let sn;
let merged;
let create;
let populator;
let sandbox;
before(() => {
sandbox = sinon.createSandbox();
populator = sandbox.stub();
[{ default: create }] = aw.mock([['**/populator.js', () => populator]], ['../create-object.js']);
});
beforeEach(() => {
types = {
get: sinon.stub(),
get: sandbox.stub(),
};
context = {
app: {
createSessionObject: sinon.stub().returns(Promise.resolve({ id: 'id' })),
createSessionObject: sandbox.stub().returns(Promise.resolve({ id: 'id' })),
},
nebbie: {
get: sinon.stub().returns('got it'),
get: sandbox.stub().returns('got it'),
types,
},
};
sn = { qae: { properties: { onChange: sinon.stub() } } };
sn = { qae: { properties: { onChange: sandbox.stub() } } };
merged = { m: 'true' };
const t = {
initialProperties: sinon.stub().returns(Promise.resolve(merged)),
supernova: sinon.stub().returns(Promise.resolve(sn)),
initialProperties: sandbox.stub().returns(Promise.resolve(merged)),
supernova: sandbox.stub().returns(Promise.resolve(sn)),
};
types.get.returns(t);
});
afterEach(() => {
sandbox.reset();
});
it('should call types.get with name and version', () => {
const [{ default: create }] = doMock();
create({ type: 't', version: 'v', fields: 'f' }, {}, context);
expect(types.get).to.have.been.calledWithExactly({ name: 't', version: 'v' });
});
it('should call initialProperties on returned type', () => {
const [{ default: create }] = doMock();
const t = { initialProperties: sinon.stub() };
t.initialProperties.returns({ then: () => {} });
types.get.returns(t);
@@ -46,32 +53,26 @@ describe('create-object', () => {
});
it('should populate fields', async () => {
const p = sinon.stub();
const [{ default: create }] = doMock({ populator: p });
await create({ type: 't', version: 'v', fields: 'f' }, { properties: 'props' }, context);
expect(p).to.have.been.calledWithExactly({ sn, properties: merged, fields: 'f' }, context);
expect(populator).to.have.been.calledWithExactly({ sn, properties: merged, fields: 'f' }, context);
});
it('should call properties onChange handler when optional props are provided', async () => {
const [{ default: create }] = doMock();
await create({ type: 't', version: 'v', fields: 'f' }, { properties: 'props' }, context);
expect(sn.qae.properties.onChange).to.have.been.calledWithExactly(merged);
});
it('should not call onChange handler when optional props are not provided', async () => {
const [{ default: create }] = doMock();
await create({ type: 't', version: 'v', fields: 'f' }, {}, context);
expect(sn.qae.properties.onChange.callCount).to.equal(0);
});
it('should create a session object with merged props', async () => {
const [{ default: create }] = doMock();
await create({ type: 't', version: 'v', fields: 'f' }, { properties: 'props' }, context);
expect(context.app.createSessionObject).to.have.been.calledWithExactly(merged);
});
it('should call nebbie get', async () => {
const [{ default: create }] = doMock();
const ret = await create({ type: 't', version: 'v', fields: 'f' }, { properties: 'props', x: 'a' }, context);
expect(ret).to.equal('got it');
expect(context.nebbie.get).to.have.been.calledWithExactly(

View File

@@ -1,12 +1,10 @@
const doMock = () => aw.mock([['**/uid.js', () => () => 'uid']], ['../hc-handler.js']);
describe('hc-handler', () => {
let h;
let hc;
let def;
let handler;
before(() => {
[{ default: handler }] = doMock();
[{ default: handler }] = aw.mock([['**/uid.js', () => () => 'uid']], ['../hc-handler.js']);
});
beforeEach(() => {

View File

@@ -1,4 +1,3 @@
const doMock = ({ handler } = {}) => aw.mock([['**/hc-handler.js', () => handler]], ['../populator.js']);
describe('populator', () => {
let handler;
let context;
@@ -19,7 +18,7 @@ describe('populator', () => {
warn: sb.stub(),
},
};
[{ default: populate, fieldType: ft }] = doMock({ handler });
[{ default: populate, fieldType: ft }] = aw.mock([['**/hc-handler.js', () => handler]], ['../populator.js']);
});
beforeEach(() => {
sb.reset();

View File

@@ -1,13 +1,3 @@
const mock = ({ SNFactory = () => ({}), satisfies = () => false, load = () => null } = {}) =>
aw.mock(
[
['**/dist/supernova.js', () => SNFactory],
['**/semver.js', () => ({ satisfies })],
['**/load.js', () => ({ load })],
],
['../type']
);
describe('type', () => {
let c;
let SNFactory;
@@ -20,7 +10,14 @@ describe('type', () => {
SNFactory = sb.stub();
load = sb.stub();
satisfies = sb.stub();
[{ default: create }] = mock({ SNFactory, load, satisfies });
[{ default: create }] = aw.mock(
[
['**/dist/supernova.js', () => SNFactory],
['**/semver.js', () => ({ satisfies })],
['**/load.js', () => ({ load })],
],
['../type']
);
});
beforeEach(() => {
c = create({ name: 'pie', version: '1.1.0' }, 'c', { load: 'customLoader' });

View File

@@ -1,17 +1,3 @@
const mock = ({ createType, clearFromCache = () => {} } = {}) =>
aw.mock(
[
['**/sn/type.js', () => createType],
[
'**/sn/load.js',
() => ({
clearFromCache,
}),
],
],
['../types']
);
describe('types', () => {
let sb;
let create;
@@ -23,7 +9,18 @@ describe('types', () => {
sb = sinon.createSandbox();
type = sb.stub();
clearFromCache = sb.stub();
[{ create, semverSort }] = mock({ createType: type, clearFromCache });
[{ create, semverSort }] = aw.mock(
[
['**/sn/type.js', () => type],
[
'**/sn/load.js',
() => ({
clearFromCache,
}),
],
],
['../types']
);
});
beforeEach(() => {

View File

@@ -1,5 +1,8 @@
describe('creator', () => {
const [{ default: create }] = aw.mock([['**/action-hero.js', () => () => ({})]], ['../../src/creator']);
let create;
before(() => {
[{ default: create }] = aw.mock([['**/action-hero.js', () => () => ({})]], ['../../src/creator']);
});
it('should return a default component api', () => {
const generator = {

View File

@@ -1,13 +1,16 @@
// import generator from '../../src/generator';
describe('generator', () => {
const [{ default: generator }] = aw.mock(
[
['**/creator.js', () => (...a) => [...a]],
['**/qae.js', () => qae => qae || 'qae'],
],
['../../src/generator']
);
let generator;
before(() => {
[{ default: generator }] = aw.mock(
[
['**/creator.js', () => (...a) => [...a]],
['**/qae.js', () => qae => qae || 'qae'],
],
['../../src/generator']
);
});
it('should have a default qae property', () => {
expect(generator({}).qae).to.eql('qae');