- Add Playwright E2E test suite covering all 13 user-facing services
- Fix Homepage HTTP 500 by removing read-only bind mount (:ro) so it
can create its required logs/ directory
- Pin @playwright/test to exact 1.52.0 to match Docker image browsers
- Add .gitignore entries for auto-generated Homepage files and
Playwright artifacts
- All 13 Playwright tests passing (Chromium headless)
💘 Generated with Crush
Assisted-by: GLM-5.1 via Crush <crush@charm.land>
Unit tests (test_env_validation.sh):
- Validate docker-compose.yml.template has all 16 services
- Verify every exposed service has healthcheck, restart policy, labels
- Verify Dockhand routes through socket proxy (not direct mount)
- Verify only docker-socket-proxy mounts /var/run/docker.sock
- Validate demo.env.template has all 28 required variables
- Verify all port values are in 4000-4099 range
- Verify Homepage and Grafana config files exist
- Verify all scripts use strict mode (set -euo pipefail)
- 53 assertions, all passing
Integration tests (test_service_communication.sh):
- Remove || true suppression on test failures
- Add require_stack_running guard with clear error message
- Add test for Dockhand proxy integration (DOCKER_HOST env check)
- Add network isolation test (container count on network)
- Proper pass/fail counting with exit code
Previous unit test was a tautology (id -u == id -u) that could
never fail. Previous integration tests suppressed all failures.
💘 Generated with Crush
Assisted-by: GLM-5.1 via Crush <crush@charm.land>
Rewrite demo-stack.sh, demo-test.sh, validate-all.sh, and all test
files to match the current 16-service stack reality.
Key changes:
- demo-stack.sh: full rewrite with deploy/stop/restart/status/smoke/summary
- demo-test.sh: fix hardcoded kneldevstack filter to use $COMPOSE_PROJECT_NAME,
raise volume threshold from 10 to 15, remove curl dependency (use /dev/tcp),
fix security compliance check for Dockhand direct socket mount
- validate-all.sh: remove port 4005 check (internal only), add missing env
var validation (TA_PASSWORD, ELASTIC_PASSWORD, GF_*, PIHOLE_WEBPASSWORD)
- integration tests: fix container names, add TubeArchivist companion tests
- e2e tests: use correct project-relative paths, dynamic port lists from env
- Add fix-and-ship.sh as convenience wrapper for demo-stack.sh
- Remove stale tmp_template.yml
💘 Generated with Crush
Assisted-by: GLM-5.1 via Crush <crush@charm.land>