import test from 'node:test' import { runInNewContext } from 'node:vm' import assert from 'node:assert/strict' import { readFile } from 'node:fs/promises' const read = path => readFile(new URL(path, import.meta.url), 'utf8') test('H5 image copies only compiled assets and static nginx configuration', async () => { const dockerfile = await read('../deploy/Dockerfile.h5') const copies = dockerfile.split(/\r?\n/).filter(line => line.startsWith('COPY ')) assert.deepEqual(copies, ['COPY deploy/nginx.conf /etc/nginx/conf.d/default.conf', 'COPY unpackage/dist/build/web/ /srv/pda-h5/pda-domestic/']) assert.match(dockerfile, /ARG NGINX_BASE_IMAGE=/) assert.match(dockerfile, /FROM \$\{NGINX_BASE_IMAGE\}/) assert.doesNotMatch(dockerfile, /RUN |npm|node_modules|COPY \. /) const ignore = await read('../.dockerignore') assert.ok(ignore.split(/\r?\n/).includes('**')) assert.ok(ignore.includes('!unpackage/dist/build/web/**')) assert.doesNotMatch(ignore, /!\.env|!node_modules|!src/) }) test('static server preserves the app prefix and returns genuine missing-resource errors', async () => { const nginx = await read('../deploy/nginx.conf') assert.match(nginx, /listen 80;/) assert.ok(nginx.includes('location ^~ /pda-domestic/')) assert.match(nginx, /root \/srv\/pda-h5;/) assert.match(nginx, /try_files \$uri \$uri\/ =404;/) assert.match(nginx, /Cache-Control "no-store" always/) assert.match(nginx, /location \/ \{ return 404; \}/) assert.match(nginx, /location = \/healthz/) assert.doesNotMatch(nginx, /proxy_pass|gateway-api|try_files[^;]*index\.html/) }) test('TEST H5 deployment has a required image tag and internal-only dual health checks', async () => { const compose = await read('../deploy/docker-compose.h5.test.yml') assert.ok(compose.includes('${IMAGE_TAG:?IMAGE_TAG is required}')) assert.match(compose, /context: \.\./) assert.match(compose, /dockerfile: deploy\/Dockerfile\.h5/) assert.match(compose, /container_name: pda-domestic-h5-test/) assert.match(compose, /aliases:\s*\n\s*- pda-domestic-h5-test/) assert.match(compose, /external: true/) assert.match(compose, /name: firstleg-test-network/) assert.match(compose, /expose:\s*\n\s*- "80"/) assert.ok(compose.includes('http://127.0.0.1/healthz && wget -qO /dev/null http://127.0.0.1/pda-domestic/')) assert.doesNotMatch(compose, /\bports:|volumes:|API_UPSTREAM|privileged:|pid: host/) }) test('only H5 production overrides the toolchain asset base', async () => { const source = (await read('../vite.config.js')) .replace(/^import .*$/gm, '') .replace('export default ', '') for (const platform of ['h5', 'app', 'app-plus', 'app-harmony', undefined]) { for (const mode of ['production', 'development']) { const factory = runInNewContext(source, { defineConfig: value => value, loadEnv: () => ({}), uni: () => ({}), process: { env: { UNI_PLATFORM: platform }, cwd: () => '/project' } }) assert.equal(factory({ mode }).base, platform === 'h5' && mode === 'production' ? '/pda-domestic/' : undefined, `${platform}:${mode}`) } } })