aboutsummaryrefslogtreecommitdiff
path: root/test/shared/store/index.test.js
diff options
context:
space:
mode:
authorShin'ya Ueoka <ueokande@i-beam.org>2017-10-08 15:11:09 +0900
committerShin'ya Ueoka <ueokande@i-beam.org>2017-10-08 15:11:09 +0900
commit2faf44af7443b3f858e15d63295a490afba83b4e (patch)
treefeac4996deb63c6161b63dec10c47fd82238aaa5 /test/shared/store/index.test.js
parent39fb5400370b818760dc7bcfe42e74b2512a840d (diff)
move store to shared
Diffstat (limited to 'test/shared/store/index.test.js')
-rw-r--r--test/shared/store/index.test.js111
1 files changed, 111 insertions, 0 deletions
diff --git a/test/shared/store/index.test.js b/test/shared/store/index.test.js
new file mode 100644
index 0000000..133033b
--- /dev/null
+++ b/test/shared/store/index.test.js
@@ -0,0 +1,111 @@
+import { expect } from "chai";
+import { createStore } from 'shared/store';
+
+describe("Store class", () => {
+ const reducer = (state, action) => {
+ if (state == undefined) {
+ return 0;
+ }
+ return state + action;
+ };
+
+ describe("#dispatch", () => {
+ it('transit status by immediate action', () => {
+ let store = createStore(reducer);
+ store.dispatch(10);
+ expect(store.getState()).to.equal(10);
+
+ store.dispatch(-20);
+ expect(store.getState()).to.equal(-10);
+ });
+
+ it('returns next state by immediate action', () => {
+ let store = createStore(reducer);
+ let dispatchedAction = store.dispatch(11);
+ expect(dispatchedAction).to.equal(11);
+ });
+
+ it('transit status by Promise action', () => {
+ let store = createStore(reducer);
+ let p1 = Promise.resolve(10);
+
+ return store.dispatch(p1).then(() => {
+ expect(store.getState()).to.equal(10);
+ }).then(() => {
+ store.dispatch(Promise.resolve(-20));
+ }).then(() => {
+ expect(store.getState()).to.equal(-10);
+ });
+ });
+
+ it('returns next state by promise action', () => {
+ let store = createStore(reducer);
+ let dispatchedAction = store.dispatch(Promise.resolve(11));
+ return dispatchedAction.then((value) => {
+ expect(value).to.equal(11);
+ });
+ });
+ });
+
+ describe("#subscribe", () => {
+ it('invoke callback', (done) => {
+ let store = createStore(reducer);
+ store.subscribe(() => {
+ expect(store.getState()).to.equal(15);
+ done();
+ });
+ store.dispatch(15);
+ });
+
+ it('propagate sender object', (done) => {
+ let store = createStore(reducer);
+ store.subscribe((sender) => {
+ expect(sender).to.equal('sender');
+ done();
+ });
+ store.dispatch(15, 'sender');
+ });
+ })
+
+ describe("catcher", () => {
+ it('catch an error in reducer on initializing by immediate action', (done) => {
+ let store = createStore(() => {
+ throw new Error();
+ }, (e) => {
+ expect(e).to.be.an('error');
+ done();
+ });
+ });
+
+ it('catch an error in reducer on initializing by immediate action', (done) => {
+ let store = createStore((state, action) => {
+ if (state === undefined) return 0;
+ throw new Error();
+ }, (e) => {
+ expect(e).to.be.an('error');
+ done();
+ });
+ store.dispatch(20);
+ });
+
+ it('catch an error in reducer on initializing by promise action', (done) => {
+ let store = createStore((state, action) => {
+ if (state === undefined) return 0;
+ throw new Error();
+ }, (e) => {
+ expect(e).to.be.an('error');
+ done();
+ });
+ store.dispatch(Promise.resolve(20));
+ });
+
+ it('catch an error in promise action', (done) => {
+ let store = createStore((state, action) => 0, (e) => {
+ expect(e).to.be.an('error');
+ done();
+ });
+ store.dispatch(new Promise(() => { throw new Error() }));
+ });
+ })
+});
+