_localInit 은 단일 슬롯이고 updateTemplateData 가 얕은 스프레드로 교체했다. 소비부(DynamicRenderer useEffect)는 React commit 이후에 실행되므로, initLocal 을 가진 progressive 소스가 둘 이상이면 두 payload 가 같은 commit 사이에 도착할 때 먼저 온 것이 한 번도 관측되지 않고 사라졌다. 무조건 누적 병합은 refetchDataSource 시 소비가 끝난 payload 를 재적용해 사용자 폼 편집을 되돌린다. 그래서 아직 관측되지 않은 슬롯만 병합하고, 관측된 슬롯은 종전대로 교체한다. 소비 여부는 소비부가 기록한 슬롯 참조로 판정해 해시 계산식을 생산부에 복제하지 않는다. 레이아웃 전환으로 _local 을 리셋할 때 추적 레지스트리도 함께 비운다. 검증: CPU 6배 스로틀로 경합 창을 강제로 열어 수정 전 0/8 → 수정 후 8/8. 동반: template-engine.test.ts 의 vi.mock 이 공유 런타임 export 를 빠뜨려 스위트가 로드되지 않던 것과, 코어 spec 2개가 없는 fixture 를 import 해 playwright 수집이 실패하던 것을 함께 복구했다.
37 lines
1.2 KiB
TypeScript
37 lines
1.2 KiB
TypeScript
/**
|
|
* Playwright 이커머스 인증 fixture.
|
|
*
|
|
* 코어 `auth.ts` 의 `issueToken` / `authenticatePage` 헬퍼를 재사용해
|
|
* 이커머스 도메인 spec 이 쓰는 토큰 fixture 를 구성한다.
|
|
* 권한 식별자는 임의 string 이므로 코어 헬퍼를 그대로 쓸 수 있다.
|
|
*
|
|
* 참조: docs/testing/e2e-testing.md "인증 가드"
|
|
*/
|
|
import { test as base } from '@playwright/test';
|
|
import { authenticatePage, issueToken } from './auth';
|
|
|
|
/**
|
|
* 이커머스 spec 용 토큰 fixture.
|
|
*
|
|
* - memberToken : 일반 회원 (마이페이지 주문/리뷰 등 본인 리소스 접근)
|
|
* - ordersUpdateToken : 주문 상태 변경 권한 (관리자 주문 관리)
|
|
*
|
|
* 토큰은 spec 별로 lazy 발급된다.
|
|
*/
|
|
type EcommerceAuthFixtures = {
|
|
memberToken: string;
|
|
ordersUpdateToken: string;
|
|
};
|
|
|
|
export const test = base.extend<EcommerceAuthFixtures>({
|
|
memberToken: async ({}, use) => {
|
|
await use(issueToken('sirsoft-ecommerce.orders.read'));
|
|
},
|
|
ordersUpdateToken: async ({}, use) => {
|
|
await use(issueToken('sirsoft-ecommerce.orders.update'));
|
|
},
|
|
});
|
|
|
|
export { authenticatePage, issueToken };
|
|
export { expect } from '@playwright/test';
|