aboutsummaryrefslogtreecommitdiff
path: root/test/store
diff options
context:
space:
mode:
authorShin'ya Ueoka <ueokande@i-beam.org>2017-09-16 23:17:42 +0900
committerShin'ya Ueoka <ueokande@i-beam.org>2017-09-16 23:17:42 +0900
commitfb1d3b5962531a004bb14f7f78796f77149ee7e7 (patch)
treedada8e3075c5aa149e5b25f1a7e460594132f195 /test/store
parentbf75603e1514e64cd608fb90f4c47afeec5c37f9 (diff)
add store test and fix store
Diffstat (limited to 'test/store')
-rw-r--r--test/store/index.test.js111
1 files changed, 111 insertions, 0 deletions
diff --git a/test/store/index.test.js b/test/store/index.test.js
new file mode 100644
index 0000000..e19d50e
--- /dev/null
+++ b/test/store/index.test.js
@@ -0,0 +1,111 @@
+import { expect } from "chai";
+import { createStore } from '../../src/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() }));
+ });
+ })
+});
+