1
Some checks failed
CI / verify (push) Has been cancelled

This commit is contained in:
2026-05-11 20:57:16 +08:00
81 changed files with 3410 additions and 132 deletions

View File

@@ -205,10 +205,16 @@ describe('Match3DResultView', () => {
];
const profile = createProfile({ generatedItemAssets });
const savedProfile = createProfile({ generatedItemAssets: [] });
const persistedProfile = createProfile({ generatedItemAssets });
const onStartTestRun = vi.fn();
vi.mocked(match3dWorksService.updateMatch3DWork).mockResolvedValue({
item: savedProfile,
});
vi.mocked(
match3dWorksService.updateMatch3DGeneratedItemAssets,
).mockResolvedValue({
item: persistedProfile,
});
render(
<Match3DResultView
@@ -221,10 +227,34 @@ describe('Match3DResultView', () => {
fireEvent.click(screen.getByRole('button', { name: '试玩' }));
await waitFor(() => {
expect(
match3dWorksService.updateMatch3DGeneratedItemAssets,
).toHaveBeenCalledWith(
profile.profileId,
expect.objectContaining({
generatedItemAssets: [
expect.objectContaining({
itemId: 'match3d-item-1',
modelSrc:
'/generated-match3d-assets/session/profile/items/match3d-item-1-item/model/model.glb',
status: 'model_ready',
}),
],
}),
);
expect(onStartTestRun).toHaveBeenCalledWith(
expect.objectContaining({
profileId: profile.profileId,
generatedItemAssets,
generatedItemAssets: [
expect.objectContaining({
itemId: 'match3d-item-1',
modelSrc:
'/generated-match3d-assets/session/profile/items/match3d-item-1-item/model/model.glb',
modelObjectKey:
'generated-match3d-assets/session/profile/items/match3d-item-1-item/model/model.glb',
status: 'model_ready',
}),
],
}),
);
});
@@ -246,6 +276,105 @@ describe('Match3DResultView', () => {
expect(match3dWorksService.publishMatch3DWork).not.toHaveBeenCalled();
});
test('发布前会先把历史草稿 3D 模型素材写回 profile', async () => {
const generatedItemAssets = [
{
itemId: 'match3d-item-1',
itemName: '草莓',
imageSrc:
'/generated-match3d-assets/session/profile/items/match3d-item-1-item/image.png',
imageObjectKey:
'generated-match3d-assets/session/profile/items/match3d-item-1-item/image.png',
modelSrc: null,
modelObjectKey:
'generated-match3d-assets/session/profile/items/match3d-item-1-item/model/model.glb',
modelFileName: 'strawberry.glb',
taskUuid: 'task-strawberry',
subscriptionKey: 'sub-strawberry',
status: 'model_ready',
error: null,
},
];
const profile = createProfile({
summary: '轻松消除水果',
coverImageSrc: 'data:image/png;base64,cover',
generatedItemAssets,
});
const savedProfile = createProfile({
...profile,
generatedItemAssets: [],
});
const onPublished = vi.fn();
vi.mocked(match3dWorksService.updateMatch3DWork).mockResolvedValue({
item: savedProfile,
});
vi.mocked(
match3dWorksService.updateMatch3DGeneratedItemAssets,
).mockResolvedValue({
item: profile,
});
vi.mocked(match3dWorksService.publishMatch3DWork).mockResolvedValue({
item: createProfile({
...profile,
publicationStatus: 'published',
generatedItemAssets: [],
}),
});
render(
<Match3DResultView
profile={profile}
onBack={() => {}}
onPublished={onPublished}
onStartTestRun={() => {}}
/>,
);
fireEvent.click(screen.getByRole('button', { name: '发布' }));
await waitFor(() => {
expect(
match3dWorksService.updateMatch3DGeneratedItemAssets,
).toHaveBeenCalledWith(
profile.profileId,
expect.objectContaining({
generatedItemAssets: [
expect.objectContaining({
itemId: 'match3d-item-1',
modelObjectKey:
'generated-match3d-assets/session/profile/items/match3d-item-1-item/model/model.glb',
status: 'model_ready',
}),
],
}),
);
expect(match3dWorksService.publishMatch3DWork).toHaveBeenCalledWith(
profile.profileId,
);
expect(onPublished).toHaveBeenCalledWith(
expect.objectContaining({
publicationStatus: 'published',
generatedItemAssets: [
expect.objectContaining({
itemId: 'match3d-item-1',
modelObjectKey:
'generated-match3d-assets/session/profile/items/match3d-item-1-item/model/model.glb',
}),
],
}),
);
});
const assetPersistCallOrder = vi.mocked(
match3dWorksService.updateMatch3DGeneratedItemAssets,
).mock.invocationCallOrder[0];
const publishCallOrder = vi.mocked(
match3dWorksService.publishMatch3DWork,
).mock.invocationCallOrder[0];
expect(assetPersistCallOrder).toBeDefined();
expect(publishCallOrder).toBeDefined();
expect(assetPersistCallOrder!).toBeLessThan(publishCallOrder!);
});
test('结果页提供多 Tab并能进入 Rodin 3D 素材详情', () => {
render(
<Match3DResultView
@@ -483,6 +612,11 @@ describe('Match3DResultView', () => {
vi.mocked(match3dWorksService.updateMatch3DWork).mockResolvedValue({
item: createProfile({ generatedItemAssets: [] }),
});
vi.mocked(
match3dWorksService.updateMatch3DGeneratedItemAssets,
).mockResolvedValue({
item: createProfile({ generatedItemAssets: [profileAsset] }),
});
render(
<Match3DResultView