Implment hard to test apis

This commit is contained in:
Arunoda Susiripala 2016-03-28 18:12:54 +05:30
parent b5830fd1fe
commit de45d2b23f

View File

@ -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}`);
});
});