1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00
lens/src/renderer/channel/request-from-channel.test.ts
Janne Savolainen ebda9424bb
Serialize messages in channels to make IPC not blow up
Co-authored-by: Mikko Aspiala <mikko.aspiala@gmail.com>

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
2022-06-03 07:49:46 +03:00

122 lines
4.0 KiB
TypeScript

/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { MessageChannel } from "../../common/channel/message-channel-injection-token";
import { getDiForUnitTesting } from "../getDiForUnitTesting";
import ipcRendererInjectable from "./ipc-renderer.injectable";
import type { IpcRenderer } from "electron";
import type { AsyncFnMock } from "@async-fn/jest";
import asyncFn from "@async-fn/jest";
import type { RequestFromChannel } from "../../common/channel/request-from-channel-injection-token";
import { requestFromChannelInjectionToken } from "../../common/channel/request-from-channel-injection-token";
import requestFromChannelInjectable from "./request-from-channel.injectable";
import { getPromiseStatus } from "../../common/test-utils/get-promise-status";
describe("request from channel in renderer", () => {
let requestFromChannel: RequestFromChannel;
let invokeMock: AsyncFnMock<(channelId: string, request: any) => any>;
beforeEach(() => {
const di = getDiForUnitTesting({ doGeneralOverrides: true });
di.unoverride(requestFromChannelInjectable);
invokeMock = asyncFn();
di.override(ipcRendererInjectable, () => ({
invoke: invokeMock,
}) as unknown as IpcRenderer);
requestFromChannel = di.inject(requestFromChannelInjectionToken);
});
describe("when messaging to channel", () => {
let actualPromise: Promise<any>;
beforeEach(() => {
actualPromise = requestFromChannel(someChannel, "some-message");
});
it("sends stringified message", () => {
expect(invokeMock).toHaveBeenCalledWith("some-channel-id", '"some-message"');
});
it("does not resolve yet", async () => {
const promiseStatus = await getPromiseStatus(actualPromise);
expect(promiseStatus.fulfilled).toBe(false);
});
it("when invoking resolves, resolves", async () => {
await invokeMock.resolve("some-response");
const actual = await actualPromise;
expect(actual).toBe("some-response");
});
it("when invoking resolves with stringified string, resolves with string", async () => {
await invokeMock.resolve('"some-response"');
const actual = await actualPromise;
expect(actual).toBe("some-response");
});
it("when invoking resolves with stringified boolean, resolves with boolean", async () => {
await invokeMock.resolve("true");
const actual = await actualPromise;
expect(actual).toBe(true);
});
it("when invoking resolves with stringified number, resolves with number", async () => {
await invokeMock.resolve("42");
const actual = await actualPromise;
expect(actual).toBe(42);
});
it("when invoking resolves with stringified object, resolves with object", async () => {
await invokeMock.resolve(JSON.stringify({ some: "object" }));
const actual = await actualPromise;
expect(actual).toEqual({ some: "object" });
});
});
it("given string as message, when messaging to channel, sends stringified message", () => {
requestFromChannel(someChannel, "some-message");
expect(invokeMock).toHaveBeenCalledWith("some-channel-id", '"some-message"');
});
it("given boolean as message, when messaging to channel, sends stringified message", () => {
requestFromChannel(someChannel, true);
expect(invokeMock).toHaveBeenCalledWith("some-channel-id", "true");
});
it("given number as message, when messaging to channel, sends stringified message", () => {
requestFromChannel(someChannel, 42);
expect(invokeMock).toHaveBeenCalledWith("some-channel-id", "42");
});
it("given object as message, when messaging to channel, sends stringified message", () => {
requestFromChannel(someChannel, { some: "object" });
expect(invokeMock).toHaveBeenCalledWith(
"some-channel-id",
JSON.stringify({ some: "object" }),
);
});
});
const someChannel: MessageChannel<any> = { id: "some-channel-id" };