From d27e204f21c7094f4d946f0a2be8ccfa820f7265 Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Mon, 5 Oct 2026 16:49:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E8=AF=A6=E6=83=85=E4=BB=B7?= =?UTF-8?q?=E6=A0=BC=E6=94=B9=E7=94=A8=E5=BE=85=E5=AE=A1=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=86=BB=E7=BB=93=E4=BB=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - applyFrozenGameMetadata 叠加冻结资料中的数值型 priceMudPoints:价格随版本冻结,审核员要看到待审版本将要生效的价格,而不是游戏行当前已公开价格 - 冻结资料缺 priceMudPoints 或为旧响应时保留 game.priceMudPoints,详情资料区仍渲染 detail.game.priceMudPoints - 新增两条详情用例:游戏行 0 泥点但冻结 30 泥点时展示「30 泥点」;旧版本冻结资料无价格时回落「免费」且不出现 NaN --- .../AdminGameDistributionReviewPage.test.tsx | 54 +++++++++++++++++++ .../pages/AdminGameDistributionReviewPage.tsx | 5 ++ 2 files changed, 59 insertions(+) diff --git a/apps/admin-web/src/pages/AdminGameDistributionReviewPage.test.tsx b/apps/admin-web/src/pages/AdminGameDistributionReviewPage.test.tsx index b3d0be77c..dda1e4022 100644 --- a/apps/admin-web/src/pages/AdminGameDistributionReviewPage.test.tsx +++ b/apps/admin-web/src/pages/AdminGameDistributionReviewPage.test.tsx @@ -17,6 +17,7 @@ import { reviewAdminGameDistributionVersion, } from '../api/adminApiClient'; import type { + AdminGameDistributionGameDetail, AdminGameDistributionGameListResponse, AdminGameDistributionReviewEntry, AdminGameDistributionVersionDetailResponse, @@ -365,3 +366,56 @@ test('详情展示发布者和冻结资料,并试玩当前待审版本', async ), ); }); + +test('详情优先展示待审版本冻结价格,而不是游戏行当前价格', async () => { + vi.mocked(getAdminGameDistributionVersion).mockResolvedValue({ + // 游戏行当前是免费,待审版本冻结为 30 泥点:审核员要看到将要生效的价格。 + game: { ...detailResponse.game, priceMudPoints: 0 }, + version: { + ...detailResponse.version, + frozenMetadata: { title: '测试游戏', priceMudPoints: 30 }, + }, + }); + + render( + , + ); + await screen.findByText(gameTitle); + + fireEvent.click(screen.getByRole('button', { name: '详情' })); + expect((await screen.findAllByText(/测试作者/u)).length).toBeGreaterThan(0); + + expect(screen.getByText('价格')).toBeTruthy(); + expect(screen.getByText('30 泥点')).toBeTruthy(); + expect(screen.queryByText('免费')).toBeNull(); +}); + +test('旧版本冻结资料没有价格时按免费回落', async () => { + vi.mocked(getAdminGameDistributionVersion).mockResolvedValue({ + game: { + ...detailResponse.game, + priceMudPoints: undefined, + } as unknown as AdminGameDistributionGameDetail, + version: { + ...detailResponse.version, + frozenMetadata: { title: '测试游戏' }, + }, + }); + + render( + , + ); + await screen.findByText(gameTitle); + + fireEvent.click(screen.getByRole('button', { name: '详情' })); + expect((await screen.findAllByText(/测试作者/u)).length).toBeGreaterThan(0); + + expect(screen.getByText('免费')).toBeTruthy(); + expect(screen.queryByText(/NaN/u)).toBeNull(); +}); diff --git a/apps/admin-web/src/pages/AdminGameDistributionReviewPage.tsx b/apps/admin-web/src/pages/AdminGameDistributionReviewPage.tsx index 4fc7782b8..46fb377cb 100644 --- a/apps/admin-web/src/pages/AdminGameDistributionReviewPage.tsx +++ b/apps/admin-web/src/pages/AdminGameDistributionReviewPage.tsx @@ -98,6 +98,11 @@ function applyFrozenGameMetadata( typeof metadata.orientation === 'string' ? metadata.orientation : game.orientation, + // 价格随版本冻结:审核页要展示待审版本将要生效的价格,而不是游戏行当前已公开价格。 + priceMudPoints: + typeof metadata.priceMudPoints === 'number' + ? metadata.priceMudPoints + : game.priceMudPoints, }; }