This commit is contained in:
2026-04-29 20:56:59 +08:00
parent fb6f455530
commit 730f485f48
200 changed files with 9881 additions and 2221 deletions

View File

@@ -11,8 +11,8 @@ import {
import { afterEach, describe, expect, test, vi } from 'vitest';
import type { PuzzleAgentSessionSnapshot } from '../../../packages/shared/src/contracts/puzzleAgentSession';
import { puzzleAssetClient } from '../../services/puzzle-works/puzzleAssetClient';
import * as puzzleWorksService from '../../services/puzzle-works';
import { puzzleAssetClient } from '../../services/puzzle-works/puzzleAssetClient';
import { PuzzleResultView } from './PuzzleResultView';
vi.mock('../ResolvedAssetImage', () => ({
@@ -193,7 +193,7 @@ describe('PuzzleResultView', () => {
);
});
test('uses two tabs without author preview or persistent publish validation', () => {
test('uses one ordered list without tabs or persistent publish validation', () => {
render(
<PuzzleResultView
session={createSession()}
@@ -203,8 +203,13 @@ describe('PuzzleResultView', () => {
/>,
);
expect(screen.getByRole('button', { name: '基本信息' })).toBeTruthy();
expect(screen.getByRole('button', { name: '拼图图片' })).toBeTruthy();
expect(screen.queryByRole('button', { name: '基本信息' })).toBeNull();
expect(screen.queryByRole('button', { name: '拼图图片' })).toBeNull();
const html = document.body.textContent ?? '';
expect(html.indexOf('关卡名称')).toBeLessThan(html.indexOf('画面预览'));
expect(html.indexOf('画面预览')).toBeLessThan(html.indexOf('画面描述'));
expect(html.indexOf('画面描述')).toBeLessThan(html.indexOf('重新生成画面'));
expect(html.indexOf('重新生成画面')).toBeLessThan(html.indexOf('题材标签'));
expect(screen.queryByText('作者预览')).toBeNull();
expect(screen.queryByText('发布校验')).toBeNull();
expect(screen.getByRole('button', { name: //u })).toBeTruthy();
@@ -289,6 +294,9 @@ describe('PuzzleResultView', () => {
fireEvent.change(screen.getByDisplayValue('雨夜猫街'), {
target: { value: '暖灯猫街' },
});
fireEvent.change(screen.getByLabelText('画面描述'), {
target: { value: '一只猫在雨夜灯牌下回头。' },
});
fireEvent.click(screen.getByLabelText('新增题材标签'));
fireEvent.change(screen.getByLabelText('新题材标签'), {
target: { value: '暖灯' },
@@ -299,11 +307,43 @@ describe('PuzzleResultView', () => {
expect(onStartTestRun).toHaveBeenCalledWith(
expect.objectContaining({
levelName: '暖灯猫街',
summary: '一只猫在雨夜灯牌下回头。',
themeTags: ['猫咪', '雨夜', '暖灯'],
}),
);
});
test('auto saves edited picture description to the puzzle work profile', async () => {
vi.useFakeTimers();
vi.mocked(puzzleWorksService.updatePuzzleWork).mockResolvedValue({
item: {} as never,
});
render(
<PuzzleResultView
session={createSession()}
profileId="puzzle-profile-session-1"
onBack={() => {}}
onExecuteAction={() => {}}
/>,
);
fireEvent.change(screen.getByLabelText('画面描述'), {
target: { value: '一只猫在雨夜灯牌下回头。' },
});
await act(async () => {
await vi.runAllTimersAsync();
});
expect(puzzleWorksService.updatePuzzleWork).toHaveBeenCalledWith(
'puzzle-profile-session-1',
expect.objectContaining({
summary: '一只猫在雨夜灯牌下回头。',
}),
);
});
test('requires at least three theme tags before publish can pass', () => {
const onExecuteAction = vi.fn();
@@ -331,6 +371,50 @@ describe('PuzzleResultView', () => {
).toBe(true);
});
test('publishes with the edited picture description', () => {
const onExecuteAction = vi.fn();
render(
<PuzzleResultView
session={createSession({
draft: {
...createSession().draft!,
themeTags: ['猫咪', '雨夜', '暖灯'],
},
resultPreview: {
draft: {
...createSession().draft!,
themeTags: ['猫咪', '雨夜', '暖灯'],
},
publishReady: true,
blockers: [],
qualityFindings: [],
},
})}
onBack={() => {}}
onExecuteAction={onExecuteAction}
/>,
);
fireEvent.change(screen.getByLabelText('画面描述'), {
target: { value: '一只猫在雨夜灯牌下回头。' },
});
fireEvent.click(screen.getByRole('button', { name: //u }));
fireEvent.click(
within(screen.getByRole('dialog', { name: '发布拼图作品' })).getByRole(
'button',
{ name: '发布到广场' },
),
);
expect(onExecuteAction).toHaveBeenCalledWith({
action: 'publish_puzzle_work',
levelName: '雨夜猫街',
summary: '一只猫在雨夜灯牌下回头。',
themeTags: ['猫咪', '雨夜', '暖灯'],
});
});
test('auto saves added and removed theme tags', async () => {
vi.useFakeTimers();
vi.mocked(puzzleWorksService.updatePuzzleWork).mockResolvedValue({
@@ -387,14 +471,14 @@ describe('PuzzleResultView', () => {
/>,
);
fireEvent.click(screen.getByRole('button', { name: '拼图图片' }));
expect(screen.getByText('画面描述')).toBeTruthy();
expect(screen.queryByText(//u)).toBeNull();
expect(screen.queryByText(//u)).toBeNull();
fireEvent.change(screen.getByLabelText('画面描述'), {
target: { value: '一只猫在雨夜灯牌下回头。' },
});
fireEvent.click(screen.getByRole('button', { name: //u }));
fireEvent.click(screen.getByRole('button', { name: //u }));
expect(onExecuteAction).toHaveBeenCalledWith({
action: 'generate_puzzle_images',
@@ -428,19 +512,22 @@ describe('PuzzleResultView', () => {
/>,
);
fireEvent.click(screen.getByRole('button', { name: '拼图图片' }));
fireEvent.click(screen.getByLabelText('从历史拼图素材库选择'));
const dialog = await screen.findByRole('dialog', {
name: '选择历史拼图素材',
});
fireEvent.click(within(dialog).getByRole('button', { name: / user-1/u }));
fireEvent.click(
await within(dialog).findByRole('button', { name: / user-1/u }),
);
await waitFor(() => {
expect(screen.queryByRole('dialog', { name: '选择历史拼图素材' })).toBeNull();
expect(
screen.queryByRole('dialog', { name: '选择历史拼图素材' }),
).toBeNull();
});
fireEvent.click(screen.getByRole('button', { name: //u }));
fireEvent.click(screen.getByRole('button', { name: //u }));
expect(onExecuteAction).toHaveBeenLastCalledWith({
action: 'generate_puzzle_images',
@@ -459,10 +546,9 @@ describe('PuzzleResultView', () => {
/>,
);
fireEvent.click(screen.getByRole('button', { name: '拼图图片' }));
expect(screen.getByRole('img', { name: '雨夜猫街' }).getAttribute('src')).toBe(
'/puzzle/candidate-1.png',
);
expect(
screen.getByRole('img', { name: '雨夜猫街' }).getAttribute('src'),
).toBe('/puzzle/candidate-1.png');
rerender(
<PuzzleResultView
@@ -492,9 +578,9 @@ describe('PuzzleResultView', () => {
);
await waitFor(() => {
expect(screen.getByRole('img', { name: '雨夜猫街' }).getAttribute('src')).toBe(
'/puzzle/candidate-2.png',
);
expect(
screen.getByRole('img', { name: '雨夜猫街' }).getAttribute('src'),
).toBe('/puzzle/candidate-2.png');
});
});
@@ -534,12 +620,10 @@ describe('PuzzleResultView', () => {
/>,
);
fireEvent.click(screen.getByRole('button', { name: '拼图图片' }));
await waitFor(() => {
expect(screen.getByRole('img', { name: '雨夜猫街' }).getAttribute('src')).toBe(
'/puzzle/candidate-2.png',
);
expect(
screen.getByRole('img', { name: '雨夜猫街' }).getAttribute('src'),
).toBe('/puzzle/candidate-2.png');
});
});
});