1import * as Alchemy from "@/index.ts";
2import * as Cloudflare from "@/Cloudflare";
3import * as Stripe from "@/Stripe";
4import * as Test from "@/Test/Alchemy";
5import { expect } from "alchemy-test";
6import * as Effect from "effect/Effect";
7import * as Layer from "effect/Layer";
8import { MinimumLogLevel } from "effect/References";
9import StripeBindingWorker from "./fixtures/worker.ts";
10
11const { test, beforeAll, afterAll, deploy, destroy } = Test.make({
12 providers: Layer.mergeAll(Cloudflare.providers(), Stripe.providers()),
13});
14const { getWhenReady } = Test;
15
16const logLevel = Effect.provideService(
17 MinimumLogLevel,
18 process.env.DEBUG ? "Debug" : "Info",
19);
20
21const Stack = Alchemy.Stack(
22 "StripeBindingTestStack",
23 {
24 providers: Layer.mergeAll(Cloudflare.providers(), Stripe.providers()),
25 state: Cloudflare.state(),
26 },
27 Effect.gen(function* () {
28 const worker = yield* StripeBindingWorker;
29 return { url: worker.url.as<string>() };
30 }),
31);
32
33const stack = beforeAll(deploy(Stack));
34afterAll.skipIf(!!process.env.NO_DESTROY)(destroy(Stack));
35
36test(
37 "deployed worker retrieves a bound Stripe product",
38 Effect.gen(function* () {
39 const { url } = yield* stack;
40 const response = yield* getWhenReady(`${url.replace(/\/+$/, "")}/product`);
41 expect(response.status).toBe(200);
42 const body = (yield* response.json) as { id: string; name: string };
43 expect(body.id).toMatch(/^prod_/);
44 expect(body.name).toEqual("Alchemy Bound Product");
45 }).pipe(logLevel),
46 {
47 tags: [
48 "provider:cloudflare",
49 "provider:cloudflare:worker",
50 "provider:stripe",
51 "provider:stripe:product",
52 "live",
53 ],
54 timeout: 180_000,
55 },
56);