Files
Gnuboard7/modules/_bundled/sirsoft-ecommerce/tests/Playwright/fixtures/ecommerce-auth.ts
T
HeuJung 55bc9399e6 fix(ecommerce): 배송비 구간 경계 포함 + 무게/부피 단위 환산
구간별 배송비의 종료값이 구간에 포함되지 않아 경계값이 무료배송으로
새고, 상품 옵션의 g/cm³ 저장값을 정책의 kg/L 로 환산하지 않아 금액이
1000배로 청구되던 문제를 수정한다.

- 구간 매칭을 종료값 오름차순 사다리로 교체 — 시작값은 표시 전용이
 되어 기존 저장 데이터의 두 형태 모두에서 정확히 계산된다
- 단위 환산을 배송비 계산 한 지점으로 모으고, 부피무게와 실무게를
 같은 kg 단위로 비교하도록 교정
- 계산이 조용히 0원이 되는 설정(구간 미등록·단위값/기준금액 누락·
 중간 구간 무제한·계산 API 폴백 0원)을 저장 시점에 차단하고,
 런타임 잔여 경로에는 경고 로그를 남긴다
- 연속성 규칙을 정책 타입별로 분리해 소수 구간(2.5kg) 저장을 허용
- 상품 옵션 무게/부피 응답 왕복, 주문 총 무게/부피 실값 기록
2026-08-12 23:43:08 +09:00

149 lines
6.6 KiB
TypeScript

