1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Verify messages are serializable within tests

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2022-06-13 14:58:09 -04:00
parent 78674e636f
commit 2c48be3ec0
3 changed files with 33 additions and 44 deletions

View File

@ -8,7 +8,8 @@ import sendToChannelInElectronBrowserWindowInjectable from "../../main/start-mai
import type { SendToViewArgs } from "../../main/start-main-application/lens-window/application-window/lens-window-injection-token"; import type { SendToViewArgs } from "../../main/start-main-application/lens-window/application-window/lens-window-injection-token";
import enlistMessageChannelListenerInjectableInRenderer from "../../renderer/utils/channel/channel-listeners/enlist-message-channel-listener.injectable"; import enlistMessageChannelListenerInjectableInRenderer from "../../renderer/utils/channel/channel-listeners/enlist-message-channel-listener.injectable";
import type { DiContainer } from "@ogre-tools/injectable"; import type { DiContainer } from "@ogre-tools/injectable";
import assert from "assert"; import { serialize } from "v8";
import { getOrInsertSet } from "../../renderer/utils";
export const overrideMessagingFromMainToWindow = (mainDi: DiContainer) => { export const overrideMessagingFromMainToWindow = (mainDi: DiContainer) => {
const messageChannelListenerFakesForRenderer = new Map< const messageChannelListenerFakesForRenderer = new Map<
@ -22,7 +23,7 @@ export const overrideMessagingFromMainToWindow = (mainDi: DiContainer) => {
() => () =>
( (
browserWindow, browserWindow,
{ channel: channelId, frameInfo, data = [] }: SendToViewArgs, { channel: channelId, frameInfo, data }: SendToViewArgs,
) => { ) => {
const listeners = const listeners =
messageChannelListenerFakesForRenderer.get(channelId) || new Set(); messageChannelListenerFakesForRenderer.get(channelId) || new Set();
@ -41,6 +42,12 @@ export const overrideMessagingFromMainToWindow = (mainDi: DiContainer) => {
); );
} }
try {
serialize(data);
} catch {
throw new Error(`Tried to send message to channel "${channelId}" but the value cannot be serialized.`);
}
listeners.forEach((listener) => listener.handler(data)); listeners.forEach((listener) => listener.handler(data));
}, },
); );
@ -50,31 +57,12 @@ export const overrideMessagingFromMainToWindow = (mainDi: DiContainer) => {
enlistMessageChannelListenerInjectableInRenderer, enlistMessageChannelListenerInjectableInRenderer,
() => (listener) => { () => (listener) => {
if (!messageChannelListenerFakesForRenderer.has(listener.channel.id)) { const listeners = getOrInsertSet(messageChannelListenerFakesForRenderer, listener.channel.id);
messageChannelListenerFakesForRenderer.set(
listener.channel.id,
new Set(),
);
}
const listeners = messageChannelListenerFakesForRenderer.get( listeners.add(listener);
listener.channel.id,
);
assert(listeners);
// TODO: Figure out typing
listeners.add(
listener as unknown as MessageChannelListener<MessageChannel<any>>,
);
return () => { return () => {
// TODO: Figure out typing listeners.delete(listener);
listeners.delete(
listener as unknown as MessageChannelListener<
MessageChannel<any>
>,
);
}; };
}, },
); );

View File

@ -3,10 +3,11 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import type { DiContainer } from "@ogre-tools/injectable"; import type { DiContainer } from "@ogre-tools/injectable";
import assert from "assert"; import { serialize } from "v8";
import type { MessageChannel } from "../../common/utils/channel/message-channel-injection-token"; import type { MessageChannel } from "../../common/utils/channel/message-channel-injection-token";
import type { MessageChannelListener } from "../../common/utils/channel/message-channel-listener-injection-token"; import type { MessageChannelListener } from "../../common/utils/channel/message-channel-listener-injection-token";
import enlistMessageChannelListenerInjectableInMain from "../../main/utils/channel/channel-listeners/enlist-message-channel-listener.injectable"; import enlistMessageChannelListenerInjectableInMain from "../../main/utils/channel/channel-listeners/enlist-message-channel-listener.injectable";
import { getOrInsertSet } from "../../renderer/utils";
import sendToMainInjectable from "../../renderer/utils/channel/send-to-main.injectable"; import sendToMainInjectable from "../../renderer/utils/channel/send-to-main.injectable";
export const overrideMessagingFromWindowToMain = (mainDi: DiContainer) => { export const overrideMessagingFromWindowToMain = (mainDi: DiContainer) => {
@ -20,27 +21,12 @@ export const overrideMessagingFromWindowToMain = (mainDi: DiContainer) => {
() => (listener) => { () => (listener) => {
const channelId = listener.channel.id; const channelId = listener.channel.id;
const listeners = getOrInsertSet(messageChannelListenerFakesForMain, channelId);
if (!messageChannelListenerFakesForMain.has(channelId)) { listeners.add(listener);
messageChannelListenerFakesForMain.set(channelId, new Set());
}
const listeners = messageChannelListenerFakesForMain.get(
channelId,
);
assert(listeners);
// TODO: Figure out typing
listeners.add(
listener as unknown as MessageChannelListener<MessageChannel<any>>,
);
return () => { return () => {
// TODO: Figure out typing listeners.delete(listener);
listeners.delete(
listener as unknown as MessageChannelListener<MessageChannel<any>>,
);
}; };
}, },
); );
@ -58,6 +44,12 @@ export const overrideMessagingFromWindowToMain = (mainDi: DiContainer) => {
); );
} }
try {
serialize(message);
} catch {
throw new Error(`Tried to send message to main channel "${channelId}" but the value cannot be serialized.`);
}
listeners.forEach((listener) => listener.handler(message)); listeners.forEach((listener) => listener.handler(message));
}); });
}; };

View File

@ -3,6 +3,7 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import type { DiContainer } from "@ogre-tools/injectable"; import type { DiContainer } from "@ogre-tools/injectable";
import { serialize } from "v8";
import type { RequestChannel } from "../../common/utils/channel/request-channel-injection-token"; import type { RequestChannel } from "../../common/utils/channel/request-channel-injection-token";
import type { RequestChannelHandler } from "../../common/utils/channel/request-channel-listener-injection-token"; import type { RequestChannelHandler } from "../../common/utils/channel/request-channel-listener-injection-token";
import enlistRequestChannelListenerInjectableInMain from "../../main/utils/channel/channel-listeners/enlist-request-channel-listener.injectable"; import enlistRequestChannelListenerInjectableInMain from "../../main/utils/channel/channel-listeners/enlist-request-channel-listener.injectable";
@ -46,7 +47,15 @@ export const overrideRequestingFromWindowToMain = (mainDi: DiContainer) => {
); );
} }
return requestListener.handler(request); const result = requestListener.handler(request);
try {
serialize(result);
} catch {
throw new Error(`Tried to request value from channel "${id}" but the value cannot be serialized.`);
}
return result;
}, },
); );
}; };