koel/resources/assets/js/components/song/AddToMenu.spec.ts

95 lines
2.9 KiB
TypeScript
Raw Normal View History

import { clone } from 'lodash'
import { screen } from '@testing-library/vue'
import { expect, it } from 'vitest'
import factory from '@/__tests__/factory'
import { favoriteStore, playlistStore, queueStore } from '@/stores'
2022-05-13 17:58:38 +00:00
import UnitTestCase from '@/__tests__/UnitTestCase'
import { arrayify } from '@/utils'
import Btn from '@/components/ui/Btn.vue'
import AddToMenu from './AddToMenu.vue'
let songs: Song[]
const config: AddToMenuConfig = {
queue: true,
favorites: true,
playlists: true,
newPlaylist: true
}
2022-05-13 17:58:38 +00:00
new class extends UnitTestCase {
private renderComponent (customConfig: Partial<AddToMenuConfig> = {}) {
songs = factory<Song>('song', 5)
return this.render(AddToMenu, {
props: {
songs,
config: Object.assign(clone(config), customConfig),
showing: true
},
global: {
stubs: {
Btn
}
}
})
}
protected test () {
it('renders', () => {
playlistStore.state.playlists = [
factory<Playlist>('playlist', { name: 'Foo' }),
factory<Playlist>('playlist', { name: 'Bar' }),
factory<Playlist>('playlist', { name: 'Baz' })
]
2022-07-16 09:52:39 +00:00
expect(this.renderComponent().html()).toMatchSnapshot()
})
it.each<[keyof AddToMenuConfig, string | string[]]>([
['queue', ['queue-after-current', 'queue-bottom', 'queue-top', 'queue']],
['favorites', 'add-to-favorites'],
['playlists', 'add-to-playlist'],
['newPlaylist', 'new-playlist']
])('renders disabling %s config', (configKey: keyof AddToMenuConfig, testIds: string | string[]) => {
this.renderComponent({ [configKey]: false })
arrayify(testIds).forEach(id => expect(screen.queryByTestId(id)).toBeNull())
})
it.each<[string, string, MethodOf<typeof queueStore>]>([
['after current', 'queue-after-current', 'queueAfterCurrent'],
['to top', 'queue-top', 'queueToTop'],
['to bottom', 'queue-bottom', 'queue']
])('queues songs %s', async (_: string, testId: string, queueMethod: MethodOf<typeof queueStore>) => {
queueStore.state.songs = factory<Song>('song', 5)
queueStore.state.songs[2].playback_state = 'Playing'
const mock = this.mock(queueStore, queueMethod)
this.renderComponent()
await this.user.click(screen.getByTestId(testId))
expect(mock).toHaveBeenCalledWith(songs)
})
it('adds songs to Favorites', async () => {
const mock = this.mock(favoriteStore, 'like')
this.renderComponent()
await this.user.click(screen.getByTestId('add-to-favorites'))
expect(mock).toHaveBeenCalledWith(songs)
})
it('adds songs to existing playlist', async () => {
const mock = this.mock(playlistStore, 'addSongs')
playlistStore.state.playlists = factory<Playlist>('playlist', 3)
this.renderComponent()
await this.user.click(screen.getAllByTestId('add-to-playlist')[1])
expect(mock).toHaveBeenCalledWith(playlistStore.state.playlists[1], songs)
})
}
}