aboutsummaryrefslogtreecommitdiffstats
path: root/packages/preload/src/contextBridge/__tests__/createSophieRenderer.spec.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/preload/src/contextBridge/__tests__/createSophieRenderer.spec.ts')
-rw-r--r--packages/preload/src/contextBridge/__tests__/createSophieRenderer.spec.ts56
1 files changed, 39 insertions, 17 deletions
diff --git a/packages/preload/src/contextBridge/__tests__/createSophieRenderer.spec.ts b/packages/preload/src/contextBridge/__tests__/createSophieRenderer.spec.ts
index a38dbac..f63c3f6 100644
--- a/packages/preload/src/contextBridge/__tests__/createSophieRenderer.spec.ts
+++ b/packages/preload/src/contextBridge/__tests__/createSophieRenderer.spec.ts
@@ -40,9 +40,12 @@ jest.unstable_mockModule('electron', () => ({
40 40
41const { ipcRenderer } = await import('electron'); 41const { ipcRenderer } = await import('electron');
42 42
43const { default: createSophieRenderer } = await import('../createSophieRenderer'); 43const { default: createSophieRenderer } = await import(
44 '../createSophieRenderer'
45);
44 46
45const event: Electron.IpcRendererEvent = null as unknown as Electron.IpcRendererEvent; 47const event: Electron.IpcRendererEvent =
48 null as unknown as Electron.IpcRendererEvent;
46 49
47const snapshot: SharedStoreSnapshotIn = { 50const snapshot: SharedStoreSnapshotIn = {
48 shouldUseDarkColors: true, 51 shouldUseDarkColors: true,
@@ -83,7 +86,10 @@ describe('createSophieRenderer', () => {
83 86
84describe('SharedStoreConnector', () => { 87describe('SharedStoreConnector', () => {
85 let sut: SophieRenderer; 88 let sut: SophieRenderer;
86 let onSharedStorePatch: (eventArg: Electron.IpcRendererEvent, patchArg: unknown) => void; 89 let onSharedStorePatch: (
90 eventArg: Electron.IpcRendererEvent,
91 patchArg: unknown,
92 ) => void;
87 const listener = { 93 const listener = {
88 // eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars 94 // eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars
89 onSnapshot: jest.fn((_snapshot: SharedStoreSnapshotIn) => {}), 95 onSnapshot: jest.fn((_snapshot: SharedStoreSnapshotIn) => {}),
@@ -102,22 +108,25 @@ describe('SharedStoreConnector', () => {
102 it('should request a snapshot from the main process', async () => { 108 it('should request a snapshot from the main process', async () => {
103 mocked(ipcRenderer.invoke).mockResolvedValueOnce(snapshot); 109 mocked(ipcRenderer.invoke).mockResolvedValueOnce(snapshot);
104 await sut.onSharedStoreChange(listener); 110 await sut.onSharedStoreChange(listener);
105 expect(ipcRenderer.invoke).toBeCalledWith(RendererToMainIpcMessage.GetSharedStoreSnapshot); 111 expect(ipcRenderer.invoke).toBeCalledWith(
112 RendererToMainIpcMessage.GetSharedStoreSnapshot,
113 );
106 expect(listener.onSnapshot).toBeCalledWith(snapshot); 114 expect(listener.onSnapshot).toBeCalledWith(snapshot);
107 }); 115 });
108 116
109 it('should catch IPC errors without exposing them', async () => { 117 it('should catch IPC errors without exposing them', async () => {
110 mocked(ipcRenderer.invoke).mockRejectedValue(new Error('s3cr3t')); 118 mocked(ipcRenderer.invoke).mockRejectedValue(new Error('s3cr3t'));
111 await expect(sut.onSharedStoreChange(listener)).rejects.not.toHaveProperty( 119 await expect(
112 'message', 120 sut.onSharedStoreChange(listener),
113 expect.stringMatching(/s3cr3t/), 121 ).rejects.not.toHaveProperty('message', expect.stringMatching(/s3cr3t/));
114 );
115 expect(listener.onSnapshot).not.toBeCalled(); 122 expect(listener.onSnapshot).not.toBeCalled();
116 }); 123 });
117 124
118 it('should not pass on invalid snapshots', async () => { 125 it('should not pass on invalid snapshots', async () => {
119 mocked(ipcRenderer.invoke).mockResolvedValueOnce(invalidSnapshot); 126 mocked(ipcRenderer.invoke).mockResolvedValueOnce(invalidSnapshot);
120 await expect(sut.onSharedStoreChange(listener)).rejects.toBeInstanceOf(Error); 127 await expect(sut.onSharedStoreChange(listener)).rejects.toBeInstanceOf(
128 Error,
129 );
121 expect(listener.onSnapshot).not.toBeCalled(); 130 expect(listener.onSnapshot).not.toBeCalled();
122 }); 131 });
123 }); 132 });
@@ -125,7 +134,10 @@ describe('SharedStoreConnector', () => {
125 describe('dispatchAction', () => { 134 describe('dispatchAction', () => {
126 it('should dispatch valid actions', () => { 135 it('should dispatch valid actions', () => {
127 sut.dispatchAction(action); 136 sut.dispatchAction(action);
128 expect(ipcRenderer.send).toBeCalledWith(RendererToMainIpcMessage.DispatchAction, action); 137 expect(ipcRenderer.send).toBeCalledWith(
138 RendererToMainIpcMessage.DispatchAction,
139 action,
140 );
129 }); 141 });
130 142
131 it('should not dispatch invalid actions', () => { 143 it('should not dispatch invalid actions', () => {
@@ -142,7 +154,9 @@ describe('SharedStoreConnector', () => {
142 154
143 function itRefusesToRegisterAnotherListener(): void { 155 function itRefusesToRegisterAnotherListener(): void {
144 it('should refuse to register another listener', async () => { 156 it('should refuse to register another listener', async () => {
145 await expect(sut.onSharedStoreChange(listener)).rejects.toBeInstanceOf(Error); 157 await expect(sut.onSharedStoreChange(listener)).rejects.toBeInstanceOf(
158 Error,
159 );
146 }); 160 });
147 } 161 }
148 162
@@ -167,7 +181,9 @@ describe('SharedStoreConnector', () => {
167 }); 181 });
168 182
169 it('should catch listener errors', () => { 183 it('should catch listener errors', () => {
170 mocked(listener.onPatch).mockImplementation(() => { throw new Error(); }); 184 mocked(listener.onPatch).mockImplementation(() => {
185 throw new Error();
186 });
171 onSharedStorePatch(event, patch); 187 onSharedStorePatch(event, patch);
172 }); 188 });
173 189
@@ -175,7 +191,9 @@ describe('SharedStoreConnector', () => {
175 191
176 describe('after the listener threw in onPatch', () => { 192 describe('after the listener threw in onPatch', () => {
177 beforeEach(() => { 193 beforeEach(() => {
178 mocked(listener.onPatch).mockImplementation(() => { throw new Error(); }); 194 mocked(listener.onPatch).mockImplementation(() => {
195 throw new Error();
196 });
179 onSharedStorePatch(event, patch); 197 onSharedStorePatch(event, patch);
180 listener.onPatch.mockRestore(); 198 listener.onPatch.mockRestore();
181 }); 199 });
@@ -217,7 +235,9 @@ describe('SharedStoreConnector', () => {
217 describe('when a listener failed to register due to listener error', () => { 235 describe('when a listener failed to register due to listener error', () => {
218 beforeEach(async () => { 236 beforeEach(async () => {
219 mocked(ipcRenderer.invoke).mockResolvedValueOnce(snapshot); 237 mocked(ipcRenderer.invoke).mockResolvedValueOnce(snapshot);
220 mocked(listener.onSnapshot).mockImplementation(() => { throw new Error(); }); 238 mocked(listener.onSnapshot).mockImplementation(() => {
239 throw new Error();
240 });
221 try { 241 try {
222 await sut.onSharedStoreChange(listener); 242 await sut.onSharedStoreChange(listener);
223 } catch { 243 } catch {
@@ -236,15 +256,17 @@ describe('SharedStoreConnector', () => {
236 }; 256 };
237 const listener2 = { 257 const listener2 = {
238 // eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars 258 // eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars
239 onSnapshot: jest.fn((_snapshot: SharedStoreSnapshotIn) => { }), 259 onSnapshot: jest.fn((_snapshot: SharedStoreSnapshotIn) => {}),
240 // eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars 260 // eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars
241 onPatch: jest.fn((_patch: IJsonPatch) => { }), 261 onPatch: jest.fn((_patch: IJsonPatch) => {}),
242 }; 262 };
243 263
244 it('should fetch a second snapshot', async () => { 264 it('should fetch a second snapshot', async () => {
245 mocked(ipcRenderer.invoke).mockResolvedValueOnce(snapshot2); 265 mocked(ipcRenderer.invoke).mockResolvedValueOnce(snapshot2);
246 await sut.onSharedStoreChange(listener2); 266 await sut.onSharedStoreChange(listener2);
247 expect(ipcRenderer.invoke).toBeCalledWith(RendererToMainIpcMessage.GetSharedStoreSnapshot); 267 expect(ipcRenderer.invoke).toBeCalledWith(
268 RendererToMainIpcMessage.GetSharedStoreSnapshot,
269 );
248 expect(listener2.onSnapshot).toBeCalledWith(snapshot2); 270 expect(listener2.onSnapshot).toBeCalledWith(snapshot2);
249 }); 271 });
250 272