Skip to content

[BE,WEB-USER][ADD]: web-user Playwright E2E 골든패스 추가 및 자정 픽업 영업시간 오판 버그 수정 - #175

Merged
geunu97 merged 3 commits into
mainfrom
staging
Sep 2, 2026
Merged

[BE,WEB-USER][ADD]: web-user Playwright E2E 골든패스 추가 및 자정 픽업 영업시간 오판 버그 수정#175
geunu97 merged 3 commits into
mainfrom
staging

Conversation

@geunu97

@geunu97 geunu97 commented Sep 2, 2026

Copy link
Copy Markdown
Member

📋 요약

web-user에 Playwright 기반 E2E 골든패스(심사용 로그인, 예약/주문 생성)를 추가하고, 그 과정에서 발견한 실제 프로덕션 버그(자정 픽업이 영업시간 밖으로 오판되는 문제)를 수정했습니다.

✨ 주요 변경사항

  • [BE,WEB-USER] web-user Playwright E2E 골든패스(심사용 로그인·예약 생성) 추가
    • ReviewLoginBottomSheet로 로그인(실제 소셜 OAuth는 리다이렉트 때문에 자동화 불가)
    • 예약 바텀시트 전체 UI(옵션→캘린더→확인)를 API 우회 없이 실제로 클릭/입력해 주문 생성까지 검증
    • backend fixture-seed.script.ts로 판매자/스토어/상품을 find-or-create 시딩, Playwright webServer가 backend(.env.test)·web-user 두 서버를 자동 기동
  • [BE,WEB-USER][FIX] 자정(00:00~00:59 KST) 픽업이 영업시간 밖으로 오판되던 문제 수정
    • Intl.DateTimeFormat({ hour12: false })가 이 환경에서 자정대를 "24:00~24:59"로 포맷하는 ICU 동작 때문에, 서버의 영업시간 판정(getSeoulWallClockForPickup)이 minuteOfDay를 1440대로 계산해 하루 종일 영업하는 스토어도 자정대 픽업을 거부하던 실제 버그
    • hourCycle: "h23"로 명시해 해결. 같은 패턴을 쓰던 web-user 지도의 "지금 픽업 가능" 판정과 카카오 알림톡 시각 표시도 함께 수정
  • [COMMON] AWS MCP 서버를 mcp-proxy-for-aws 기반으로 전환

🧪 테스트 계획

  • backend 유닛테스트 119/119 통과 (Node 24)
  • web-user 유닛테스트 17/17 통과 (Node 24)
  • 신규 Playwright E2E 3/3 통과 (yarn web-user:test:e2e, 자정 픽업 슬롯 포함)
  • staging 배포(web-user/staging-v0.0.231, backend/staging-v0.0.174) 후 staging.picakes.com, api-staging.picakes.com 실제 응답 200 확인

📎 참고 사항

  • 신규 Playwright E2E(apps/web-user/e2e/)는 아직 PR 자동 테스트(test-web.yml)에는 연결되어 있지 않습니다 — yarn workspace @picake/web-user testvitest run만 돌리고 playwright test는 별도 명령이라 CI에 백엔드 서버·Postgres까지 띄우는 작업이 추가로 필요합니다. 로컬에서만 yarn web-user:test:e2e로 실행 가능합니다. 원하시면 후속으로 CI 연동하겠습니다.

geunu97 and others added 3 commits September 2, 2026 22:16
web-user는 순수 로직 유닛테스트와 Storybook 컴포넌트 테스트만 있어서, 클라이언트
라우팅·hydration·커스텀 UI 컴포넌트(Select/Calendar/TimePicker) 상호작용처럼
web-user에서만 터지는 문제는 어디서도 검증되지 않았다. backend는 이미
unit/integration/e2e 3단계가 있지만 "API가 올바른 데이터를 반환하는가"만
검증할 뿐, 실제 브라우저 화면 흐름은 다루지 않는다.

- 로그인은 실제 소셜 OAuth 대신 앱스토어 심사 대응용 ReviewLoginBottomSheet를
  사용한다 — 외부 제공자 리다이렉트가 없어 자동화 가능한 유일한 로그인 경로.
