1import * as NodeServices from "@effect/platform-node/NodeServices";
2import { assert, it } from "@effect/vitest";
3import * as Effect from "effect/Effect";
4import * as Layer from "effect/Layer";
5import type * as Electron from "electron";
6import { vi } from "vite-plus/test";
7
8vi.mock("electron", () => ({}));
9
10import * as DesktopConfig from "../../app/DesktopConfig.ts";
11import * as DesktopEnvironment from "../../app/DesktopEnvironment.ts";
12import * as ElectronWindow from "../../electron/ElectronWindow.ts";
13import * as DesktopVideo from "../../media/DesktopVideo.ts";
14import { getDesktopUrl } from "../../electron/ElectronProtocol.ts";
15import { openVideo } from "./media.ts";
16
17it.effect("allows only the top-level app frame to open a video", () => {
18 const calls: unknown[] = [];
19 // Electron owns this object; only the native identity checks are exercised here.
20 const window = { isDestroyed: () => false, webContents: { id: 42 } } as Electron.BrowserWindow;
21 const layer = Layer.mergeAll(
22 DesktopEnvironment.layer({
23 dirname: "/repo/apps/desktop/dist-electron",
24 homeDirectory: "/tmp/t3-media-test",
25 platform: "darwin",
26 processArch: "arm64",
27 appVersion: "0.0.45",
28 appPath: "/tmp/T3 Code.app",
29 isPackaged: true,
30 resourcesPath: "/tmp/resources",
31 runningUnderArm64Translation: false,
32 }).pipe(Layer.provide(Layer.mergeAll(NodeServices.layer, DesktopConfig.layerTest({})))),
33 Layer.mock(ElectronWindow.ElectronWindow, { main: Effect.succeedSome(window) }),
34 Layer.succeed(DesktopVideo.DesktopVideo, {
35 open: (input) =>
36 Effect.sync(() => {
37 calls.push(input);
38 }),
39 }),
40 );
41 const input = { url: "https://remote.test/clip.mp4", name: "clip.mp4" };
42 const trustedFrame = { parent: null, url: getDesktopUrl(false) };
43 return Effect.gen(function* () {
44 for (const event of [
45 undefined,
46 { sender: { id: 100 }, senderFrame: trustedFrame },
47 { sender: { id: 42 }, senderFrame: { parent: {}, url: trustedFrame.url } },
48 { sender: { id: 42 }, senderFrame: { parent: null, url: "https://preview.test" } },
49 { sender: { id: 42 } },
50 ])
51 assert.equal((yield* Effect.result(openVideo.handler(input, event)))._tag, "Failure");
52 assert.equal(calls.length, 0);
53 yield* openVideo.handler(input, { sender: { id: 42 }, senderFrame: trustedFrame });
54 assert.deepEqual(calls, [input]);
55 }).pipe(Effect.provide(layer));
56});