wizard 완성도 보완 + 자동화 테스트 구축
오늘은 "질문 설계 위저드"(/wizard)를 실사용 가능한 수준으로 다듬고, 그 결과를 사람이 일일이 클릭해보지 않아도 되도록 자동화 테스트로 전부 검증했다.
기존 위저드는 문구 조립·화면 흐름은 되는데, 로그인 연동·이탈 방지·입력 검증 같은 "완성형 제품"에 필요한 디테일이 빠져 있었다. 오늘 그 6가지를 순서대로 채웠다.
histories 테이블에 source(curated | wizard) 컬럼과 wizard_category 컬럼을 추가했다. 위저드 결과는 prompts 테이블에 대응하는 행이 없어서 prompt_id도 NULL을 허용하도록 스키마를 바꿨다.ALTER TABLE로 NOT NULL 제약을 못 풀어서, 마이그레이션은 "새 테이블 만들고 → 데이터 옮기고 → 기존 테이블 지우고 → 이름 바꾸기" 방식으로 작성했다.sessionStorage에 잠깐 담아두고 로그인 페이지로 보낸 뒤, 로그인에 성공하면 다시 위저드로 돌아와 자동으로 저장을 이어가도록 만들었다.beforeunload), 브라우저 뒤로가기(popstate), 헤더·푸터 링크 클릭까지 3중으로 가로채서 "작성 중인 내용이 사라집니다. 나가시겠어요?" 확인창을 띄운다.getQuestionError(question, answers) 함수 하나로 필수 입력/공백-only/최소 글자 수/최대 글자 수를 전부 판정하도록 정리했다.buildPrompt를 다시 짰다./prompts?category=이름 쿼리스트링으로).홈 화면이 "찾기 / 만들기" 2-카드 구조로 크게 바뀌었는데, 루트/frontend README가 예전 "4개 카테고리" 구조 설명으로 남아있어서 최신 구조에 맞게 갱신했다.
여기가 오늘의 메인 작업. 아래 체크리스트 7개 항목을 사람이 직접 클릭해서 확인하지 않고 전부 코드로 검증했다.
buildPrompt/getQuestionError처럼 AI 호출 없이 순수 함수로 동작하는 로직을 직접 실행해서 검증했다.
wrangler dev(백엔드)와 vite dev(프론트)를 Playwright의 webServer 옵션으로 동시에 띄운 뒤, 실제 크로미움 브라우저로 클릭·입력·화면 전환을 검증했다. 특히:
wrangler d1 execute --local을 자식 프로세스로 호출하는 헬퍼를 만들어서, 위저드로 저장한 결과가 로컬 D1의 histories 테이블에 source='wizard'로 실제로 들어갔는지 SELECT로 직접 확인했다. GET /histories API 응답과 마이페이지 화면 노출도 함께 확인.dialog 이벤트로 confirm 창이 실제로 뜨는지, 취소를 누르면 입력값이 그대로인지까지 확인했다. beforeunload 다이얼로그도(환경에 따라 안 뜰 수도 있어서 방어 로직을 넣긴 했지만) 이번 환경에서는 정상적으로 잡혔다.boundingBox()로, 홈 화면 2-카드가 가로가 아니라 세로로 쌓이는지 좌표 비교로 확인했다.playwright install-deps가 막혀서, apt-get download(root 불필요)로 libnspr4/libnss3/libasound2t64 세 패키지만 받아 압축을 풀고 LD_LIBRARY_PATH로 지정해 헤드리스 크로미움을 띄웠다. 재현용 스크립트로 만들어서 프로젝트에 같이 커밋해뒀다.frontend/tests/unit, frontend/tests/e2e에 정식으로 남겨둬서 npm run test:unit, npm run test:e2e로 언제든 재실행 가능data-testid 하나만 추가했고, 실제 동작은 건드리지 않았다8481a01 /wizard 위저드 자동화 테스트 스위트 추가 (Vitest 단위 50개 + Playwright e2e 31개)