| 1 | import { makeWorkerRuntimeContext } from "@/Cloudflare/Workers/WorkerRuntimeContext.ts"; |
| 2 | import * as Effect from "effect/Effect"; |
| 3 | import { describe, expect, it } from "alchemy-test"; |
| 4 | |
| 5 | describe( |
| 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 | ); |