koel/resources/assets/js/components/ui/album-artist/AlbumOrArtistThumbnail.spec.ts
2024-10-14 00:37:01 +07:00

109 lines
3.1 KiB
TypeScript

import { orderBy } from 'lodash'
import UnitTestCase from '@/__tests__/UnitTestCase'
import { expect, it } from 'vitest'
import factory from '@/__tests__/factory'
import { screen, waitFor } from '@testing-library/vue'
import { queueStore, songStore } from '@/stores'
import { playbackService } from '@/services'
import Thumbnail from './AlbumOrArtistThumbnail.vue'
let album: Album
let artist: Artist
new class extends UnitTestCase {
protected test () {
it('renders for album', () => {
expect(this.renderForAlbum().html()).toMatchSnapshot()
})
it('renders for artist', () => {
expect(this.renderForArtist().html()).toMatchSnapshot()
})
it('plays album', async () => {
const songs = factory('song', 10)
const fetchMock = this.mock(songStore, 'fetchForAlbum').mockResolvedValue(songs)
const playMock = this.mock(playbackService, 'queueAndPlay')
this.renderForAlbum()
await this.user.click(screen.getByRole('button'))
await waitFor(() => {
expect(fetchMock).toHaveBeenCalledWith(album)
expect(playMock).toHaveBeenCalledWith(songs)
})
})
it('queues album', async () => {
const songs = factory('song', 10)
const fetchMock = this.mock(songStore, 'fetchForAlbum').mockResolvedValue(songs)
const queueMock = this.mock(queueStore, 'queue')
this.renderForAlbum()
await this.user.keyboard('{Alt>}')
await this.user.click(screen.getByRole('button'))
await this.user.keyboard('{/Alt}')
await waitFor(() => {
expect(fetchMock).toHaveBeenCalledWith(album)
expect(queueMock).toHaveBeenCalledWith(orderBy(songs, ['disc', 'track']))
})
})
it('plays artist', async () => {
const songs = factory('song', 10)
const fetchMock = this.mock(songStore, 'fetchForArtist').mockResolvedValue(songs)
const playMock = this.mock(playbackService, 'queueAndPlay')
this.renderForArtist()
await this.user.click(screen.getByRole('button'))
await waitFor(() => {
expect(fetchMock).toHaveBeenCalledWith(artist)
expect(playMock).toHaveBeenCalledWith(songs)
})
})
it('queues artist', async () => {
const songs = factory('song', 10)
const fetchMock = this.mock(songStore, 'fetchForArtist').mockResolvedValue(songs)
const queueMock = this.mock(queueStore, 'queue')
this.renderForArtist()
await this.user.keyboard('{Alt>}')
await this.user.click(screen.getByRole('button'))
await this.user.keyboard('{/Alt}')
await waitFor(() => {
expect(fetchMock).toHaveBeenCalledWith(artist)
expect(queueMock).toHaveBeenCalledWith(orderBy(songs, ['album_id', 'disc', 'track']))
})
})
}
private renderForAlbum () {
album = factory('album', {
name: 'IV',
cover: 'https://test/album.jpg',
})
return this.render(Thumbnail, {
props: {
entity: album,
},
})
}
private renderForArtist () {
artist = factory('artist', {
name: 'Led Zeppelin',
image: 'https://test/blimp.jpg',
})
return this.render(Thumbnail, {
props: {
entity: artist,
},
})
}
}