From c60d0e7392fc708e961614d6b756a045de74f458 Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Tue, 30 Apr 2019 14:00:07 +0900 Subject: Rename .js/.jsx to .ts/.tsx --- .../components/form/BlacklistForm.test.jsx | 92 --------------- .../components/form/BlacklistForm.test.tsx | 92 +++++++++++++++ test/settings/components/form/KeymapsForm.test.jsx | 64 ----------- test/settings/components/form/KeymapsForm.test.tsx | 64 +++++++++++ .../components/form/PropertiesForm.test.jsx | 104 ----------------- .../components/form/PropertiesForm.test.tsx | 104 +++++++++++++++++ .../components/form/SearchEngineForm.test.jsx | 128 --------------------- .../components/form/SearchEngineForm.test.tsx | 128 +++++++++++++++++++++ test/settings/components/ui/input.test.jsx | 111 ------------------ test/settings/components/ui/input.test.tsx | 111 ++++++++++++++++++ test/settings/reducers/setting.test.js | 55 --------- test/settings/reducers/setting.test.ts | 55 +++++++++ 12 files changed, 554 insertions(+), 554 deletions(-) delete mode 100644 test/settings/components/form/BlacklistForm.test.jsx create mode 100644 test/settings/components/form/BlacklistForm.test.tsx delete mode 100644 test/settings/components/form/KeymapsForm.test.jsx create mode 100644 test/settings/components/form/KeymapsForm.test.tsx delete mode 100644 test/settings/components/form/PropertiesForm.test.jsx create mode 100644 test/settings/components/form/PropertiesForm.test.tsx delete mode 100644 test/settings/components/form/SearchEngineForm.test.jsx create mode 100644 test/settings/components/form/SearchEngineForm.test.tsx delete mode 100644 test/settings/components/ui/input.test.jsx create mode 100644 test/settings/components/ui/input.test.tsx delete mode 100644 test/settings/reducers/setting.test.js create mode 100644 test/settings/reducers/setting.test.ts (limited to 'test/settings') diff --git a/test/settings/components/form/BlacklistForm.test.jsx b/test/settings/components/form/BlacklistForm.test.jsx deleted file mode 100644 index 2be5d96..0000000 --- a/test/settings/components/form/BlacklistForm.test.jsx +++ /dev/null @@ -1,92 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import ReactTestRenderer from 'react-test-renderer'; -import ReactTestUtils from 'react-dom/test-utils'; -import BlacklistForm from 'settings/components/form/BlacklistForm' - -describe("settings/form/BlacklistForm", () => { - describe('render', () => { - it('renders BlacklistForm', () => { - let root = ReactTestRenderer.create( - , - ).root; - - let children = root.children[0].children; - expect(children).to.have.lengthOf(3); - expect(children[0].children[0].props.value).to.equal('*.slack.com'); - expect(children[1].children[0].props.value).to.equal('www.google.com/maps'); - expect(children[2].props.name).to.equal('add'); - }); - - it('renders blank value', () => { - let root = ReactTestRenderer.create().root; - - let children = root.children[0].children; - expect(children).to.have.lengthOf(1); - expect(children[0].props.name).to.equal('add'); - }); - }); - - describe('onChange', () => { - let container; - - beforeEach(() => { - container = document.createElement('div'); - document.body.appendChild(container); - }); - - afterEach(() => { - document.body.removeChild(container); - container = null; - }); - - it('invokes onChange event on edit', (done) => { - ReactTestUtils.act(() => { - ReactDOM.render( { - expect(value).to.have.lengthOf(2); - expect(value).to.have.members(['gitter.im', 'www.google.com/maps*']); - done(); - }} - />, container) - }); - - let input = document.querySelectorAll('input[type=text]')[0]; - input.value = 'gitter.im'; - ReactTestUtils.Simulate.change(input); - }); - - it('invokes onChange event on delete', (done) => { - ReactTestUtils.act(() => { - ReactDOM.render( { - expect(value).to.have.lengthOf(1); - expect(value).to.have.members(['www.google.com/maps*']); - done(); - }} - />, container) - }); - - let button = document.querySelectorAll('input[type=button]')[0]; - ReactTestUtils.Simulate.click(button); - }); - - it('invokes onChange event on add', (done) => { - ReactTestUtils.act(() => { - ReactDOM.render( { - expect(value).to.have.lengthOf(2); - expect(value).to.have.members(['*.slack.com', '']); - done(); - }} - />, container); - }); - - let button = document.querySelector('input[type=button].ui-add-button'); - ReactTestUtils.Simulate.click(button); - }); - }); -}); diff --git a/test/settings/components/form/BlacklistForm.test.tsx b/test/settings/components/form/BlacklistForm.test.tsx new file mode 100644 index 0000000..2be5d96 --- /dev/null +++ b/test/settings/components/form/BlacklistForm.test.tsx @@ -0,0 +1,92 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import ReactTestRenderer from 'react-test-renderer'; +import ReactTestUtils from 'react-dom/test-utils'; +import BlacklistForm from 'settings/components/form/BlacklistForm' + +describe("settings/form/BlacklistForm", () => { + describe('render', () => { + it('renders BlacklistForm', () => { + let root = ReactTestRenderer.create( + , + ).root; + + let children = root.children[0].children; + expect(children).to.have.lengthOf(3); + expect(children[0].children[0].props.value).to.equal('*.slack.com'); + expect(children[1].children[0].props.value).to.equal('www.google.com/maps'); + expect(children[2].props.name).to.equal('add'); + }); + + it('renders blank value', () => { + let root = ReactTestRenderer.create().root; + + let children = root.children[0].children; + expect(children).to.have.lengthOf(1); + expect(children[0].props.name).to.equal('add'); + }); + }); + + describe('onChange', () => { + let container; + + beforeEach(() => { + container = document.createElement('div'); + document.body.appendChild(container); + }); + + afterEach(() => { + document.body.removeChild(container); + container = null; + }); + + it('invokes onChange event on edit', (done) => { + ReactTestUtils.act(() => { + ReactDOM.render( { + expect(value).to.have.lengthOf(2); + expect(value).to.have.members(['gitter.im', 'www.google.com/maps*']); + done(); + }} + />, container) + }); + + let input = document.querySelectorAll('input[type=text]')[0]; + input.value = 'gitter.im'; + ReactTestUtils.Simulate.change(input); + }); + + it('invokes onChange event on delete', (done) => { + ReactTestUtils.act(() => { + ReactDOM.render( { + expect(value).to.have.lengthOf(1); + expect(value).to.have.members(['www.google.com/maps*']); + done(); + }} + />, container) + }); + + let button = document.querySelectorAll('input[type=button]')[0]; + ReactTestUtils.Simulate.click(button); + }); + + it('invokes onChange event on add', (done) => { + ReactTestUtils.act(() => { + ReactDOM.render( { + expect(value).to.have.lengthOf(2); + expect(value).to.have.members(['*.slack.com', '']); + done(); + }} + />, container); + }); + + let button = document.querySelector('input[type=button].ui-add-button'); + ReactTestUtils.Simulate.click(button); + }); + }); +}); diff --git a/test/settings/components/form/KeymapsForm.test.jsx b/test/settings/components/form/KeymapsForm.test.jsx deleted file mode 100644 index 6ac57c9..0000000 --- a/test/settings/components/form/KeymapsForm.test.jsx +++ /dev/null @@ -1,64 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import ReactTestRenderer from 'react-test-renderer'; -import ReactTestUtils from 'react-dom/test-utils'; -import KeymapsForm from 'settings/components/form/KeymapsForm' - -describe("settings/form/KeymapsForm", () => { - describe('render', () => { - it('renders keymap fields', () => { - let root = ReactTestRenderer.create().root - - let inputj = root.findByProps({ id: 'scroll.vertically?{"count":1}' }); - let inputk = root.findByProps({ id: 'scroll.vertically?{"count":-1}' }); - - expect(inputj.props.value).to.equal('j'); - expect(inputk.props.value).to.equal('k'); - }); - - it('renders blank value', () => { - let root = ReactTestRenderer.create().root; - - let inputj = root.findByProps({ id: 'scroll.vertically?{"count":1}' }); - let inputk = root.findByProps({ id: 'scroll.vertically?{"count":-1}' }); - - expect(inputj.props.value).to.be.empty; - expect(inputk.props.value).to.be.empty; - }); - }); - - describe('onChange event', () => { - let container; - - beforeEach(() => { - container = document.createElement('div'); - document.body.appendChild(container); - }); - - afterEach(() => { - document.body.removeChild(container); - container = null; - }); - - it('invokes onChange event on edit', (done) => { - ReactTestUtils.act(() => { - ReactDOM.render( { - expect(value['scroll.vertically?{"count":1}']).to.equal('jjj'); - done(); - }} />, container); - }); - - let input = document.getElementById('scroll.vertically?{"count":1}'); - input.value = 'jjj'; - ReactTestUtils.Simulate.change(input); - }); - }); -}); diff --git a/test/settings/components/form/KeymapsForm.test.tsx b/test/settings/components/form/KeymapsForm.test.tsx new file mode 100644 index 0000000..6ac57c9 --- /dev/null +++ b/test/settings/components/form/KeymapsForm.test.tsx @@ -0,0 +1,64 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import ReactTestRenderer from 'react-test-renderer'; +import ReactTestUtils from 'react-dom/test-utils'; +import KeymapsForm from 'settings/components/form/KeymapsForm' + +describe("settings/form/KeymapsForm", () => { + describe('render', () => { + it('renders keymap fields', () => { + let root = ReactTestRenderer.create().root + + let inputj = root.findByProps({ id: 'scroll.vertically?{"count":1}' }); + let inputk = root.findByProps({ id: 'scroll.vertically?{"count":-1}' }); + + expect(inputj.props.value).to.equal('j'); + expect(inputk.props.value).to.equal('k'); + }); + + it('renders blank value', () => { + let root = ReactTestRenderer.create().root; + + let inputj = root.findByProps({ id: 'scroll.vertically?{"count":1}' }); + let inputk = root.findByProps({ id: 'scroll.vertically?{"count":-1}' }); + + expect(inputj.props.value).to.be.empty; + expect(inputk.props.value).to.be.empty; + }); + }); + + describe('onChange event', () => { + let container; + + beforeEach(() => { + container = document.createElement('div'); + document.body.appendChild(container); + }); + + afterEach(() => { + document.body.removeChild(container); + container = null; + }); + + it('invokes onChange event on edit', (done) => { + ReactTestUtils.act(() => { + ReactDOM.render( { + expect(value['scroll.vertically?{"count":1}']).to.equal('jjj'); + done(); + }} />, container); + }); + + let input = document.getElementById('scroll.vertically?{"count":1}'); + input.value = 'jjj'; + ReactTestUtils.Simulate.change(input); + }); + }); +}); diff --git a/test/settings/components/form/PropertiesForm.test.jsx b/test/settings/components/form/PropertiesForm.test.jsx deleted file mode 100644 index 80f60d2..0000000 --- a/test/settings/components/form/PropertiesForm.test.jsx +++ /dev/null @@ -1,104 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import ReactTestRenderer from 'react-test-renderer'; -import ReactTestUtils from 'react-dom/test-utils'; -import PropertiesForm from 'settings/components/form/PropertiesForm' - -describe("settings/form/PropertiesForm", () => { - describe('render', () => { - it('renders PropertiesForm', () => { - let types = { - mystr: 'string', - mynum: 'number', - mybool: 'boolean', - empty: 'string', - } - let value = { - mystr: 'abc', - mynum: 123, - mybool: true, - }; - - let root = ReactTestRenderer.create( - , - ).root - - let input = root.findByProps({ name: 'mystr' }); - expect(input.props.type).to.equals('text'); - expect(input.props.value).to.equal('abc'); - - input = root.findByProps({ name: 'mynum' }); - expect(input.props.type).to.equals('number'); - expect(input.props.value).to.equal(123); - - input = root.findByProps({ name: 'mybool' }); - expect(input.props.type).to.equals('checkbox'); - expect(input.props.value).to.equal(true); - }); - }); - - describe('onChange', () => { - let container; - - beforeEach(() => { - container = document.createElement('div'); - document.body.appendChild(container); - }); - - afterEach(() => { - document.body.removeChild(container); - container = null; - }); - - it('invokes onChange event on text changed', (done) => { - ReactTestUtils.act(() => { - ReactDOM.render( { - expect(value).to.have.property('myvalue', 'abcd'); - done(); - }} - />, container); - }); - - let input = document.querySelector('input[name=myvalue]'); - input.value = 'abcd' - ReactTestUtils.Simulate.change(input); - }); - - it('invokes onChange event on number changeed', (done) => { - ReactTestUtils.act(() => { - ReactDOM.render( { - expect(value).to.have.property('myvalue', 1234); - done(); - }} - />, container); - }); - - let input = document.querySelector('input[name=myvalue]'); - input.value = '1234' - ReactTestUtils.Simulate.change(input); - }); - - it('invokes onChange event on checkbox changed', (done) => { - ReactTestUtils.act(() => { - ReactDOM.render( { - expect(value).to.have.property('myvalue', true); - done(); - }} - />, container); - }); - - let input = document.querySelector('input[name=myvalue]'); - input.checked = true; - ReactTestUtils.Simulate.change(input); - }); - }); -}); diff --git a/test/settings/components/form/PropertiesForm.test.tsx b/test/settings/components/form/PropertiesForm.test.tsx new file mode 100644 index 0000000..80f60d2 --- /dev/null +++ b/test/settings/components/form/PropertiesForm.test.tsx @@ -0,0 +1,104 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import ReactTestRenderer from 'react-test-renderer'; +import ReactTestUtils from 'react-dom/test-utils'; +import PropertiesForm from 'settings/components/form/PropertiesForm' + +describe("settings/form/PropertiesForm", () => { + describe('render', () => { + it('renders PropertiesForm', () => { + let types = { + mystr: 'string', + mynum: 'number', + mybool: 'boolean', + empty: 'string', + } + let value = { + mystr: 'abc', + mynum: 123, + mybool: true, + }; + + let root = ReactTestRenderer.create( + , + ).root + + let input = root.findByProps({ name: 'mystr' }); + expect(input.props.type).to.equals('text'); + expect(input.props.value).to.equal('abc'); + + input = root.findByProps({ name: 'mynum' }); + expect(input.props.type).to.equals('number'); + expect(input.props.value).to.equal(123); + + input = root.findByProps({ name: 'mybool' }); + expect(input.props.type).to.equals('checkbox'); + expect(input.props.value).to.equal(true); + }); + }); + + describe('onChange', () => { + let container; + + beforeEach(() => { + container = document.createElement('div'); + document.body.appendChild(container); + }); + + afterEach(() => { + document.body.removeChild(container); + container = null; + }); + + it('invokes onChange event on text changed', (done) => { + ReactTestUtils.act(() => { + ReactDOM.render( { + expect(value).to.have.property('myvalue', 'abcd'); + done(); + }} + />, container); + }); + + let input = document.querySelector('input[name=myvalue]'); + input.value = 'abcd' + ReactTestUtils.Simulate.change(input); + }); + + it('invokes onChange event on number changeed', (done) => { + ReactTestUtils.act(() => { + ReactDOM.render( { + expect(value).to.have.property('myvalue', 1234); + done(); + }} + />, container); + }); + + let input = document.querySelector('input[name=myvalue]'); + input.value = '1234' + ReactTestUtils.Simulate.change(input); + }); + + it('invokes onChange event on checkbox changed', (done) => { + ReactTestUtils.act(() => { + ReactDOM.render( { + expect(value).to.have.property('myvalue', true); + done(); + }} + />, container); + }); + + let input = document.querySelector('input[name=myvalue]'); + input.checked = true; + ReactTestUtils.Simulate.change(input); + }); + }); +}); diff --git a/test/settings/components/form/SearchEngineForm.test.jsx b/test/settings/components/form/SearchEngineForm.test.jsx deleted file mode 100644 index 06822f2..0000000 --- a/test/settings/components/form/SearchEngineForm.test.jsx +++ /dev/null @@ -1,128 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import ReactTestRenderer from 'react-test-renderer'; -import ReactTestUtils from 'react-dom/test-utils'; -import SearchForm from 'settings/components/form/SearchForm' - -describe("settings/form/SearchForm", () => { - describe('render', () => { - it('renders SearchForm', () => { - let root = ReactTestRenderer.create().root; - - let names = root.findAllByProps({ name: 'name' }); - expect(names).to.have.lengthOf(2); - expect(names[0].props.value).to.equal('google'); - expect(names[1].props.value).to.equal('yahoo'); - - let urls = root.findAllByProps({ name: 'url' }); - expect(urls).to.have.lengthOf(2); - expect(urls[0].props.value).to.equal('google.com'); - expect(urls[1].props.value).to.equal('yahoo.com'); - }); - - it('renders blank value', () => { - let root = ReactTestRenderer.create().root; - - let names = root.findAllByProps({ name: 'name' }); - expect(names).to.be.empty; - - let urls = root.findAllByProps({ name: 'url' }); - expect(urls).to.be.empty; - }); - - it('renders blank engines', () => { - let root = ReactTestRenderer.create( - , - ).root; - - let names = root.findAllByProps({ name: 'name' }); - expect(names).to.be.empty; - - let urls = root.findAllByProps({ name: 'url' }); - expect(urls).to.be.empty; - }); - }); - - describe('onChange event', () => { - let container; - - beforeEach(() => { - container = document.createElement('div'); - document.body.appendChild(container); - }); - - afterEach(() => { - document.body.removeChild(container); - container = null; - }); - - it('invokes onChange event on edit', (done) => { - ReactTestUtils.act(() => { - ReactDOM.render( { - expect(value.default).to.equal('louvre'); - expect(value.engines).to.have.lengthOf(2) - expect(value.engines).to.have.deep.members( - [['louvre', 'google.com'], ['yahoo', 'yahoo.com']] - ); - done(); - }} />, container); - }); - - let radio = document.querySelectorAll('input[type=radio]'); - radio.checked = true; - - let name = document.querySelector('input[name=name]'); - name.value = 'louvre'; - - ReactTestUtils.Simulate.change(name); - }); - - it('invokes onChange event on delete', (done) => { - ReactTestUtils.act(() => { - ReactDOM.render( { - expect(value.default).to.equal('yahoo'); - expect(value.engines).to.have.lengthOf(1) - expect(value.engines).to.have.deep.members( - [['yahoo', 'yahoo.com']] - ); - done(); - }} />, container); - }); - - let button = document.querySelector('input[type=button]'); - ReactTestUtils.Simulate.click(button); - }); - - it('invokes onChange event on add', (done) => { - ReactTestUtils.act(() => { - ReactDOM.render( { - expect(value.default).to.equal('yahoo'); - expect(value.engines).to.have.lengthOf(2) - expect(value.engines).to.have.deep.members( - [['google', 'google.com'], ['', '']], - ); - done(); - }} />, container); - }); - - let button = document.querySelector('input[type=button].ui-add-button'); - ReactTestUtils.Simulate.click(button); - }); - }); -}); diff --git a/test/settings/components/form/SearchEngineForm.test.tsx b/test/settings/components/form/SearchEngineForm.test.tsx new file mode 100644 index 0000000..06822f2 --- /dev/null +++ b/test/settings/components/form/SearchEngineForm.test.tsx @@ -0,0 +1,128 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import ReactTestRenderer from 'react-test-renderer'; +import ReactTestUtils from 'react-dom/test-utils'; +import SearchForm from 'settings/components/form/SearchForm' + +describe("settings/form/SearchForm", () => { + describe('render', () => { + it('renders SearchForm', () => { + let root = ReactTestRenderer.create().root; + + let names = root.findAllByProps({ name: 'name' }); + expect(names).to.have.lengthOf(2); + expect(names[0].props.value).to.equal('google'); + expect(names[1].props.value).to.equal('yahoo'); + + let urls = root.findAllByProps({ name: 'url' }); + expect(urls).to.have.lengthOf(2); + expect(urls[0].props.value).to.equal('google.com'); + expect(urls[1].props.value).to.equal('yahoo.com'); + }); + + it('renders blank value', () => { + let root = ReactTestRenderer.create().root; + + let names = root.findAllByProps({ name: 'name' }); + expect(names).to.be.empty; + + let urls = root.findAllByProps({ name: 'url' }); + expect(urls).to.be.empty; + }); + + it('renders blank engines', () => { + let root = ReactTestRenderer.create( + , + ).root; + + let names = root.findAllByProps({ name: 'name' }); + expect(names).to.be.empty; + + let urls = root.findAllByProps({ name: 'url' }); + expect(urls).to.be.empty; + }); + }); + + describe('onChange event', () => { + let container; + + beforeEach(() => { + container = document.createElement('div'); + document.body.appendChild(container); + }); + + afterEach(() => { + document.body.removeChild(container); + container = null; + }); + + it('invokes onChange event on edit', (done) => { + ReactTestUtils.act(() => { + ReactDOM.render( { + expect(value.default).to.equal('louvre'); + expect(value.engines).to.have.lengthOf(2) + expect(value.engines).to.have.deep.members( + [['louvre', 'google.com'], ['yahoo', 'yahoo.com']] + ); + done(); + }} />, container); + }); + + let radio = document.querySelectorAll('input[type=radio]'); + radio.checked = true; + + let name = document.querySelector('input[name=name]'); + name.value = 'louvre'; + + ReactTestUtils.Simulate.change(name); + }); + + it('invokes onChange event on delete', (done) => { + ReactTestUtils.act(() => { + ReactDOM.render( { + expect(value.default).to.equal('yahoo'); + expect(value.engines).to.have.lengthOf(1) + expect(value.engines).to.have.deep.members( + [['yahoo', 'yahoo.com']] + ); + done(); + }} />, container); + }); + + let button = document.querySelector('input[type=button]'); + ReactTestUtils.Simulate.click(button); + }); + + it('invokes onChange event on add', (done) => { + ReactTestUtils.act(() => { + ReactDOM.render( { + expect(value.default).to.equal('yahoo'); + expect(value.engines).to.have.lengthOf(2) + expect(value.engines).to.have.deep.members( + [['google', 'google.com'], ['', '']], + ); + done(); + }} />, container); + }); + + let button = document.querySelector('input[type=button].ui-add-button'); + ReactTestUtils.Simulate.click(button); + }); + }); +}); diff --git a/test/settings/components/ui/input.test.jsx b/test/settings/components/ui/input.test.jsx deleted file mode 100644 index 432efcb..0000000 --- a/test/settings/components/ui/input.test.jsx +++ /dev/null @@ -1,111 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import ReactTestUtils from 'react-dom/test-utils'; -import Input from 'settings/components/ui/Input' - -describe("settings/ui/Input", () => { - let container; - - beforeEach(() => { - container = document.createElement('div'); - document.body.appendChild(container); - }); - - afterEach(() => { - document.body.removeChild(container); - container = null; - }); - - context("type=text", () => { - it('renders text input', () => { - ReactTestUtils.act(() => { - ReactDOM.render( - , - container); - }); - - let label = document.querySelector('label'); - let input = document.querySelector('input'); - expect(label.textContent).to.contain('myfield'); - expect(input.type).to.contain('text'); - expect(input.name).to.contain('myname'); - expect(input.value).to.contain('myvalue'); - }); - - it('invoke onChange', (done) => { - ReactTestUtils.act(() => { - ReactDOM.render( { - expect(e.target.value).to.equal('newvalue'); - done(); - }}/>, container); - }); - - let input = document.querySelector('input'); - input.value = 'newvalue'; - ReactTestUtils.Simulate.change(input); - }); - }); - - context("type=radio", () => { - it('renders radio button', () => { - ReactTestUtils.act(() => { - ReactDOM.render( - , - container); - }); - - let label = document.querySelector('label'); - let input = document.querySelector('input'); - expect(label.textContent).to.contain('myfield'); - expect(input.type).to.contain('radio'); - expect(input.name).to.contain('myname'); - expect(input.value).to.contain('myvalue'); - }); - - it('invoke onChange', (done) => { - ReactTestUtils.act(() => { - ReactDOM.render( { - expect(e.target.checked).to.be.true; - done(); - }}/>, - container); - }); - - let input = document.querySelector('input'); - input.checked = true; - ReactTestUtils.Simulate.change(input); - }); - }); - - context("type=textarea", () => { - it('renders textarea button', () => { - ReactTestUtils.act(() => { - ReactDOM.render( - , - container); - }); - - let label = document.querySelector('label'); - let textarea = document.querySelector('textarea'); - let error = document.querySelector('.settings-ui-input-error'); - expect(label.textContent).to.contain('myfield'); - expect(textarea.nodeName).to.contain('TEXTAREA'); - expect(textarea.name).to.contain('myname'); - expect(textarea.value).to.contain('myvalue'); - expect(error.textContent).to.contain('myerror'); - }); - - it('invoke onChange', (done) => { - ReactTestUtils.act(() => { - ReactDOM.render( { - expect(e.target.value).to.equal('newvalue'); - done(); - }}/>, container); - }); - - let input = document.querySelector('textarea'); - input.value = 'newvalue' - ReactTestUtils.Simulate.change(input); - }); - }); -}); diff --git a/test/settings/components/ui/input.test.tsx b/test/settings/components/ui/input.test.tsx new file mode 100644 index 0000000..432efcb --- /dev/null +++ b/test/settings/components/ui/input.test.tsx @@ -0,0 +1,111 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import ReactTestUtils from 'react-dom/test-utils'; +import Input from 'settings/components/ui/Input' + +describe("settings/ui/Input", () => { + let container; + + beforeEach(() => { + container = document.createElement('div'); + document.body.appendChild(container); + }); + + afterEach(() => { + document.body.removeChild(container); + container = null; + }); + + context("type=text", () => { + it('renders text input', () => { + ReactTestUtils.act(() => { + ReactDOM.render( + , + container); + }); + + let label = document.querySelector('label'); + let input = document.querySelector('input'); + expect(label.textContent).to.contain('myfield'); + expect(input.type).to.contain('text'); + expect(input.name).to.contain('myname'); + expect(input.value).to.contain('myvalue'); + }); + + it('invoke onChange', (done) => { + ReactTestUtils.act(() => { + ReactDOM.render( { + expect(e.target.value).to.equal('newvalue'); + done(); + }}/>, container); + }); + + let input = document.querySelector('input'); + input.value = 'newvalue'; + ReactTestUtils.Simulate.change(input); + }); + }); + + context("type=radio", () => { + it('renders radio button', () => { + ReactTestUtils.act(() => { + ReactDOM.render( + , + container); + }); + + let label = document.querySelector('label'); + let input = document.querySelector('input'); + expect(label.textContent).to.contain('myfield'); + expect(input.type).to.contain('radio'); + expect(input.name).to.contain('myname'); + expect(input.value).to.contain('myvalue'); + }); + + it('invoke onChange', (done) => { + ReactTestUtils.act(() => { + ReactDOM.render( { + expect(e.target.checked).to.be.true; + done(); + }}/>, + container); + }); + + let input = document.querySelector('input'); + input.checked = true; + ReactTestUtils.Simulate.change(input); + }); + }); + + context("type=textarea", () => { + it('renders textarea button', () => { + ReactTestUtils.act(() => { + ReactDOM.render( + , + container); + }); + + let label = document.querySelector('label'); + let textarea = document.querySelector('textarea'); + let error = document.querySelector('.settings-ui-input-error'); + expect(label.textContent).to.contain('myfield'); + expect(textarea.nodeName).to.contain('TEXTAREA'); + expect(textarea.name).to.contain('myname'); + expect(textarea.value).to.contain('myvalue'); + expect(error.textContent).to.contain('myerror'); + }); + + it('invoke onChange', (done) => { + ReactTestUtils.act(() => { + ReactDOM.render( { + expect(e.target.value).to.equal('newvalue'); + done(); + }}/>, container); + }); + + let input = document.querySelector('textarea'); + input.value = 'newvalue' + ReactTestUtils.Simulate.change(input); + }); + }); +}); diff --git a/test/settings/reducers/setting.test.js b/test/settings/reducers/setting.test.js deleted file mode 100644 index c1a1648..0000000 --- a/test/settings/reducers/setting.test.js +++ /dev/null @@ -1,55 +0,0 @@ -import actions from 'settings/actions'; -import settingReducer from 'settings/reducers/setting'; - -describe("settings setting reducer", () => { - it('return the initial state', () => { - let state = settingReducer(undefined, {}); - expect(state).to.have.deep.property('json', ''); - expect(state).to.have.deep.property('form', null); - expect(state).to.have.deep.property('error', ''); - }); - - it('return next state for SETTING_SET_SETTINGS', () => { - let action = { - type: actions.SETTING_SET_SETTINGS, - source: 'json', - json: '{ "key": "value" }', - form: {}, - }; - let state = settingReducer(undefined, action); - expect(state).to.have.deep.property('source', 'json'); - expect(state).to.have.deep.property('json', '{ "key": "value" }'); - expect(state).to.have.deep.property('form', {}); - }); - - it('return next state for SETTING_SHOW_ERROR', () => { - let action = { - type: actions.SETTING_SHOW_ERROR, - error: 'bad value', - json: '{}', - }; - let state = settingReducer(undefined, action); - expect(state).to.have.deep.property('error', 'bad value'); - expect(state).to.have.deep.property('json', '{}'); - }); - - it('return next state for SETTING_SWITCH_TO_FORM', () => { - let action = { - type: actions.SETTING_SWITCH_TO_FORM, - form: {}, - }; - let state = settingReducer(undefined, action); - expect(state).to.have.deep.property('form', {}); - expect(state).to.have.deep.property('source', 'form'); - }); - - it('return next state for SETTING_SWITCH_TO_JSON', () => { - let action = { - type: actions.SETTING_SWITCH_TO_JSON, - json: '{}', - }; - let state = settingReducer(undefined, action); - expect(state).to.have.deep.property('json', '{}'); - expect(state).to.have.deep.property('source', 'json'); - }); -}); diff --git a/test/settings/reducers/setting.test.ts b/test/settings/reducers/setting.test.ts new file mode 100644 index 0000000..c1a1648 --- /dev/null +++ b/test/settings/reducers/setting.test.ts @@ -0,0 +1,55 @@ +import actions from 'settings/actions'; +import settingReducer from 'settings/reducers/setting'; + +describe("settings setting reducer", () => { + it('return the initial state', () => { + let state = settingReducer(undefined, {}); + expect(state).to.have.deep.property('json', ''); + expect(state).to.have.deep.property('form', null); + expect(state).to.have.deep.property('error', ''); + }); + + it('return next state for SETTING_SET_SETTINGS', () => { + let action = { + type: actions.SETTING_SET_SETTINGS, + source: 'json', + json: '{ "key": "value" }', + form: {}, + }; + let state = settingReducer(undefined, action); + expect(state).to.have.deep.property('source', 'json'); + expect(state).to.have.deep.property('json', '{ "key": "value" }'); + expect(state).to.have.deep.property('form', {}); + }); + + it('return next state for SETTING_SHOW_ERROR', () => { + let action = { + type: actions.SETTING_SHOW_ERROR, + error: 'bad value', + json: '{}', + }; + let state = settingReducer(undefined, action); + expect(state).to.have.deep.property('error', 'bad value'); + expect(state).to.have.deep.property('json', '{}'); + }); + + it('return next state for SETTING_SWITCH_TO_FORM', () => { + let action = { + type: actions.SETTING_SWITCH_TO_FORM, + form: {}, + }; + let state = settingReducer(undefined, action); + expect(state).to.have.deep.property('form', {}); + expect(state).to.have.deep.property('source', 'form'); + }); + + it('return next state for SETTING_SWITCH_TO_JSON', () => { + let action = { + type: actions.SETTING_SWITCH_TO_JSON, + json: '{}', + }; + let state = settingReducer(undefined, action); + expect(state).to.have.deep.property('json', '{}'); + expect(state).to.have.deep.property('source', 'json'); + }); +}); -- cgit v1.2.3 From e69497fab457df486b2a7068bdd0283505461f8b Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Thu, 2 May 2019 11:12:28 +0900 Subject: Types src/settings --- src/settings/actions/index.ts | 39 +++++++++++++++---- src/settings/actions/setting.ts | 18 ++++----- src/settings/components/form/BlacklistForm.tsx | 28 +++++++------ src/settings/components/form/KeymapsForm.tsx | 32 ++++++++------- src/settings/components/form/PropertiesForm.tsx | 32 ++++++++------- src/settings/components/form/SearchForm.tsx | 38 +++++++++--------- src/settings/components/index.tsx | 44 ++++++++++++--------- src/settings/components/ui/AddButton.tsx | 5 ++- src/settings/components/ui/DeleteButton.tsx | 5 ++- src/settings/components/ui/Input.tsx | 52 ++++++++++++++++++------- src/settings/reducers/setting.ts | 16 ++++++-- test/settings/reducers/setting.test.ts | 2 +- 12 files changed, 194 insertions(+), 117 deletions(-) (limited to 'test/settings') diff --git a/src/settings/actions/index.ts b/src/settings/actions/index.ts index 016f2a5..75c6bb5 100644 --- a/src/settings/actions/index.ts +++ b/src/settings/actions/index.ts @@ -1,7 +1,32 @@ -export default { - // Settings - SETTING_SET_SETTINGS: 'setting.set.settings', - SETTING_SHOW_ERROR: 'setting.show.error', - SETTING_SWITCH_TO_FORM: 'setting.switch.to.form', - SETTING_SWITCH_TO_JSON: 'setting.switch.to.json', -}; +// Settings +export const SETTING_SET_SETTINGS = 'setting.set.settings'; +export const SETTING_SHOW_ERROR = 'setting.show.error'; +export const SETTING_SWITCH_TO_FORM = 'setting.switch.to.form'; +export const SETTING_SWITCH_TO_JSON = 'setting.switch.to.json'; + +interface SettingSetSettingsAcion { + type: typeof SETTING_SET_SETTINGS; + source: string; + json: string; + form: any; +} + +interface SettingShowErrorAction { + type: typeof SETTING_SHOW_ERROR; + error: string; + json: string; +} + +interface SettingSwitchToFormAction { + type: typeof SETTING_SWITCH_TO_FORM; + form: any; +} + +interface SettingSwitchToJsonAction { + type: typeof SETTING_SWITCH_TO_JSON; + json: string; +} + +export type SettingAction = + SettingSetSettingsAcion | SettingShowErrorAction | + SettingSwitchToFormAction | SettingSwitchToJsonAction; diff --git a/src/settings/actions/setting.ts b/src/settings/actions/setting.ts index db63a45..b03cd80 100644 --- a/src/settings/actions/setting.ts +++ b/src/settings/actions/setting.ts @@ -1,15 +1,15 @@ -import actions from 'settings/actions'; -import * as validator from 'shared/settings/validator'; -import * as settingsValues from 'shared/settings/values'; -import * as settingsStorage from 'shared/settings/storage'; +import * as actions from './index'; +import * as validator from '../../shared/settings/validator'; +import * as settingsValues from '../../shared/settings/values'; +import * as settingsStorage from '../../shared/settings/storage'; import keymaps from '../keymaps'; -const load = async() => { +const load = async(): Promise => { let settings = await settingsStorage.loadRaw(); return set(settings); }; -const save = async(settings) => { +const save = async(settings: any): Promise => { try { if (settings.source === 'json') { let value = JSON.parse(settings.json); @@ -26,7 +26,7 @@ const save = async(settings) => { return set(settings); }; -const switchToForm = (json) => { +const switchToForm = (json: string): actions.SettingAction => { try { validator.validate(JSON.parse(json)); let form = settingsValues.formFromJson(json, keymaps.allowedOps); @@ -43,7 +43,7 @@ const switchToForm = (json) => { } }; -const switchToJson = (form) => { +const switchToJson = (form: any): actions.SettingAction => { let json = settingsValues.jsonFromForm(form); return { type: actions.SETTING_SWITCH_TO_JSON, @@ -51,7 +51,7 @@ const switchToJson = (form) => { }; }; -const set = (settings) => { +const set = (settings: any): actions.SettingAction => { return { type: actions.SETTING_SET_SETTINGS, source: settings.source, diff --git a/src/settings/components/form/BlacklistForm.tsx b/src/settings/components/form/BlacklistForm.tsx index c470758..637bc1e 100644 --- a/src/settings/components/form/BlacklistForm.tsx +++ b/src/settings/components/form/BlacklistForm.tsx @@ -2,9 +2,19 @@ import './BlacklistForm.scss'; import AddButton from '../ui/AddButton'; import DeleteButton from '../ui/DeleteButton'; import React from 'react'; -import PropTypes from 'prop-types'; -class BlacklistForm extends React.Component { +interface Props { + value: string[]; + onChange: (value: string[]) => void; + onBlur: () => void; +} + +class BlacklistForm extends React.Component { + public static defaultProps: Props = { + value: [], + onChange: () => {}, + onBlur: () => {}, + }; render() { return
@@ -28,7 +38,7 @@ class BlacklistForm extends React.Component {
; } - bindValue(e) { + bindValue(e: any) { let name = e.target.name; let index = e.target.getAttribute('data-index'); let next = this.props.value ? this.props.value.slice() : []; @@ -48,16 +58,4 @@ class BlacklistForm extends React.Component { } } -BlacklistForm.propTypes = { - value: PropTypes.arrayOf(PropTypes.string), - onChange: PropTypes.func, - onBlur: PropTypes.func, -}; - -BlacklistForm.defaultProps = { - value: [], - onChange: () => {}, - onBlur: () => {}, -}; - export default BlacklistForm; diff --git a/src/settings/components/form/KeymapsForm.tsx b/src/settings/components/form/KeymapsForm.tsx index 01acf61..ab44464 100644 --- a/src/settings/components/form/KeymapsForm.tsx +++ b/src/settings/components/form/KeymapsForm.tsx @@ -1,10 +1,22 @@ import './KeymapsForm.scss'; import React from 'react'; -import PropTypes from 'prop-types'; import Input from '../ui/Input'; import keymaps from '../../keymaps'; -class KeymapsForm extends React.Component { +type Value = {[key: string]: string}; + +interface Props{ + value: Value; + onChange: (e: Value) => void; + onBlur: () => void; +} + +class KeymapsForm extends React.Component { + public static defaultProps: Props = { + value: {}, + onChange: () => {}, + onBlur: () => {}, + } render() { return
@@ -19,7 +31,7 @@ class KeymapsForm extends React.Component { return ; }) @@ -30,22 +42,12 @@ class KeymapsForm extends React.Component {
; } - bindValue(e) { + bindValue(name: string, value: string) { let next = { ...this.props.value }; - next[e.target.name] = e.target.value; + next[name] = value; this.props.onChange(next); } } -KeymapsForm.propTypes = { - value: PropTypes.objectOf(PropTypes.string), - onChange: PropTypes.func, -}; - -KeymapsForm.defaultProps = { - value: {}, - onChange: () => {}, -}; - export default KeymapsForm; diff --git a/src/settings/components/form/PropertiesForm.tsx b/src/settings/components/form/PropertiesForm.tsx index 979fdd8..0be5f5c 100644 --- a/src/settings/components/form/PropertiesForm.tsx +++ b/src/settings/components/form/PropertiesForm.tsx @@ -1,8 +1,20 @@ import './PropertiesForm.scss'; import React from 'react'; -import PropTypes from 'prop-types'; -class PropertiesForm extends React.Component { +interface Props { + types: {[key: string]: string}; + value: {[key: string]: any}; + onChange: (value: any) => void; + onBlur: () => void; +} + +class PropertiesForm extends React.Component { + public static defaultProps: Props = { + types: {}, + value: {}, + onChange: () => {}, + onBlur: () => {}, + }; render() { let types = this.props.types; @@ -12,13 +24,15 @@ class PropertiesForm extends React.Component { { Object.keys(types).map((name) => { let type = types[name]; - let inputType = null; + let inputType = ''; if (type === 'string') { inputType = 'text'; } else if (type === 'number') { inputType = 'number'; } else if (type === 'boolean') { inputType = 'checkbox'; + } else { + return null; } return
; } - bindValue(e) { + bindValue(e: React.ChangeEvent) { let name = e.target.name; let next = { ...this.props.value }; if (e.target.type.toLowerCase() === 'checkbox') { @@ -52,14 +66,4 @@ class PropertiesForm extends React.Component { } } -PropertiesForm.propTypes = { - value: PropTypes.objectOf(PropTypes.any), - onChange: PropTypes.func, -}; - -PropertiesForm.defaultProps = { - value: {}, - onChange: () => {}, -}; - export default PropertiesForm; diff --git a/src/settings/components/form/SearchForm.tsx b/src/settings/components/form/SearchForm.tsx index 6b0bd01..737e291 100644 --- a/src/settings/components/form/SearchForm.tsx +++ b/src/settings/components/form/SearchForm.tsx @@ -1,10 +1,25 @@ import './SearchForm.scss'; import React from 'react'; -import PropTypes from 'prop-types'; import AddButton from '../ui/AddButton'; import DeleteButton from '../ui/DeleteButton'; -class SearchForm extends React.Component { +interface Value { + default: string; + engines: string[][]; +} + +interface Props { + value: Value; + onChange: (value: Value) => void; + onBlur: () => void; +} + +class SearchForm extends React.Component { + public static defaultProps: Props = { + value: { default: '', engines: []}, + onChange: () => {}, + onBlur: () => {}, + } render() { let value = this.props.value; @@ -47,11 +62,11 @@ class SearchForm extends React.Component { ; } - bindValue(e) { + bindValue(e: any) { let value = this.props.value; let name = e.target.name; - let index = e.target.getAttribute('data-index'); - let next = { + let index = Number(e.target.getAttribute('data-index')); + let next: Value = { default: value.default, engines: value.engines ? value.engines.slice() : [], }; @@ -76,17 +91,4 @@ class SearchForm extends React.Component { } } -SearchForm.propTypes = { - value: PropTypes.shape({ - default: PropTypes.string, - engines: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.string)), - }), - onChange: PropTypes.func, -}; - -SearchForm.defaultProps = { - value: { default: '', engines: []}, - onChange: () => {}, -}; - export default SearchForm; diff --git a/src/settings/components/index.tsx b/src/settings/components/index.tsx index 4ef59d7..f56e93f 100644 --- a/src/settings/components/index.tsx +++ b/src/settings/components/index.tsx @@ -6,19 +6,29 @@ import SearchForm from './form/SearchForm'; import KeymapsForm from './form/KeymapsForm'; import BlacklistForm from './form/BlacklistForm'; import PropertiesForm from './form/PropertiesForm'; -import * as properties from 'shared/settings/properties'; -import * as settingActions from 'settings/actions/setting'; +import * as properties from '../../shared/settings/properties'; +import * as settingActions from '../../settings/actions/setting'; const DO_YOU_WANT_TO_CONTINUE = 'Some settings in JSON can be lost when migrating. ' + 'Do you want to continue?'; -class SettingsComponent extends React.Component { +interface Props { + source: string; + json: string; + form: any; + error: string; + + // FIXME + store: any; +} + +class SettingsComponent extends React.Component { componentDidMount() { this.props.dispatch(settingActions.load()); } - renderFormFields(form) { + renderFormFields(form: any) { return
Keybindings @@ -56,15 +66,15 @@ class SettingsComponent extends React.Component {
; } - renderJsonFields(json, error) { + renderJsonFields(json: string, error: string) { return
@@ -90,7 +100,7 @@ class SettingsComponent extends React.Component { label='Use form' checked={this.props.source === 'form'} value='form' - onChange={this.bindSource.bind(this)} + onValueChange={this.bindSource.bind(this)} disabled={disabled} /> { fields } @@ -107,7 +117,7 @@ class SettingsComponent extends React.Component { ); } - bindForm(name, value) { + bindForm(name: string, value: any) { let settings = { source: this.props.source, json: this.props.json, @@ -117,22 +127,20 @@ class SettingsComponent extends React.Component { this.props.dispatch(settingActions.set(settings)); } - bindJson(e) { + bindJson(_name: string, value: string) { let settings = { source: this.props.source, - json: e.target.value, + json: value, form: this.props.form, }; this.props.dispatch(settingActions.set(settings)); } - bindSource(e) { + bindSource(_name: string, value: string) { let from = this.props.source; - let to = e.target.value; - - if (from === 'form' && to === 'json') { + if (from === 'form' && value === 'json') { this.props.dispatch(settingActions.switchToJson(this.props.form)); - } else if (from === 'json' && to === 'form') { + } else if (from === 'json' && value === 'form') { let b = window.confirm(DO_YOU_WANT_TO_CONTINUE); if (!b) { this.forceUpdate(); @@ -148,6 +156,6 @@ class SettingsComponent extends React.Component { } } -const mapStateToProps = state => state; +const mapStateToProps = (state: any) => state; export default connect(mapStateToProps)(SettingsComponent); diff --git a/src/settings/components/ui/AddButton.tsx b/src/settings/components/ui/AddButton.tsx index 185a03b..0577068 100644 --- a/src/settings/components/ui/AddButton.tsx +++ b/src/settings/components/ui/AddButton.tsx @@ -1,7 +1,10 @@ import './AddButton.scss'; import React from 'react'; -class AddButton extends React.Component { +interface Props extends React.AllHTMLAttributes { +} + +class AddButton extends React.Component { render() { return { +} + +class DeleteButton extends React.Component { render() { return { + name: string; + type: string; + error?: string; + label: string; + value: string; + onValueChange?: (name: string, value: string) => void; + onBlur?: (e: React.FocusEvent) => void; +} - renderText(props) { +class Input extends React.Component { + renderText(props: Props) { let inputClassName = props.error ? 'input-error' : ''; + let pp = { ...props }; + delete pp.onValueChange; return
- +
; } - renderRadio(props) { + renderRadio(props: Props) { let inputClassName = props.error ? 'input-error' : ''; + let pp = { ...props }; + delete pp.onValueChange; return
; } - renderTextArea(props) { + renderTextArea(props: Props) { let inputClassName = props.error ? 'input-error' : ''; + let pp = { ...props }; + delete pp.onValueChange; return
-