Skip to content
This repository was archived by the owner on Jun 5, 2019. It is now read-only.

Commit 0beb853

Browse files
committed
🔨 Switches to jest from ava
1 parent 57da369 commit 0beb853

34 files changed

+734
-1445
lines changed

‎.gitignore‎

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
.DS_Store
22
.fusebox/
3-
.nyc_output/
4-
coverage/
53
node_modules/
64
npm-debug.log
75
yarn-error.log
86
dist/
97
out/
108
tmp/
11-
out-test/
129
dev-app-update.yml
1310
.vscode/

‎docs/stack.md‎

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -169,29 +169,11 @@ What I do know is, once I started playing with FuseBox, I was sold. I like the d
169169

170170
## Testing
171171

172-
> **ava**
172+
> **jest**
173173
174-
[ava - github](https://github.com/avajs/ava)
174+
[jest - github](https://github.com/facebook/jest)
175175

176-
This is my favourite testing framework. I've tried them all. The devs behind this are very talented, helpful, and friendly.
177-
178-
> **sinon**
179-
180-
[sinon - github](https://github.com/sinonjs/sinon)
181-
182-
This is great for spies and stubs.
183-
184-
> **mockery**
185-
186-
[mockery - github](https://github.com/mockery/mockery)
187-
188-
Hooks require('') calls to hijack dependencies and replace with your own.
189-
190-
> **nyc**
191-
192-
[nyc - github](https://github.com/istanbuljs/nyc)
193-
194-
Coverage report generation of your tests.
176+
Because we're using TypeScript, Jest makes this much easier. Jest comes with mocking and coverage as well.
195177

196178

197179
## Compile Time Utilities

‎package.json‎

Lines changed: 52 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
"!globals.d.ts"
2424
],
2525
"linux": {
26-
"target": ["tar.gz"]
26+
"target": [
27+
"tar.gz"
28+
]
2729
},
2830
"mac": {
2931
"category": "public.app-category.developer-tools"
@@ -35,19 +37,20 @@
3537
"repo": "typescript-with-electron-react-kit"
3638
},
3739
"win": {
38-
"target": ["zip", "nsis"]
40+
"target": [
41+
"zip",
42+
"nsis"
43+
]
3944
}
4045
},
4146
"scripts": {
4247
"build-storybook": "build-storybook",
43-
"check": "npm-run-all check:*",
44-
"check:src": "tsc -p tsconfig.json --noEmit --pretty",
45-
"check:test": "tsc -p tsconfig.test.json --noEmit --pretty",
46-
"clean": "rm -rf .fusebox out dist out-test",
48+
"check": "tsc -p . --noEmit --pretty",
49+
"clean": "rm -rf .fusebox out dist",
4750
"compile": "NODE_ENV=production ts-node fuse",
4851
"coverage:upload": "cat ./coverage/lcov.info | coveralls",
49-
"coverage:report": "nyc --reporter=lcov --reporter=html --reporter=text ava",
50-
"coverage": "npm-run-all test:clean test:compile coverage:report",
52+
"coverage:report": "nyc --reporter=lcov --reporter=html --reporter=text jest",
53+
"coverage": "npm-run-all coverage:report",
5154
"dist": "electron-builder --mac --win --linux --ia32 --x64",
5255
"draft": "electron-builder -p always --draft --mac --win --linux --ia32 --x64",
5356
"info": "npm-scripts-info",
@@ -59,12 +62,7 @@
5962
"sanity": "npm-run-all clean check lint test clean compile clean",
6063
"start": "ts-node fuse",
6164
"storybook": "start-storybook -p 6006",
62-
"test": "npm-run-all test:clean test:compile test:unit",
63-
"test:clean": "rm -rf out-test",
64-
"test:compile": "tsc -p tsconfig.test.json",
65-
"test:unit": "ava",
66-
"watch:compile": "npm run test:compile -- -w",
67-
"watch:tests": "npm run test:unit -- --watch"
65+
"test": "jest"
6866
},
6967
"dependencies": {
7068
"electron-is-dev": "^0.3.0",
@@ -85,37 +83,67 @@
8583
"@storybook/react": "^3.2.15",
8684
"@types/electron-is-dev": "^0.3.0",
8785
"@types/electron-store": "^1.2.0",
88-
"@types/mockery": "^1.4.29",
86+
"@types/jest": "^21.1.6",
8987
"@types/mousetrap": "^1.5.34",
9088
"@types/react": "^16.0.22",
9189
"@types/react-dom": "^16.0.3",
9290
"@types/react-test-renderer": "^16.0.0",
93-
"@types/sinon": "^2.3.7",
9491
"@types/storybook__react": "^3.0.5",
95-
"ava": "^0.23.0",
9692
"babel-preset-react": "^6.24.1",
9793
"coveralls": "^3.0.0",
9894
"electron": "^1.7.9",
9995
"electron-builder": "^19.45.4",
10096
"fuse-box": "^2.4.0",
10197
"husky": "^0.14.3",
98+
"jest": "^21.2.1",
99+
"jest-expect-contain-deep": "^1.0.1",
102100
"lint-staged": "^5.0.0",
103-
"mockery": "^2.1.0",
104101
"npm-run-all": "^4.1.2",
105-
"npm-scripts-info": "^0.3.6",
106-
"nyc": "^11.3.0",
107102
"prettier": "^1.8.2",
108103
"react-test-renderer": "^16.0.0",
109-
"sinon": "^4.1.2",
104+
"ts-jest": "^21.2.1",
110105
"ts-loader": "^3.1.1",
111106
"ts-node": "^3.3.0",
112107
"tslint": "^5.8.0",
113108
"typescript": "~2.6.1"
114109
},
115-
"ava": {
116-
"require": ["./out-test/main/test/setup.js"]
110+
"jest": {
111+
"setupFiles": [
112+
"./test/setup.ts"
113+
],
114+
"transform": {
115+
".(ts|tsx)": "<rootDir>/node_modules/ts-jest/preprocessor.js"
116+
},
117+
"testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$",
118+
"moduleFileExtensions": [
119+
"ts",
120+
"tsx",
121+
"js"
122+
],
123+
"coveragePathIgnorePatterns": [
124+
"/node_modules/",
125+
"/test/",
126+
"/out/",
127+
"/build/",
128+
"/dist/",
129+
"/docs/"
130+
],
131+
"coverageThreshold": {
132+
"global": {
133+
"branches": 90,
134+
"functions": 95,
135+
"lines": 95,
136+
"statements": 95
137+
}
138+
},
139+
"collectCoverage": true,
140+
"mapCoverage": true
117141
},
118142
"lint-staged": {
119-
"*.{ts,tsx}": ["prettier --write", "tslint --fix", "git add"]
143+
"*.{ts,tsx}": [
144+
"prettier --write",
145+
"tslint --fix",
146+
"git add"
147+
]
120148
}
121149
}
Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,24 @@
1-
import { test } from 'ava'
21
import { createDb, createRepo } from './database.fixtures'
32

4-
test('can load', async t => {
3+
test('can load', async () => {
54
const db = createDb()
65
const repo = await db.load('skellock/typescript-with-electron-react-kit')
76

8-
t.is(repo.name, 'typescript-with-electron-react-kit')
9-
t.is(repo.fullName, 'skellock/typescript-with-electron-react-kit')
7+
expect(repo.name).toBe('typescript-with-electron-react-kit')
8+
expect(repo.fullName).toBe('skellock/typescript-with-electron-react-kit')
109
})
1110

12-
test('can save', async t => {
11+
test('can save', async () => {
1312
const db = createDb()
1413
const repo = createRepo()
15-
16-
t.true(await db.save(repo))
14+
const result = await db.save(repo)
15+
expect(result).toBe(true)
1716
})
1817

19-
test('fails to save', async t => {
18+
test('fails to save', async () => {
2019
const db = createDb()
2120
const repo = createRepo()
2221
repo.fullName = 'crap'
23-
24-
t.false(await db.save(repo))
22+
const result = await db.save(repo)
23+
expect(result).toBe(false)
2524
})
Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
1-
import { test } from 'ava'
2-
import { stub } from 'sinon'
31
import { loadURL } from './load-url'
42

5-
test('loads from storybook', t => {
6-
const loadStub = stub()
3+
test('loads from storybook', () => {
4+
const loadStub = jest.fn()
75
loadURL({ loadURL: loadStub } as any, 'a', true)
8-
t.true(loadStub.calledWith('http://localhost:6006'))
6+
expect(loadStub).toBeCalledWith('http://localhost:6006')
97
})
108

11-
test('loads from electron', t => {
12-
const loadStub = stub()
9+
test('loads from electron', () => {
10+
const loadStub = jest.fn()
1311
loadURL({ loadURL: loadStub } as any, 'a', false)
14-
15-
t.true(loadStub.calledWith('file:///a/out/index.html'))
12+
expect(loadStub).toBeCalledWith('file:///a/out/index.html')
1613
})
Lines changed: 26 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -1,114 +1,40 @@
1-
import { test } from 'ava'
2-
import * as mockery from 'mockery'
3-
import { stub } from 'sinon'
4-
import { electron, BrowserWindow } from '../test/mock-electron'
5-
import { WindowStateManager } from '../test/mock-window-state-manager'
1+
import { createMainWindow } from './main-window'
2+
import * as WindowStateManager from 'electron-window-state-manager'
3+
import * as containDeep from 'jest-expect-contain-deep'
4+
import { BrowserWindow } from 'electron'
65

7-
test.beforeEach(() => {
8-
mockery.enable({ warnOnUnregistered: false })
6+
it('can read window state', () => {
7+
WindowStateManager.mockImplementation(() => ({ width: 10, height: 40 }))
8+
createMainWindow(__dirname)
9+
expect(BrowserWindow).toBeCalledWith(containDeep({ width: 10, height: 40 }))
910
})
10-
test.afterEach.always(() => {
11-
mockery.deregisterAll()
12-
mockery.disable()
13-
})
14-
15-
test('mocks have coverage :(', t => {
16-
const win = new WindowStateManager()
17-
t.is(win.x, 1)
18-
t.is(win.y, 2)
19-
t.is(win.width, 3)
20-
t.is(win.height, 4)
21-
t.is(win.maximized, true)
22-
t.is(win.saveState({}), undefined)
23-
24-
const bw = new BrowserWindow()
25-
t.is(bw.getSize(), undefined)
26-
t.is(bw.loadURL(), undefined)
27-
t.is(bw.maximize(), undefined)
28-
t.is(bw.show(), undefined)
29-
t.is(bw.focus(), undefined)
30-
})
31-
32-
test('reads from window state', t => {
33-
// two step process for the getters :(
34-
const width = stub()
35-
const height = stub()
36-
const x = stub()
37-
const y = stub()
38-
stub(WindowStateManager.prototype, 'width').get(width)
39-
stub(WindowStateManager.prototype, 'height').get(height)
40-
stub(WindowStateManager.prototype, 'x').get(x)
41-
stub(WindowStateManager.prototype, 'y').get(y)
4211

43-
// hijack the 3rd parties
44-
mockery.registerMock('electron-window-state-manager', WindowStateManager)
45-
mockery.registerMock('electron', electron)
46-
47-
// now we can create our window
48-
require('./main-window').createMainWindow(__dirname)
49-
50-
// did our mocks get called?
51-
t.true(width.calledOnce)
52-
t.true(height.calledOnce)
53-
t.true(x.calledOnce)
54-
t.true(y.calledOnce)
12+
it('might maximize on startup', () => {
13+
WindowStateManager.mockImplementation(() => ({ maximized: true }))
14+
const window = createMainWindow(__dirname)
15+
expect(window.maximize).toBeCalled()
5516
})
5617

57-
test('maximizes if told by the window state manager', t => {
58-
const maximized = stub().returns(true)
59-
stub(WindowStateManager.prototype, 'maximized').get(maximized)
60-
61-
mockery.registerMock('electron-window-state-manager', WindowStateManager)
62-
mockery.registerMock('electron', electron)
63-
const maximize = stub(BrowserWindow.prototype, 'maximize')
64-
require('./main-window').createMainWindow(__dirname)
65-
maximize.restore()
66-
67-
t.true(maximized.calledOnce)
68-
t.true(maximize.calledOnce)
18+
it('might not maximize on startup', () => {
19+
WindowStateManager.mockImplementation(() => ({ maximized: false }))
20+
expect(createMainWindow(__dirname).maximize).not.toBeCalled()
6921
})
7022

71-
test('does not maximize unless told by the window state manager', t => {
72-
const maximized = stub().returns(false)
73-
stub(WindowStateManager.prototype, 'maximized').get(maximized)
74-
75-
mockery.registerMock('electron-window-state-manager', WindowStateManager)
76-
mockery.registerMock('electron', electron)
77-
const maximize = stub(BrowserWindow.prototype, 'maximize')
78-
require('./main-window').createMainWindow(__dirname)
79-
maximize.restore()
80-
81-
t.true(maximized.calledOnce)
82-
t.true(maximize.notCalled)
83-
})
84-
85-
test('saves window state', t => {
86-
const saveState = stub(WindowStateManager.prototype, 'saveState')
87-
88-
mockery.registerMock('electron-window-state-manager', WindowStateManager)
89-
mockery.registerMock('electron', electron)
90-
91-
const window: BrowserWindow = require('./main-window').createMainWindow(__dirname)
23+
test('saves window state', () => {
24+
let saveState = jest.fn()
25+
WindowStateManager.mockImplementation(() => ({ saveState: saveState }))
26+
const window: BrowserWindow = createMainWindow(__dirname)
9227
window.emit('close')
9328
window.emit('move')
9429
window.emit('resize')
95-
96-
t.is(saveState.callCount, 3)
30+
expect(saveState).toHaveBeenCalledTimes(3)
9731
})
9832

99-
test.cb('show the window after we finish loading + delay', t => {
100-
mockery.registerMock('electron-window-state-manager', WindowStateManager)
101-
mockery.registerMock('electron', electron)
102-
103-
const window: BrowserWindow = require('./main-window').createMainWindow(__dirname, 1)
104-
const showStub = stub(window, 'show')
105-
const focusStub = stub(window, 'focus')
106-
33+
test('show the window after we finish loading + delay', async () => {
34+
const window: BrowserWindow = createMainWindow(__dirname, 1)
10735
window.webContents.emit('did-finish-load')
108-
109-
setTimeout(() => {
110-
t.true(showStub.calledOnce)
111-
t.true(focusStub.calledOnce)
112-
t.end()
113-
}, 2)
36+
const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms))
37+
await delay(2)
38+
expect(window.show).toHaveBeenCalled()
39+
expect(window.focus).toHaveBeenCalled()
11440
})

‎src/main/main-window/main-window.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { app, BrowserWindow } from 'electron'
2-
import WindowStateManager = require('electron-window-state-manager')
1+
const { app, BrowserWindow } = require('electron')
2+
const WindowStateManager = require('electron-window-state-manager')
33
import { loadURL } from './load-url'
44

55
// default dimensions
6-
const DIMENSIONS = { width: 600, height: 500, minWidth: 450, minHeight: 450 }
6+
export const DIMENSIONS = { width: 600, height: 500, minWidth: 450, minHeight: 450 }
77

88
/**
99
* Creates the main window.

0 commit comments

Comments
 (0)