diff --git a/src/components/image-editor/ImageCanvasProjectAssetPickerDialog.test.tsx b/src/components/image-editor/ImageCanvasProjectAssetPickerDialog.test.tsx index 5d588db1b..cde2b12c7 100644 --- a/src/components/image-editor/ImageCanvasProjectAssetPickerDialog.test.tsx +++ b/src/components/image-editor/ImageCanvasProjectAssetPickerDialog.test.tsx @@ -173,6 +173,59 @@ describe('ImageCanvasProjectAssetPickerDialog', () => { expect(screen.getByText('已选 1 个')).toBeTruthy(); }); + /** + * 弹窗里的搜索 / 分类 / 在选中的选择是用户正在做的工作,不能被父级的一次普通重渲染清掉。 + * + * 调用方(`useImageCanvasGenerationSurface`)每次渲染都会重算 `selectedAssetIds`, + * 把它的身份放进重置 effect 的依赖里,就等于「父级一渲染就清空」。 + * + * 变异验证:把 `selectedAssetIds` 加回 effect 依赖,本用例必须失败。 + */ + it('keeps the in-progress search and selection across parent re-renders', () => { + const { rerender } = render( + {}} + onConfirm={() => {}} + />, + ); + + fireEvent.change(screen.getByLabelText('搜索参考图素材'), { + target: { value: '主角' }, + }); + fireEvent.click(screen.getByRole('option', { name: '选择参考图主角立绘' })); + expect(screen.getByText('已选 1 个')).toBeTruthy(); + expect( + screen.queryByRole('option', { name: '选择参考图小镇背景' }), + ).toBeNull(); + + // 父级重渲染:`selectedAssetIds` 换了一个新数组身份,内容不变。 + rerender( + {}} + onConfirm={() => {}} + />, + ); + + expect( + (screen.getByLabelText('搜索参考图素材') as HTMLInputElement).value, + ).toBe('主角'); + expect(screen.getByText('已选 1 个')).toBeTruthy(); + expect( + screen + .getByRole('option', { name: '选择参考图主角立绘' }) + .getAttribute('aria-selected'), + ).toBe('true'); + expect( + screen.queryByRole('option', { name: '选择参考图小镇背景' }), + ).toBeNull(); + }); + it('shows an empty state when the project has no registered assets', () => { render(