1import { assert, describe, it } from "@effect/vitest";
2import * as Effect from "effect/Effect";
3import * as Layer from "effect/Layer";
4
5import * as DesktopEnvironment from "../../app/DesktopEnvironment.ts";
6import * as DesktopLifecycle from "../../app/DesktopLifecycle.ts";
7import * as DesktopShutdown from "../../app/DesktopShutdown.ts";
8import * as DesktopState from "../../app/DesktopState.ts";
9import * as ElectronApp from "../../electron/ElectronApp.ts";
10import * as ElectronTheme from "../../electron/ElectronTheme.ts";
11import * as DesktopAppSettings from "../../settings/DesktopAppSettings.ts";
12import * as DesktopWindow from "../../window/DesktopWindow.ts";
13import { getLocalEnvironmentEnabled, setLocalEnvironmentEnabled } from "./localEnvironment.ts";
14
15// `relaunch` declares the lifecycle runtime services as requirements even
16// though the mocked relaunch never touches them.
17const layerUnusedLifecycleRuntime = Layer.mergeAll(
18 DesktopShutdown.layer,
19 DesktopState.layer,
20 Layer.succeed(
21 DesktopEnvironment.DesktopEnvironment,
22 DesktopEnvironment.DesktopEnvironment.of(
23 {} as DesktopEnvironment.DesktopEnvironment["Service"],
24 ),
25 ),
26 Layer.mock(DesktopWindow.DesktopWindow, {}),
27 Layer.mock(ElectronApp.ElectronApp, {}),
28 Layer.mock(ElectronTheme.ElectronTheme, {}),
29);
30
31describe("local environment IPC", () => {
32 it.effect("relaunches only when the setting changes and keeps other settings", () => {
33 const relaunchReasons: Array<string> = [];
34 const layer = Layer.mergeAll(
35 DesktopAppSettings.layerTest({
36 ...DesktopAppSettings.DEFAULT_DESKTOP_SETTINGS,
37 wslBackendEnabled: true,
38 }),
39 Layer.mock(DesktopLifecycle.DesktopLifecycle, {
40 relaunch: (reason) =>
41 Effect.sync(() => {
42 relaunchReasons.push(reason);
43 }),
44 }),
45 layerUnusedLifecycleRuntime,
46 );
47 return Effect.gen(function* () {
48 yield* setLocalEnvironmentEnabled.handler(false);
49 assert.isFalse(yield* getLocalEnvironmentEnabled.handler());
50 yield* setLocalEnvironmentEnabled.handler(false);
51 assert.deepEqual(relaunchReasons, ["localEnvironmentEnabled=false"]);
52
53 yield* setLocalEnvironmentEnabled.handler(true);
54 assert.isTrue(yield* getLocalEnvironmentEnabled.handler());
55 const appSettings = yield* DesktopAppSettings.DesktopAppSettings;
56 assert.isTrue((yield* appSettings.get).wslBackendEnabled);
57 assert.deepEqual(relaunchReasons, [
58 "localEnvironmentEnabled=false",
59 "localEnvironmentEnabled=true",
60 ]);
61 }).pipe(Effect.provide(layer));
62 });
63});