aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-27 02:24:22 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-27 02:37:38 +0100
commit11cf57ce92aff4dcdb504194ea5c381ac400c5c5 (patch)
tree2fb6fbc28903d61d1a79f2cf95753d8b83eaf4e4
parenttest: Add preload unit tests (diff)
downloadsophie-11cf57ce92aff4dcdb504194ea5c381ac400c5c5.tar.gz
sophie-11cf57ce92aff4dcdb504194ea5c381ac400c5c5.tar.zst
sophie-11cf57ce92aff4dcdb504194ea5c381ac400c5c5.zip
refactor: Simplify IpcRendererService and its spec
-rw-r--r--packages/preload/src/contextBridge/SophieRendererImpl.ts13
-rw-r--r--packages/preload/src/contextBridge/__tests__/SophieRendererImpl.spec.ts15
-rw-r--r--packages/preload/src/index.ts3
-rw-r--r--packages/preload/src/services/IpcRendererService.ts (renamed from packages/preload/src/services/RendererToMainIpcService.ts)2
4 files changed, 18 insertions, 15 deletions
diff --git a/packages/preload/src/contextBridge/SophieRendererImpl.ts b/packages/preload/src/contextBridge/SophieRendererImpl.ts
index 61b01e9..bbb4f65 100644
--- a/packages/preload/src/contextBridge/SophieRendererImpl.ts
+++ b/packages/preload/src/contextBridge/SophieRendererImpl.ts
@@ -27,16 +27,17 @@ import {
27 SophieRenderer, 27 SophieRenderer,
28} from '@sophie/shared'; 28} from '@sophie/shared';
29 29
30import { RendererToMainIpcService } from '../services/RendererToMainIpcService'; 30import { IpcRendererService } from '../services/IpcRendererService';
31 31
32class SophieRendererImpl implements SophieRenderer { 32class SophieRendererImpl implements SophieRenderer {
33 readonly #ipcService = new RendererToMainIpcService(); 33 readonly #ipcService;
34 34
35 #onSharedStoreChangeCalled: boolean = false; 35 #onSharedStoreChangeCalled: boolean = false;
36 36
37 #listener: SharedStoreListener | null = null; 37 #listener: SharedStoreListener | null = null;
38 38
39 constructor() { 39 constructor(ipcService: IpcRendererService) {
40 this.#ipcService = ipcService;
40 this.#ipcService.onSharedStorePatch((patch) => { 41 this.#ipcService.onSharedStorePatch((patch) => {
41 try { 42 try {
42 // `mobx-state-tree` will validate the patch, so we can safely cast here. 43 // `mobx-state-tree` will validate the patch, so we can safely cast here.
@@ -87,8 +88,10 @@ class SophieRendererImpl implements SophieRenderer {
87 } 88 }
88} 89}
89 90
90export function createSophieRenderer(): SophieRenderer { 91export function createSophieRenderer(
91 const impl = new SophieRendererImpl(); 92 ipcService: IpcRendererService,
93): SophieRenderer {
94 const impl = new SophieRendererImpl(ipcService);
92 return { 95 return {
93 onSharedStoreChange: impl.onSharedStoreChange.bind(impl), 96 onSharedStoreChange: impl.onSharedStoreChange.bind(impl),
94 dispatchAction: impl.dispatchAction.bind(impl), 97 dispatchAction: impl.dispatchAction.bind(impl),
diff --git a/packages/preload/src/contextBridge/__tests__/SophieRendererImpl.spec.ts b/packages/preload/src/contextBridge/__tests__/SophieRendererImpl.spec.ts
index c0e5ec2..bd2b1d5 100644
--- a/packages/preload/src/contextBridge/__tests__/SophieRendererImpl.spec.ts
+++ b/packages/preload/src/contextBridge/__tests__/SophieRendererImpl.spec.ts
@@ -22,10 +22,10 @@ import { mocked } from 'jest-mock';
22import type { IJsonPatch } from 'mobx-state-tree'; 22import type { IJsonPatch } from 'mobx-state-tree';
23import type { Action, SharedStoreSnapshotIn, SophieRenderer } from '@sophie/shared'; 23import type { Action, SharedStoreSnapshotIn, SophieRenderer } from '@sophie/shared';
24 24
25import { RendererToMainIpcService } from '../../services/RendererToMainIpcService'; 25import { IpcRendererService } from '../../services/IpcRendererService';
26import { createSophieRenderer } from '../SophieRendererImpl'; 26import { createSophieRenderer } from '../SophieRendererImpl';
27 27
28jest.mock('../../services/RendererToMainIpcService'); 28jest.mock('../../services/IpcRendererService');
29 29
30const snapshot: SharedStoreSnapshotIn = { 30const snapshot: SharedStoreSnapshotIn = {
31 shouldUseDarkColors: true, 31 shouldUseDarkColors: true,
@@ -52,16 +52,15 @@ const invalidAction = {
52 52
53describe('constructor', () => { 53describe('constructor', () => {
54 it('registers a shared store patch listener', () => { 54 it('registers a shared store patch listener', () => {
55 createSophieRenderer(); 55 const service = new IpcRendererService();
56 expect(RendererToMainIpcService).toHaveBeenCalledTimes(1); 56 createSophieRenderer(service);
57 const service = mocked(RendererToMainIpcService).mock.instances[0];
58 expect(service.onSharedStorePatch).toHaveBeenCalledTimes(1); 57 expect(service.onSharedStorePatch).toHaveBeenCalledTimes(1);
59 }); 58 });
60}); 59});
61 60
62describe('instance', () => { 61describe('instance', () => {
63 let sut: SophieRenderer; 62 let sut: SophieRenderer;
64 let service: RendererToMainIpcService; 63 let service: IpcRendererService;
65 let onSharedStorePatch: (patch: unknown) => void; 64 let onSharedStorePatch: (patch: unknown) => void;
66 let listener = { 65 let listener = {
67 onSnapshot: jest.fn((_snapshot: SharedStoreSnapshotIn) => {}), 66 onSnapshot: jest.fn((_snapshot: SharedStoreSnapshotIn) => {}),
@@ -69,8 +68,8 @@ describe('instance', () => {
69 }; 68 };
70 69
71 beforeEach(() => { 70 beforeEach(() => {
72 sut = createSophieRenderer(); 71 service = new IpcRendererService();
73 service = mocked(RendererToMainIpcService).mock.instances[0]; 72 sut = createSophieRenderer(service);
74 onSharedStorePatch = mocked(service.onSharedStorePatch).mock.calls[0][0]; 73 onSharedStorePatch = mocked(service.onSharedStorePatch).mock.calls[0][0];
75 }); 74 });
76 75
diff --git a/packages/preload/src/index.ts b/packages/preload/src/index.ts
index ef466b4..2703d40 100644
--- a/packages/preload/src/index.ts
+++ b/packages/preload/src/index.ts
@@ -21,7 +21,8 @@
21import { contextBridge } from 'electron'; 21import { contextBridge } from 'electron';
22 22
23import { createSophieRenderer } from './contextBridge/SophieRendererImpl'; 23import { createSophieRenderer } from './contextBridge/SophieRendererImpl';
24import { IpcRendererService } from './services/IpcRendererService';
24 25
25const sophieRenderer = createSophieRenderer(); 26const sophieRenderer = createSophieRenderer(new IpcRendererService());
26 27
27contextBridge.exposeInMainWorld('sophieRenderer', sophieRenderer); 28contextBridge.exposeInMainWorld('sophieRenderer', sophieRenderer);
diff --git a/packages/preload/src/services/RendererToMainIpcService.ts b/packages/preload/src/services/IpcRendererService.ts
index 40f1339..7f51351 100644
--- a/packages/preload/src/services/RendererToMainIpcService.ts
+++ b/packages/preload/src/services/IpcRendererService.ts
@@ -25,7 +25,7 @@ import {
25 RendererToMainIpcMessage, 25 RendererToMainIpcMessage,
26} from '@sophie/shared'; 26} from '@sophie/shared';
27 27
28export class RendererToMainIpcService { 28export class IpcRendererService {
29 getSharedStoreSnapshot(): Promise<unknown> { 29 getSharedStoreSnapshot(): Promise<unknown> {
30 return ipcRenderer.invoke(RendererToMainIpcMessage.GetSharedStoreSnapshot); 30 return ipcRenderer.invoke(RendererToMainIpcMessage.GetSharedStoreSnapshot);
31 } 31 }