import { readFileSync } from 'node:fs' import { resolve } from 'node:path' import { describe, expect, it } from 'vitest' const config = readFileSync(resolve(process.cwd(), 'nginx/default.conf.template'), 'utf8') const testCompose = readFileSync(resolve(process.cwd(), 'docker-compose.test.yml'), 'utf8') const developmentCompose = readFileSync(resolve(process.cwd(), 'docker-compose.development.yml'), 'utf8') const jenkinsfile = readFileSync(resolve(process.cwd(), 'Jenkinsfile'), 'utf8') const dockerfile = readFileSync(resolve(process.cwd(), 'Dockerfile'), 'utf8') describe('admin nginx deployment config', () => { it('allows qualification uploads with multipart overhead through the API proxy', () => { expect(config).toContain('client_max_body_size 12m;') }) it('prevents the application shell from retaining stale chunk references', () => { expect(config).toContain('location = /index.html') expect(config).toContain('Cache-Control "no-cache, no-store, must-revalidate"') }) it('serves hashed assets immutably and never falls back missing chunks to HTML', () => { expect(config).toContain('location /assets/') expect(config).toContain('try_files $uri =404;') expect(config).toContain('Cache-Control "public, max-age=31536000, immutable"') }) it('keeps Vue history routes on the application shell without caching them', () => { expect(config).toContain('try_files $uri $uri/ /index.html;') expect(config).toContain('Cache-Control "no-cache"') }) it('proxies overseas API requests to the gateway API prefix', () => { expect(config).toContain('location /overseas-api/') expect(config).toContain('rewrite ^/overseas-api/(.*)$ /api/$1 break;') expect(config).toContain('proxy_pass ${OVERSEAS_API_UPSTREAM};') }) it('declares an explicit overseas gateway upstream in container deployments', () => { expect(testCompose).toContain('OVERSEAS_API_UPSTREAM: "http://host.docker.internal:9300"') expect(developmentCompose).toContain('OVERSEAS_API_UPSTREAM: "http://host.docker.internal:9300"') }) it('runs each deployment on its target node without controller-local SSH files', () => { expect(jenkinsfile).toContain("env.JOB_BASE_NAME?.endsWith('-dev') ? 'java-dev' : 'java-test'") expect(jenkinsfile).toContain('docker compose -f "$DEVELOPMENT_COMPOSE_FILE" up -d') expect(jenkinsfile).not.toContain('/var/jenkins_home/.ssh') expect(jenkinsfile).not.toContain('docker save') expect(jenkinsfile).not.toMatch(/\bssh\b/) }) it('uses authenticated internal base images in CI instead of pulling from Docker Hub', () => { expect(dockerfile).toContain('ARG NODE_IMAGE=node:22-alpine') expect(dockerfile).toContain('ARG NGINX_IMAGE=nginx:1.27-alpine') expect(dockerfile).toContain('FROM ${NODE_IMAGE} AS build') expect(dockerfile).toContain('FROM ${NGINX_IMAGE}') expect(jenkinsfile).toContain("NODE_BASE_IMAGE = '172.31.198.7:10082/html/node:22-alpine'") expect(jenkinsfile).toContain("NGINX_BASE_IMAGE = '172.31.198.7:10082/html/nginx:1.27-alpine'") expect(jenkinsfile).toContain('withCredentials([usernamePassword(') expect(jenkinsfile).toContain('export DOCKER_CONFIG="${WORKSPACE}@tmp/docker-auth"') }) })