1import { AlchemyContext } from "@/AlchemyContext.ts";
2import {
3 fromEnv,
4 layer,
5 RPC_SERVER_ENVIRONMENT_KEY,
6 type RpcServerEnvironment,
7} from "@/Local/RpcServerEnvironment.ts";
8import { Stack } from "@/Stack.ts";
9import { Stage } from "@/Stage.ts";
10import { PlatformServices } from "@/Util/PlatformServices.ts";
11import { describe, expect, it } from "alchemy-test";
12import * as ConfigProvider from "effect/ConfigProvider";
13import * as Effect from "effect/Effect";
14import * as Layer from "effect/Layer";
15
16const sessionEnv = {
17 alchemyContext: {
18 dotAlchemy: "/tmp/.alchemy",
19 dev: true,
20 adopt: false,
21 },
22 stack: {
23 name: "my-stack",
24 stage: "dev",
25 },
26};
27
28const sampleEnv: RpcServerEnvironment = {
29 profile: undefined,
30 envFile: undefined,
31 ...sessionEnv,
32};
33
34describe("Local.RpcServerEnvironment", { tags: ["unit", "local"] }, () => {
35 it.effect("layer() provides Stack, Stage, and AlchemyContext", () =>
36 Effect.gen(function* () {
37 const observed = yield* Effect.gen(function* () {
38 const stack = yield* Stack;
39 const stage = yield* Stage;
40 const ctx = yield* AlchemyContext;
41 return { stack, stage, ctx };
42 }).pipe(
43 Effect.provide(
44 Layer.provide(
45 layer({ profile: undefined, envFile: undefined, ...sessionEnv }),
46 PlatformServices,
47 ),
48 ),
49 );
50
51 expect(observed.stack.name).toBe("my-stack");
52 expect(observed.stack.stage).toBe("dev");
53 expect(observed.stage).toBe("dev");
54 expect(observed.ctx.dotAlchemy).toBe("/tmp/.alchemy");
55 expect(observed.ctx.dev).toBe(true);
56 }),
57 );
58
59 it.effect("fromEnv() roundtrips a serialized RpcServerEnvironment", () =>
60 Effect.gen(function* () {
61 const environment = ConfigProvider.layer(
62 ConfigProvider.fromEnv({
63 env: {
64 [RPC_SERVER_ENVIRONMENT_KEY]: JSON.stringify(sampleEnv),
65 },
66 }),
67 );
68 const stack = yield* Stack.pipe(
69 Effect.provide(
70 Layer.provide(
71 fromEnv(),
72 Layer.mergeAll(PlatformServices, environment),
73 ),
74 ),
75 );
76 expect(stack.name).toBe(sessionEnv.stack.name);
77 expect(stack.stage).toBe(sessionEnv.stack.stage);
78 }),
79 );
80
81 it("exports the canonical environment variable key", () => {
82 expect(RPC_SERVER_ENVIRONMENT_KEY).toBe("ALCHEMY_RPC_SERVER_ENVIRONMENT");
83 });
84});