mirim-app/deploy/e2e.sh
AWESOMEDEV 1661591d8b
Some checks failed
CI / backend-test (push) Successful in 1m3s
CI / frontend-build (push) Failing after 27s
CI / backend-dep-scan (push) Successful in 6s
test(e2e): Playwright E2E 도입 — 로그인→강좌→퀴즈 + 멘토/감사로그
실제 브라우저로 '다 조립된 앱'(프론트+백엔드+DB)을 태우는 통합 테스트 6개:
- 인증 가드(비로그인→로그인), 로그인 실패 안내, 학생 로그인→대시보드
- 학습 센터→강좌 열기, 퀴즈 풀기→제출→서버 채점 결과
- 멘토 로그인→멘토 화면+개인정보 접근 기록(SEC-02 감사로그까지 검증)

운영 무오염 설계:
- deploy/docker-compose.e2e.yml — 별도 프로젝트(mirime2e)·네트워크·휘발성 DB(tmpfs)
- deploy/Caddyfile.e2e — 평문 HTTP로 SPA+/api 프록시(운영과 동일 구조)
- deploy/e2e.sh — 스택 기동→테스트 학생 API 생성→퀴즈 slug 자동조회→
  Playwright(브라우저 내장 이미지) 실행→down -v(정리)
- 백엔드 힙 256MB 제한(작은 인스턴스에서 운영과 공존)

EC2에서 6/6 통과 확인. 러너가 운영과 같은 인스턴스라 push마다가 아닌
온디맨드(릴리스 전)로 운영 — 전용 러너 확보 시 CI 게이트로 승격.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 08:27:42 +09:00

61 lines
2.7 KiB
Bash

#!/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