From 6f6a9ca5d1ae641799343c5ace2b6b1f804e0722 Mon Sep 17 00:00:00 2001 From: Mohamedox Date: Tue, 12 Mar 2019 13:58:35 +0100 Subject: [PATCH 1/8] next reaclette tests --- src/new.spec.js | 82 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/new.spec.js diff --git a/src/new.spec.js b/src/new.spec.js new file mode 100644 index 0000000..4368330 --- /dev/null +++ b/src/new.spec.js @@ -0,0 +1,82 @@ +/* eslint-env jest */ + +require("raf/polyfill"); +const { createElement } = require("react"); +const { configure, mount } = require("enzyme"); + +const { withStore } = require("./"); + +configure({ adapter: new (require("enzyme-adapter-react-16"))() }); + +const makeTestInstance = (opts, props) => { + let renderCount = 0; + let renderArgs; + const parent = mount( + createElement( + withStore( + { + ...opts, + effects: { + ...opts.effects, + _setState(props) { + Object.assign(this.state, props); + }, + }, + }, + (...args) => { + ++renderCount; + renderArgs = args; + return null; + } + ), + props + ) + ); + return { + effects: renderArgs[0].effects, + getParentProps: () => parent.instance().props, + getRenderArgs: () => renderArgs, + getRenderCount: () => renderCount, + getState: () => renderArgs[0].state, + setParentProps: parent.setProps.bind(parent), + }; +}; + +describe("withStore", () => { + describe("render function", () => { + it("receives the store as first param with effects, state and resetState", async () => { + const { getRenderArgs } = makeTestInstance({ + initialState: () => ({ + foo: "bar", + }), + effects: { + changeState(value) { + this.state.foo = value; + }, + }, + }); + + expect(getRenderArgs()[0]).toHaveProperty("effects"); + expect(getRenderArgs()[0]).toHaveProperty("resetState"); + expect(getRenderArgs()[0]).toHaveProperty("state"); + }); + + it("receives the props as second param", () => { + const props = { bar: "baz" }; + const { getRenderArgs } = makeTestInstance( + { + initialState: () => ({ + foo: "bar", + }), + effects: { + changeState(value) { + this.state.foo = value; + }, + }, + }, + props + ); + expect(getRenderArgs()[1]).toHaveProperty("bar"); + }); + }); +}); From c450e44c0fb5f02d84d41bb0a5ab72922bee3d50 Mon Sep 17 00:00:00 2001 From: Mohamedox Date: Tue, 12 Mar 2019 14:08:21 +0100 Subject: [PATCH 2/8] render function tests --- src/new.spec.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/new.spec.js b/src/new.spec.js index 4368330..22e2419 100644 --- a/src/new.spec.js +++ b/src/new.spec.js @@ -46,14 +46,8 @@ describe("withStore", () => { describe("render function", () => { it("receives the store as first param with effects, state and resetState", async () => { const { getRenderArgs } = makeTestInstance({ - initialState: () => ({ - foo: "bar", - }), - effects: { - changeState(value) { - this.state.foo = value; - }, - }, + initialState: () => ({}), + effects: {}, }); expect(getRenderArgs()[0]).toHaveProperty("effects"); From 51182264d26672f9fdad579834eacb17bae0b624 Mon Sep 17 00:00:00 2001 From: Mohamedox Date: Tue, 12 Mar 2019 14:19:42 +0100 Subject: [PATCH 3/8] render function tests --- src/new.spec.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/new.spec.js b/src/new.spec.js index 22e2419..205811a 100644 --- a/src/new.spec.js +++ b/src/new.spec.js @@ -1,6 +1,5 @@ /* eslint-env jest */ -require("raf/polyfill"); const { createElement } = require("react"); const { configure, mount } = require("enzyme"); From 207e6e606fee5a840ed16e48746888974cec34ab Mon Sep 17 00:00:00 2001 From: Mohamedox Date: Tue, 12 Mar 2019 14:22:23 +0100 Subject: [PATCH 4/8] render function tests --- src/new.spec.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/new.spec.js b/src/new.spec.js index 205811a..17959e7 100644 --- a/src/new.spec.js +++ b/src/new.spec.js @@ -58,14 +58,8 @@ describe("withStore", () => { const props = { bar: "baz" }; const { getRenderArgs } = makeTestInstance( { - initialState: () => ({ - foo: "bar", - }), - effects: { - changeState(value) { - this.state.foo = value; - }, - }, + initialState: () => ({}), + effects: {}, }, props ); From b45e2b6062cd3a20cf66ac3f1929e8f2f057fbbc Mon Sep 17 00:00:00 2001 From: Mohamedox Date: Tue, 12 Mar 2019 17:00:20 +0100 Subject: [PATCH 5/8] render function tests --- src/new.spec.js | 58 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 17 deletions(-) diff --git a/src/new.spec.js b/src/new.spec.js index 17959e7..48c1226 100644 --- a/src/new.spec.js +++ b/src/new.spec.js @@ -41,29 +41,53 @@ const makeTestInstance = (opts, props) => { }; }; +const isReadOnly = object => + !Object.isExtensible(object) && + Object.getOwnPropertyNames(object).every(name => { + const descriptor = Object.getOwnPropertyDescriptor(object, name); + return ( + !descriptor.configurable && + (descriptor.set === undefined || !descriptor.writable) + ); + }); + describe("withStore", () => { describe("render function", () => { - it("receives the store as first param with effects, state and resetState", async () => { - const { getRenderArgs } = makeTestInstance({ - initialState: () => ({}), - effects: {}, - }); - - expect(getRenderArgs()[0]).toHaveProperty("effects"); - expect(getRenderArgs()[0]).toHaveProperty("resetState"); - expect(getRenderArgs()[0]).toHaveProperty("state"); - }); - - it("receives the props as second param", () => { - const props = { bar: "baz" }; + it("returns readOnly state, effects, props and resetState func", async () => { + const _props = { bar: "baz" }; const { getRenderArgs } = makeTestInstance( { - initialState: () => ({}), - effects: {}, + initialState: () => ({ myEntry: "bar" }), + effects: { + myEffect() { + this.state.myEntry = "baz"; + }, + }, }, - props + _props ); - expect(getRenderArgs()[1]).toHaveProperty("bar"); + + const store = getRenderArgs()[0]; + const props = getRenderArgs()[1]; + + const { effects, resetState, state } = store; + + expect(isReadOnly(store)); + + expect(isReadOnly(effects)); + expect(Object.getOwnPropertyNames(effects)).toEqual([ + "myEffect", + "_setState", + ]); + + expect(typeof resetState).toBe("function"); + + expect(isReadOnly(state)); + expect(Object.getOwnPropertyNames(state)).toEqual(["myEntry"]); + expect(state).toHaveProperty("myEntry"); + + expect(isReadOnly(props)); + expect(Object.getOwnPropertyNames(props)).toEqual(["bar"]); }); }); }); From be1e6354108677218b3bf654b321dc0ada97c400 Mon Sep 17 00:00:00 2001 From: Mohamedox Date: Tue, 12 Mar 2019 17:01:59 +0100 Subject: [PATCH 6/8] render functiont tests --- src/new.spec.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/new.spec.js b/src/new.spec.js index 48c1226..02a363f 100644 --- a/src/new.spec.js +++ b/src/new.spec.js @@ -84,7 +84,6 @@ describe("withStore", () => { expect(isReadOnly(state)); expect(Object.getOwnPropertyNames(state)).toEqual(["myEntry"]); - expect(state).toHaveProperty("myEntry"); expect(isReadOnly(props)); expect(Object.getOwnPropertyNames(props)).toEqual(["bar"]); From dccf45a843cb895bda1e9058d878fe00d6fd7c61 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Tue, 12 Mar 2019 17:14:39 +0100 Subject: [PATCH 7/8] Update new.spec.js --- src/new.spec.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/new.spec.js b/src/new.spec.js index 02a363f..bdaca46 100644 --- a/src/new.spec.js +++ b/src/new.spec.js @@ -67,13 +67,13 @@ describe("withStore", () => { _props ); - const store = getRenderArgs()[0]; - const props = getRenderArgs()[1]; - - const { effects, resetState, state } = store; + const renderArgs = getRenderArgs(); + const store = renderArgs[0]; expect(isReadOnly(store)); + const { effects, resetState, state } = store; + expect(isReadOnly(effects)); expect(Object.getOwnPropertyNames(effects)).toEqual([ "myEffect", @@ -85,6 +85,7 @@ describe("withStore", () => { expect(isReadOnly(state)); expect(Object.getOwnPropertyNames(state)).toEqual(["myEntry"]); + const props = renderArgs[1]; expect(isReadOnly(props)); expect(Object.getOwnPropertyNames(props)).toEqual(["bar"]); }); From c6a406a3fd53a96714314fffc1b95d5e7b590f0c Mon Sep 17 00:00:00 2001 From: Mohamedox Date: Tue, 12 Mar 2019 17:23:05 +0100 Subject: [PATCH 8/8] render function tests --- src/new.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/new.spec.js b/src/new.spec.js index bdaca46..f739f84 100644 --- a/src/new.spec.js +++ b/src/new.spec.js @@ -53,7 +53,7 @@ const isReadOnly = object => describe("withStore", () => { describe("render function", () => { - it("returns readOnly state, effects, props and resetState func", async () => { + it("receives readOnly store and props", async () => { const _props = { bar: "baz" }; const { getRenderArgs } = makeTestInstance( {