# Test harness for vnctalk-prosody end-to-end verification. # # Brings up Prosody (built from this repo's Dockerfile), a local PostgreSQL, # and a single aiohttp mock service that stands in for every external HTTP # backend (auth, FCM, file-share, avatar upload). The optional `tester` # service runs the pytest suite inside the compose network; for local dev the # host can run pytest directly against the published ports. # # docker compose up -d --build postgres mocks prosody # docker compose run --rm tester pytest . -v -c pytest.ini # # Env-var names below use the EXACT placeholders found in # config/prosody.cfg.lua.template (snake_case ${fcm_api_url} / ${del_api_url}). # test.sh historically passed camelCase fcmApiUrl/fcmDelUrl, which envsubst # silently leaves unsubstituted — see test-improvement.md §1.2. services: postgres: image: postgres:15-alpine environment: POSTGRES_DB: prosody POSTGRES_USER: prosody POSTGRES_PASSWORD: prosody ports: ["5434:5432"] # 5434 on host (5433 often taken by a local PG) volumes: [pgdata:/var/lib/postgresql/data] healthcheck: test: ["CMD-SHELL", "pg_isready -U prosody"] interval: 2s retries: 30 mocks: build: ./tests/mocks ports: ["8092:8080"] # host inspection of /__requests (8090 often taken) environment: AUTH_USERS: "user1@example.com:pass1,user2@example.com:pass2,admin@example.com:adminpw" prosody: build: . # The image declares USER prosody, but startup.sh writes certs and the # rendered config into /etc/prosody (root-owned). Production runs as root # (run_as_root = true); mirror that here so the harness is self-contained. user: "0:0" depends_on: postgres: { condition: service_healthy } mocks: { condition: service_started } ports: - "5222:5222" # C2S - "5280:5280" # HTTP (BOSH/WS/REST/admin) - "${TELNET_HOST_PORT:-5582}:5582" # admin telnet environment: prosodyDomain: example.com prosodyDBhost: postgres prosodyDBname: prosody prosodyDBuser: prosody prosodyDBpass: prosody hybridaAuthUrl: http://mocks:8080/auth fcm_api_url: http://mocks:8080/fcm/notify del_api_url: http://mocks:8080/delfile fcmApiKey: test-fcm-key fileShareBaseUrl: http://mocks:8080/share/ fileShareSecret: test-share-secret avatarUploadUrl: http://mocks:8080/avatar/ avatarUploadUser: avatar avatarUploadPass: avpw DEFAULT_JITSI_CONFERENCE: conference.jitsi.test log_slow_events_threshold: "1.5" # Lower SMACKS hibernation window so test_10 can exercise expiry without # waiting 5 minutes. startup.sh appends this to the rendered config when set. SMACKS_HIBERNATION_TIME: "10" C2S_STANZA_SIZE_LIMIT: "5242880" S2S_STANZA_SIZE_LIMIT: "5242880" healthcheck: test: ["CMD", "/vnc/config/healthcheck.sh"] interval: 5s timeout: 3s retries: 20 start_period: 10s tester: build: ./tests profiles: ["ci"] # only started with --profile ci depends_on: [prosody] environment: XMPP_HOST: prosody XMPP_PORT: "5222" XMPP_DOMAIN: example.com MUC_DOMAIN: conference.example.com XMPP_JID: user1@example.com XMPP_PASSWORD: pass1 XMPP_JID2: user2@example.com XMPP_PASSWORD2: pass2 REST_URL: http://prosody:5280/rest BOSH_URL: http://prosody:5280/http-bind WS_URL: ws://prosody:5280/xmpp-websocket ADMIN_TELNET_HOST: prosody PG_HOST: postgres PG_USER: prosody PG_PASSWORD: prosody PG_DB: prosody MOCK_URL: http://mocks:8080 # for side-effect assertions # The tester reaches prosody directly by service name (http://prosody:5280), # so aiohttp sends Host: prosody — which Prosody rejects as an unknown # vhost (404 "Unknown host"). Send the real XMPP domain so HTTP routing # lands on the example.com VirtualHost that serves mod_http_rest /rest. REST_HOST_HEADER: example.com volumes: - ./tests:/tests # Surface the repo config/ dir so static tests (test_04_infra # healthcheck source checks) can resolve ../config/healthcheck.sh # from inside the container. - ./config:/config:ro volumes: pgdata: