opencode/packages/opencode/test/util/effect-log.test.ts
Kit Langton e13d44684d test(log): avoid global logger module mocking
Replace the effect-log tests' global util/log module mock with local spies on Log.create so the logger compatibility tests no longer leak into unrelated unit suites. Keep the coverage for routing, annotations, spans, and cause formatting while allowing the full package test workflow to run cleanly.
2026-03-12 17:00:20 -04:00

99 lines
2.5 KiB
TypeScript

import { afterEach, expect, mock, spyOn, test } from "bun:test"
import { Cause, Effect } from "effect"
import { CurrentLogAnnotations, CurrentLogSpans } from "effect/References"
import * as EffectLog from "../../src/util/effect-log"
import { Log } from "../../src/util/log"
const debug = mock(() => {})
const info = mock(() => {})
const warn = mock(() => {})
const error = mock(() => {})
const logger = {
debug,
info,
warn,
error,
tag() {
return logger
},
clone() {
return logger
},
time() {
return {
stop() {},
[Symbol.dispose]() {},
}
},
}
afterEach(() => {
debug.mockClear()
info.mockClear()
warn.mockClear()
error.mockClear()
})
test("EffectLog.layer routes info logs through util/log", async () => {
using create = spyOn(Log, "create").mockReturnValue(logger)
await Effect.runPromise(Effect.logInfo("hello").pipe(Effect.provide(EffectLog.layer({ service: "effect-test" }))))
expect(create).toHaveBeenCalledWith({ service: "effect-test" })
expect(info).toHaveBeenCalledWith("hello", expect.any(Object))
})
test("EffectLog.layer forwards annotations and spans to util/log", async () => {
using create = spyOn(Log, "create").mockReturnValue(logger)
await Effect.runPromise(
Effect.logInfo("hello").pipe(
Effect.annotateLogs({ requestId: "req-123" }),
Effect.withLogSpan("provider-auth"),
Effect.provide(EffectLog.layer({ service: "effect-test-meta" })),
),
)
expect(create).toHaveBeenCalledWith({ service: "effect-test-meta" })
expect(info).toHaveBeenCalledWith(
"hello",
expect.objectContaining({
requestId: "req-123",
spans: expect.arrayContaining([
expect.objectContaining({
label: "provider-auth",
}),
]),
}),
)
})
test("EffectLog.make formats structured messages and causes for legacy logger", () => {
using create = spyOn(Log, "create").mockReturnValue(logger)
const effect = EffectLog.make({ service: "effect-test-struct" })
effect.log({
message: { hello: "world" },
logLevel: "Warn",
cause: Cause.fail(new Error("boom")),
fiber: {
id: 123n,
getRef(ref: unknown) {
if (ref === CurrentLogAnnotations) return {}
if (ref === CurrentLogSpans) return []
return undefined
},
},
date: new Date(),
} as never)
expect(create).toHaveBeenCalledWith({ service: "effect-test-struct" })
expect(warn).toHaveBeenCalledWith(
'{"hello":"world"}',
expect.objectContaining({
fiber: 123n,
}),
)
})