Conversation
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
📋 요약
web-user에 Playwright 기반 E2E 골든패스(심사용 로그인, 예약/주문 생성)를 추가하고, 그 과정에서 발견한 실제 프로덕션 버그(자정 픽업이 영업시간 밖으로 오판되는 문제)를 수정했습니다.
✨ 주요 변경사항
ReviewLoginBottomSheet로 로그인(실제 소셜 OAuth는 리다이렉트 때문에 자동화 불가)fixture-seed.script.ts로 판매자/스토어/상품을 find-or-create 시딩, PlaywrightwebServer가 backend(.env.test)·web-user 두 서버를 자동 기동Intl.DateTimeFormat({ hour12: false })가 이 환경에서 자정대를 "24:00~24:59"로 포맷하는 ICU 동작 때문에, 서버의 영업시간 판정(getSeoulWallClockForPickup)이 minuteOfDay를 1440대로 계산해 하루 종일 영업하는 스토어도 자정대 픽업을 거부하던 실제 버그hourCycle: "h23"로 명시해 해결. 같은 패턴을 쓰던 web-user 지도의 "지금 픽업 가능" 판정과 카카오 알림톡 시각 표시도 함께 수정mcp-proxy-for-aws기반으로 전환🧪 테스트 계획
yarn web-user:test:e2e, 자정 픽업 슬롯 포함)web-user/staging-v0.0.231,backend/staging-v0.0.174) 후staging.picakes.com,api-staging.picakes.com실제 응답 200 확인📎 참고 사항
apps/web-user/e2e/)는 아직 PR 자동 테스트(test-web.yml)에는 연결되어 있지 않습니다 —yarn workspace @picake/web-user test가vitest run만 돌리고playwright test는 별도 명령이라 CI에 백엔드 서버·Postgres까지 띄우는 작업이 추가로 필요합니다. 로컬에서만yarn web-user:test:e2e로 실행 가능합니다. 원하시면 후속으로 CI 연동하겠습니다.