init codebase

This commit is contained in:
2026-02-17 17:30:45 -05:00
parent a3b28549b4
commit f7e2755a91
175 changed files with 21600 additions and 232 deletions
+281
View File
@@ -0,0 +1,281 @@
# docker-compose.test.yml — ephemeral infra for testing
#
# Integration tests (infra only):
# docker compose -f docker-compose.test.yml --profile init up -d
#
# E2E tests (full stack + browser):
# docker compose -f docker-compose.test.yml --profile e2e up -d --build
# cd e2e && npx nbb -cp src -m ajet-chat.e2e.runner
services:
postgres-test:
image: postgres:16-alpine
ports:
- "5433:5432"
environment:
POSTGRES_DB: ajet_chat_test
POSTGRES_USER: ajet
POSTGRES_PASSWORD: ajet_test
tmpfs:
- /var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ajet -d ajet_chat_test"]
interval: 3s
timeout: 2s
retries: 10
nats-test:
image: nats:2.10-alpine
ports:
- "4223:4222"
command: ["--js", "-m", "8222"]
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:8222/healthz"]
interval: 3s
timeout: 2s
retries: 10
minio-test:
image: minio/minio:latest
ports:
- "9002:9000"
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
command: server /data
tmpfs:
- /data
healthcheck:
test: ["CMD", "mc", "ready", "local"]
interval: 3s
timeout: 2s
retries: 10
minio-test-init:
profiles: ["init"]
image: minio/mc:latest
depends_on:
minio-test:
condition: service_healthy
entrypoint: >
/bin/sh -c "
mc alias set local http://minio-test:9000 minioadmin minioadmin;
mc mb --ignore-existing local/ajet-chat;
"
# --------------------------------------------------------------------------
# Gitea — self-contained OAuth provider for E2E tests
# --------------------------------------------------------------------------
gitea-test:
profiles: ["e2e"]
image: gitea/gitea:1.22
ports:
- "4080:3000"
environment:
- GITEA__database__DB_TYPE=sqlite3
- GITEA__security__INSTALL_LOCK=true
- GITEA__server__ROOT_URL=http://localhost:4080
- GITEA__server__HTTP_PORT=3000
- GITEA__service__DISABLE_REGISTRATION=false
- GITEA__service__REQUIRE_SIGNIN_VIEW=false
- GITEA__oauth2__ENABLE=true
tmpfs:
- /data
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:3000/api/v1/version"]
interval: 3s
timeout: 2s
retries: 20
start_period: 10s
gitea-test-init:
profiles: ["e2e"]
image: curlimages/curl:latest
depends_on:
gitea-test:
condition: service_healthy
entrypoint: /bin/sh
command:
- -c
- |
set -e
GITEA=http://gitea-test:3000
echo "==> Creating Gitea admin user..."
curl -sf -X POST "$$GITEA/api/v1/admin/users" \
-H "Content-Type: application/json" \
-u "gitea-admin:gitea-admin-pass" \
-d '{"username":"gitea-admin","password":"gitea-admin-pass","email":"admin@test.local","must_change_password":false,"login_name":"gitea-admin","source_id":0,"visibility":"public"}' \
|| true
# Gitea with INSTALL_LOCK=true uses the first registered user as admin.
# Verify admin access, fall back to sign-up if needed:
curl -sf -X POST "$$GITEA/api/v1/user/repos" \
-H "Content-Type: application/json" \
-u "gitea-admin:gitea-admin-pass" \
-d '{"name":"test"}' \
> /dev/null 2>&1 || {
echo "==> Admin doesn't exist yet, creating via sign-up..."
curl -sf -X POST "$$GITEA/user/sign_up" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "user_name=gitea-admin&password=gitea-admin-pass&retype=gitea-admin-pass&email=admin@test.local" \
|| true
sleep 2
}
echo "==> Getting admin token..."
TOKEN=$$(curl -sf -X POST "$$GITEA/api/v1/users/gitea-admin/tokens" \
-u "gitea-admin:gitea-admin-pass" \
-H "Content-Type: application/json" \
-d '{"name":"e2e-setup","scopes":["all"]}' | sed 's/.*"sha1":"//' | sed 's/".*//')
echo "Token: $$TOKEN"
echo "==> Creating test user A..."
curl -sf -X POST "$$GITEA/api/v1/admin/users" \
-H "Content-Type: application/json" \
-H "Authorization: token $$TOKEN" \
-d '{"username":"testuser-a","password":"testpass-a","email":"testuser-a@test.local","must_change_password":false}' \
|| true
echo "==> Creating test user B..."
curl -sf -X POST "$$GITEA/api/v1/admin/users" \
-H "Content-Type: application/json" \
-H "Authorization: token $$TOKEN" \
-d '{"username":"testuser-b","password":"testpass-b","email":"testuser-b@test.local","must_change_password":false}' \
|| true
echo "==> Gitea init complete! Users: gitea-admin, testuser-a, testuser-b"
echo "==> OAuth app will be created by the nbb test runner via Gitea API"
# --------------------------------------------------------------------------
# E2E profile — application service containers
# --------------------------------------------------------------------------
auth-gw:
profiles: ["e2e"]
build:
context: .
dockerfile: auth-gw/Dockerfile
ports:
- "4000:3000"
environment:
AJET__DB__HOST: postgres-test
AJET__DB__PORT: 5432
AJET__DB__DBNAME: ajet_chat_test
AJET__DB__USER: ajet
AJET__DB__PASSWORD: ajet_test
AJET__SERVICES__API__HOST: api
AJET__SERVICES__WEB_SM__HOST: web-sm
AJET__SERVICES__TUI_SM__HOST: tui-sm
AJET__SESSION__COOKIE_SECURE: "false"
AJET__OAUTH__GITEA_SERVER_BASE_URL: "http://host.docker.internal:4080"
extra_hosts:
- "host.docker.internal:host-gateway"
depends_on:
postgres-test:
condition: service_healthy
api:
condition: service_healthy
web-sm:
condition: service_healthy
tui-sm:
condition: service_healthy
gitea-test-init:
condition: service_completed_successfully
healthcheck:
test: ["CMD", "wget", "-qO-", "http://127.0.0.1:3000/health"]
interval: 5s
timeout: 3s
retries: 15
start_period: 20s
api:
profiles: ["e2e"]
build:
context: .
dockerfile: api/Dockerfile
ports:
- "4001:3001"
environment:
AJET__DB__HOST: postgres-test
AJET__DB__PORT: 5432
AJET__DB__DBNAME: ajet_chat_test
AJET__DB__USER: ajet
AJET__DB__PASSWORD: ajet_test
AJET__NATS__URL: nats://nats-test:4222
AJET__MINIO__ENDPOINT: http://minio-test:9000
AJET__MINIO__ACCESS_KEY: minioadmin
AJET__MINIO__SECRET_KEY: minioadmin
depends_on:
postgres-test:
condition: service_healthy
nats-test:
condition: service_healthy
minio-test:
condition: service_healthy
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:3001/api/health"]
interval: 5s
timeout: 3s
retries: 15
start_period: 20s
web-sm:
profiles: ["e2e"]
build:
context: .
dockerfile: web-sm/Dockerfile
ports:
- "4002:3002"
environment:
AJET__API__BASE_URL: http://api:3001
AJET__NATS__URL: nats://nats-test:4222
depends_on:
nats-test:
condition: service_healthy
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:3002/web/health"]
interval: 5s
timeout: 3s
retries: 15
start_period: 20s
tui-sm:
profiles: ["e2e"]
build:
context: .
dockerfile: tui-sm/Dockerfile
ports:
- "4003:3003"
environment:
AJET__API__BASE_URL: http://api:3001
AJET__NATS__URL: nats://nats-test:4222
depends_on:
nats-test:
condition: service_healthy
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:3003/tui/health"]
interval: 5s
timeout: 3s
retries: 15
start_period: 20s
test-runner:
profiles: ["e2e-docker"]
build:
context: .
dockerfile: e2e/Dockerfile
environment:
AJET_TEST_BASE_URL: http://auth-gw:3000
AJET_TEST_DB_HOST: postgres-test
AJET_TEST_DB_PORT: 5432
AJET_TEST_DB_DBNAME: ajet_chat_test
AJET_TEST_DB_USER: ajet
AJET_TEST_DB_PASSWORD: ajet_test
AJET_TEST_NATS_URL: nats://nats-test:4222
AJET_TEST_MINIO_ENDPOINT: http://minio-test:9000
AJET_TEST_MINIO_ACCESS_KEY: minioadmin
AJET_TEST_MINIO_SECRET_KEY: minioadmin
depends_on:
auth-gw:
condition: service_healthy