94 lines
5.4 KiB
TypeScript
94 lines
5.4 KiB
TypeScript
import { describe, expect, test } from "bun:test";
|
|
import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
import { tmpdir } from "node:os";
|
|
import { resolve } from "node:path";
|
|
|
|
import { renderPikaoaTestDesiredPipeline } from "./pikaoa-test-delivery-renderer";
|
|
|
|
function pacDocument(): Record<string, unknown> {
|
|
return Bun.YAML.parse(readFileSync(resolve(import.meta.dir, "../../config/platform-infra/pipelines-as-code.yaml"), "utf8")) as Record<string, unknown>;
|
|
}
|
|
|
|
function rendererBinding(): Parameters<typeof renderPikaoaTestDesiredPipeline>[0] {
|
|
const document = pacDocument();
|
|
const repositories = document.repositories as Array<Record<string, unknown>>;
|
|
const consumers = document.consumers as Array<Record<string, unknown>>;
|
|
const repository = repositories.find((item) => item.id === "pikaoa-test-nc01");
|
|
const consumer = consumers.find((item) => item.id === "pikaoa-test-nc01");
|
|
if (repository === undefined || consumer === undefined) throw new Error("PikaOA test PaC fixture is required");
|
|
return { consumer, repository } as Parameters<typeof renderPikaoaTestDesiredPipeline>[0];
|
|
}
|
|
|
|
function sourceFixture(): string {
|
|
const root = mkdtempSync(resolve(tmpdir(), "pikaoa-test-renderer-"));
|
|
mkdirSync(resolve(root, "deploy"), { recursive: true });
|
|
for (const file of ["api.Dockerfile", "worker.Dockerfile", "web.Dockerfile"]) writeFileSync(resolve(root, "deploy", file), "FROM scratch\n");
|
|
return root;
|
|
}
|
|
|
|
describe("PikaOA test PaC renderer", () => {
|
|
test("keeps master test and release production consumers isolated", () => {
|
|
const document = pacDocument();
|
|
const repositories = document.repositories as Array<Record<string, unknown>>;
|
|
const consumers = document.consumers as Array<Record<string, unknown>>;
|
|
const repository = repositories.find((item) => item.id === "pikaoa-test-nc01");
|
|
const testConsumer = consumers.find((item) => item.id === "pikaoa-test-nc01");
|
|
const productionConsumer = consumers.find((item) => item.id === "pikaoa-nc01");
|
|
expect((repository?.params as Record<string, unknown>).source_branch).toBe("master");
|
|
expect((testConsumer?.sourceArtifact as Record<string, unknown>).pipelineRunPath).toBe(".tekton/pikaoa-test-nc01-pac.yaml");
|
|
expect((testConsumer?.sourceArtifact as Record<string, unknown>).renderer).toBe("pikaoa-test-runtime");
|
|
expect((productionConsumer?.params as Record<string, unknown>).source_branch).toBe("release");
|
|
expect((productionConsumer?.params as Record<string, unknown>).source_snapshot_prefix).toBe("refs/unidesk/snapshots/gitea-actions/pikaoa-release-nc01");
|
|
expect(productionConsumer?.sourceArtifact).toBeUndefined();
|
|
});
|
|
|
|
test("renders parallel digest builds and a PreSync fresh database initializer", () => {
|
|
const source = sourceFixture();
|
|
try {
|
|
const rendered = renderPikaoaTestDesiredPipeline(rendererBinding(), source);
|
|
const spec = rendered.pipeline.spec as Record<string, unknown>;
|
|
const tasks = spec.tasks as Array<Record<string, unknown>>;
|
|
for (const name of ["build-api", "build-worker", "build-web"]) {
|
|
const task = tasks.find((item) => item.name === name);
|
|
expect(task?.runAfter).toEqual(["source"]);
|
|
expect(JSON.stringify(task)).toContain("buildctl-daemonless.sh build");
|
|
expect(JSON.stringify(task)).toContain("$(params.revision)");
|
|
expect(JSON.stringify(task)).not.toContain("source-token");
|
|
}
|
|
const sourceTask = tasks.find((item) => item.name === "source");
|
|
expect(JSON.stringify(sourceTask)).toContain("source-token");
|
|
expect(JSON.stringify(sourceTask)).toContain("GIT_ASKPASS");
|
|
expect(JSON.stringify(sourceTask)).toContain("$(params.gitops-secret-name)");
|
|
const publish = tasks.find((item) => item.name === "gitops-publish");
|
|
expect(publish?.runAfter).toEqual(["build-api", "build-worker", "build-web"]);
|
|
const script = ((((publish?.taskSpec as Record<string, unknown>).steps as Array<Record<string, unknown>>)[0]?.script) as string);
|
|
for (const evidence of [
|
|
'"status":"published"',
|
|
'"registryVerified":true',
|
|
'"publishedCount":3',
|
|
'"requiredServiceCount":3',
|
|
'"gitopsCommit"',
|
|
'"service":"api"',
|
|
'"service":"worker"',
|
|
'"service":"web"',
|
|
]) expect(script).toContain(evidence);
|
|
const encoded = /printf '%s' '([A-Za-z0-9+/=]+)' \| base64 -d/u.exec(script)?.[1];
|
|
if (encoded === undefined) throw new Error("embedded GitOps manifest is required");
|
|
const manifest = Buffer.from(encoded, "base64").toString("utf8");
|
|
expect(manifest).toContain("argocd.argoproj.io/hook: PreSync");
|
|
expect(manifest).toContain("name: pikaoa-init");
|
|
expect(manifest).toContain("name: initializer");
|
|
expect(manifest).not.toContain("kind: Secret");
|
|
expect(manifest).toContain("secretName: pikaoa-test-runtime");
|
|
expect(manifest).toContain("image: __PIKAOA_API_IMAGE__");
|
|
expect(manifest).toContain("pikaoa.unidesk.io/source-commit: __PIKAOA_SOURCE_COMMIT__");
|
|
expect(script).toContain('s|__PIKAOA_SOURCE_COMMIT__|$SOURCE_COMMIT|g');
|
|
expect(script).toContain("GitOps manifest contains unresolved provenance or image placeholders");
|
|
expect(script).toContain("git ls-remote --exit-code --heads");
|
|
expect(script).toContain("git -C /workspace/gitops checkout --orphan");
|
|
} finally {
|
|
rmSync(source, { recursive: true, force: true });
|
|
}
|
|
});
|
|
});
|