43 lines
2.2 KiB
JavaScript
43 lines
2.2 KiB
JavaScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import fs from "node:fs";
|
|
import path from "node:path";
|
|
|
|
test("Docker Configuration: Dockerfile enforces Node runtime and excludes Nginx", () => {
|
|
const dockerfilePath = path.resolve(process.cwd(), "Dockerfile");
|
|
assert.ok(fs.existsSync(dockerfilePath), "Dockerfile must exist");
|
|
|
|
const content = fs.readFileSync(dockerfilePath, "utf-8");
|
|
|
|
// Must use Node 22 alpine
|
|
assert.match(content, /FROM\s+node:22-alpine/i, "Dockerfile must use node:22-alpine base image");
|
|
|
|
// Must NOT contain nginx base images or references
|
|
assert.doesNotMatch(content, /FROM\s+nginx/i, "Dockerfile must not use nginx base image");
|
|
assert.doesNotMatch(content, /nginx/i, "Dockerfile must not contain nginx directives");
|
|
|
|
// Must build static site and serve with npm
|
|
assert.match(content, /RUN\s+npm\s+run\s+build/, "Dockerfile must run npm build");
|
|
assert.match(content, /ARG\s+PORT=8080/, "Dockerfile must define ARG PORT with default fallback");
|
|
assert.match(content, /ENV\s+PORT=\$\{?PORT\}?/, "Dockerfile must define ENV PORT using variable");
|
|
assert.match(content, /EXPOSE\s+\$\{?PORT\}?/, "Dockerfile must expose dynamic PORT variable");
|
|
assert.match(content, /CMD\s*\[\s*["']npm["']\s*,\s*["']start["']\s*\]/, "Dockerfile must start via npm start");
|
|
});
|
|
|
|
test("Docker Configuration: docker-compose.yml configures Node service correctly", () => {
|
|
const composePath = path.resolve(process.cwd(), "docker-compose.yml");
|
|
assert.ok(fs.existsSync(composePath), "docker-compose.yml must exist");
|
|
|
|
const content = fs.readFileSync(composePath, "utf-8");
|
|
|
|
// Verifies dynamic port mapping and environment variables
|
|
assert.match(content, /PORT:\s*\$\{PORT:-8080\}/, "docker-compose.yml must pass dynamic PORT build arg and env");
|
|
assert.match(content, /:\$\{PORT:-8080\}/, "docker-compose.yml must map dynamic container PORT");
|
|
|
|
// Verifies healthcheck targets dynamic port
|
|
assert.match(content, /localhost:\$\{PORT:-8080\}\/healthz/, "Healthcheck must probe dynamic PORT on /healthz");
|
|
|
|
// Verifies domain argument enforcement
|
|
assert.match(content, /SITE_DOMAIN/, "docker-compose.yml must require SITE_DOMAIN");
|
|
});
|