event-logger.test.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import { describe, expect, test } from "bun:test"
  2. import { Effect, Layer, Logger } from "effect"
  3. import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder"
  4. import { LayerNode } from "@opencode-ai/util/effect/layer-node"
  5. import { Database } from "@opencode-ai/core/database/database"
  6. import { Bus } from "@opencode-ai/core/bus"
  7. import { EventLogger } from "@opencode-ai/core/event-logger"
  8. import { Agent } from "@opencode-ai/schema/agent"
  9. import { Catalog } from "@opencode-ai/schema/catalog"
  10. import { Command } from "@opencode-ai/schema/command"
  11. import { Config } from "@opencode-ai/schema/config"
  12. import { McpEvent } from "@opencode-ai/schema/mcp-event"
  13. const UnlistedUpdated = Bus.ephemeral({ type: "test.updated", schema: {} })
  14. describe("EventLogger", () => {
  15. test("logs explicitly listed updated events", async () => {
  16. const output = new Array<ReturnType<typeof Logger.formatStructured.log>>()
  17. const logger = Logger.map(Logger.formatStructured, (entry) => {
  18. output.push(entry)
  19. })
  20. await Effect.gen(function* () {
  21. const bus = yield* Bus.Service
  22. yield* bus.publish(Agent.Event.Updated, {})
  23. yield* bus.publish(Catalog.Event.Updated, {})
  24. yield* bus.publish(Command.Event.Updated, {})
  25. yield* bus.publish(Config.Event.Updated, {})
  26. yield* bus.publish(McpEvent.StatusChanged, { server: "example" })
  27. yield* bus.publish(UnlistedUpdated, {})
  28. }).pipe(
  29. Effect.provide(AppNodeBuilder.build(LayerNode.group([Database.node, Bus.node, EventLogger.node]))),
  30. Effect.provide(Logger.layer([logger])),
  31. Effect.scoped,
  32. Effect.runPromise,
  33. )
  34. expect(
  35. output.flatMap((entry) => (Array.isArray(entry.message) && entry.message[0] === "event" ? [entry.message] : [])),
  36. ).toEqual([
  37. ["event", { event: expect.objectContaining({ type: "agent.updated" }) }],
  38. ["event", { event: expect.objectContaining({ type: "catalog.updated" }) }],
  39. ["event", { event: expect.objectContaining({ type: "command.updated" }) }],
  40. ["event", { event: expect.objectContaining({ type: "config.updated" }) }],
  41. ])
  42. })
  43. })