mirror of
https://github.com/storybookjs/storybook.git
synced 2025-03-19 05:02:40 +08:00
Implment hard to test apis
This commit is contained in:
parent
b5830fd1fe
commit
de45d2b23f
@ -4,132 +4,160 @@ import sinon from 'sinon';
|
||||
import { expect } from 'chai';
|
||||
import SyncedStore from '../synced_store';
|
||||
|
||||
const currentDataId = UUID.v4();
|
||||
const window = {
|
||||
location: {
|
||||
search: `?dataId=${currentDataId}`,
|
||||
},
|
||||
addEventListener() {},
|
||||
};
|
||||
const dataModule = new SyncedStore(window);
|
||||
dataModule._bus = {};
|
||||
function getSyncedData(dataId) {
|
||||
const window = {
|
||||
location: {},
|
||||
addEventListener() {},
|
||||
};
|
||||
|
||||
if (dataId) {
|
||||
window.location.search = `?dataId=${dataId}`;
|
||||
}
|
||||
|
||||
const syncedData = new SyncedStore(window);
|
||||
syncedData._bus = {};
|
||||
|
||||
return syncedData;
|
||||
}
|
||||
|
||||
describe('data', () => {
|
||||
// TODO: We can't find a way to reset the module cache.
|
||||
// Once we do that, we can test for this case as well.
|
||||
describe('normal mode', () => {
|
||||
it('should set the `iframeMode` as false', () => {
|
||||
const syncedData = getSyncedData();
|
||||
|
||||
// describe('normal mode', () => {
|
||||
// it('should set the `iframeMode` as false', () => {
|
||||
// const data = dataModule.getData();
|
||||
// expect(data.iframeMode).to.be.equal(false);
|
||||
// });
|
||||
// it('should set a random Id to dataId', () => {
|
||||
// const data = dataModule.getData();
|
||||
// expect(typeof data.dataId).to.be.equal('string');
|
||||
// });
|
||||
// });
|
||||
const data = syncedData.getData();
|
||||
expect(data.iframeMode).to.be.equal(false);
|
||||
});
|
||||
it('should set a random Id to dataId', () => {
|
||||
const syncedData = getSyncedData();
|
||||
|
||||
const data = syncedData.getData();
|
||||
expect(typeof data.dataId).to.be.equal('string');
|
||||
});
|
||||
});
|
||||
|
||||
describe('iframe mode', () => {
|
||||
it('should get the dataId from the URL', () => {
|
||||
const data = dataModule.getData();
|
||||
const currentDataId = UUID.v4();
|
||||
const syncedData = getSyncedData(currentDataId);
|
||||
|
||||
const data = syncedData.getData();
|
||||
expect(data.dataId).to.be.equal(currentDataId);
|
||||
});
|
||||
|
||||
it('should set the iframeMode as true', () => {
|
||||
const data = dataModule.getData();
|
||||
const syncedData = getSyncedData(UUID.v4());
|
||||
|
||||
const data = syncedData.getData();
|
||||
expect(data.iframeMode).to.be.equal(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('watchData', () => {
|
||||
it('should add the handler to handlers', () => {
|
||||
const syncedData = getSyncedData(UUID.v4());
|
||||
|
||||
const fn = () => {};
|
||||
dataModule.watchData(fn);
|
||||
const fnStored = dataModule._handlers.pop();
|
||||
syncedData.watchData(fn);
|
||||
const fnStored = syncedData._handlers.pop();
|
||||
expect(fnStored).to.be.equal(fn);
|
||||
});
|
||||
|
||||
it('should remove the handler when the return function called', () => {
|
||||
const stop = dataModule.watchData(() => {});
|
||||
const countStart = dataModule._handlers.length;
|
||||
const syncedData = getSyncedData(UUID.v4());
|
||||
|
||||
const stop = syncedData.watchData(() => {});
|
||||
const countStart = syncedData._handlers.length;
|
||||
stop();
|
||||
const countEnd = dataModule._handlers.length;
|
||||
const countEnd = syncedData._handlers.length;
|
||||
expect(countStart - countEnd).to.be.equal(1);
|
||||
});
|
||||
});
|
||||
|
||||
describe('setData', () => {
|
||||
it('should emit data to the pageBus', () => {
|
||||
const kkr = UUID.v4();
|
||||
const originalEmit = dataModule._bus.emit;
|
||||
dataModule._bus.emit = sinon.stub();
|
||||
dataModule.setData({ kkr });
|
||||
const data = dataModule.getData();
|
||||
const syncedData = getSyncedData(UUID.v4());
|
||||
|
||||
const sentString = dataModule._bus.emit.args[0][1];
|
||||
const kkr = UUID.v4();
|
||||
const originalEmit = syncedData._bus.emit;
|
||||
syncedData._bus.emit = sinon.stub();
|
||||
syncedData.setData({ kkr });
|
||||
const data = syncedData.getData();
|
||||
|
||||
const sentString = syncedData._bus.emit.args[0][1];
|
||||
const sentJSON = JSON.parse(sentString);
|
||||
expect(sentJSON).to.deep.equal(data);
|
||||
dataModule._bus.emit = originalEmit;
|
||||
syncedData._bus.emit = originalEmit;
|
||||
});
|
||||
|
||||
it('should update existing data', () => {
|
||||
const kkr = UUID.v4();
|
||||
const originalEmit = dataModule._bus.emit;
|
||||
dataModule._bus.emit = sinon.stub();
|
||||
const syncedData = getSyncedData(UUID.v4());
|
||||
|
||||
const previousKKR = dataModule.getData().kkr;
|
||||
dataModule.setData({ kkr });
|
||||
const data = dataModule.getData();
|
||||
const kkr = UUID.v4();
|
||||
const originalEmit = syncedData._bus.emit;
|
||||
syncedData._bus.emit = sinon.stub();
|
||||
|
||||
const previousKKR = syncedData.getData().kkr;
|
||||
syncedData.setData({ kkr });
|
||||
const data = syncedData.getData();
|
||||
|
||||
expect(data.kkr).not.to.be.equal(previousKKR);
|
||||
dataModule._bus.emit = originalEmit;
|
||||
syncedData._bus.emit = originalEmit;
|
||||
});
|
||||
|
||||
it('should run all handlers with the data', (done) => {
|
||||
const syncedData = getSyncedData(UUID.v4());
|
||||
|
||||
const kkr = UUID.v4();
|
||||
const stop = dataModule.watchData((data) => {
|
||||
const stop = syncedData.watchData((data) => {
|
||||
stop();
|
||||
expect(data.kkr).to.be.equal(kkr);
|
||||
done();
|
||||
});
|
||||
|
||||
const originalEmit = dataModule._bus.emit;
|
||||
dataModule._bus.emit = sinon.stub();
|
||||
dataModule.setData({ kkr });
|
||||
dataModule._bus.emit = originalEmit;
|
||||
const originalEmit = syncedData._bus.emit;
|
||||
syncedData._bus.emit = sinon.stub();
|
||||
syncedData.setData({ kkr });
|
||||
syncedData._bus.emit = originalEmit;
|
||||
});
|
||||
|
||||
it('should add a property with __lastUpdated with Date.now()', () => {
|
||||
const syncedData = getSyncedData(UUID.v4());
|
||||
|
||||
const now = UUID.v4();
|
||||
const originalEmit = dataModule._bus.emit;
|
||||
dataModule._bus.emit = sinon.stub();
|
||||
const originalEmit = syncedData._bus.emit;
|
||||
syncedData._bus.emit = sinon.stub();
|
||||
const originalNow = Date.now;
|
||||
Date.now = () => (now);
|
||||
|
||||
dataModule.setData({ aa: 10 });
|
||||
const data = dataModule.getData();
|
||||
syncedData.setData({ aa: 10 });
|
||||
const data = syncedData.getData();
|
||||
|
||||
expect(data.__lastUpdated).to.be.equal(now);
|
||||
Date.now = originalNow;
|
||||
dataModule._bus.emit = originalEmit;
|
||||
syncedData._bus.emit = originalEmit;
|
||||
});
|
||||
});
|
||||
|
||||
describe('receiveData', () => {
|
||||
it('should set received data as the new data', () => {
|
||||
const previousData = dataModule.getData();
|
||||
const newData = { kkr: UUID.v4() };
|
||||
dataModule._onData(JSON.stringify(newData));
|
||||
const syncedData = getSyncedData(UUID.v4());
|
||||
|
||||
const updatedData = dataModule.getData();
|
||||
const previousData = syncedData.getData();
|
||||
const newData = { kkr: UUID.v4() };
|
||||
syncedData._onData(JSON.stringify(newData));
|
||||
|
||||
const updatedData = syncedData.getData();
|
||||
delete updatedData.iframeMode;
|
||||
expect(updatedData).to.deep.equal(newData);
|
||||
expect(previousData).not.to.deep.equal(newData);
|
||||
});
|
||||
|
||||
it('should run all handlers with data', (done) => {
|
||||
const syncedData = getSyncedData(UUID.v4());
|
||||
|
||||
const newData = { kkr: UUID.v4() };
|
||||
const stop = dataModule.watchData((data) => {
|
||||
const stop = syncedData.watchData((data) => {
|
||||
stop();
|
||||
const updatedData = { ...data };
|
||||
delete updatedData.iframeMode;
|
||||
@ -137,19 +165,21 @@ describe('data', () => {
|
||||
done();
|
||||
});
|
||||
|
||||
dataModule._onData(JSON.stringify(newData));
|
||||
syncedData._onData(JSON.stringify(newData));
|
||||
});
|
||||
|
||||
it('should set the local iframeMode to data', () => {
|
||||
const syncedData = getSyncedData(UUID.v4());
|
||||
|
||||
const newData = {
|
||||
kkr: UUID.v4(),
|
||||
iframeMode: UUID.v4(),
|
||||
};
|
||||
|
||||
const oldIframeMode = dataModule.getData().iframeMode;
|
||||
dataModule._onData(JSON.stringify(newData));
|
||||
const oldIframeMode = syncedData.getData().iframeMode;
|
||||
syncedData._onData(JSON.stringify(newData));
|
||||
|
||||
const newIframeMode = dataModule.getData().iframeMode;
|
||||
const newIframeMode = syncedData.getData().iframeMode;
|
||||
|
||||
expect(newIframeMode).to.be.deep.equal(oldIframeMode);
|
||||
});
|
||||
@ -157,8 +187,10 @@ describe('data', () => {
|
||||
|
||||
describe('getDataKey', () => {
|
||||
it('should get the data key prefixed with the current dataId', () => {
|
||||
const dataId = dataModule.getData().dataId;
|
||||
const dataKey = dataModule.getDataKey();
|
||||
const syncedData = getSyncedData(UUID.v4());
|
||||
|
||||
const dataId = syncedData.getData().dataId;
|
||||
const dataKey = syncedData.getDataKey();
|
||||
expect(dataKey).to.be.equal(`data-${dataId}`);
|
||||
});
|
||||
});
|
||||
|
Loading…
x
Reference in New Issue
Block a user