import { EnvironmentId, WS_METHODS } from "@t3tools/contracts"; import { describe, expect, it } from "@effect/vitest"; import * as Effect from "effect/Effect"; import { onRetainedMobileBackgroundScopesChange, observeMobileBackgroundActivitySubscription, retainedMobileBackgroundScopes, } from "./background-activity-scopes"; describe("mobile background activity", () => { it.effect("retains VCS demand only while the mobile subscription is active", () => Effect.gen(function* () { const environmentId = EnvironmentId.make("mobile-environment"); const release = yield* observeMobileBackgroundActivitySubscription({ environmentId, method: WS_METHODS.subscribeVcsStatus, input: { cwd: "/workspace" }, }); expect(retainedMobileBackgroundScopes(environmentId)).toEqual([ { type: "vcs-status", cwd: "/workspace" }, ]); yield* release; expect(retainedMobileBackgroundScopes(environmentId)).toEqual([]); }), ); it.effect("keeps delimiter-containing environment and scope values distinct", () => Effect.gen(function* () { const firstEnvironmentId = EnvironmentId.make("a"); const secondEnvironmentId = EnvironmentId.make("a:vcs-status:b"); const releaseFirst = yield* observeMobileBackgroundActivitySubscription({ environmentId: firstEnvironmentId, method: WS_METHODS.subscribeVcsStatus, input: { cwd: "b:vcs-status:c" }, }); const releaseSecond = yield* observeMobileBackgroundActivitySubscription({ environmentId: secondEnvironmentId, method: WS_METHODS.subscribeVcsStatus, input: { cwd: "c" }, }); expect(retainedMobileBackgroundScopes(firstEnvironmentId)).toEqual([ { type: "vcs-status", cwd: "b:vcs-status:c" }, ]); expect(retainedMobileBackgroundScopes(secondEnvironmentId)).toEqual([ { type: "vcs-status", cwd: "c" }, ]); yield* Effect.all([releaseFirst, releaseSecond]); }), ); it.effect("returns a release handle when a retained-scope listener throws", () => Effect.gen(function* () { const environmentId = EnvironmentId.make("throwing-listener-environment"); const removeListener = onRetainedMobileBackgroundScopesChange(() => { throw new Error("listener failed"); }); const release = yield* observeMobileBackgroundActivitySubscription({ environmentId, method: WS_METHODS.subscribeVcsStatus, input: { cwd: "/workspace" }, }); expect(retainedMobileBackgroundScopes(environmentId)).toEqual([ { type: "vcs-status", cwd: "/workspace" }, ]); yield* release; expect(retainedMobileBackgroundScopes(environmentId)).toEqual([]); removeListener(); }), ); });