Skip to content

Commit f9b23ae

Browse files
committed
#1 - WIP: Refactorings
Signed-off-by: Gregor Anders <[email protected]>
1 parent 559bd7b commit f9b23ae

File tree

11 files changed

+81
-28
lines changed

11 files changed

+81
-28
lines changed

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
"tsx",
4040
"js"
4141
],
42+
"reporters": ["jest-spec-reporter"],
4243
"setupFilesAfterEnv": [
4344
"jest-enzyme"
4445
],
@@ -95,6 +96,7 @@
9596
"jest-cli": "24.9.0",
9697
"jest-environment-enzyme": "^7.1.2",
9798
"jest-enzyme": "^7.1.2",
99+
"jest-spec-reporter": "^1.0.10",
98100
"mime": "2.4.4",
99101
"node-sass": "4.13.0",
100102
"react-test-renderer": "16.12.0",

src/application.spec.tsx

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

88
describe("Application", (): void => {
99

10-
const service: RendererService = new RendererService();
10+
const service: RendererService = new RendererService(undefined as any, undefined as any);
1111

1212
it("Application export exists", (): void => {
1313
expect(TestSubject.Application).toBeDefined();

src/button.spec.tsx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
import { mount, ReactWrapper } from "enzyme";
2-
// import * as Adapter from "enzyme-adapter-react-16";
32
import * as React from "react";
43
import * as renderer from "react-test-renderer";
54

65
import * as TestSubject from "./button";
76

87
describe("Button", (): void => {
98

10-
// beforeAll((): void => {
11-
// configure({ adapter: new Adapter() });
12-
// });
139

1410
it("Button export exists", (): void => {
1511
expect(TestSubject.Button).toBeDefined();

src/ipc.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { ipcMain, ipcRenderer } from "electron";
22

33
export type IPCMessageType = "ping" | "pong";
44

5-
export type IPCChannel = "main-channel" | "render-channel";
5+
export type IPCChannel = "main-channel";
66

77
export interface IIPCMessage<T> {
88
data: T;

src/ipcService.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,17 @@ import * as log from "fancy-log";
22

33
import { IIPCMessage, IPCChannel, IPCMessageType } from "./ipc";
44

5-
export abstract class IpcService<T extends Electron.IpcMainEvent | Electron.IpcRendererEvent> {
5+
type IpcEventType<T> = T extends Electron.IpcMain ? Electron.IpcMainEvent : Electron.IpcRendererEvent;
66

7-
public register(ipc: NodeJS.EventEmitter, channel: string): void {
8-
ipc.on(channel, (event: T, ...args: any[]): void => {
7+
type IpcSenderType<T> = T extends Electron.IpcMain ? Electron.WebContents : Electron.IpcRenderer;
8+
9+
10+
export abstract class IpcService<T extends Electron.IpcMain | Electron.IpcRenderer> {
11+
12+
public constructor(protected ipc: T, protected channel: IPCChannel) {}
13+
14+
public register(): void {
15+
this.ipc.on(this.channel, (event: Electron.IpcMainEvent | Electron.IpcRendererEvent, ...args: any[]): void => {
916
if (args && args.length === 1) {
1017
const ipcMessage: IIPCMessage<any> = args[0];
1118
this.handleMessage(event, ipcMessage);
@@ -15,10 +22,10 @@ export abstract class IpcService<T extends Electron.IpcMainEvent | Electron.IpcR
1522
});
1623
}
1724

18-
protected abstract handleMessage<MT>(event: T, message: IIPCMessage<MT>): void;
25+
protected abstract handleMessage<MT>(event: Electron.IpcMainEvent | Electron.IpcRendererEvent,
26+
message: IIPCMessage<MT>): void;
1927

20-
protected send<MT>(sender: Electron.WebContents | Electron.IpcRenderer,
21-
channel: IPCChannel, type: IPCMessageType, data: MT): void {
28+
protected send<MT>(sender: IpcSenderType<T>, channel: IPCChannel, type: IPCMessageType, data: MT): void {
2229
sender.send(channel, {
2330
data,
2431
timestamp: new Date(),

src/main.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ app.whenReady()
2828
mode: "right",
2929
});
3030
}
31-
const service: MainService = new MainService();
32-
service.register(ipcMain, "main-channel");
31+
const service: MainService = new MainService(ipcMain, "main-channel");
32+
service.register();
3333
browserWindow.show();
3434
})
3535
.catch((reason: any): void => {

src/mainService.spec.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { mount, ReactWrapper } from "enzyme";
2+
import * as React from "react";
3+
import * as renderer from "react-test-renderer";
4+
5+
import * as TestSubject from "./mainService";
6+
7+
describe("MainService", (): void => {
8+
9+
it("MainService export exists", (): void => {
10+
expect(TestSubject.MainService).toBeDefined();
11+
});
12+
});

src/mainService.ts

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,14 @@ import { IpcService } from "./ipcService";
66

77
import { IIPCMessage } from "./ipc";
88

9-
10-
export class MainService extends IpcService<Electron.IpcMainEvent> {
11-
12-
public constructor() {
13-
super();
14-
this.register(ipcMain, "main-channel");
15-
}
9+
export class MainService extends IpcService<Electron.IpcMain> {
1610

1711
protected handleMessage<T>(event: Electron.IpcMainEvent, message: IIPCMessage<T>): void {
1812
switch (message.type) {
1913
case "ping":
2014
log.info(message);
21-
this.send(event.sender, "main-channel", "pong", message.data);
22-
this.send(event.sender, "main-channel", "ping", message.data);
15+
this.send(event.sender, this.channel, "pong", message.data);
16+
this.send(event.sender, this.channel, "ping", message.data);
2317
break;
2418
case "pong":
2519
log.info(message);

src/renderer.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { Application } from "./application";
77

88
import { RendererService } from "./rendererService";
99

10-
const service: RendererService = new RendererService();
11-
service.register(ipcRenderer, "render-channel");
10+
const service: RendererService = new RendererService(ipcRenderer, "main-channel");
11+
service.register();
1212

1313
render(<Application service={ service }/>, document.getElementById("content"));

src/rendererService.spec.tsx

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { mount, ReactWrapper } from "enzyme";
2+
import * as React from "react";
3+
import * as renderer from "react-test-renderer";
4+
5+
import * as TestSubject from "./rendererService";
6+
7+
describe("RendererService", (): void => {
8+
9+
it("RendererService export exists", (): void => {
10+
expect(TestSubject.RendererService).toBeDefined();
11+
});
12+
13+
it("ping", (): void => {
14+
const ipc: any = {
15+
send: jest.fn(),
16+
};
17+
18+
const testSubject: TestSubject.RendererService = new TestSubject.RendererService(ipc, "main-channel");
19+
testSubject.ping();
20+
expect(ipc.send).toHaveBeenCalledTimes(1);
21+
});
22+
23+
it("register", (): void => {
24+
const ipc: any = {
25+
on: jest.fn(),
26+
};
27+
28+
const testSubject: TestSubject.RendererService = new TestSubject.RendererService(ipc, "main-channel");
29+
testSubject.register();
30+
expect(ipc.on).toHaveBeenCalledTimes(1);
31+
});
32+
33+
it("callback", (): void => {
34+
const ipc: any = {
35+
on: jest.fn(),
36+
};
37+
38+
const testSubject: TestSubject.RendererService = new TestSubject.RendererService(ipc, "main-channel");
39+
testSubject.register();
40+
expect(ipc.on).toHaveBeenCalledTimes(1);
41+
});
42+
});

0 commit comments

Comments
 (0)