This commit is contained in:
2026-05-14 01:11:58 +08:00
parent b13870f71b
commit 5a55180b78
61 changed files with 5050 additions and 1057 deletions

View File

@@ -25,6 +25,9 @@ vi.mock('../ResolvedAssetImage', () => ({
vi.mock('../../services/assetReadUrlService', () => ({
isGeneratedLegacyPath: (value: string) =>
/^\/?generated-[^/?#]+\/.+/u.test(value.trim()),
resolveAssetReadUrl: vi.fn((value: string) =>
Promise.resolve(`https://signed.example.com/${value.replace(/^\/+/u, '')}`),
),
}));
vi.mock('../../services/match3d-works', () => ({
@@ -167,6 +170,7 @@ describe('Match3DResultView', () => {
expect(match3dWorksService.generateMatch3DWorkTags).toHaveBeenCalledWith({
gameName: '水果抓大鹅',
themeText: '水果',
summary: '',
});
expect(screen.getByText('果园')).toBeTruthy();
expect(screen.getByText('轻量休闲')).toBeTruthy();
@@ -500,6 +504,7 @@ describe('Match3DResultView', () => {
expect(screen.getByRole('dialog', { name: /水果核心物件/u })).toBeTruthy();
expect(screen.getByText('素材名称')).toBeTruthy();
expect(screen.getByText('暂无音效')).toBeTruthy();
expect(screen.getByLabelText('生成点击音效10光点')).toBeTruthy();
expect(screen.queryByRole('button', { name: '重新生成' })).toBeNull();
expect(screen.queryByText('用途')).toBeNull();
});
@@ -633,7 +638,8 @@ describe('Match3DResultView', () => {
fireEvent.change(screen.getByLabelText('物品名称 4'), {
target: { value: '苹果' },
});
fireEvent.click(screen.getByRole('button', { name: '生成物品素材' }));
expect(screen.getByRole('button', { name: /生成物品素材 · 2光点/u })).toBeTruthy();
fireEvent.click(screen.getByRole('button', { name: /生成物品素材/u }));
await waitFor(() => {
expect(match3dWorksService.generateMatch3DItemAssets).toHaveBeenCalledWith(
@@ -674,7 +680,7 @@ describe('Match3DResultView', () => {
fireEvent.change(screen.getByLabelText('物品名称 1'), {
target: { value: '草莓' },
});
fireEvent.click(screen.getByRole('button', { name: '生成物品素材' }));
fireEvent.click(screen.getByRole('button', { name: /生成物品素材/u }));
await waitFor(() => {
expect(screen.getAllByText('生成中').length).toBeGreaterThan(0);
@@ -716,14 +722,20 @@ describe('Match3DResultView', () => {
fireEvent.click(screen.getByRole('button', { name: '难度配置' }));
expect(screen.getByRole('button', { name: //u })).toBeTruthy();
expect(
screen.getByRole('button', { name: //u }).getAttribute('aria-pressed'),
screen.getByRole('button', { name: '轻松 8次 · 3种' }),
).toBeTruthy();
const difficultySlider = screen.getByRole('slider', { name: '难度' });
expect((difficultySlider as HTMLInputElement).value).toBe('1');
expect(
screen
.getByRole('button', { name: '标准 12次 · 9种' })
.getAttribute('aria-pressed'),
).toBe('true');
expect(screen.getByText('36 件')).toBeTruthy();
expect(screen.getAllByText('9 种').length).toBeGreaterThan(0);
fireEvent.click(screen.getByRole('button', { name: //u }));
fireEvent.change(difficultySlider, { target: { value: '3' } });
await waitFor(() => {
expect(match3dWorksService.updateMatch3DWork).toHaveBeenCalledWith(
@@ -799,7 +811,6 @@ describe('Match3DResultView', () => {
);
expect(screen.getByDisplayValue('物品1')).toBeTruthy();
expect(screen.getAllByText('素材已就绪').length).toBeGreaterThan(0);
expect(
[...document.querySelectorAll('img')].some((image) =>
image
@@ -845,7 +856,29 @@ describe('Match3DResultView', () => {
expect(
imageSources.some((source) => source.includes('views/view-05.png')),
).toBe(true);
expect(screen.getAllByText('5 视角').length).toBeGreaterThan(0);
});
test('物品详情五视角预览使用 1:1 五格布局', () => {
render(
<Match3DResultView
profile={createProfile({
clearCount: 3,
generatedItemAssets: [createReadyGeneratedItemAsset(1)],
})}
onBack={() => {}}
onStartTestRun={() => {}}
/>,
);
fireEvent.click(screen.getByRole('button', { name: '素材配置' }));
fireEvent.click(
screen.getByRole('button', { name: '打开物品1物品素材' }),
);
const preview = screen.getByLabelText('物品1五视角预览');
expect(preview.className).toContain('aspect-square');
expect(preview.className).toContain('grid-cols-[repeat(5,minmax(0,1fr))]');
expect(preview.querySelectorAll('img')).toHaveLength(5);
});
test('草稿阶段仅有切割图片时展示 2D 素材', () => {
@@ -882,7 +915,11 @@ describe('Match3DResultView', () => {
);
expect(screen.getByDisplayValue('草莓')).toBeTruthy();
expect(screen.getAllByText('素材已就绪').length).toBeGreaterThan(0);
expect(
[...document.querySelectorAll('img')].some((image) =>
image.getAttribute('src')?.includes('items/strawberry/image.png'),
),
).toBe(true);
expect(screen.queryByRole('link', { name: /\.glb/u })).toBeNull();
});
@@ -997,6 +1034,11 @@ describe('Match3DResultView', () => {
'/generated-match3d-assets/session/profile/background/old/background.png',
imageObjectKey:
'generated-match3d-assets/session/profile/background/old/background.png',
containerPrompt: '旧容器提示词',
containerImageSrc:
'/generated-match3d-assets/session/profile/ui-container/old/container.png',
containerImageObjectKey:
'generated-match3d-assets/session/profile/ui-container/old/container.png',
status: 'image_ready',
error: null,
},
@@ -1015,6 +1057,11 @@ describe('Match3DResultView', () => {
'/generated-match3d-assets/session/profile/background/new/background.png',
imageObjectKey:
'generated-match3d-assets/session/profile/background/new/background.png',
containerPrompt: '新容器提示词',
containerImageSrc:
'/generated-match3d-assets/session/profile/ui-container/new/container.png',
containerImageObjectKey:
'generated-match3d-assets/session/profile/ui-container/new/container.png',
status: 'image_ready',
error: null,
},
@@ -1026,6 +1073,11 @@ describe('Match3DResultView', () => {
'/generated-match3d-assets/session/profile/background/new/background.png',
imageObjectKey:
'generated-match3d-assets/session/profile/background/new/background.png',
containerPrompt: '新容器提示词',
containerImageSrc:
'/generated-match3d-assets/session/profile/ui-container/new/container.png',
containerImageObjectKey:
'generated-match3d-assets/session/profile/ui-container/new/container.png',
status: 'image_ready',
error: null,
},
@@ -1057,7 +1109,8 @@ describe('Match3DResultView', () => {
fireEvent.change(screen.getByLabelText('UI背景图画面描述提示词'), {
target: { value: '新背景提示词' },
});
fireEvent.click(screen.getByRole('button', { name: '重新生成' }));
expect(screen.getByRole('button', { name: /重新生成 · 2光点/u })).toBeTruthy();
fireEvent.click(screen.getByRole('button', { name: /重新生成/u }));
await waitFor(() => {
expect(
@@ -1074,6 +1127,8 @@ describe('Match3DResultView', () => {
prompt: '新背景提示词',
imageSrc:
'/generated-match3d-assets/session/profile/background/new/background.png',
containerImageSrc:
'/generated-match3d-assets/session/profile/ui-container/new/container.png',
}),
}),
],
@@ -1128,7 +1183,11 @@ describe('Match3DResultView', () => {
);
expect(screen.getByDisplayValue('草莓')).toBeTruthy();
expect(screen.getAllByText('素材已就绪').length).toBeGreaterThan(0);
expect(
[...document.querySelectorAll('img')].some((image) =>
image.getAttribute('src')?.includes('views/view-01.png'),
),
).toBe(true);
fireEvent.click(screen.getByRole('button', { name: '试玩' }));
@@ -1240,11 +1299,9 @@ describe('Match3DResultView', () => {
],
}),
);
expect(
document.querySelector(
'audio[src="/generated-match3d-assets/audio/click.wav"]',
),
).toBeTruthy();
expect(screen.getByLabelText('草莓点击音效').getAttribute('src')).toBe(
'https://signed.example.com/generated-match3d-assets/audio/click.wav',
);
});
});
@@ -1312,6 +1369,7 @@ describe('Match3DResultView', () => {
'轻快, 休闲',
);
expect(screen.queryByLabelText('抓大鹅背景音乐提示词')).toBeNull();
expect(screen.getByRole('button', { name: /生成音乐 · 5光点/u })).toBeTruthy();
fireEvent.click(screen.getByRole('button', { name: /生成音乐/u }));
@@ -1351,11 +1409,9 @@ describe('Match3DResultView', () => {
],
}),
);
expect(
document.querySelector(
'audio[src="/generated-match3d-assets/audio/music.wav"]',
),
).toBeTruthy();
expect(screen.getByLabelText('抓大鹅背景音乐').getAttribute('src')).toBe(
'https://signed.example.com/generated-match3d-assets/audio/music.wav',
);
});
});
});