Files
reverse-engineering-anything/tests/conformance/package/environmentBundlePackagePin.test.ts
T

73 lines
2.5 KiB
TypeScript

import { readFile } from "node:fs/promises";
import { describe, expect, it } from "vitest";
import { z } from "zod";
import {
planEnvironmentBundle,
registryPackageSource,
} from "../../../src/application/environment/environmentBundle.js";
import {
environmentServeFixture,
environmentServeServed,
} from "../../fixtures/environmentServe.js";
import { PRODUCT_IDENTITY } from "../../../src/identity.js";
import { supportsNodeVersion } from "../../../src/domain/runtimeVersion.js";
const plannedDockerfile = (): string => {
const { source, served } = environmentServeServed(environmentServeFixture());
const planned = planEnvironmentBundle(source, {
packageSource: registryPackageSource(),
served: () => served,
});
if (!planned.ok) throw planned.error;
const dockerfile = planned.value.files.find(({ path }) =>
path.endsWith("/Dockerfile"),
);
if (dockerfile === undefined)
throw new Error("Expected a planned Dockerfile");
return dockerfile.content;
};
/**
* The exported Dockerfile installs the CLI that produced the bundle, so the
* pin must be the exact package version of this build, read from the package
* manifest rather than restated anywhere in source.
*/
describe("environment bundle package pin", () => {
it("exports the pinned supported Node runtime in the Dockerfile", async () => {
const pinned = (
await readFile(new URL("../../../.nvmrc", import.meta.url), "utf8")
).trim();
const dockerfile = plannedDockerfile();
const nodeVersion = /^FROM node:(\d+\.\d+\.\d+)(?:[-@][^\s]+)?$/u.exec(
dockerfile.split("\n")[0] ?? "",
)?.[1];
expect(nodeVersion).toBe(pinned);
expect(supportsNodeVersion(nodeVersion ?? "")).toBe(true);
});
it("pins the registry install to the package.json version", async () => {
const manifest = z
.object({ name: z.literal("rea-agents"), version: z.string().min(1) })
.parse(
JSON.parse(
await readFile(
new URL("../../../package.json", import.meta.url),
"utf8",
),
),
);
const dockerfile = plannedDockerfile();
const install = dockerfile
.split("\n")
.find((line) => line.startsWith("RUN npm install -g"));
expect(install).toBeDefined();
expect(install?.endsWith(` ${manifest.name}@${manifest.version}`)).toBe(
true,
);
expect(PRODUCT_IDENTITY.packageVersion).toBe(manifest.version);
expect(dockerfile).not.toMatch(/rea-agents@(?:latest|\^|~)/u);
});
});