File size: 4,802 Bytes
5428397
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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/);
});