hypertwist/website/scripts/render-same-origin-deployment-lib.test.mjs
2026-06-22 06:55:09 +00:00

80 lines
3 KiB
JavaScript

import fs from 'node:fs'
import os from 'node:os'
import path from 'node:path'
import { describe, expect, it } from 'vitest'
import {
renderNginxConfig,
renderSystemdService,
resolveDeploymentRenderOptions,
writeRenderedDeploymentFiles,
} from './render-same-origin-deployment-lib.mjs'
describe('resolveDeploymentRenderOptions', () => {
it('derives website/server paths from the checkout root by default', () => {
const options = resolveDeploymentRenderOptions({
checkoutRoot: '/srv/hypertwist/current',
})
expect(options.websiteRoot).toBe('/srv/hypertwist/current/website')
expect(options.serverRoot).toBe('/srv/hypertwist/current/website/server')
expect(options.environmentFile).toBe('/srv/hypertwist/current/website/server/.env')
expect(options.serverNames).toEqual(['hypertwist.app', 'www.hypertwist.app'])
})
})
describe('renderSystemdService', () => {
it('renders a production systemd unit with the resolved checkout paths', () => {
const rendered = renderSystemdService({
checkoutRoot: '/srv/hypertwist/current',
serviceUser: 'deploy',
serviceGroup: 'www-data',
environmentFile: '/etc/hypertwist/server.env',
})
expect(rendered).toContain('User=deploy')
expect(rendered).toContain('Group=www-data')
expect(rendered).toContain('WorkingDirectory=/srv/hypertwist/current/website/server')
expect(rendered).toContain('EnvironmentFile=/etc/hypertwist/server.env')
expect(rendered).toContain('ExecStart=/usr/bin/npm start')
})
})
describe('renderNginxConfig', () => {
it('renders a same-origin nginx vhost for the configured hostnames and port', () => {
const rendered = renderNginxConfig({
checkoutRoot: '/srv/hypertwist/current',
serverNames: ['hypertwist.app', 'preview.hypertwist.app'],
certificateName: 'hypertwist.app',
upstreamPort: 4100,
upstreamName: 'hypertwist_preview',
})
expect(rendered).toContain('server_name hypertwist.app preview.hypertwist.app;')
expect(rendered).toContain('server 127.0.0.1:4100;')
expect(rendered).toContain('ssl_certificate /etc/letsencrypt/live/hypertwist.app/fullchain.pem;')
expect(rendered).toContain('proxy_pass http://hypertwist_preview;')
})
})
describe('writeRenderedDeploymentFiles', () => {
it('writes both rendered files to disk when output paths are provided', () => {
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'hypertwist-deploy-render-'))
const systemdOut = path.join(tempDir, 'hypertwist.service')
const nginxOut = path.join(tempDir, 'hypertwist.conf')
try {
writeRenderedDeploymentFiles({
checkoutRoot: '/srv/hypertwist/current',
systemdOut,
nginxOut,
})
expect(fs.readFileSync(systemdOut, 'utf8')).toContain('WorkingDirectory=/srv/hypertwist/current/website/server')
expect(fs.readFileSync(nginxOut, 'utf8')).toContain('server_name hypertwist.app www.hypertwist.app;')
} finally {
fs.rmSync(tempDir, { recursive: true, force: true })
}
})
})