| 1 | import * as NodeServices from "@effect/platform-node/NodeServices"; |
| 2 | import { assert, it } from "@effect/vitest"; |
| 3 | import * as Effect from "effect/Effect"; |
| 4 | import * as Layer from "effect/Layer"; |
| 5 | import type * as Electron from "electron"; |
| 6 | import { vi } from "vite-plus/test"; |
| 7 | |
| 8 | vi.mock("electron", () => ({})); |
| 9 | |
| 10 | import * as DesktopConfig from "../../app/DesktopConfig.ts"; |
| 11 | import * as DesktopEnvironment from "../../app/DesktopEnvironment.ts"; |
| 12 | import * as ElectronWindow from "../../electron/ElectronWindow.ts"; |
| 13 | import * as DesktopVideo from "../../media/DesktopVideo.ts"; |
| 14 | import { getDesktopUrl } from "../../electron/ElectronProtocol.ts"; |
| 15 | import { openVideo } from "./media.ts"; |
| 16 | |
| 17 | it.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 | }); |