실제 브라우저로 '다 조립된 앱'(프론트+백엔드+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>
28 lines
1.2 KiB
JavaScript
28 lines
1.2 KiB
JavaScript
import { test, expect } from '@playwright/test'
|
|
import { login, STUDENT } from './helpers.js'
|
|
|
|
// 인증 경계 — "로그인 전/후"가 올바로 갈리는지 실제 브라우저로 확인.
|
|
|
|
test('비로그인으로 보호 페이지 접근 → 로그인 화면으로 보낸다', async ({ page }) => {
|
|
await page.goto('/')
|
|
await expect(page).toHaveURL(/\/login/)
|
|
await expect(page.locator('#username')).toBeVisible()
|
|
})
|
|
|
|
test('잘못된 비밀번호는 로그인 실패 안내를 보여준다', async ({ page }) => {
|
|
await page.goto('/login')
|
|
await page.locator('#username').fill(STUDENT.username)
|
|
await page.locator('#password').fill('wrong-password-xyz')
|
|
await page.getByRole('button', { name: '로그인' }).click()
|
|
await expect(page.getByText(/맞지 않아요|올바르지|너무 많/)).toBeVisible()
|
|
// 실패했으니 여전히 로그인 화면에 남아 있어야 한다.
|
|
await expect(page).toHaveURL(/\/login/)
|
|
})
|
|
|
|
test('학생 로그인 → 대시보드 진입', async ({ page }) => {
|
|
await login(page, STUDENT)
|
|
await expect(page).toHaveURL(/\/$/)
|
|
// 로그인 화면 요소(#username)는 더 이상 없어야 한다.
|
|
await expect(page.locator('#username')).toHaveCount(0)
|
|
})
|