diff --git a/tests/test.sh b/tests/test.sh new file mode 100644 index 0000000..69f29b1 --- /dev/null +++ b/tests/test.sh @@ -0,0 +1,54 @@ +#!/bin/bash +set -euo pipefail + +IMAGE="$1" +FAILED=0 +PASSED=0 + +TMPDIR="$(mktemp -d)" +CONTAINER_NAME="test-$(echo "$IMAGE" | tr ':/' '-')-$$" +trap 'docker rm -f "$CONTAINER_NAME" 2>/dev/null; rm -rf "$TMPDIR"' EXIT + +DOCKER_GW=$(docker network inspect bridge --format '{{range .IPAM.Config}}{{.Gateway}}{{end}}') +BASE_URL="http://${DOCKER_GW}:3000" + +assert_eq() { + local desc="$1" expected="$2" actual="$3" + if [ "$expected" = "$actual" ]; then + echo "PASS: $desc" + PASSED=$((PASSED + 1)) + else + echo "FAIL: $desc (expected '$expected', got '$actual')" + FAILED=$((FAILED + 1)) + fi +} + +docker run -d --name "$CONTAINER_NAME" -p 3000:3000 "$IMAGE" + +echo "Waiting for container..." +READY=false +for i in $(seq 1 30); do + if curl -s -o /dev/null "$BASE_URL/"; then + echo "Container ready (attempt $i)" + READY=true + break + fi + sleep 2 +done + +if [ "$READY" = false ]; then + echo "Container did not become ready within 60s" + echo "=== Container logs ===" + docker logs "$CONTAINER_NAME" 2>&1 || true + exit 1 +fi + +STATUS=$(curl -s -o "$TMPDIR/body" -w '%{http_code}' "$BASE_URL/") +echo "HTTP status: $STATUS" +assert_eq "HTTP 200" "200" "$STATUS" + +echo "" +echo "$PASSED/$((PASSED + FAILED)) tests passed" +if [ "$FAILED" -gt 0 ]; then + exit 1 +fi