feat(server/web/coverart): manual Re-search missing art button
POST /api/admin/cover-sources/research bumps cover_art_sources_meta. current_version unconditionally; the next enrichment pass re-eligibles every 'none' row. Existing positively-sourced rows are not affected — the version-mismatch eligibility rule only kicks in for 'none'. Admin Cover Art panel gains a "Re-search missing art" button that calls the endpoint and shows a confirmation toast. Operator's escape hatch when: - They've added a Last.fm key and want to retry failed rows immediately rather than waiting for the next scheduled scan. - An upstream provider's catalog has updated (e.g. Deezer added a back-catalog import). - They want to verify a fix end-to-end before the next scheduled scan fires. SettingsService.BumpVersion (the unconditional version of T5's BumpVersionIfProvidersChanged) is the single-call DB writer; both endpoints route through it. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -42,6 +42,7 @@ vi.mock('$lib/api/admin', async () => {
|
||||
deleteQuarantineViaLidarr: vi.fn().mockResolvedValue({}),
|
||||
triggerScan: vi.fn().mockResolvedValue({}),
|
||||
refetchMissingCovers: vi.fn().mockResolvedValue({ queued: 0 }),
|
||||
researchMissingArt: vi.fn().mockResolvedValue({ version: 1 }),
|
||||
createScanScheduleQuery: vi.fn(() =>
|
||||
readable({
|
||||
data: {
|
||||
@@ -111,7 +112,8 @@ import {
|
||||
rejectRequest,
|
||||
resolveQuarantine,
|
||||
deleteQuarantineFile,
|
||||
deleteQuarantineViaLidarr
|
||||
deleteQuarantineViaLidarr,
|
||||
researchMissingArt
|
||||
} from '$lib/api/admin';
|
||||
import OverviewPage from './+page.svelte';
|
||||
|
||||
@@ -264,6 +266,15 @@ describe('admin Overview page', () => {
|
||||
expect(select.value).toBe('off');
|
||||
});
|
||||
|
||||
test('renders Re-search missing art button and invokes on click', async () => {
|
||||
setupOverview();
|
||||
render(OverviewPage);
|
||||
const btn = screen.getByRole('button', { name: /re-search missing art/i });
|
||||
expect(btn).toBeInTheDocument();
|
||||
await fireEvent.click(btn);
|
||||
expect(researchMissingArt).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
test('Library scan card shows Processing badge when library tally is populated and in-flight', async () => {
|
||||
const { readable } = await import('svelte/store');
|
||||
(createScanStatusQuery as ReturnType<typeof vi.fn>).mockReturnValueOnce(
|
||||
|
||||
Reference in New Issue
Block a user