101 lines
3.3 KiB
JavaScript
101 lines
3.3 KiB
JavaScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
import {
|
|
DEFAULT_STAGING_BASE_URL,
|
|
EXPECTED_INSTALL_VERSION,
|
|
INSTALLER_SCRIPT_REQUIRED_SNIPPETS,
|
|
buildChecks,
|
|
normalizeBaseUrl,
|
|
parseArgs,
|
|
validateArtifactBodyAgainstManifest,
|
|
validateArtifactManifestBody,
|
|
validateInstallerScriptBody,
|
|
} from "./staging-edge-gateway-smoke.mjs";
|
|
|
|
test("normalizeBaseUrl strips trailing slashes", () => {
|
|
assert.equal(normalizeBaseUrl("https://api.truckwash.io:4433///"), DEFAULT_STAGING_BASE_URL);
|
|
});
|
|
|
|
test("parseArgs accepts base URL and install token", () => {
|
|
const options = parseArgs([
|
|
"--base-url",
|
|
"https://staging.example.test/",
|
|
"--install-token",
|
|
"token-123",
|
|
]);
|
|
|
|
assert.equal(options.baseUrl, "https://staging.example.test/");
|
|
assert.equal(options.installToken, "token-123");
|
|
assert.equal(options.help, false);
|
|
});
|
|
|
|
test("buildChecks targets the public staging endpoints", () => {
|
|
const checks = buildChecks(DEFAULT_STAGING_BASE_URL, "abc 123");
|
|
|
|
assert.deepEqual(checks.map((check) => check.url), [
|
|
"https://api.truckwash.io:4433/ping",
|
|
"https://api.truckwash.io:4433/edge-agent/artifacts/manifest.json",
|
|
"https://api.truckwash.io:4433/edge-agent/artifacts/agent.php",
|
|
"https://api.truckwash.io:4433/edge-agent/artifacts/truckwash-edge-agent.service",
|
|
"https://api.truckwash.io:4433/edge-agent/install.sh?token=abc%20123",
|
|
]);
|
|
});
|
|
|
|
test("validateArtifactManifestBody requires v3 install artifacts", () => {
|
|
const artifacts = [
|
|
"agent.php",
|
|
"lan-worker.php",
|
|
"auto-updater.php",
|
|
"docker-compose.gateway.yml",
|
|
"Dockerfile.edge-agent",
|
|
"Dockerfile.lan-worker",
|
|
"Dockerfile.auto-updater",
|
|
"gateway-launcher.sh",
|
|
"truckwash-edge-gateway-stack.service",
|
|
"truckwash-edge-agent.service",
|
|
].map((name) => ({ name, sha256: "abc", bytes: 1 }));
|
|
|
|
const manifest = validateArtifactManifestBody(JSON.stringify({
|
|
version: EXPECTED_INSTALL_VERSION,
|
|
artifacts,
|
|
}));
|
|
|
|
assert.equal(manifest.version, EXPECTED_INSTALL_VERSION);
|
|
});
|
|
|
|
test("validateArtifactBodyAgainstManifest verifies size and hash", () => {
|
|
const body = Buffer.from("hello");
|
|
const manifest = {
|
|
artifacts: [{
|
|
name: "agent.php",
|
|
sha256: "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824",
|
|
bytes: body.length,
|
|
}],
|
|
};
|
|
|
|
assert.equal(validateArtifactBodyAgainstManifest(manifest, "agent.php", body).name, "agent.php");
|
|
});
|
|
|
|
test("validateInstallerScriptBody requires install-session reporting wiring", () => {
|
|
const script = `
|
|
INSTALL_STATUS_URL="https://api.truckwash.io:4433/edge-agent/install-token/status"
|
|
fetch_http "Download artifact manifest" "https://api.truckwash.io:4433/edge-agent/artifacts/manifest.json"
|
|
report_install_status "FAILED"
|
|
begin_install_phase "VERIFY_TOKEN" "Verifying install token"
|
|
begin_install_phase "VERIFY_ARTIFACTS" "Verifying edge gateway artifacts"
|
|
begin_install_phase "WAIT_FOR_CLAIM" "Waiting for gateway heartbeat and claim"
|
|
verify_manifest_artifact
|
|
${EXPECTED_INSTALL_VERSION}
|
|
`;
|
|
|
|
assert.deepEqual(validateInstallerScriptBody(script), INSTALLER_SCRIPT_REQUIRED_SNIPPETS);
|
|
});
|
|
|
|
test("validateInstallerScriptBody rejects missing installer status hooks", () => {
|
|
assert.throws(
|
|
() => validateInstallerScriptBody("echo hello"),
|
|
/Installer script is missing required status wiring/
|
|
);
|
|
});
|