From 47858b1788b2bed823fe3d19de0a1e6c48204bfb Mon Sep 17 00:00:00 2001 From: Samu Date: Thu, 3 Sep 2026 22:54:09 +0200 Subject: [PATCH] fix: refetch item detail after re-match so the play button stays honest --- web/src/pages/ItemPage.tsx | 5 +---- web/test/item.test.tsx | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/web/src/pages/ItemPage.tsx b/web/src/pages/ItemPage.tsx index 81ade21..731181c 100644 --- a/web/src/pages/ItemPage.tsx +++ b/web/src/pages/ItemPage.tsx @@ -60,10 +60,7 @@ export default function ItemPage() { if (!item) return void api .setMatch(item.id, albumId) - .then((updated) => { - applyUpdated(updated) - setMutationError(null) - }) + .then(() => refetch()) .catch(() => setMutationError("That didn't work — check your connection and try again.")) } diff --git a/web/test/item.test.tsx b/web/test/item.test.tsx index 92db6a1..b385479 100644 --- a/web/test/item.test.tsx +++ b/web/test/item.test.tsx @@ -119,6 +119,27 @@ describe('ItemPage', () => { await waitFor(() => expect(api.setMatch).toHaveBeenCalledWith(1, 77)) }) + it('re-match refreshes the play button state', async () => { + vi.mocked(api.getItem) + .mockResolvedValueOnce({ ...rippedItem, matchedAlbum: null } as never) + .mockResolvedValue({ ...rippedItem } as never) + vi.mocked(api.searchAlbums).mockResolvedValue({ + albums: [{ id: 77, subsonicId: 'a1', title: 'Motion (Remaster)', artist: 'The Cinematic Orchestra' }], + } as never) + vi.mocked(api.setMatch).mockResolvedValue({ ...item } as never) + renderItem() + await waitFor(() => expect(screen.getByRole('heading', { name: 'Motion' })).toBeTruthy()) + expect(screen.queryByRole('button', { name: /play album/i })).toBeNull() + + await userEvent.click(screen.getByRole('button', { name: /re-match/i })) + await userEvent.click(screen.getByRole('button', { name: /^search$/i })) + const albumRadio = await screen.findByRole('radio', { name: /motion \(remaster\)/i }) + await userEvent.click(albumRadio) + await userEvent.click(screen.getByRole('button', { name: /^link$/i })) + + await waitFor(() => expect(screen.getByRole('button', { name: /play album/i })).toBeTruthy()) + }) + it('unlink clears the match', async () => { vi.mocked(api.setMatch).mockResolvedValue(item as never) renderItem()