aboutsummaryrefslogtreecommitdiffstats
path: root/packages/preload/src/contextBridge/__tests__/SophieRendererImpl.spec.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/preload/src/contextBridge/__tests__/SophieRendererImpl.spec.ts')
-rw-r--r--packages/preload/src/contextBridge/__tests__/SophieRendererImpl.spec.ts36
1 files changed, 19 insertions, 17 deletions
diff --git a/packages/preload/src/contextBridge/__tests__/SophieRendererImpl.spec.ts b/packages/preload/src/contextBridge/__tests__/SophieRendererImpl.spec.ts
index 41937c2..fdd1cc5 100644
--- a/packages/preload/src/contextBridge/__tests__/SophieRendererImpl.spec.ts
+++ b/packages/preload/src/contextBridge/__tests__/SophieRendererImpl.spec.ts
@@ -18,7 +18,7 @@
18 * SPDX-License-Identifier: AGPL-3.0-only 18 * SPDX-License-Identifier: AGPL-3.0-only
19 */ 19 */
20 20
21import { describe, it, jest } from '@jest/globals'; 21import { jest } from '@jest/globals';
22import { mocked } from 'jest-mock'; 22import { mocked } from 'jest-mock';
23import log from 'loglevel'; 23import log from 'loglevel';
24import type { IJsonPatch } from 'mobx-state-tree'; 24import type { IJsonPatch } from 'mobx-state-tree';
@@ -67,7 +67,9 @@ const invalidAction = {
67 action: 'not-a-valid-action', 67 action: 'not-a-valid-action',
68} as unknown as Action; 68} as unknown as Action;
69 69
70log.disableAll(); 70beforeAll(() => {
71 log.disableAll();
72});
71 73
72describe('createSophieRenderer', () => { 74describe('createSophieRenderer', () => {
73 it('registers a shared store patch listener', () => { 75 it('registers a shared store patch listener', () => {
@@ -95,59 +97,59 @@ describe('SophieRendererImpl', () => {
95 }); 97 });
96 98
97 describe('onSharedStoreChange', () => { 99 describe('onSharedStoreChange', () => {
98 it('requests a snapshot from the main process', async () => { 100 it('should request a snapshot from the main process', async () => {
99 mocked(ipcRenderer.invoke).mockResolvedValueOnce(snapshot); 101 mocked(ipcRenderer.invoke).mockResolvedValueOnce(snapshot);
100 await sut.onSharedStoreChange(listener); 102 await sut.onSharedStoreChange(listener);
101 expect(ipcRenderer.invoke).toBeCalledWith(RendererToMainIpcMessage.GetSharedStoreSnapshot); 103 expect(ipcRenderer.invoke).toBeCalledWith(RendererToMainIpcMessage.GetSharedStoreSnapshot);
102 expect(listener.onSnapshot).toBeCalledWith(snapshot); 104 expect(listener.onSnapshot).toBeCalledWith(snapshot);
103 }); 105 });
104 106
105 it('catches IPC errors without exposing them', async () => { 107 it('should catch IPC errors without exposing them', async () => {
106 mocked(ipcRenderer.invoke).mockRejectedValue(new Error('s3cr3t')); 108 mocked(ipcRenderer.invoke).mockRejectedValue(new Error('s3cr3t'));
107 await expect(sut.onSharedStoreChange(listener)).rejects.not.toHaveProperty( 109 await expect(sut.onSharedStoreChange(listener)).rejects.not.toHaveProperty(
108 'message', 110 'message',
109 expect.stringMatching(/s3cr3t/), 111 expect.stringMatching(/s3cr3t/),
110 ); 112 );
111 expect(listener.onSnapshot).toBeCalledTimes(0); 113 expect(listener.onSnapshot).not.toBeCalled();
112 }); 114 });
113 115
114 it('does not pass on invalid snapshots', async () => { 116 it('should not pass on invalid snapshots', async () => {
115 mocked(ipcRenderer.invoke).mockResolvedValueOnce(invalidSnapshot); 117 mocked(ipcRenderer.invoke).mockResolvedValueOnce(invalidSnapshot);
116 await expect(sut.onSharedStoreChange(listener)).rejects.toBeInstanceOf(Error); 118 await expect(sut.onSharedStoreChange(listener)).rejects.toBeInstanceOf(Error);
117 expect(listener.onSnapshot).toBeCalledTimes(0); 119 expect(listener.onSnapshot).not.toBeCalled();
118 }); 120 });
119 }); 121 });
120 122
121 describe('dispatchAction', () => { 123 describe('dispatchAction', () => {
122 it('dispatched valid actions', () => { 124 it('should dispatch valid actions', () => {
123 sut.dispatchAction(action); 125 sut.dispatchAction(action);
124 expect(ipcRenderer.send).toBeCalledWith(RendererToMainIpcMessage.DispatchAction, action); 126 expect(ipcRenderer.send).toBeCalledWith(RendererToMainIpcMessage.DispatchAction, action);
125 }); 127 });
126 128
127 it('does not dispatch invalid actions', () => { 129 it('should not dispatch invalid actions', () => {
128 expect(() => sut.dispatchAction(invalidAction)).toThrowError(); 130 expect(() => sut.dispatchAction(invalidAction)).toThrowError();
129 expect(ipcRenderer.send).toBeCalledTimes(0); 131 expect(ipcRenderer.send).not.toBeCalled();
130 }); 132 });
131 }); 133 });
132 134
133 describe('when no listener is registered', () => { 135 describe('when no listener is registered', () => {
134 it('discards the received patch without any error', () => { 136 it('should discard the received patch without any error', () => {
135 onSharedStorePatch(event, patch); 137 onSharedStorePatch(event, patch);
136 }); 138 });
137 }); 139 });
138 140
139 function itRefusesToRegisterAnotherListener() { 141 function itRefusesToRegisterAnotherListener() {
140 it('refuses to register another listener', async () => { 142 it('should refuse to register another listener', async () => {
141 await expect(sut.onSharedStoreChange(listener)).rejects.toBeInstanceOf(Error); 143 await expect(sut.onSharedStoreChange(listener)).rejects.toBeInstanceOf(Error);
142 }); 144 });
143 } 145 }
144 146
145 function itDoesNotPassPatchesToTheListener( 147 function itDoesNotPassPatchesToTheListener(
146 name: string = 'does not pass patches to the listener', 148 name: string = 'should not pass patches to the listener',
147 ) { 149 ) {
148 it(name, () => { 150 it(name, () => {
149 onSharedStorePatch(event, patch); 151 onSharedStorePatch(event, patch);
150 expect(listener.onPatch).toBeCalledTimes(0); 152 expect(listener.onPatch).not.toBeCalled();
151 }); 153 });
152 } 154 }
153 155
@@ -157,12 +159,12 @@ describe('SophieRendererImpl', () => {
157 await sut.onSharedStoreChange(listener); 159 await sut.onSharedStoreChange(listener);
158 }); 160 });
159 161
160 it('passes patches to the listener', () => { 162 it('should pass patches to the listener', () => {
161 onSharedStorePatch(event, patch); 163 onSharedStorePatch(event, patch);
162 expect(listener.onPatch).toBeCalledWith(patch); 164 expect(listener.onPatch).toBeCalledWith(patch);
163 }); 165 });
164 166
165 it('catches listener errors', () => { 167 it('should catch listener errors', () => {
166 mocked(listener.onPatch).mockImplementation(() => { throw new Error(); }); 168 mocked(listener.onPatch).mockImplementation(() => { throw new Error(); });
167 onSharedStorePatch(event, patch); 169 onSharedStorePatch(event, patch);
168 }); 170 });
@@ -176,7 +178,7 @@ describe('SophieRendererImpl', () => {
176 listener.onPatch.mockRestore(); 178 listener.onPatch.mockRestore();
177 }); 179 });
178 180
179 itDoesNotPassPatchesToTheListener('does not pass on patches any more'); 181 itDoesNotPassPatchesToTheListener('should not pass on patches any more');
180 }); 182 });
181 }); 183 });
182 184