+
Rip queue — oldest additions first.
+ {error &&
Could not load the queue.
}
+ {items && items.length === 0 && (
+
+
Nothing waiting to be ripped.
+
+ Scan something →
+
+
+ )}
+ {items &&
+ items.map((item) => (
+
+
+
+
{item.title}
+
+ {item.artist} · added {new Date(item.dateAdded + 'Z').toLocaleDateString()}
+
+
+
+
+ details
+
+
+ ))}
+
+ )
+}
diff --git a/web/test/library.test.tsx b/web/test/library.test.tsx
index 7154e7e..bd94669 100644
--- a/web/test/library.test.tsx
+++ b/web/test/library.test.tsx
@@ -110,4 +110,23 @@ describe('LibraryPage', () => {
await waitFor(() => expect(screen.getByText(/nothing here yet/i)).toBeTruthy())
expect(screen.getByRole('link', { name: /add your first record/i }).getAttribute('href')).toBe('/add')
})
+
+ it('header links to stats and queue', async () => {
+ renderLibrary()
+ expect(screen.getByRole('link', { name: /stats/i }).getAttribute('href')).toBe('/stats')
+ expect(screen.getByRole('link', { name: /queue/i }).getAttribute('href')).toBe('/queue')
+ })
+
+ it('on-loan chip filters by loan state', async () => {
+ renderLibrary()
+ await waitFor(() => expect(screen.getByRole('button', { name: /^on loan$/i })).toBeTruthy())
+ await userEvent.click(screen.getByRole('button', { name: /^on loan$/i }))
+ await waitFor(() =>
+ expect(api.listCollection).toHaveBeenLastCalledWith(expect.objectContaining({ onLoan: 'true' }))
+ )
+ await userEvent.click(screen.getByRole('button', { name: /^on loan$/i }))
+ await waitFor(() =>
+ expect(api.listCollection).toHaveBeenLastCalledWith(expect.not.objectContaining({ onLoan: expect.anything() }))
+ )
+ })
})
diff --git a/web/test/queue.test.tsx b/web/test/queue.test.tsx
new file mode 100644
index 0000000..2a3eb16
--- /dev/null
+++ b/web/test/queue.test.tsx
@@ -0,0 +1,56 @@
+import { describe, it, expect, vi, beforeEach } from 'vitest'
+import { render, screen, waitFor } from '@testing-library/react'
+import userEvent from '@testing-library/user-event'
+import { MemoryRouter } from 'react-router-dom'
+import QueuePage from '../src/pages/QueuePage.js'
+import type { Item } from '../src/types.js'
+
+vi.mock('../src/api.js', async (importOriginal) => {
+ const actual = await importOriginal