#!/bin/bash # 이 파일이 하는 일: 격리된 임시 스택을 띄우고 Playwright E2E를 돌린 뒤 통째로 정리한다. # # 흐름: 스택 기동(postgres+backend+frontend+caddy) → 백엔드 준비 대기 → 테스트 학생 생성 # → 퀴즈 있는 코스 slug 조회 → Playwright(브라우저 내장 이미지) 실행 → down -v(정리). # # 사용법: bash deploy/e2e.sh # 운영과 완전히 격리된다(별도 프로젝트·네트워크·휘발성 DB, 호스트 포트 8899). 운영 DB 무접촉. set -uo pipefail cd "$(dirname "$0")" # deploy/ COMPOSE="docker compose -f docker-compose.e2e.yml" NET="mirime2e_default" BASE="http://localhost:8899" cleanup() { echo "▶ E2E 스택 정리(down -v)..."; $COMPOSE down -v >/dev/null 2>&1 || true; } trap cleanup EXIT echo "▶ E2E 스택 빌드·기동..." $COMPOSE up -d --build echo "▶ 백엔드 준비 대기(최대 ~3분)..." ready=0 for i in $(seq 1 60); do code=$(curl -s -o /dev/null -w '%{http_code}' "$BASE/api/auth/me" 2>/dev/null || true) if [ "$code" = "401" ]; then ready=1; echo " 준비됨"; break; fi sleep 3 done if [ "$ready" != "1" ]; then echo "🔴 백엔드가 뜨지 않았습니다. 최근 로그:"; $COMPOSE logs backend 2>&1 | tail -30; exit 1 fi echo "▶ 테스트 학생 생성(주소는 문자열 — Daum 팝업 우회)..." sc=$(curl -s -o /dev/null -w '%{http_code}' -X POST "$BASE/api/auth/signup" \ -H 'Content-Type: application/json' -d '{ "username":"e2estudent","password":"E2ePass123!","name":"이투이","track":"DEV", "companyEmailLocal":"e2e.student","birthDate":"2007-03-15","phone":"010-1234-5678", "address":"서울특별시 강남구 테헤란로 1","school":"미림마이스터고","major":"소프트웨어과", "emergencyName":"이보호","emergencyRelation":"부","emergencyPhone":"010-9876-5432","privacyConsent":true }') echo " signup 응답: $sc (201=생성 / 409=이미 있음 — 둘 다 정상)" echo "▶ 퀴즈가 있는 코스 slug 조회..." SLUG=$($COMPOSE exec -T postgres psql -U mirim -d mirim -tAc \ "SELECT course_slug FROM quiz_question GROUP BY course_slug ORDER BY course_slug LIMIT 1" 2>/dev/null | tr -d '[:space:]') echo " quiz slug: ${SLUG:-(없음 — 퀴즈 테스트는 skip)}" echo "▶ Playwright 실행(브라우저 내장 이미지)..." docker run --rm --network "$NET" \ -v "$PWD/../frontend:/work" -w /work \ -e E2E_BASE_URL=http://caddy \ -e E2E_STUDENT_USER=e2estudent -e E2E_STUDENT_PASS='E2ePass123!' \ -e E2E_MENTOR_USER=mentor1 -e E2E_MENTOR_PASS=e2e-mentor-pass \ -e E2E_QUIZ_SLUG="$SLUG" \ -e CI=true \ mcr.microsoft.com/playwright:v1.49.1-jammy \ sh -c "npm ci --no-audit --no-fund && npx playwright test" rc=$? echo "▶ Playwright 종료 코드: $rc" exit $rc