From 8a3bb749c539ee39096c1e5be2f4f234895a905c Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Wed, 29 Apr 2026 22:24:21 -0400 Subject: [PATCH 1/2] test: cover ConfigService helper --- .../test/effect/config-service.test.ts | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 packages/opencode/test/effect/config-service.test.ts diff --git a/packages/opencode/test/effect/config-service.test.ts b/packages/opencode/test/effect/config-service.test.ts new file mode 100644 index 000000000000..ae941a57a3dc --- /dev/null +++ b/packages/opencode/test/effect/config-service.test.ts @@ -0,0 +1,62 @@ +import { describe, expect, test } from "bun:test" +import { Config, ConfigProvider, Context, Effect, Layer, Option } from "effect" +import { ConfigService } from "../../src/effect/config-service" + +class TestConfig extends ConfigService.Service()("@test/ConfigService", { + name: Config.string("NAME"), + token: Config.string("TOKEN").pipe(Config.option), + port: Config.number("PORT").pipe(Config.withDefault(3000)), +}) {} + +const fromConfig = (input: Record) => + TestConfig.defaultLayer.pipe(Layer.provide(ConfigProvider.layer(ConfigProvider.fromUnknown(input)))) + +const readConfig = TestConfig.useSync((config) => config) + +describe("ConfigService", () => { + test("defaultLayer parses values from the active ConfigProvider", async () => { + const config = await Effect.runPromise( + readConfig.pipe( + Effect.provide( + fromConfig({ + NAME: "kit", + TOKEN: "secret", + PORT: "4096", + }), + ), + ), + ) + + expect(config.name).toBe("kit") + expect(config.token).toEqual(Option.some("secret")) + expect(config.port).toBe(4096) + }) + + test("defaultLayer applies Effect Config defaults", async () => { + const config = await Effect.runPromise(readConfig.pipe(Effect.provide(fromConfig({ NAME: "kit" })))) + + expect(config.name).toBe("kit") + expect(config.token).toEqual(Option.none()) + expect(config.port).toBe(3000) + }) + + test("layer provides an already parsed service value", async () => { + const config = await Effect.runPromise( + readConfig.pipe( + Effect.provide( + TestConfig.layer({ + name: "direct", + token: Option.some("parsed"), + port: 9000, + }), + ), + ), + ) + + expect(config).toEqual({ + name: "direct", + token: Option.some("parsed"), + port: 9000, + } satisfies Context.Service.Shape) + }) +}) From 556a5b2356c1260c0c6fea9de7a9d0fe7fd11983 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Wed, 29 Apr 2026 22:33:30 -0400 Subject: [PATCH 2/2] test: use testEffect for ConfigService tests --- .../test/effect/config-service.test.ts | 59 ++++++++++--------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/packages/opencode/test/effect/config-service.test.ts b/packages/opencode/test/effect/config-service.test.ts index ae941a57a3dc..be6f97736313 100644 --- a/packages/opencode/test/effect/config-service.test.ts +++ b/packages/opencode/test/effect/config-service.test.ts @@ -1,6 +1,7 @@ -import { describe, expect, test } from "bun:test" +import { describe, expect } from "bun:test" import { Config, ConfigProvider, Context, Effect, Layer, Option } from "effect" import { ConfigService } from "../../src/effect/config-service" +import { it } from "../lib/effect" class TestConfig extends ConfigService.Service()("@test/ConfigService", { name: Config.string("NAME"), @@ -14,9 +15,9 @@ const fromConfig = (input: Record) => const readConfig = TestConfig.useSync((config) => config) describe("ConfigService", () => { - test("defaultLayer parses values from the active ConfigProvider", async () => { - const config = await Effect.runPromise( - readConfig.pipe( + it.effect("defaultLayer parses values from the active ConfigProvider", () => + Effect.gen(function* () { + const config = yield* readConfig.pipe( Effect.provide( fromConfig({ NAME: "kit", @@ -24,25 +25,27 @@ describe("ConfigService", () => { PORT: "4096", }), ), - ), - ) + ) - expect(config.name).toBe("kit") - expect(config.token).toEqual(Option.some("secret")) - expect(config.port).toBe(4096) - }) + expect(config.name).toBe("kit") + expect(config.token).toEqual(Option.some("secret")) + expect(config.port).toBe(4096) + }), + ) - test("defaultLayer applies Effect Config defaults", async () => { - const config = await Effect.runPromise(readConfig.pipe(Effect.provide(fromConfig({ NAME: "kit" })))) + it.effect("defaultLayer applies Effect Config defaults", () => + Effect.gen(function* () { + const config = yield* readConfig.pipe(Effect.provide(fromConfig({ NAME: "kit" }))) - expect(config.name).toBe("kit") - expect(config.token).toEqual(Option.none()) - expect(config.port).toBe(3000) - }) + expect(config.name).toBe("kit") + expect(config.token).toEqual(Option.none()) + expect(config.port).toBe(3000) + }), + ) - test("layer provides an already parsed service value", async () => { - const config = await Effect.runPromise( - readConfig.pipe( + it.effect("layer provides an already parsed service value", () => + Effect.gen(function* () { + const config = yield* readConfig.pipe( Effect.provide( TestConfig.layer({ name: "direct", @@ -50,13 +53,13 @@ describe("ConfigService", () => { port: 9000, }), ), - ), - ) - - expect(config).toEqual({ - name: "direct", - token: Option.some("parsed"), - port: 9000, - } satisfies Context.Service.Shape) - }) + ) + + expect(config).toEqual({ + name: "direct", + token: Option.some("parsed"), + port: 9000, + } satisfies Context.Service.Shape) + }), + ) })