diff --git a/package-lock.json b/package-lock.json index c1a0565e..1fec2639 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4296,6 +4296,7 @@ "anymatch": "^2.0.0", "async-each": "^1.0.0", "braces": "^2.3.0", + "fsevents": "^1.2.2", "glob-parent": "^3.1.0", "inherits": "^2.0.1", "is-binary-path": "^1.0.0", @@ -7042,6 +7043,535 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.8.tgz", + "integrity": "sha512-tPvHgPGB7m40CZ68xqFGkKuzN+RnpGmSV+hgeKxhRpbxdqKXUFJGC3yonBOLzQBcJyGpdZFDfCsdOC2KFsXzeA==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + }, "fstream": { "version": "1.0.11", "resolved": "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz", @@ -14185,6 +14715,7 @@ "capture-exit": "^1.2.0", "exec-sh": "^0.2.0", "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", "micromatch": "^3.1.4", "minimist": "^1.1.1", "walker": "~1.0.5", diff --git a/test/common/Home.test.js b/test/common/Home.test.js index 83e01ba2..6fb094a5 100644 --- a/test/common/Home.test.js +++ b/test/common/Home.test.js @@ -1,7 +1,6 @@ import { shallow } from 'enzyme'; import { values } from 'ramda'; import React from 'react'; -import * as sinon from 'sinon'; import Home from '../../src/common/Home'; describe('', () => { @@ -28,11 +27,11 @@ describe('', () => { }); it('resets selected server when mounted', () => { - const resetSelectedServer = sinon.spy(); + const resetSelectedServer = jest.fn(); - expect(resetSelectedServer.called).toEqual(false); + expect(resetSelectedServer).not.toHaveBeenCalled(); createComponent({ resetSelectedServer }); - expect(resetSelectedServer.called).toEqual(true); + expect(resetSelectedServer).toHaveBeenCalled(); }); it('shows link to create server when no servers exist', () => { diff --git a/test/common/ScrollToTop.test.js b/test/common/ScrollToTop.test.js index 77d428e5..b49450db 100644 --- a/test/common/ScrollToTop.test.js +++ b/test/common/ScrollToTop.test.js @@ -1,12 +1,11 @@ import React from 'react'; import { shallow } from 'enzyme'; -import * as sinon from 'sinon'; import createScrollToTop from '../../src/common/ScrollToTop'; describe('', () => { let wrapper; const window = { - scrollTo: sinon.spy(), + scrollTo: jest.fn(), }; beforeEach(() => { @@ -17,13 +16,13 @@ describe('', () => { afterEach(() => { wrapper.unmount(); - window.scrollTo.resetHistory(); + window.scrollTo.mockReset(); }); it('just renders children', () => expect(wrapper.text()).toEqual('Foobar')); it('scrolls to top when location changes', () => { wrapper.instance().componentDidUpdate({ location: { href: 'bar' } }); - expect(window.scrollTo.calledOnce).toEqual(true); + expect(window.scrollTo).toHaveBeenCalledTimes(1); }); }); diff --git a/test/servers/CreateServer.test.js b/test/servers/CreateServer.test.js index ed6aff67..69a7888e 100644 --- a/test/servers/CreateServer.test.js +++ b/test/servers/CreateServer.test.js @@ -1,20 +1,18 @@ import React from 'react'; import { shallow } from 'enzyme'; import { identity } from 'ramda'; -import sinon from 'sinon'; import createServerConstruct from '../../src/servers/CreateServer'; describe('', () => { let wrapper; const ImportServersBtn = () => ''; - const createServerMock = sinon.fake(); + const createServerMock = jest.fn(); const historyMock = { - push: sinon.fake(), + push: jest.fn(), }; beforeEach(() => { - createServerMock.resetHistory(); - historyMock.push.resetHistory(); + createServerMock.mockReset(); const CreateServer = createServerConstruct(ImportServersBtn); @@ -44,8 +42,8 @@ describe('', () => { return ''; } }); - expect(createServerMock.callCount).toEqual(1); - expect(historyMock.push.callCount).toEqual(1); + expect(createServerMock).toHaveBeenCalledTimes(1); + expect(historyMock.push).toHaveBeenCalledTimes(1); }); it('updates state when inputs are changed', () => { diff --git a/test/servers/DeleteServerModal.test.js b/test/servers/DeleteServerModal.test.js index ab06004d..21f938c7 100644 --- a/test/servers/DeleteServerModal.test.js +++ b/test/servers/DeleteServerModal.test.js @@ -1,20 +1,19 @@ import React from 'react'; import { shallow } from 'enzyme'; -import sinon from 'sinon'; import { Modal, ModalBody, ModalFooter, ModalHeader } from 'reactstrap'; import DeleteServerModal from '../../src/servers/DeleteServerModal'; describe('', () => { let wrapper; - const deleteServerMock = sinon.fake(); - const historyMock = { push: sinon.fake() }; - const toggleMock = sinon.fake(); + const deleteServerMock = jest.fn(); + const historyMock = { push: jest.fn() }; + const toggleMock = jest.fn(); const serverName = 'the_server_name'; beforeEach(() => { - toggleMock.resetHistory(); - deleteServerMock.resetHistory(); - historyMock.push.resetHistory(); + deleteServerMock.mockReset(); + toggleMock.mockReset(); + historyMock.push.mockReset(); wrapper = shallow( ', () => { cancelBtn.simulate('click'); - expect(toggleMock.callCount).toEqual(1); - expect(deleteServerMock.callCount).toEqual(0); - expect(historyMock.push.callCount).toEqual(0); + expect(toggleMock).toHaveBeenCalledTimes(1); + expect(deleteServerMock).not.toHaveBeenCalled(); + expect(historyMock.push).not.toHaveBeenCalled(); }); it('deletes server when clicking accept button', () => { @@ -58,8 +57,8 @@ describe('', () => { acceptBtn.simulate('click'); - expect(toggleMock.callCount).toEqual(1); - expect(deleteServerMock.callCount).toEqual(1); - expect(historyMock.push.callCount).toEqual(1); + expect(toggleMock).toHaveBeenCalledTimes(1); + expect(deleteServerMock).toHaveBeenCalledTimes(1); + expect(historyMock.push).toHaveBeenCalledTimes(1); }); }); diff --git a/test/servers/helpers/ImportServersBtn.test.js b/test/servers/helpers/ImportServersBtn.test.js index 269cd300..d4c68186 100644 --- a/test/servers/helpers/ImportServersBtn.test.js +++ b/test/servers/helpers/ImportServersBtn.test.js @@ -1,25 +1,24 @@ import React from 'react'; -import sinon from 'sinon'; import { shallow } from 'enzyme'; import { UncontrolledTooltip } from 'reactstrap'; import importServersBtnConstruct from '../../../src/servers/helpers/ImportServersBtn'; describe('', () => { let wrapper; - const onImportMock = sinon.fake(); - const createServersMock = sinon.fake(); + const onImportMock = jest.fn(); + const createServersMock = jest.fn(); const serversImporterMock = { - importServersFromFile: sinon.fake.returns(Promise.resolve([])), + importServersFromFile: jest.fn().mockResolvedValue([]), }; const fileRef = { - current: { click: sinon.fake() }, + current: { click: jest.fn() }, }; beforeEach(() => { - onImportMock.resetHistory(); - createServersMock.resetHistory(); - serversImporterMock.importServersFromFile.resetHistory(); - fileRef.current.click.resetHistory(); + onImportMock.mockReset(); + createServersMock.mockReset(); + serversImporterMock.importServersFromFile.mockClear(); + fileRef.current.click.mockReset(); const ImportServersBtn = importServersBtnConstruct(serversImporterMock); @@ -40,7 +39,7 @@ describe('', () => { btn.simulate('click'); - expect(fileRef.current.click.callCount).toEqual(1); + expect(fileRef.current.click).toHaveBeenCalledTimes(1); }); it('imports servers when file input changes', (done) => { @@ -49,9 +48,9 @@ describe('', () => { file.simulate('change', { target: { files: [ '' ] } }); setImmediate(() => { - expect(serversImporterMock.importServersFromFile.callCount).toEqual(1); - expect(createServersMock.callCount).toEqual(1); - expect(onImportMock.callCount).toEqual(1); + expect(serversImporterMock.importServersFromFile).toHaveBeenCalledTimes(1); + expect(createServersMock).toHaveBeenCalledTimes(1); + expect(onImportMock).toHaveBeenCalledTimes(1); done(); }); }); diff --git a/test/servers/reducers/selectedServer.test.js b/test/servers/reducers/selectedServer.test.js index 423637d6..3a0bec3c 100644 --- a/test/servers/reducers/selectedServer.test.js +++ b/test/servers/reducers/selectedServer.test.js @@ -1,4 +1,3 @@ -import * as sinon from 'sinon'; import reducer, { selectServer, resetSelectedServer, @@ -31,31 +30,35 @@ describe('selectedServerReducer', () => { id: serverId, }; const ServersServiceMock = { - findServerById: sinon.fake.returns(selectedServer), + findServerById: jest.fn(() => selectedServer), }; afterEach(() => { - ServersServiceMock.findServerById.resetHistory(); + ServersServiceMock.findServerById.mockClear(); }); it('dispatches proper actions', () => { - const dispatch = sinon.spy(); + const dispatch = jest.fn(); const expectedDispatchCalls = 2; selectServer(ServersServiceMock)(serverId)(dispatch); - expect(dispatch.callCount).toEqual(expectedDispatchCalls); - expect(dispatch.firstCall.calledWith({ type: RESET_SHORT_URL_PARAMS })).toEqual(true); - expect(dispatch.secondCall.calledWith({ - type: SELECT_SERVER, - selectedServer, - })).toEqual(true); + const [ firstCallArgs, secondCallArgs ] = dispatch.mock.calls; + + expect(dispatch).toHaveBeenCalledTimes(expectedDispatchCalls); + expect(firstCallArgs).toEqual([{ type: RESET_SHORT_URL_PARAMS }]); + expect(secondCallArgs).toEqual([ + { + type: SELECT_SERVER, + selectedServer, + }, + ]); }); it('invokes dependencies', () => { selectServer(ServersServiceMock)(serverId)(() => {}); - expect(ServersServiceMock.findServerById.callCount).toEqual(1); + expect(ServersServiceMock.findServerById).toHaveBeenCalledTimes(1); }); }); }); diff --git a/test/servers/reducers/server.test.js b/test/servers/reducers/server.test.js index cbf81d00..2d68e381 100644 --- a/test/servers/reducers/server.test.js +++ b/test/servers/reducers/server.test.js @@ -1,4 +1,3 @@ -import * as sinon from 'sinon'; import { values } from 'ramda'; import reducer, { createServer, @@ -15,10 +14,10 @@ describe('serverReducer', () => { }; const expectedFetchServersResult = { type: FETCH_SERVERS, payload }; const ServersServiceMock = { - listServers: sinon.fake.returns(payload), - createServer: sinon.fake(), - deleteServer: sinon.fake(), - createServers: sinon.fake(), + listServers: jest.fn(() => payload), + createServer: jest.fn(), + deleteServer: jest.fn(), + createServers: jest.fn(), }; describe('reducer', () => { @@ -28,10 +27,10 @@ describe('serverReducer', () => { describe('action creators', () => { beforeEach(() => { - ServersServiceMock.listServers.resetHistory(); - ServersServiceMock.createServer.resetHistory(); - ServersServiceMock.deleteServer.resetHistory(); - ServersServiceMock.createServers.resetHistory(); + ServersServiceMock.listServers.mockClear(); + ServersServiceMock.createServer.mockReset(); + ServersServiceMock.deleteServer.mockReset(); + ServersServiceMock.createServers.mockReset(); }); describe('listServers', () => { @@ -39,10 +38,10 @@ describe('serverReducer', () => { const result = listServers(ServersServiceMock)(); expect(result).toEqual(expectedFetchServersResult); - expect(ServersServiceMock.listServers.calledOnce).toEqual(true); - expect(ServersServiceMock.createServer.called).toEqual(false); - expect(ServersServiceMock.deleteServer.called).toEqual(false); - expect(ServersServiceMock.createServers.called).toEqual(false); + expect(ServersServiceMock.listServers).toHaveBeenCalledTimes(1); + expect(ServersServiceMock.createServer).not.toHaveBeenCalled(); + expect(ServersServiceMock.deleteServer).not.toHaveBeenCalled(); + expect(ServersServiceMock.createServers).not.toHaveBeenCalled(); }); }); @@ -52,11 +51,11 @@ describe('serverReducer', () => { const result = createServer(ServersServiceMock, () => expectedFetchServersResult)(serverToCreate); expect(result).toEqual(expectedFetchServersResult); - expect(ServersServiceMock.createServer.calledOnce).toEqual(true); - expect(ServersServiceMock.createServer.firstCall.calledWith(serverToCreate)).toEqual(true); - expect(ServersServiceMock.listServers.called).toEqual(false); - expect(ServersServiceMock.deleteServer.called).toEqual(false); - expect(ServersServiceMock.createServers.called).toEqual(false); + expect(ServersServiceMock.createServer).toHaveBeenCalledTimes(1); + expect(ServersServiceMock.createServer.mock.calls[0]).toEqual([ serverToCreate ]); + expect(ServersServiceMock.listServers).not.toHaveBeenCalled(); + expect(ServersServiceMock.deleteServer).not.toHaveBeenCalled(); + expect(ServersServiceMock.createServers).not.toHaveBeenCalled(); }); }); @@ -66,11 +65,11 @@ describe('serverReducer', () => { const result = deleteServer(ServersServiceMock, () => expectedFetchServersResult)(serverToDelete); expect(result).toEqual(expectedFetchServersResult); - expect(ServersServiceMock.listServers.called).toEqual(false); - expect(ServersServiceMock.createServer.called).toEqual(false); - expect(ServersServiceMock.createServers.called).toEqual(false); - expect(ServersServiceMock.deleteServer.calledOnce).toEqual(true); - expect(ServersServiceMock.deleteServer.firstCall.calledWith(serverToDelete)).toEqual(true); + expect(ServersServiceMock.listServers).not.toHaveBeenCalled(); + expect(ServersServiceMock.createServer).not.toHaveBeenCalled(); + expect(ServersServiceMock.createServers).not.toHaveBeenCalled(); + expect(ServersServiceMock.deleteServer).toHaveBeenCalledTimes(1); + expect(ServersServiceMock.deleteServer.mock.calls[0]).toEqual([ serverToDelete ]); }); }); @@ -80,11 +79,11 @@ describe('serverReducer', () => { const result = createServers(ServersServiceMock, () => expectedFetchServersResult)(serversToCreate); expect(result).toEqual(expectedFetchServersResult); - expect(ServersServiceMock.listServers.called).toEqual(false); - expect(ServersServiceMock.createServer.called).toEqual(false); - expect(ServersServiceMock.createServers.calledOnce).toEqual(true); - expect(ServersServiceMock.createServers.firstCall.calledWith(serversToCreate)).toEqual(true); - expect(ServersServiceMock.deleteServer.called).toEqual(false); + expect(ServersServiceMock.listServers).not.toHaveBeenCalled(); + expect(ServersServiceMock.createServer).not.toHaveBeenCalled(); + expect(ServersServiceMock.createServers).toHaveBeenCalledTimes(1); + expect(ServersServiceMock.createServers.mock.calls[0]).toEqual([ serversToCreate ]); + expect(ServersServiceMock.deleteServer).not.toHaveBeenCalled(); }); }); }); diff --git a/test/servers/services/ServersExporter.test.js b/test/servers/services/ServersExporter.test.js index 173292e3..772df918 100644 --- a/test/servers/services/ServersExporter.test.js +++ b/test/servers/services/ServersExporter.test.js @@ -1,26 +1,25 @@ -import sinon from 'sinon'; import ServersExporter from '../../../src/servers/services/ServersExporter'; describe('ServersExporter', () => { const createLinkMock = () => ({ - setAttribute: sinon.fake(), - click: sinon.fake(), + setAttribute: jest.fn(), + click: jest.fn(), style: {}, }); const createWindowMock = (isIe10 = true) => ({ navigator: { - msSaveBlob: isIe10 ? sinon.fake() : undefined, + msSaveBlob: isIe10 ? jest.fn() : undefined, }, document: { - createElement: sinon.fake.returns(createLinkMock()), + createElement: jest.fn(() => createLinkMock()), body: { - appendChild: sinon.fake(), - removeChild: sinon.fake(), + appendChild: jest.fn(), + removeChild: jest.fn(), }, }, }); const serversServiceMock = { - listServers: sinon.fake.returns({ + listServers: jest.fn(() => ({ abc123: { id: 'abc123', name: 'foo', @@ -29,10 +28,16 @@ describe('ServersExporter', () => { id: 'def456', name: 'bar', }, - }), + })), }; const createCsvjsonMock = (throwError = false) => ({ - toCSV: throwError ? sinon.fake.throws('') : sinon.fake.returns(''), + toCSV: jest.fn(() => { + if (throwError) { + throw new Error(''); + } + + return ''; + }), }); describe('exportServers', () => { @@ -40,10 +45,10 @@ describe('ServersExporter', () => { beforeEach(() => { originalConsole = global.console; - global.console = { error: sinon.fake() }; + global.console = { error: jest.fn() }; global.Blob = class Blob {}; global.URL = { createObjectURL: () => '' }; - serversServiceMock.listServers.resetHistory(); + serversServiceMock.listServers.mockReset(); }); afterEach(() => { global.console = originalConsole; @@ -59,8 +64,8 @@ describe('ServersExporter', () => { exporter.exportServers(); - expect(global.console.error.callCount).toEqual(1); - expect(csvjsonMock.toCSV.callCount).toEqual(1); + expect(global.console.error).toHaveBeenCalledTimes(1); + expect(csvjsonMock.toCSV).toHaveBeenCalledTimes(1); }); it('makes use of msSaveBlob API when available', () => { @@ -73,9 +78,9 @@ describe('ServersExporter', () => { exporter.exportServers(); - expect(serversServiceMock.listServers.callCount).toEqual(1); - expect(windowMock.navigator.msSaveBlob.callCount).toEqual(1); - expect(windowMock.document.createElement.callCount).toEqual(0); + expect(serversServiceMock.listServers).toHaveBeenCalledTimes(1); + expect(windowMock.navigator.msSaveBlob).toHaveBeenCalledTimes(1); + expect(windowMock.document.createElement).not.toHaveBeenCalled(); }); it('makes use of download link API when available', () => { @@ -88,10 +93,10 @@ describe('ServersExporter', () => { exporter.exportServers(); - expect(serversServiceMock.listServers.callCount).toEqual(1); - expect(windowMock.document.createElement.callCount).toEqual(1); - expect(windowMock.document.body.appendChild.callCount).toEqual(1); - expect(windowMock.document.body.removeChild.callCount).toEqual(1); + expect(serversServiceMock.listServers).toHaveBeenCalledTimes(1); + expect(windowMock.document.createElement).toHaveBeenCalledTimes(1); + expect(windowMock.document.body.appendChild).toHaveBeenCalledTimes(1); + expect(windowMock.document.body.removeChild).toHaveBeenCalledTimes(1); }); }); }); diff --git a/test/servers/services/ServersImporter.test.js b/test/servers/services/ServersImporter.test.js index ef79d790..217cc0bf 100644 --- a/test/servers/services/ServersImporter.test.js +++ b/test/servers/services/ServersImporter.test.js @@ -1,14 +1,13 @@ -import sinon from 'sinon'; import ServersImporter from '../../../src/servers/services/ServersImporter'; describe('ServersImporter', () => { const servers = [{ name: 'foo' }, { name: 'bar' }]; const csvjsonMock = { - toObject: sinon.fake.returns(servers), + toObject: jest.fn(() => servers), }; const importer = new ServersImporter(csvjsonMock); - beforeEach(() => csvjsonMock.toObject.resetHistory()); + beforeEach(() => csvjsonMock.toObject.mockClear()); describe('importServersFromFile', () => { it('rejects with error if no file was provided', async () => { @@ -28,7 +27,7 @@ describe('ServersImporter', () => { }); it('reads file when a CSV is provided', async () => { - const readAsText = sinon.fake.returns(''); + const readAsText = jest.fn(() => ''); global.FileReader = class FileReader { constructor() { @@ -40,8 +39,8 @@ describe('ServersImporter', () => { await importer.importServersFromFile({ type: 'text/csv' }); - expect(readAsText.callCount).toEqual(1); - expect(csvjsonMock.toObject.callCount).toEqual(1); + expect(readAsText).toHaveBeenCalledTimes(1); + expect(csvjsonMock.toObject).toHaveBeenCalledTimes(1); }); }); }); diff --git a/test/servers/services/ServersService.test.js b/test/servers/services/ServersService.test.js index b8c60d9e..a80046f9 100644 --- a/test/servers/services/ServersService.test.js +++ b/test/servers/services/ServersService.test.js @@ -1,4 +1,3 @@ -import sinon from 'sinon'; import { last } from 'ramda'; import ServersService from '../../../src/servers/services/ServersService'; @@ -8,8 +7,8 @@ describe('ServersService', () => { def456: { id: 'def456' }, }; const createStorageMock = (returnValue) => ({ - set: sinon.fake(), - get: sinon.fake.returns(returnValue), + set: jest.fn(), + get: jest.fn(() => returnValue), }); describe('listServers', () => { @@ -20,8 +19,8 @@ describe('ServersService', () => { const result = service.listServers(); expect(result).toEqual({}); - expect(storageMock.get.callCount).toEqual(1); - expect(storageMock.set.callCount).toEqual(0); + expect(storageMock.get).toHaveBeenCalledTimes(1); + expect(storageMock.set).not.toHaveBeenCalled(); }); it('returns value from storage when found', () => { @@ -31,8 +30,8 @@ describe('ServersService', () => { const result = service.listServers(); expect(result).toEqual(servers); - expect(storageMock.get.callCount).toEqual(1); - expect(storageMock.set.callCount).toEqual(0); + expect(storageMock.get).toHaveBeenCalledTimes(1); + expect(storageMock.set).not.toHaveBeenCalled(); }); }); @@ -44,8 +43,8 @@ describe('ServersService', () => { const result = service.findServerById('ghi789'); expect(result).toBeUndefined(); - expect(storageMock.get.callCount).toEqual(1); - expect(storageMock.set.callCount).toEqual(0); + expect(storageMock.get).toHaveBeenCalledTimes(1); + expect(storageMock.set).not.toHaveBeenCalled(); }); it('returns server from list when found', () => { @@ -55,8 +54,8 @@ describe('ServersService', () => { const result = service.findServerById('abc123'); expect(result).toEqual({ id: 'abc123' }); - expect(storageMock.get.callCount).toEqual(1); - expect(storageMock.set.callCount).toEqual(0); + expect(storageMock.get).toHaveBeenCalledTimes(1); + expect(storageMock.set).not.toHaveBeenCalled(); }); }); @@ -67,9 +66,12 @@ describe('ServersService', () => { service.createServer({ id: 'ghi789' }); - expect(storageMock.get.callCount).toEqual(1); - expect(storageMock.set.callCount).toEqual(1); - expect(last(storageMock.set.lastCall.args)).toEqual({ + expect(storageMock.get).toHaveBeenCalledTimes(1); + expect(storageMock.set).toHaveBeenCalledTimes(1); + + const setLastCallLastArg = last(last(storageMock.set.mock.calls)); + + expect(setLastCallLastArg).toEqual({ abc123: { id: 'abc123' }, def456: { id: 'def456' }, ghi789: { id: 'ghi789' }, @@ -84,9 +86,12 @@ describe('ServersService', () => { service.createServers([{ id: 'ghi789' }, { id: 'jkl123' }]); - expect(storageMock.get.callCount).toEqual(1); - expect(storageMock.set.callCount).toEqual(1); - expect(last(storageMock.set.lastCall.args)).toEqual({ + expect(storageMock.get).toHaveBeenCalledTimes(1); + expect(storageMock.set).toHaveBeenCalledTimes(1); + + const setLastCallLastArg = last(last(storageMock.set.mock.calls)); + + expect(setLastCallLastArg).toEqual({ abc123: { id: 'abc123' }, def456: { id: 'def456' }, ghi789: { id: 'ghi789' }, @@ -102,9 +107,12 @@ describe('ServersService', () => { service.deleteServer({ id: 'abc123' }); - expect(storageMock.get.callCount).toEqual(1); - expect(storageMock.set.callCount).toEqual(1); - expect(last(storageMock.set.lastCall.args)).toEqual({ + expect(storageMock.get).toHaveBeenCalledTimes(1); + expect(storageMock.set).toHaveBeenCalledTimes(1); + + const setLastCallLastArg = last(last(storageMock.set.mock.calls)); + + expect(setLastCallLastArg).toEqual({ def456: { id: 'def456' }, }); });