import { afterEach, describe, expect, test, vi } from 'vitest'; import { fireEvent, render, screen, waitFor } from '@testing-library/svelte'; import { mockInfiniteQuery } from '../../../test-utils/query'; import type { ReleaseBlock } from '#lib/api/types.js'; vi.mock('#lib/api/wanted.js', () => ({ createReleaseBlocksQuery: vi.fn(), unblockRelease: vi.fn().mockResolvedValue(undefined) })); vi.mock('#lib/stores/toast.svelte.js', () => ({ pushToast: vi.fn() })); import BlockList from './BlockList.svelte'; import { createReleaseBlocksQuery, unblockRelease } from '#lib/api/wanted.js'; const block: ReleaseBlock = { info_hash: 'abc123', name: 'Daft Punk - Random Access Memories (Drumless Edition)', reason: 'import', detail: 'The album tag says another version.', blocked_at: new Date(Date.now() - 3_600_000).toISOString(), want_title: 'Random Access Memories', want_artist: 'Daft Punk' }; afterEach(() => vi.clearAllMocks()); function setup(items: ReleaseBlock[]) { vi.mocked(createReleaseBlocksQuery).mockReturnValue( mockInfiniteQuery({ pages: [{ items, total: items.length, limit: 50, offset: 0 }] }) as unknown as ReturnType< typeof createReleaseBlocksQuery > ); return render(BlockList); } describe('BlockList', () => { test('a blocked release says why and can be allowed again', async () => { setup([block]); expect(screen.getByText(/refused on import/i)).toBeTruthy(); expect(screen.getByText(/another version/)).toBeTruthy(); expect(screen.getByText(/for daft punk – random access memories/i)).toBeTruthy(); await fireEvent.click(screen.getByRole('button', { name: /allow .* again/i })); await waitFor(() => expect(unblockRelease).toHaveBeenCalledWith('abc123')); }); test('with nothing blocked it says so', () => { setup([]); expect(screen.getByText(/no releases are blocked/i)).toBeTruthy(); }); });