aboutsummaryrefslogtreecommitdiff
path: root/test/shared
diff options
context:
space:
mode:
authorShin'ya Ueoka <ueokande@i-beam.org>2017-10-08 15:19:25 +0900
committerGitHub <noreply@github.com>2017-10-08 15:19:25 +0900
commit0183161145d36cbafb7dbd86ca3a1aac6faca43f (patch)
treeaed757bfb5f8789156439d1e1fdff4e221376aaa /test/shared
parent0f54a203dba38acdd080a928cee95f875fe84706 (diff)
parent57f798044d32ba7f9dc10a34ac31ad5dbdbf56ae (diff)
Merge pull request #22 from ueokande/separate-domains
Refactor: Separate domains
Diffstat (limited to 'test/shared')
-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() }));
+ });
+ })
+});
+