import { readFileSync } from "node:fs"; import { resolve } from "node:path"; import { describe, expect, it } from "vitest"; describe("CI workflow", () => { const workflow = readFileSync( resolve(process.cwd(), ".gitea/workflows/ci.yaml"), "utf8", ).replace(/\r\n/g, "\n"); it("runs check then production deploy on push to main", () => { expect(workflow).toContain("pnpm biome:lint"); expect(workflow).toContain("pnpm typecheck"); expect(workflow).toContain("pnpm test"); expect(workflow).toContain("needs: check"); expect(workflow).toContain( "gitea.event_name == 'push' && gitea.ref_name == 'main'", ); expect(workflow).toContain("worktree add --detach"); expect(workflow).toContain("/api/health"); expect(workflow).not.toContain("github.ref"); }); it("uses Gitea SHA for check checkout", () => { expect(workflow).toContain("gitea.sha"); expect(workflow).toContain("SKIP_ENV_VALIDATION=1"); }); it("keeps tag release in the same workflow", () => { expect(workflow).toContain('tags:\n - "v*"'); expect(workflow).toContain("Creating release for"); expect(workflow).toContain("startsWith(gitea.ref_name, 'v')"); }); it("applies CMS migrations on tag release before build", () => { const release = workflow.slice(workflow.indexOf("\n release:")); expect(release).toContain("pnpm db:migrate"); expect(release).not.toContain("pnpm prisma:generate"); expect(release).toContain("pnpm db:migrate"); expect(release).toContain("src/db/schema.ts"); const migrateAt = release.indexOf("pnpm db:migrate"); const buildAt = release.indexOf("pnpm build"); expect(migrateAt).toBeGreaterThan(-1); expect(buildAt).toBeGreaterThan(migrateAt); }); });