Files
SnapOtter/tests/unit/infra/deploy-demo-workflow.test.ts
T

47 lines
1.6 KiB
TypeScript

import { existsSync, readFileSync } from "node:fs";
import path from "node:path";
import { describe, expect, it } from "vitest";
const workflowPath = path.resolve(process.cwd(), ".github/workflows/deploy-demo.yml");
function workflowText(): string {
expect(existsSync(workflowPath)).toBe(true);
return readFileSync(workflowPath, "utf8");
}
describe("demo deployment workflow", () => {
it("deploys the demo app to the Cloudflare Pages demo project", () => {
const workflow = workflowText();
expect(workflow).toContain("name: Deploy Demo to Cloudflare Pages");
expect(workflow).toContain("pnpm --filter @snapotter/demo build");
expect(workflow).toContain(
"npx wrangler pages deploy apps/demo/dist --project-name snapotter-demo --branch main --commit-dirty=true",
);
expect(workflow).toContain("CLOUDFLARE_API_TOKEN: $" + "{{ secrets.CLOUDFLARE_API_TOKEN }}");
expect(workflow).toContain("CLOUDFLARE_ACCOUNT_ID: $" + "{{ secrets.CLOUDFLARE_ACCOUNT_ID }}");
});
it("rebuilds when the demo shell, real app UI, shared code, or build inputs change", () => {
const workflow = workflowText();
for (const pathFilter of [
'"apps/demo/**"',
'"apps/web/**"',
'"packages/shared/**"',
'"package.json"',
'"pnpm-lock.yaml"',
'"pnpm-workspace.yaml"',
'".github/actions/setup/**"',
'".github/workflows/deploy-demo.yml"',
]) {
expect(workflow).toContain(pathFilter);
}
expect(workflow).toContain("branches: [main]");
expect(workflow).toContain("workflow_dispatch:");
expect(workflow).toContain("concurrency:");
expect(workflow).toContain("group: deploy-demo");
});
});