1import { makeWorkerRuntimeContext } from "@/Cloudflare/Workers/WorkerRuntimeContext.ts";
2import * as Effect from "effect/Effect";
3import { describe, expect, it } from "alchemy-test";
4
5describe(
6 "WorkerRuntimeContext",
7 {
8 tags: [
9 "unit",
10 "provider:cloudflare",
11 "provider:cloudflare:worker",
12 "local",
13 ],
14 },
15 () => {
16 it("dispatches an event to every listener for that event type", async () => {
17 const ctx = makeWorkerRuntimeContext("test-worker");
18 const observed: string[] = [];
19
20 await Effect.runPromise(
21 Effect.gen(function* () {
22 yield* ctx.listen((event) => {
23 if (event.type !== "queue") return;
24 return Effect.sync(() => {
25 observed.push("first");
26 });
27 });
28 yield* ctx.listen((event) => {
29 if (event.type !== "queue") return;
30 return Effect.sync(() => {
31 observed.push("second");
32 });
33 });
34 }),
35 );
36
37 const exports = await Effect.runPromise(ctx.exports);
38 const [program, services] = exports.default.queue(
39 { queue: "queue-a", messages: [] },
40 {},
41 {} as ExecutionContext,
42 );
43
44 await Effect.runPromise(program.pipe(Effect.provide(services)));
45
46 expect(observed).toEqual(["first", "second"]);
47 });
48 },
49);