1import * as Railway from "@/Railway";
2import * as Test from "@/Test/Alchemy";
3import { describe, expect } from "alchemy-test";
4import * as Effect from "effect/Effect";
5import * as pathe from "pathe";
6import { cloneFixture } from "../../Cloudflare/Utils/Fixture.ts";
7import { expectUrlContains } from "../../Cloudflare/Utils/Http.ts";
8
9const { test } = Test.make({ providers: Railway.providers(), dev: true });
10
11const fixtureDir = pathe.resolve(
12 import.meta.dirname,
13 "../../AWS/Website/fixtures/solidstart-app",
14);
15const tempRoot = pathe.resolve(import.meta.dirname, "../../../.tmp");
16const fixtureEntries = [
17 ".gitignore",
18 "package.json",
19 "vite.config.ts",
20 "src",
21 "public",
22];
23
24describe(
25 "Railway.Website.SolidStart local",
26 { tags: ["provider:railway", "provider:railway:website", "local"] },
27 () => {
28 test.provider(
29 "dev runs the framework server with no cloud resources",
30 (stack) =>
31 Effect.gen(function* () {
32 yield* stack.destroy();
33
34 const rootDir = yield* cloneFixture(fixtureDir, {
35 prefix: "alchemy-solidstart-railway-local-",
36 tempRoot,
37 entries: fixtureEntries,
38 });
39
40 const deployed = yield* stack.deploy(
41 Effect.gen(function* () {
42 const site = yield* Railway.Website.SolidStart("Web", {
43 rootDir,
44 });
45 return { site };
46 }),
47 );
48
49 const url = deployed.site.url;
50 expect(url).toMatch(/^http:\/\/(localhost|127\.0\.0\.1):\d+\/?$/);
51 expect(deployed.site.service).toBeUndefined();
52 expect(deployed.site.project).toBeUndefined();
53
54 const origin = String(url).replace(/\/+$/, "");
55 yield* expectUrlContains(`${origin}/`, "SOLIDSTART_AWS_PAGE_MARKER", {
56 timeout: "90 seconds",
57 label: "dev home page",
58 });
59 yield* expectUrlContains(
60 `${origin}/api/hello?echo=roundtrip`,
61 "SOLIDSTART_AWS_API_MARKER",
62 { label: "api route (dev)" },
63 );
64 yield* expectUrlContains(
65 `${origin}/prerendered`,
66 "SOLIDSTART_AWS_PRERENDERED_MARKER",
67 { label: "extra route (dev)" },
68 );
69
70 yield* stack.destroy();
71 }),
72 { timeout: 120_000 },
73 );
74 },
75);