diff options
author | Kristóf Marussy <kristof@marussy.com> | 2021-12-27 02:24:22 +0100 |
---|---|---|
committer | Kristóf Marussy <kristof@marussy.com> | 2021-12-27 02:37:38 +0100 |
commit | 11cf57ce92aff4dcdb504194ea5c381ac400c5c5 (patch) | |
tree | 2fb6fbc28903d61d1a79f2cf95753d8b83eaf4e4 | |
parent | test: Add preload unit tests (diff) | |
download | sophie-11cf57ce92aff4dcdb504194ea5c381ac400c5c5.tar.gz sophie-11cf57ce92aff4dcdb504194ea5c381ac400c5c5.tar.zst sophie-11cf57ce92aff4dcdb504194ea5c381ac400c5c5.zip |
refactor: Simplify IpcRendererService and its spec
-rw-r--r-- | packages/preload/src/contextBridge/SophieRendererImpl.ts | 13 | ||||
-rw-r--r-- | packages/preload/src/contextBridge/__tests__/SophieRendererImpl.spec.ts | 15 | ||||
-rw-r--r-- | packages/preload/src/index.ts | 3 | ||||
-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 | ||
30 | import { RendererToMainIpcService } from '../services/RendererToMainIpcService'; | 30 | import { IpcRendererService } from '../services/IpcRendererService'; |
31 | 31 | ||
32 | class SophieRendererImpl implements SophieRenderer { | 32 | class 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 | ||
90 | export function createSophieRenderer(): SophieRenderer { | 91 | export 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'; | |||
22 | import type { IJsonPatch } from 'mobx-state-tree'; | 22 | import type { IJsonPatch } from 'mobx-state-tree'; |
23 | import type { Action, SharedStoreSnapshotIn, SophieRenderer } from '@sophie/shared'; | 23 | import type { Action, SharedStoreSnapshotIn, SophieRenderer } from '@sophie/shared'; |
24 | 24 | ||
25 | import { RendererToMainIpcService } from '../../services/RendererToMainIpcService'; | 25 | import { IpcRendererService } from '../../services/IpcRendererService'; |
26 | import { createSophieRenderer } from '../SophieRendererImpl'; | 26 | import { createSophieRenderer } from '../SophieRendererImpl'; |
27 | 27 | ||
28 | jest.mock('../../services/RendererToMainIpcService'); | 28 | jest.mock('../../services/IpcRendererService'); |
29 | 29 | ||
30 | const snapshot: SharedStoreSnapshotIn = { | 30 | const snapshot: SharedStoreSnapshotIn = { |
31 | shouldUseDarkColors: true, | 31 | shouldUseDarkColors: true, |
@@ -52,16 +52,15 @@ const invalidAction = { | |||
52 | 52 | ||
53 | describe('constructor', () => { | 53 | describe('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 | ||
62 | describe('instance', () => { | 61 | describe('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 @@ | |||
21 | import { contextBridge } from 'electron'; | 21 | import { contextBridge } from 'electron'; |
22 | 22 | ||
23 | import { createSophieRenderer } from './contextBridge/SophieRendererImpl'; | 23 | import { createSophieRenderer } from './contextBridge/SophieRendererImpl'; |
24 | import { IpcRendererService } from './services/IpcRendererService'; | ||
24 | 25 | ||
25 | const sophieRenderer = createSophieRenderer(); | 26 | const sophieRenderer = createSophieRenderer(new IpcRendererService()); |
26 | 27 | ||
27 | contextBridge.exposeInMainWorld('sophieRenderer', sophieRenderer); | 28 | contextBridge.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 | ||
28 | export class RendererToMainIpcService { | 28 | export class IpcRendererService { |
29 | getSharedStoreSnapshot(): Promise<unknown> { | 29 | getSharedStoreSnapshot(): Promise<unknown> { |
30 | return ipcRenderer.invoke(RendererToMainIpcMessage.GetSharedStoreSnapshot); | 30 | return ipcRenderer.invoke(RendererToMainIpcMessage.GetSharedStoreSnapshot); |
31 | } | 31 | } |