Files
Gnuboard7/modules/_bundled/sirsoft-ecommerce/tests/scenarios/cash-receipt-dead-provider.yaml
T
HeuJung d970117149 fix(core,ecommerce,board,admin_basic): 고아 카탈로그 차단 + 설정 저장 파이프라인 정합
확장이 훅으로 등록한 카탈로그에서 고른 값은 그 확장이 사라져도 저장값으로 남는다.
그 상태에서 값만 보고 판정하면 이미 제공 불가한 항목이 사용자 화면에 그대로 노출된다.
예외도 경고도 로그도 남지 않아 관리자 화면과 나란히 보지 않으면 드러나지 않는다.

- 결제수단에 지정한 PG, 현금영수증 발급사, 검색엔진 드라이버 세 축에 같은 판정을 적용.
 공개 응답에서는 제거하고 관리자 응답에는 표시를 남긴다 — 운영자가 고쳐야 할 대상이라
 감추면 복구 경로가 사라진다. 서버 검증도 같은 판정을 공유해 화면 우회 제출을 막는다.
- 설정 단건 저장이 벌크 저장과 다른 경로를 타던 문제를 코어·이커머스·게시판에서 정리.
 저장은 성공하고 파생 값만 갱신되지 않아 어느 화면에서 저장했느냐로 결과가 갈렸다.
- 단건 저장의 값 형태 계약 신설. 빈 값으로 되돌릴 수 있게 하고, 타입은 defaults.json 의
 기본값을 SSoT 로 삼는다. 해석 불가한 입력은 조용히 캐스팅하지 않고 거절한다.
- 드라이버 셀렉트를 서버 카탈로그에 바인딩하고, 저장값이 카탈로그에 없으면 그 값을
 드러내는 안내를 8곳 전수에 붙인다. 종전에는 빈 칸으로만 보여 무엇이 저장됐는지
 알 수 없었다.

시나리오 매니페스트 8종을 면제 없이 신설했다. `audit:allow` 는 cross product 와 effects
검사를 함께 끄므로, 면제가 걸린 매니페스트에 선언을 추가하면 검증이 회복되지 않는다.
그 아래에서 대응 테스트가 없는 effect 이름 2건이 살아남아 있었고, 함께 정리했다.
2026-08-14 17:28:49 +09:00

41 lines
2.8 KiB
YAML

feature: 죽은 현금영수증 발급사 차단 (A3)
description: |
발급사(`order_settings.cash_receipt_provider`)는 플러그인이 훅으로 등록한 카탈로그에서 고른다.
운영자가 고른 뒤 그 플러그인을 제거하면 저장값만 남는다 — 카탈로그에는 없는 문자열이다.
그 상태에서 발급을 허용하면 요청이 어디에도 도달하지 못한다. 구매자 화면에는 신청 폼이
그대로 뜨고, 발급을 눌러도 실패 이력만 쌓인다. 예외는 나지 않는다.
판정은 하나다 — 저장값이 현재 레지스트리에 없으면 **미설정과 동일하게** 취급한다.
단, 저장값 자체는 지우지 않는다. 관리자 응답에는 남겨 운영자가 무엇을 골랐었는지 보고
고칠 수 있게 하고, 공개 응답·리소스에서만 null 로 정규화한다.
이미 발급된 영수증은 별개다. 취소는 현재 설정값이 아니라 **영수증에 박제된 발급사**로
수행한다 — 그러지 않으면 플러그인을 제거한 뒤 과거 영수증을 취소할 수 없게 되어,
구매자는 환불받았는데 현금영수증만 살아 있는 상태가 남는다.
axis_notes:
provider_state: |
surface(관리자 설정 / 공개 응답 / 주문 리소스 / 발급 서비스)는 축이 아니라 effects 로
구분한다 — 네 표면이 같은 판정을 공유하는 것이 이 기능의 요구사항이기 때문이다.
죽은 PG 를 다루는 형제 매니페스트(payment-method-dead-pg.yaml)와 같은 구조다.
axes:
provider_state: [live, dead]
effects:
- live_cash_receipt_provider_resolved # 등록된 발급사는 그대로 해석 (거짓 양성 차단)
- dead_cash_receipt_provider_treated_as_unset # 해석 결과가 null (저장값은 관리자 확인용으로 보존)
- dead_cash_receipt_provider_normalized_in_public # 공개 응답에서 null → 체크아웃 신청 폼 미렌더
- dead_provider_nulled_in_resource # 주문 리소스의 발급사 필드도 null → 발급 버튼 미노출
- existing_receipt_history_survives_dead_provider # 이미 발급/시도된 이력은 계속 표시 (영수증 URL 도달 경로 보존)
- issue_blocked_when_provider_unregistered # 신규 발급은 훅 호출 없이 차단 (실패 이력만 쌓이는 것 방지)
- cancel_uses_receipt_snapshot_provider # 취소는 영수증에 박제된 발급사로 수행
test_files:
- modules/_bundled/sirsoft-ecommerce/tests/Feature/Http/Controllers/Admin/EcommerceSettingsCashReceiptTest.php
- modules/_bundled/sirsoft-ecommerce/tests/Unit/Resources/CashReceiptResourceTest.php
- modules/_bundled/sirsoft-ecommerce/tests/Unit/Services/CashReceiptServiceTest.php
- modules/_bundled/sirsoft-ecommerce/tests/Playwright/specs/shop/cash-receipt-lifecycle.spec.ts