/**
* 이커머스 모듈 권한 fixture (sample skeleton).
*
* 코어 `tests/Playwright/fixtures/auth.ts` 의 헬퍼를 재사용하되, 모듈 권한 토큰 fixture 를
* 자체적으로 정의한다. 권한 식별자는 임의 string 이므로 코어 PlaywrightIssueToken 커맨드가
* 그대로 동작한다 (Permission::firstOrCreate 가 자동 생성).
*
* 활성화 절차 (이커머스 모듈 작업 세션):
* 1. 사이드바 메뉴 컴포넌트에 data-testid="admin-menu-ecommerce-settings" 보강
* 2. 환경설정 폼 컴포넌트에 data-testid="ecommerce-settings-form" 보강
* 3. specs/admin/ecommerce-settings-menu.spec.ts 의 test.skip → test 변경
*/
import { test as base } from '@playwright/test';
// 6단계 상위 = 코어 루트의 fixtures/auth.ts
import { issueToken, authenticatePage } from '../../../../../../tests/Playwright/fixtures/auth';
type EcommerceAuthFixtures = {
/** 이커머스 환경설정 권한 보유 토큰 */
settingsToken: string;
/** 이커머스 대시보드 조회 권한 보유 토큰 (대시보드 이커머스 영역 검증용) */
dashboardToken: string;
/** 권한 없는 일반 사용자 토큰 (메뉴 미노출 검증용) */
noPermissionToken: string;
/** 일반 구매자 토큰 (상점 화면 — 장바구니·주문서 등. 관리자 권한 없음) */
userToken: string;
/** 구매자 토큰 (마이페이지 — 주문조회·취소요청 등. 관리자 권한 없음) */
customerToken: string;
/** 주문 조회 전용 권한 토큰 (읽기만 — 수정 게이팅 검증용) */
ordersReadToken: string;
/** 회원 토큰 (마이페이지 주문상세·리뷰 등. 관리자 권한 없음) */
memberToken: string;
/** 주문 수정 권한 토큰 (입금확인·상태 전이 검증용) */
ordersUpdateToken: string;
/** 마일리지 조회 + 수동 관리 권한 보유 토큰 */
mileageManageToken: string;
/** 마일리지 조회 전용 토큰 (수동 지급/차감 게이팅 검증용) */
mileageReadOnlyToken: string;
/** 상품 조회 + 수정 권한 보유 토큰 (상품폼 등록/수정 검증용) */
productManageToken: string;
/** 주문 조회(`orders.read`) 권한 보유 토큰 (주문 상세 표시 검증용) */
ordersReadToken: string;
/** 주문 조회 + 수정 권한 보유 토큰 (입금확인·취소·현금영수증 발급 검증용) */
orderManageToken: string;
/** 배송정책 조회+수정 권한 보유 토큰 (배송정책 목록 표시 검증용) */
shippingPolicyToken: string;
/** 프로모션 쿠폰 조회+등록+수정+삭제 권한 보유 토큰 (쿠폰 폼 검증용) */
couponManageToken: string;
/** 배송정책 + 상품 + 카테고리 권한 토큰 (구간 경계 E2E 픽스처 구성용) */
shippingBoundaryToken: string;
/** 일반 쇼핑 사용자 토큰 (관리자 권한 없음 — 유저 화면 검증용) */
userToken: string;
/** 구매 고객 토큰 (장바구니/추가옵션 등 쇼핑 플로우 검증용) */
customerToken: string;
};
export const test = base.extend<EcommerceAuthFixtures>({
settingsToken: async ({}, use) => {
await use(issueToken('sirsoft-ecommerce.settings.read', 'sirsoft-ecommerce.settings.update'));
},
dashboardToken: async ({}, use) => {
await use(issueToken('sirsoft-ecommerce.dashboard.view'));
},
noPermissionToken: async ({}, use) => {
// 빈 권한 — 인증만 통과, 어떤 모듈 권한도 없음
await use(issueToken());
},
userToken: async ({}, use) => {
// 상점 이용자 — 관리자 권한 없이 인증만 통과한다 (장바구니/주문서는 회원이면 이용 가능).
await use(issueToken());
},
customerToken: async ({}, use) => {
// 마이페이지 이용자 — 자기 주문만 다루므로 관리자 권한이 필요 없다.
await use(issueToken());
},
ordersReadToken: async ({}, use) => {
await use(issueToken('sirsoft-ecommerce.orders.read'));
},
memberToken: async ({}, use) => {
// 회원 — 자기 주문/리뷰만 다루므로 관리자 권한이 필요 없다.
await use(issueToken());
},
ordersUpdateToken: async ({}, use) => {
await use(issueToken('sirsoft-ecommerce.orders.read', 'sirsoft-ecommerce.orders.update'));
},
mileageManageToken: async ({}, use) => {
await use(issueToken('sirsoft-ecommerce.mileage.read', 'sirsoft-ecommerce.mileage.manage'));
},
mileageReadOnlyToken: async ({}, use) => {
await use(issueToken('sirsoft-ecommerce.mileage.read'));
},
productManageToken: async ({}, use) => {
await use(issueToken('sirsoft-ecommerce.products.read', 'sirsoft-ecommerce.products.update'));
},
ordersReadToken: async ({}, use) => {
await use(issueToken('sirsoft-ecommerce.orders.read'));
},
orderManageToken: async ({}, use) => {
await use(issueToken('sirsoft-ecommerce.orders.read', 'sirsoft-ecommerce.orders.update'));
},
shippingPolicyToken: async ({}, use) => {
await use(
issueToken(
'sirsoft-ecommerce.shipping-policies.read',
'sirsoft-ecommerce.shipping-policies.create',
'sirsoft-ecommerce.shipping-policies.update',
'sirsoft-ecommerce.shipping-policies.delete',
),
);
},
couponManageToken: async ({}, use) => {
await use(
issueToken(
'sirsoft-ecommerce.promotion-coupon.read',
'sirsoft-ecommerce.promotion-coupon.create',
'sirsoft-ecommerce.promotion-coupon.update',
'sirsoft-ecommerce.promotion-coupon.delete',
),
);
},
shippingBoundaryToken: async ({}, use) => {
// 구간 경계 검증은 정책·상품·카테고리를 한 세션에서 만들고 지우므로 권한을 함께 발급한다.
await use(
issueToken(
'sirsoft-ecommerce.shipping-policies.read',
'sirsoft-ecommerce.shipping-policies.create',
'sirsoft-ecommerce.shipping-policies.update',
'sirsoft-ecommerce.shipping-policies.delete',
'sirsoft-ecommerce.products.read',
'sirsoft-ecommerce.products.create',
'sirsoft-ecommerce.products.update',
'sirsoft-ecommerce.products.delete',
'sirsoft-ecommerce.categories.read',
),
);
},
// userToken / customerToken 은 현재 둘 다 "관리자 권한 없는 인증 사용자" 로 동일하다.
// 유저 화면(마이페이지/헤더)과 구매 플로우(장바구니/주문서)는 요구 권한이 갈릴 수 있어
// 호출부의 의도를 이름으로 남긴다 — 한쪽에 권한이 붙어도 다른 쪽이 영향받지 않는다.
userToken: async ({}, use) => {
await use(issueToken());
},
customerToken: async ({}, use) => {
await use(issueToken());
},
});
export { authenticatePage };
export { expect } from '@playwright/test';