fix: render prompt museum media

This commit is contained in:
brother7 committed 2026-08-18 12:32:34 +08:00
1 parent 11b19832a3
commit f8d82e6c19
9 files changed
+609 -37

No files matched your search

@@ -7,6 +7,7 @@ import type { PromptMuseumEntry, PromptMuseumPage } from '../../shared/image-pro
const fetchPromptMuseumPageMock = vi.hoisted(() => vi.fn());
const fetchPromptMuseumEntryMock = vi.hoisted(() => vi.fn());
const fetchPromptMuseumMediaMock = vi.hoisted(() => vi.fn());
vi.mock('@/lib/image-prompt-museum', async (importOriginal) => {
const actual = await importOriginal<typeof import('@/lib/image-prompt-museum')>();
@@ -14,6 +15,7 @@ vi.mock('@/lib/image-prompt-museum', async (importOriginal) => {
...actual,
fetchPromptMuseumPage: (...args: unknown[]) => fetchPromptMuseumPageMock(...args),
fetchPromptMuseumEntry: (...args: unknown[]) => fetchPromptMuseumEntryMock(...args),
fetchPromptMuseumMedia: (...args: unknown[]) => fetchPromptMuseumMediaMock(...args),
};
});
@@ -66,6 +68,7 @@ describe('Prompt Museum page', () => {
useImagePromptMuseumStore.getState().clearPendingPrompt();
fetchPromptMuseumPageMock.mockResolvedValue(pageFixture);
fetchPromptMuseumEntryMock.mockResolvedValue(entryFixture);
fetchPromptMuseumMediaMock.mockResolvedValue('data:image/webp;base64,AQID');
});
it('keeps the inspiration filters compact and below the native title bar', async () => {
@@ -126,4 +129,78 @@ describe('Prompt Museum page', () => {
expect.objectContaining({ cursor: 'cursor-two' }),
);
});
it('renders source attribution as text when the server omits its optional URL', async () => {
fetchPromptMuseumEntryMock.mockResolvedValueOnce({
...entryFixture,
attribution: {
...entryFixture.attribution,
source: { name: 'PromptHero' },
},
});
render(
<MemoryRouter initialEntries={['/image-prompts']}>
<Routes>
<Route path="/image-prompts" element={<ImagePromptMuseum />} />
</Routes>
</MemoryRouter>,
);
fireEvent.click(await screen.findByRole('button', { name: '查看 编辑感产品海报' }));
expect(await screen.findByText('PromptHero')).toBeInTheDocument();
expect(screen.queryByRole('link', { name: 'PromptHero' })).not.toBeInTheDocument();
});
it('loads relative media through Main and renders its data URL', async () => {
fetchPromptMuseumPageMock.mockResolvedValueOnce({
...pageFixture,
items: [{
...pageFixture.items[0],
thumbnail: {
...pageFixture.items[0].thumbnail,
url: '/api/image-prompt-museum/prompt-one/media/thumbnail',
},
}],
});
render(
<MemoryRouter initialEntries={['/image-prompts']}>
<Routes>
<Route path="/image-prompts" element={<ImagePromptMuseum />} />
</Routes>
</MemoryRouter>,
);
const image = await screen.findByRole('img', { name: '编辑感产品海报示例' });
expect(image).toHaveAttribute('src', 'data:image/webp;base64,AQID');
expect(fetchPromptMuseumMediaMock).toHaveBeenCalledWith(
'/api/image-prompt-museum/prompt-one/media/thumbnail',
);
});
it('keeps a card usable when its relative image fails', async () => {
fetchPromptMuseumMediaMock.mockRejectedValueOnce(new Error('image unavailable'));
fetchPromptMuseumPageMock.mockResolvedValueOnce({
...pageFixture,
items: [{
...pageFixture.items[0],
thumbnail: {
...pageFixture.items[0].thumbnail,
url: '/api/image-prompt-museum/prompt-one/media/thumbnail',
},
}],
});
render(
<MemoryRouter initialEntries={['/image-prompts']}>
<Routes>
<Route path="/image-prompts" element={<ImagePromptMuseum />} />
</Routes>
</MemoryRouter>,
);
expect(await screen.findByLabelText('编辑感产品海报示例加载失败')).toBeInTheDocument();
expect(screen.getByRole('button', { name: '查看 编辑感产品海报' })).toBeEnabled();
});
});