feat(web): AddToPlaylistMenu submenu wired into TrackMenu (M7 #352)
The "Add to playlist…" entry that #372 reserved as a disabled slot is now active. Submenu lists the operator's own playlists alphabetically; "New playlist…" toggles an inline create form that makes the playlist + appends the track in two API calls. TrackMenu's existing test asserts the entry is enabled and opens the submenu instead of the previous "is disabled with tooltip" check.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import { afterEach, describe, expect, test, vi } from 'vitest';
|
||||
import { render, screen, fireEvent } from '@testing-library/svelte';
|
||||
import { render, screen, fireEvent, waitFor } from '@testing-library/svelte';
|
||||
import { readable } from 'svelte/store';
|
||||
import type { TrackRef } from '$lib/api/types';
|
||||
|
||||
@@ -37,6 +37,13 @@ vi.mock('$lib/api/admin/tracks', () => ({
|
||||
removeTrack: vi.fn().mockResolvedValue({ deleted_track_id: 't1' })
|
||||
}));
|
||||
|
||||
vi.mock('$lib/api/playlists', () => ({
|
||||
createPlaylistsQuery: () =>
|
||||
readable({ data: { owned: [], public: [] }, isPending: false, isError: false }),
|
||||
appendTracks: vi.fn().mockResolvedValue({ id: 'p1', tracks: [] }),
|
||||
createPlaylist: vi.fn().mockResolvedValue({ id: 'p1', name: 'New' })
|
||||
}));
|
||||
|
||||
vi.mock('$lib/player/store.svelte', () => ({
|
||||
playNext: vi.fn(),
|
||||
enqueueTrack: vi.fn()
|
||||
@@ -100,12 +107,15 @@ describe('TrackMenu', () => {
|
||||
expect(screen.getAllByRole('menuitem')).toHaveLength(8);
|
||||
});
|
||||
|
||||
test('"Add to playlist…" rendered as aria-disabled with tooltip', async () => {
|
||||
test('"Add to playlist…" is enabled and opens the AddToPlaylistMenu submenu', async () => {
|
||||
render(TrackMenu, { props: { track } });
|
||||
await fireEvent.click(screen.getByRole('button', { name: /track actions/i }));
|
||||
const item = screen.getByRole('menuitem', { name: /add to playlist/i });
|
||||
expect(item.getAttribute('aria-disabled')).toBe('true');
|
||||
expect(item.getAttribute('title')).toBe('Coming with playlists');
|
||||
expect(item.getAttribute('aria-disabled')).toBe('false');
|
||||
await fireEvent.click(item);
|
||||
await waitFor(() =>
|
||||
expect(screen.getByRole('menu', { name: /add to playlist/i })).toBeInTheDocument()
|
||||
);
|
||||
});
|
||||
|
||||
test('"Play next" dispatches playNext(track)', async () => {
|
||||
|
||||
Reference in New Issue
Block a user