mirim-app/frontend/e2e/helpers.js
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

24 lines
1.1 KiB
JavaScript

import { expect } from '@playwright/test'
// 테스트 계정·퀴즈 slug는 deploy/e2e.sh 가 임시 스택을 띄우며 env로 주입한다.
// (기본값은 로컬에서 같은 값으로 스택을 띄웠을 때를 위한 폴백)
export const STUDENT = {
username: process.env.E2E_STUDENT_USER || 'e2estudent',
password: process.env.E2E_STUDENT_PASS || 'E2ePass123!',
}
export const MENTOR = {
username: process.env.E2E_MENTOR_USER || 'mentor1',
password: process.env.E2E_MENTOR_PASS || 'e2e-mentor-pass',
}
export const QUIZ_SLUG = process.env.E2E_QUIZ_SLUG || ''
/** 로그인 폼을 채워 제출하고, 대시보드(/)로 이동할 때까지 기다린다. */
export async function login(page, account) {
await page.goto('/login')
await page.locator('#username').fill(account.username)
await page.locator('#password').fill(account.password)
await page.getByRole('button', { name: '로그인' }).click()
await page.waitForURL((url) => url.pathname === '/', { timeout: 15_000 })
await expect(page.getByText('주차 진행 상황', { exact: false })).toBeVisible()
}