Skip to content

Commit 1ea878b

Browse files
authored
Merge pull request #4 from gregoranders/development
#1 - WIP: Initial tests
2 parents 91c015e + d72fa32 commit 1ea878b

File tree

9 files changed

+219
-37
lines changed

9 files changed

+219
-37
lines changed

.github/workflows/master.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,5 @@ jobs:
7676
name: ${{ steps.prebuild.outputs.version }} Release
7777
body: ${{ steps.prebuild.outputs.version }}
7878
target: ${{ github.ref }}
79+
draft: true
80+
prerelease: false

.github/workflows/release.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ jobs:
6666
name: ${{ steps.prebuild.outputs.version }} Release
6767
body: ${{ steps.prebuild.outputs.version }}
6868
target: ${{ github.ref }}
69+
draft: true
70+
prerelease: false
6971
- name: upload
7072
id: upload
7173
uses: ./.github/actions/upload-asset

package.json

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
{
22
"name": "typescript-react-electron-starter",
3-
"version": "0.0.2",
3+
"version": "0.0.3",
44
"description": "TypeScript React Electron Starter",
55
"main": "app/main.js",
66
"scripts": {
7-
"clear": "gulp --cwd . clear && rimraf ./node_modules ./app ./dist ./coverage ./it/screenshots ./package-lock.json ./gulpfile.js ./gulpfile.js.map ./.github/actions/gulpfile.js ./.github/actions/gulpfile.js.map",
7+
"clear": "gulp --cwd . clear && rimraf ./node_modules ./app ./dist ./coverage ./coverage-it ./it/screenshots ./package-lock.json ./gulpfile.js ./gulpfile.js.map ./.github/actions/gulpfile.js ./.github/actions/gulpfile.js.map",
88
"postinstall": "tsc -p ./",
99
"actions": "gulp --gulpfile ./.github/actions/gulpfile.js --cwd .",
10-
"prebuild": "rimraf ./app ./dist ./coverage ./it/screenshots",
10+
"prebuild": "rimraf ./app ./dist ./coverage ./coverage-it ./it/screenshots",
1111
"build": "gulp --cwd .",
1212
"predist": "rimraf ./app ./dist",
1313
"dist": "gulp --cwd . dist",
1414
"start": "electron ./",
1515
"pretest": "rimraf ./coverage",
1616
"test": "jest --testEnvironment enzyme --coverage --coverageDirectory ../coverage --rootDir ./src",
17-
"preit": "rimraf ./it/screenshots",
18-
"it": "jest --rootDir ./it"
17+
"preit": "rimraf ./coverage-it ./it/screenshots",
18+
"it": "jest --runInBand --coverage --coverageDirectory ../coverage-it --rootDir ./it"
1919
},
2020
"repository": {
2121
"type": "git",
@@ -30,8 +30,10 @@
3030
"typescript"
3131
],
3232
"jest": {
33+
"collectCoverage": true,
3334
"collectCoverageFrom": [
3435
"**/*.{ts,tsx}",
36+
"**/*.{js,jsx}",
3537
"!**/node_modules/**"
3638
],
3739
"moduleFileExtensions": [

src/__snapshots__/application.spec.tsx.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

3-
exports[`Application Application snapshot 1`] = `
3+
exports[`Application snapshot 1`] = `
44
<div
55
className="section container"
66
>

src/application.spec.tsx

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { mount, ReactWrapper } from "enzyme";
12
import * as React from "react";
23
import * as renderer from "react-test-renderer";
34

@@ -7,16 +8,43 @@ import { RendererService } from "./rendererService";
78

89
describe("Application", (): void => {
910

10-
const service: RendererService = new RendererService(undefined as any, undefined as any);
11+
const pingMock: jest.Mock<any, any[]> = jest.fn();
12+
const RendererServiceMock: jest.Mock<RendererService, any[]>
13+
= jest.fn().mockImplementation((props: TestSubject.IApplicationProperties, context?: any) => {
14+
return {
15+
ping: pingMock,
16+
};
17+
});
18+
19+
const service: RendererService = new RendererServiceMock();
1120

12-
it("Application export exists", (): void => {
21+
beforeEach((): void => {
22+
RendererServiceMock.mockClear();
23+
});
24+
it("export exists", (): void => {
1325
expect(TestSubject.Application).toBeDefined();
1426
});
1527

16-
it("Application snapshot", (): void => {
28+
it("snapshot", (): void => {
1729
const snapshot: renderer.ReactTestRenderer = renderer.create(<TestSubject.Application service={ service } />);
1830
snapshot.toJSON();
1931
expect(snapshot).toMatchSnapshot();
2032
});
2133

34+
it("header", (): void => {
35+
const testSubject: ReactWrapper<TestSubject.IApplicationProperties, {}, TestSubject.Application>
36+
= mount(<TestSubject.Application service={ service } />);
37+
38+
expect(testSubject.find("h1").text()).toBe("Application loaded");
39+
});
40+
41+
it("button clicked", (): void => {
42+
const testSubject: ReactWrapper<TestSubject.IApplicationProperties, {}, TestSubject.Application>
43+
= mount(<TestSubject.Application service={ service } />);
44+
45+
expect(pingMock).toBeCalledTimes(0);
46+
testSubject.find("Button").find("button").simulate("click");
47+
expect(pingMock).toBeCalledTimes(1);
48+
});
49+
2250
});

src/application.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { RendererService } from "./rendererService";
44

55
import { Button } from "./button";
66

7-
interface IApplicationProperties {
7+
export interface IApplicationProperties {
88
service: RendererService;
99
}
1010

src/mainService.spec.tsx

Lines changed: 88 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,109 @@ import { mount, ReactWrapper } from "enzyme";
22
import * as React from "react";
33
import * as renderer from "react-test-renderer";
44

5+
import { IIPCMessage, IPCChannel, IPCMessageType } from "./ipc";
6+
57
import * as TestSubject from "./mainService";
68

79
describe("MainService", (): void => {
810

9-
it("MainService export exists", (): void => {
11+
const sendMock: jest.Mock<any, any[]> = jest.fn();
12+
const onMock: jest.Mock<any, any[]> = jest.fn();
13+
let eventCallback: (event: Electron.IpcMainEvent | Electron.IpcRendererEvent, ...args: any[]) => void;
14+
15+
const handler: (channel: IPCChannel,
16+
callback: (event: Electron.IpcMainEvent | Electron.IpcRendererEvent, ...args: any[]) => void)
17+
=> void = (channel: IPCChannel, callback: (event: Electron.IpcMainEvent | Electron.IpcRendererEvent,
18+
...args: any[]) => void): void => {
19+
eventCallback = callback;
20+
onMock(channel);
21+
};
22+
23+
const ipcMock: any = {
24+
on: handler,
25+
send: sendMock,
26+
};
27+
28+
beforeEach((): void => {
29+
onMock.mockClear();
30+
});
31+
32+
it("export exists", (): void => {
1033
expect(TestSubject.MainService).toBeDefined();
1134
});
1235

1336
it("register", (): void => {
14-
const ipc: any = {
15-
on: jest.fn(),
37+
const testSubject: TestSubject.MainService = new TestSubject.MainService(ipcMock, "main-channel");
38+
testSubject.register();
39+
expect(onMock).toHaveBeenNthCalledWith(1, "main-channel");
40+
});
41+
42+
it("invalid event", (): void => {
43+
const testSubject: TestSubject.MainService = new TestSubject.MainService(ipcMock, "main-channel");
44+
const eventSenderSendMock: jest.Mock<any, any[]> = jest.fn();
45+
const event: any = {
46+
sender: {
47+
send: eventSenderSendMock,
48+
},
1649
};
50+
testSubject.register();
51+
expect(onMock).toHaveBeenNthCalledWith(1, "main-channel");
52+
eventCallback(event, 1, 2, 3);
53+
expect(event.sender.send).toHaveBeenCalledTimes(0);
54+
});
1755

18-
const testSubject: TestSubject.MainService = new TestSubject.MainService(ipc, "main-channel");
56+
it("ping event", (): void => {
57+
const testSubject: TestSubject.MainService = new TestSubject.MainService(ipcMock, "main-channel");
58+
const eventSenderSendMock: jest.Mock<any, any[]> = jest.fn();
59+
const event: any = {
60+
sender: {
61+
send: eventSenderSendMock,
62+
},
63+
};
1964
testSubject.register();
20-
expect(ipc.on).toHaveBeenCalledTimes(1);
65+
expect(onMock).toHaveBeenNthCalledWith(1, "main-channel");
66+
eventCallback(event, {
67+
data: "test",
68+
timestamp: new Date(),
69+
type: "ping",
70+
} as IIPCMessage<string>);
71+
expect(event.sender.send).toHaveBeenCalledTimes(2);
2172
});
2273

23-
it("callback", (): void => {
24-
const ipc: any = {
25-
on: jest.fn(),
74+
75+
it("pong event", (): void => {
76+
const testSubject: TestSubject.MainService = new TestSubject.MainService(ipcMock, "main-channel");
77+
const eventSenderSendMock: jest.Mock<any, any[]> = jest.fn();
78+
const event: any = {
79+
sender: {
80+
send: eventSenderSendMock,
81+
},
2682
};
83+
testSubject.register();
84+
expect(onMock).toHaveBeenNthCalledWith(1, "main-channel");
85+
eventCallback(event, {
86+
data: "test",
87+
timestamp: new Date(),
88+
type: "pong",
89+
} as IIPCMessage<string>);
90+
expect(event.sender.send).toHaveBeenCalledTimes(0);
91+
});
2792

28-
const testSubject: TestSubject.MainService = new TestSubject.MainService(ipc, "main-channel");
93+
it("unknown event", (): void => {
94+
const testSubject: TestSubject.MainService = new TestSubject.MainService(ipcMock, "main-channel");
95+
const eventSenderSendMock: jest.Mock<any, any[]> = jest.fn();
96+
const event: any = {
97+
sender: {
98+
send: eventSenderSendMock,
99+
},
100+
};
29101
testSubject.register();
30-
expect(ipc.on).toHaveBeenCalledTimes(1);
102+
expect(onMock).toHaveBeenNthCalledWith(1, "main-channel");
103+
eventCallback(event, {
104+
data: "test",
105+
timestamp: new Date(),
106+
type: "test",
107+
} as any);
108+
expect(event.sender.send).toHaveBeenCalledTimes(0);
31109
});
32110
});

src/rendererService.spec.tsx

Lines changed: 87 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,112 @@ import { mount, ReactWrapper } from "enzyme";
22
import * as React from "react";
33
import * as renderer from "react-test-renderer";
44

5+
import { IIPCMessage, IPCChannel, IPCMessageType } from "./ipc";
6+
57
import * as TestSubject from "./rendererService";
68

9+
710
describe("RendererService", (): void => {
811

9-
it("RendererService export exists", (): void => {
12+
const sendMock: jest.Mock<any, any[]> = jest.fn();
13+
const onMock: jest.Mock<any, any[]> = jest.fn();
14+
let eventCallback: (event: Electron.IpcMainEvent | Electron.IpcRendererEvent, ...args: any[]) => void;
15+
16+
const handler: (channel: IPCChannel,
17+
callback: (event: Electron.IpcMainEvent | Electron.IpcRendererEvent, ...args: any[]) => void)
18+
=> void = (channel: IPCChannel, callback: (event: Electron.IpcMainEvent | Electron.IpcRendererEvent,
19+
...args: any[]) => void): void => {
20+
eventCallback = callback;
21+
onMock(channel);
22+
};
23+
24+
const ipcMock: any = {
25+
on: handler,
26+
send: sendMock,
27+
};
28+
29+
beforeEach((): void => {
30+
onMock.mockClear();
31+
});
32+
33+
it("export exists", (): void => {
1034
expect(TestSubject.RendererService).toBeDefined();
1135
});
1236

1337
it("ping", (): void => {
14-
const ipc: any = {
15-
send: jest.fn(),
16-
};
17-
18-
const testSubject: TestSubject.RendererService = new TestSubject.RendererService(ipc, "main-channel");
38+
const testSubject: TestSubject.RendererService = new TestSubject.RendererService(ipcMock, "main-channel");
1939
testSubject.ping();
20-
expect(ipc.send).toHaveBeenCalledTimes(1);
40+
expect(ipcMock.send).toHaveBeenCalledTimes(1);
2141
});
2242

2343
it("register", (): void => {
24-
const ipc: any = {
25-
on: jest.fn(),
44+
const testSubject: TestSubject.RendererService = new TestSubject.RendererService(ipcMock, "main-channel");
45+
testSubject.register();
46+
expect(onMock).toHaveBeenNthCalledWith(1, "main-channel");
47+
});
48+
49+
50+
it("event", (): void => {
51+
const testSubject: TestSubject.RendererService = new TestSubject.RendererService(ipcMock, "main-channel");
52+
const eventSenderSendMock: jest.Mock<any, any[]> = jest.fn();
53+
const event: any = {
54+
sender: {
55+
send: eventSenderSendMock,
56+
},
2657
};
58+
testSubject.register();
59+
expect(onMock).toHaveBeenNthCalledWith(1, "main-channel");
60+
eventCallback(event, "test");
61+
});
2762

28-
const testSubject: TestSubject.RendererService = new TestSubject.RendererService(ipc, "main-channel");
63+
it("invalid event", (): void => {
64+
const testSubject: TestSubject.RendererService = new TestSubject.RendererService(ipcMock, "main-channel");
65+
const eventSenderSendMock: jest.Mock<any, any[]> = jest.fn();
66+
const event: any = {
67+
sender: {
68+
send: eventSenderSendMock,
69+
},
70+
};
2971
testSubject.register();
30-
expect(ipc.on).toHaveBeenCalledTimes(1);
72+
expect(onMock).toHaveBeenNthCalledWith(1, "main-channel");
73+
eventCallback(event, "test", 1);
74+
eventCallback(event);
3175
});
3276

33-
it("callback", (): void => {
34-
const ipc: any = {
35-
on: jest.fn(),
77+
it("ping event", (): void => {
78+
const testSubject: TestSubject.RendererService = new TestSubject.RendererService(ipcMock, "main-channel");
79+
const eventSenderSendMock: jest.Mock<any, any[]> = jest.fn();
80+
const event: any = {
81+
sender: {
82+
send: eventSenderSendMock,
83+
},
3684
};
85+
testSubject.register();
86+
expect(onMock).toHaveBeenNthCalledWith(1, "main-channel");
87+
eventCallback(event, {
88+
data: "test",
89+
timestamp: new Date(),
90+
type: "ping",
91+
} as IIPCMessage<string>);
92+
expect(event.sender.send).toHaveBeenCalledTimes(1);
93+
});
3794

38-
const testSubject: TestSubject.RendererService = new TestSubject.RendererService(ipc, "main-channel");
95+
96+
it("pong event", (): void => {
97+
const testSubject: TestSubject.RendererService = new TestSubject.RendererService(ipcMock, "main-channel");
98+
const eventSenderSendMock: jest.Mock<any, any[]> = jest.fn();
99+
const event: any = {
100+
sender: {
101+
send: eventSenderSendMock,
102+
},
103+
};
39104
testSubject.register();
40-
expect(ipc.on).toHaveBeenCalledTimes(1);
105+
expect(onMock).toHaveBeenNthCalledWith(1, "main-channel");
106+
eventCallback(event, {
107+
data: "test",
108+
timestamp: new Date(),
109+
type: "pong",
110+
} as IIPCMessage<string>);
111+
expect(event.sender.send).toHaveBeenCalledTimes(0);
41112
});
42113
});

src/rendererService.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ export class RendererService extends IpcService<Electron.IpcRenderer> {
1313
protected handleMessage<MT>(event: Electron.IpcRendererEvent, message: IIPCMessage<MT>): void {
1414
switch (message.type) {
1515
case "ping":
16-
console.log(message);
1716
this.send(event.sender, this.channel, "pong", message.data);
1817
break;
1918
case "pong":

0 commit comments

Comments
 (0)