- 예약(주문) 생성은 API 우회 없이 바텀시트 전체 UI(옵션→캘린더→확인)를 실제로
  클릭/입력해 검증한다. 사이즈/맛 Select는 날짜 선택 시 자동으로 열리는 UX가
  있어, 이미 열려있으면 트리거를 다시 누르지 않도록(누르면 토글되어 닫힘) 짧게
  기다렸다가 판단하는 헬퍼로 처리했다.
- backend는 fixture-seed.script.ts로 판매자/스토어/상품을 find-or-create
  시딩하고(반복 실행해도 데이터가 안 쌓임), Playwright의 webServer 설정이
  backend(.env.test)·web-user 두 서버를 자동으로 띄운다. 스토어 이름에는
  대괄호 마커를 못 써서(validators.decorator.ts 정규식) 상품 이름으로만
  마커를 두고 `GET /consumer/products?search=`로 찾는다.
- backend의 test:integration/test:e2e는 같은 테스트 DB를 매 테스트 후
  TRUNCATE하므로, 이 E2E와 동시에 돌리면 서로 데이터를 지운다(순차 실행은 무관).
- @playwright/test를 추가하면서 이미 있던 devDependency `playwright`
  (storybook 브라우저 테스트용, 1.57.0)와 버전이 어긋나 yarn이 별도
  node_modules에 두 번째 사본을 만들었고, 그 결과 두 인스턴스의 `test()`가
  서로 달라 "did not expect test() to be called here" 오류가 났다.
  `playwright`를 1.62.1로 맞춰 단일 사본으로 정리해 해결했다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Au6qVAM3RXf7rAakifYDcL
위 E2E 테스트로 예약 생성을 실제로 돌려보다가, 하루 종일 영업하는 스토어인데도
픽업 시각을 00:00~00:59 KST로 고르면 "영업 시간에 포함되지 않습니다"로
거부되는 걸 발견했다. 재현해보니 실사용자도 똑같이 겪는 실제 버그였다.

원인: `Intl.DateTimeFormat({ hour12: false })`로 서울 시각을 구할 때, 이 환경의
ICU가 자정대를 "24:00~24:59"로 포맷한다(0~23이 아니라 1~24로 세는 h24
사이클). getSeoulWallClockForPickup은 이걸 그대로 파싱해 minuteOfDay가
1440대로 나오고, "당일 0~1440분"과 비교하는 전체영업 판정에서
`1440 < 1440`이 false가 되어 자정대만 통째로 걸러졌다. hourCycle을
명시적으로 h23으로 고정하면 해결된다(hour12와 hourCycle을 같이 주면 이
환경에서는 hour12가 이긴다 — 직접 검증).

같은 파일의 getSeoulHour는 이미 이 문제를 알고 "24 → 0" 예외처리로 우회하고
있었는데(주석 있음), pickup 시각을 다루는 다른 두 곳은 그 처리가 없었다:
- backend order-store-business-calendar: 주문 생성 자체를 막던 지점(위에서 발견)
- web-user의 동일 유틸: 지도의 "지금 픽업 가능" 판정(isStoreOpenForPickupNow)에서
  같은 패턴으로 재사용되고 있어 같은 시간대에 동일하게 틀렸을 것 — 같이 고침
- 카카오 알림톡 메시지 포맷(user-order-alimtalk.util): 픽업/입금마감 시각이
  자정대면 "9월 3일 24:30"처럼 표시되던 것도 같은 원인이라 같이 고침

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Au6qVAM3RXf7rAakifYDcL
awslabs.aws-api-mcp-server(uvx, AWS 자격증명 직접 사용)에서
mcp-proxy-for-aws(SigV4 프록시, --profile claude-aws-mcp)로 교체.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Au6qVAM3RXf7rAakifYDcL
@geunu97 geunu97 self-assigned this Sep 2, 2026
@geunu97
geunu97 merged commit 009a652 into main Sep 2, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant