收口创作流程统一总计划并修复等待页窄屏裁切
This commit is contained in:
102
src/components/square-hole-result/SquareHoleResultView.test.tsx
Normal file
102
src/components/square-hole-result/SquareHoleResultView.test.tsx
Normal file
@@ -0,0 +1,102 @@
|
||||
/* @vitest-environment jsdom */
|
||||
|
||||
import { render, screen, waitFor } from '@testing-library/react';
|
||||
import userEvent from '@testing-library/user-event';
|
||||
import { expect, test, vi } from 'vitest';
|
||||
|
||||
import type { SquareHoleWorkProfile } from '../../../packages/shared/src/contracts/squareHoleWorks';
|
||||
import { SquareHoleResultView } from './SquareHoleResultView';
|
||||
|
||||
vi.mock('../../services/square-hole-works', () => ({
|
||||
publishSquareHoleWork: vi.fn(),
|
||||
regenerateSquareHoleWorkImage: vi.fn(),
|
||||
squareHoleAssetClient: {
|
||||
listHistoryAssets: vi.fn(),
|
||||
},
|
||||
updateSquareHoleWork: vi.fn(),
|
||||
}));
|
||||
|
||||
function createProfile(): SquareHoleWorkProfile {
|
||||
return {
|
||||
profileId: 'profile-1',
|
||||
workId: 'work-1',
|
||||
ownerUserId: 'user-1',
|
||||
gameName: '方洞挑战',
|
||||
themeText: '几何反差',
|
||||
twistRule: '形状要投进对应洞口',
|
||||
summary: '把所有形状投入正确洞口。',
|
||||
tags: ['方洞', '反差'],
|
||||
coverImageSrc: 'data:image/png;base64,cover',
|
||||
backgroundPrompt: '几何场景',
|
||||
backgroundImageSrc: 'data:image/png;base64,background',
|
||||
shapeOptions: [
|
||||
{
|
||||
optionId: 'shape-1',
|
||||
shapeKind: 'square',
|
||||
label: '方块',
|
||||
targetHoleId: 'hole-1',
|
||||
imagePrompt: '方块贴图',
|
||||
imageSrc: 'data:image/png;base64,shape-1',
|
||||
},
|
||||
],
|
||||
holeOptions: [
|
||||
{
|
||||
holeId: 'hole-1',
|
||||
holeKind: 'hole-1',
|
||||
label: '洞口 1',
|
||||
imagePrompt: '洞口 1 贴图',
|
||||
imageSrc: 'data:image/png;base64,hole-1',
|
||||
},
|
||||
],
|
||||
shapeCount: 6,
|
||||
difficulty: 2,
|
||||
publicationStatus: 'draft',
|
||||
playCount: 0,
|
||||
updatedAt: '2026-05-30T10:00:00.000Z',
|
||||
publishedAt: null,
|
||||
publishReady: true,
|
||||
};
|
||||
}
|
||||
|
||||
test('square hole result view exposes test run and publish actions', async () => {
|
||||
const user = userEvent.setup();
|
||||
const onBack = vi.fn();
|
||||
const onStartTestRun = vi.fn();
|
||||
const onPublished = vi.fn();
|
||||
const { publishSquareHoleWork, updateSquareHoleWork } = await import(
|
||||
'../../services/square-hole-works'
|
||||
);
|
||||
const mockUpdateSquareHoleWork = vi.mocked(updateSquareHoleWork);
|
||||
const mockPublishSquareHoleWork = vi.mocked(publishSquareHoleWork);
|
||||
const nextProfile = createProfile();
|
||||
mockUpdateSquareHoleWork.mockResolvedValue({
|
||||
item: nextProfile,
|
||||
} as Awaited<ReturnType<typeof updateSquareHoleWork>>);
|
||||
mockPublishSquareHoleWork.mockResolvedValue({
|
||||
item: nextProfile,
|
||||
} as Awaited<ReturnType<typeof publishSquareHoleWork>>);
|
||||
|
||||
render(
|
||||
<SquareHoleResultView
|
||||
profile={createProfile()}
|
||||
onBack={onBack}
|
||||
onStartTestRun={onStartTestRun}
|
||||
onPublished={onPublished}
|
||||
/>,
|
||||
);
|
||||
|
||||
expect(screen.getByRole('button', { name: '试玩' })).toBeTruthy();
|
||||
expect(screen.getByRole('button', { name: '发布' })).toBeTruthy();
|
||||
|
||||
await user.click(screen.getByRole('button', { name: '试玩' }));
|
||||
await user.click(screen.getByRole('button', { name: '发布' }));
|
||||
await user.click(screen.getByRole('button', { name: '返回' }));
|
||||
|
||||
await waitFor(() => {
|
||||
expect(onStartTestRun).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
await waitFor(() => {
|
||||
expect(onPublished).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
expect(onBack).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
Reference in New Issue
Block a user