收口创作流程统一总计划并修复等待页窄屏裁切

This commit is contained in:
2026-05-31 05:57:34 +00:00
parent 551d436919
commit c193a352df
53 changed files with 2192 additions and 161 deletions

View 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);
});