Files
Genarrative/apps/ai-game-creator-shell/tests/ResourceEditSurface.test.tsx
T
k88936 594063a1e0 测试:修正 AGC 测试文件的类型错误
- 按 vitest 0.34 的参数元组口径改写 mock 泛型
- 修正 noUncheckedIndexedAccess 下的下标访问
- 补齐与当前类型脱节的测试桩字段
- 按 scripts/*.mjs 的运行时契约补局部类型声明
2026-10-03 17:41:30 +08:00

58 lines
2.1 KiB
TypeScript

/** @vitest-environment jsdom */
import React from 'react';
import { describe, expect, it, vi } from 'vitest';
import {
type ResourceEditSubmitInput,
ResourceEditSurface,
} from '../src/view/project-development/ResourceEditSurface';
import { fireEvent, render, screen, waitFor } from './appSurface/harness';
describe('统一资源编辑面板', () => {
it('失败后锁定原请求字段并使用相同输入重试', async () => {
const submit = vi
.fn<[input: ResourceEditSubmitInput], Promise<void>>()
.mockRejectedValueOnce(new Error('网络暂不可用'))
.mockResolvedValueOnce(undefined);
render(
<ResourceEditSurface
resourceLabel="玩法规则.md"
editKind="text"
initialAssetName="玩法规则-编辑版"
semanticNotice={null}
onCancel={() => undefined}
onSubmit={submit}
/>,
);
const name = screen.getByLabelText('派生资源名称');
const prompt = screen.getByLabelText('编辑提示词');
fireEvent.change(name, { target: { value: '红发角色规则' } });
fireEvent.change(prompt, { target: { value: '把角色头发设定改为红色' } });
fireEvent.click(screen.getByRole('button', { name: '生成派生资源' }));
expect((await screen.findByRole('alert')).textContent).toContain(
'网络暂不可用',
);
expect((name as HTMLInputElement).disabled).toBe(true);
expect((prompt as HTMLTextAreaElement).disabled).toBe(true);
fireEvent.click(screen.getByRole('button', { name: '使用原请求重试' }));
await waitFor(() => expect(submit).toHaveBeenCalledTimes(2));
expect(submit.mock.calls[0]?.[0]).toEqual(submit.mock.calls[1]?.[0]);
});
it('对音频显示语义派生边界', () => {
render(
<ResourceEditSurface
resourceLabel="theme.ogg"
editKind="background-music"
initialAssetName="theme-编辑版"
semanticNotice="音频将基于原资源语义派生重制,不会修改原音频波形。"
onCancel={() => undefined}
onSubmit={async () => undefined}
/>,
);
expect(screen.getByText(/不会修改原音频波形/)).not.toBeNull();
});
});