gpt-image-sidecar-bridge / test /deploy-docker-script.test.mjs
misonL's picture
Deploy latest GPT Image Bridge
5428397 verified
Raw
History Blame Contribute Delete
4.8 kB
import assert from 'node:assert/strict';
import { readFile } from 'node:fs/promises';
import test from 'node:test';
test('docker deploy script runs a standalone bridge service', async () => {
const script = await readFile('scripts/deploy-docker.sh', 'utf8');
assert.match(script, /CONTAINER="\$\{GPT_IMAGE_BRIDGE_CONTAINER:-gpt-image-bridge\}"/);
assert.match(script, /IMAGE="\$\{GPT_IMAGE_BRIDGE_IMAGE:-gpt-image-bridge:local\}"/);
assert.match(script, /EFFECTIVE_PROVIDER="\$\{GPT_IMAGE_BRIDGE_PROVIDER:-second-site\}"/);
assert.match(script, /docker build -t "\$IMAGE" "\$PROJECT_DIR"/);
assert.match(script, /--restart unless-stopped/);
assert.match(script, /-p "127\.0\.0\.1:\$EFFECTIVE_HOST_PORT:\$EFFECTIVE_CONTAINER_PORT"/);
assert.doesNotMatch(script, /GPT_IMAGE_BRIDGE_NETWORK_CONTAINER/);
assert.doesNotMatch(script, /--network container:/);
assert.doesNotMatch(script, /gpt-image-sidecar-bridge/);
});
test('docker deploy script keeps credentials out of image and env values', async () => {
const script = await readFile('scripts/deploy-docker.sh', 'utf8');
assert.match(script, /CONFIG_DIR="\$\{GPT_IMAGE_BRIDGE_CONFIG_DIR:-\$HOME\/\.config\/gpt-image-bridge\}"/);
assert.match(script, /SECRET_DIR="\$CONFIG_DIR\/secrets"/);
assert.match(script, /source="\$SECRET_DIR\/adapter-api-key",target=\/run\/gpt-image-bridge\/adapter-api-key,readonly/);
assert.match(script, /source="\$SECRET_DIR\/second-site-email",target=\/run\/gpt-image-bridge\/second-site-email,readonly/);
assert.match(script, /source="\$SECRET_DIR\/second-site-password",target=\/run\/gpt-image-bridge\/second-site-password,readonly/);
assert.match(script, /source="\$SECRET_DIR\/first-site-email",target=\/run\/gpt-image-bridge\/first-site-email,readonly/);
assert.match(script, /source="\$SECRET_DIR\/first-site-password",target=\/run\/gpt-image-bridge\/first-site-password,readonly/);
assert.match(script, /source="\$SECRET_DIR\/first-site-session-cookie",target=\/run\/gpt-image-bridge\/first-site-session-cookie,readonly/);
assert.match(script, /source="\$SECRET_DIR\/first-site-session-token",target=\/run\/gpt-image-bridge\/first-site-session-token,readonly/);
assert.match(script, /ADAPTER_API_KEY_FILE=\/run\/gpt-image-bridge\/adapter-api-key/);
assert.match(script, /SECOND_SITE_EMAIL_FILE=\/run\/gpt-image-bridge\/second-site-email/);
assert.match(script, /SECOND_SITE_PASSWORD_FILE=\/run\/gpt-image-bridge\/second-site-password/);
assert.match(script, /FIRST_SITE_EMAIL_FILE=\/run\/gpt-image-bridge\/first-site-email/);
assert.match(script, /FIRST_SITE_PASSWORD_FILE=\/run\/gpt-image-bridge\/first-site-password/);
assert.match(script, /FIRST_SITE_SESSION_COOKIE_FILE=\/run\/gpt-image-bridge\/first-site-session-cookie/);
assert.match(script, /FIRST_SITE_SESSION_TOKEN_FILE=\/run\/gpt-image-bridge\/first-site-session-token/);
assert.match(script, /FIRST_SITE_SESSION_COOKIE="\$\(cat "\$FIRST_SITE_SESSION_COOKIE_FILE"\)"/);
assert.match(script, /FIRST_SITE_SESSION_TOKEN="\$\(cat "\$FIRST_SITE_SESSION_TOKEN_FILE"\)"/);
assert.doesNotMatch(script, /-e ADAPTER_API_KEY=/);
assert.doesNotMatch(script, /-e SECOND_SITE_EMAIL=/);
assert.doesNotMatch(script, /-e SECOND_SITE_PASSWORD=/);
assert.doesNotMatch(script, /-e FIRST_SITE_EMAIL=/);
assert.doesNotMatch(script, /-e FIRST_SITE_PASSWORD=/);
assert.doesNotMatch(script, /-e FIRST_SITE_SESSION_COOKIE=/);
assert.doesNotMatch(script, /-e FIRST_SITE_SESSION_TOKEN=/);
});
test('docker deploy script supports one first-site authentication method', async () => {
const script = await readFile('scripts/deploy-docker.sh', 'utf8');
assert.match(script, /FIRST_SITE_AUTH_MODE=""/);
assert.match(script, /FIRST_SITE_EMAIL and FIRST_SITE_PASSWORD must be configured together/);
assert.match(script, /Configure only one first-site authentication method/);
assert.match(script, /First-site deployment requires credentials, a session cookie, or a session token/);
assert.match(script, /write_secret "\$SECRET_DIR\/first-site-session-cookie"/);
assert.match(script, /write_secret "\$SECRET_DIR\/first-site-session-token"/);
});
test('standalone deployment check documents container boundary', async () => {
const script = await readFile('scripts/check-standalone-deployment.sh', 'utf8');
assert.match(script, /HostConfig\.NetworkMode/);
assert.match(script, /running bridge/);
assert.match(script, /DOWNSTREAM_CONTAINER="\$\{GPT_IMAGE_BRIDGE_DOWNSTREAM_CONTAINER:-\}"/);
assert.match(script, /host\.docker\.internal:\$HOST_PORT\/health/);
assert.match(script, /127\.0\.0\.1:\$HOST_PORT\/health/);
assert.match(script, /Standalone bridge deployment is healthy/);
assert.doesNotMatch(script, /--network container:/);
assert.doesNotMatch(script, /docker run/);
});