| 1 | import { AlchemyContext } from "@/AlchemyContext.ts"; |
| 2 | import { |
| 3 | fromEnv, |
| 4 | layer, |
| 5 | RPC_SERVER_ENVIRONMENT_KEY, |
| 6 | type RpcServerEnvironment, |
| 7 | } from "@/Local/RpcServerEnvironment.ts"; |
| 8 | import { Stack } from "@/Stack.ts"; |
| 9 | import { Stage } from "@/Stage.ts"; |
| 10 | import { PlatformServices } from "@/Util/PlatformServices.ts"; |
| 11 | import { describe, expect, it } from "alchemy-test"; |
| 12 | import * as ConfigProvider from "effect/ConfigProvider"; |
| 13 | import * as Effect from "effect/Effect"; |
| 14 | import * as Layer from "effect/Layer"; |
| 15 | |
| 16 | const 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 | |
| 28 | const sampleEnv: RpcServerEnvironment = { |
| 29 | profile: undefined, |
| 30 | envFile: undefined, |
| 31 | ...sessionEnv, |
| 32 | }; |
| 33 | |
| 34 | describe("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 | }); |