koel/resources/assets/js/components/ui/FooterPlayButton.spec.ts

131 lines
4.3 KiB
TypeScript
Raw Normal View History

2024-01-18 11:13:05 +00:00
import Router from '@/router'
2022-10-13 15:18:47 +00:00
import factory from '@/__tests__/factory'
import { ref } from 'vue'
import { expect, it } from 'vitest'
import UnitTestCase from '@/__tests__/UnitTestCase'
import { playbackService } from '@/services'
import { screen, waitFor } from '@testing-library/vue'
2024-05-19 05:49:42 +00:00
import { CurrentPlayableKey } from '@/symbols'
2022-10-13 15:18:47 +00:00
import { commonStore, favoriteStore, queueStore, recentlyPlayedStore, songStore } from '@/stores'
import FooterPlayButton from './FooterPlayButton.vue'
new class extends UnitTestCase {
protected test () {
it('toggles the playback of current song', async () => {
const toggleMock = this.mock(playbackService, 'toggle')
this.renderComponent(factory('song'))
2022-10-13 15:18:47 +00:00
await this.user.click(screen.getByRole('button'))
2022-10-13 15:18:47 +00:00
expect(toggleMock).toHaveBeenCalled()
})
2024-04-23 21:01:27 +00:00
it.each<[ScreenName, MethodOf<typeof songStore>, string | number]>([
2024-01-18 11:13:05 +00:00
['Album', 'fetchForAlbum', 42],
['Artist', 'fetchForArtist', 42],
['Playlist', 'fetchForPlaylist', '71d8cd40-20d4-4b17-b460-d30fe5bb7b66']
])('initiates playback for %s screen', async (screenName, fetchMethod, id) => {
2022-10-13 15:18:47 +00:00
commonStore.state.song_count = 10
const songs = factory('song', 3)
2022-10-13 15:18:47 +00:00
const fetchMock = this.mock(songStore, fetchMethod).mockResolvedValue(songs)
const playMock = this.mock(playbackService, 'queueAndPlay')
2024-01-18 11:13:05 +00:00
const goMock = this.mock(Router, 'go')
2022-10-13 15:18:47 +00:00
await this.router.activateRoute({
screen: screenName,
2022-10-13 15:18:47 +00:00
path: '_'
2024-01-18 11:13:05 +00:00
}, { id: String(id) })
2022-10-13 15:18:47 +00:00
this.renderComponent()
2022-10-13 15:18:47 +00:00
await this.user.click(screen.getByRole('button'))
2022-10-13 15:18:47 +00:00
await waitFor(() => {
2024-01-18 11:13:05 +00:00
expect(fetchMock).toHaveBeenCalledWith(id)
2022-10-13 15:18:47 +00:00
expect(playMock).toHaveBeenCalledWith(songs)
expect(goMock).toHaveBeenCalledWith('queue')
})
})
2022-12-02 16:17:37 +00:00
it.each<[
ScreenName,
2023-08-20 22:35:58 +00:00
typeof favoriteStore | typeof recentlyPlayedStore,
2022-12-02 16:17:37 +00:00
MethodOf<typeof favoriteStore | typeof recentlyPlayedStore>
]>([
2022-10-13 15:18:47 +00:00
['Favorites', favoriteStore, 'fetch'],
['RecentlyPlayed', recentlyPlayedStore, 'fetch']
])('initiates playback for %s screen', async (screenName, store, fetchMethod) => {
2022-10-13 15:18:47 +00:00
commonStore.state.song_count = 10
const songs = factory('song', 3)
2022-10-13 15:18:47 +00:00
const fetchMock = this.mock(store, fetchMethod).mockResolvedValue(songs)
const playMock = this.mock(playbackService, 'queueAndPlay')
2024-01-18 11:13:05 +00:00
const goMock = this.mock(Router, 'go')
2022-10-13 15:18:47 +00:00
await this.router.activateRoute({
screen: screenName,
2022-10-13 15:18:47 +00:00
path: '_'
})
this.renderComponent()
2022-10-13 15:18:47 +00:00
await this.user.click(screen.getByRole('button'))
2022-10-13 15:18:47 +00:00
await waitFor(() => {
expect(fetchMock).toHaveBeenCalled()
expect(playMock).toHaveBeenCalledWith(songs)
expect(goMock).toHaveBeenCalledWith('queue')
})
})
it.each<[ScreenName]>([['Queue'], ['Songs'], ['Albums']])('initiates playback %s screen', async screenName => {
2022-10-13 15:18:47 +00:00
commonStore.state.song_count = 10
const songs = factory('song', 3)
2022-10-13 15:18:47 +00:00
const fetchMock = this.mock(queueStore, 'fetchRandom').mockResolvedValue(songs)
const playMock = this.mock(playbackService, 'queueAndPlay')
2024-01-18 11:13:05 +00:00
const goMock = this.mock(Router, 'go')
2022-10-13 15:18:47 +00:00
await this.router.activateRoute({
screen: screenName,
2022-10-13 15:18:47 +00:00
path: '_'
})
this.renderComponent()
2022-10-13 15:18:47 +00:00
await this.user.click(screen.getByRole('button'))
2022-10-13 15:18:47 +00:00
await waitFor(() => {
expect(fetchMock).toHaveBeenCalled()
expect(playMock).toHaveBeenCalledWith(songs)
expect(goMock).toHaveBeenCalledWith('queue')
})
})
it('does nothing if there are no songs', async () => {
commonStore.state.song_count = 0
const playMock = this.mock(playbackService, 'queueAndPlay')
2024-01-18 11:13:05 +00:00
const goMock = this.mock(Router, 'go')
2022-10-13 15:18:47 +00:00
await this.router.activateRoute({
2022-10-13 15:18:47 +00:00
screen: 'Songs',
path: '_'
})
this.renderComponent()
2022-10-13 15:18:47 +00:00
await this.user.click(screen.getByRole('button'))
2022-10-13 15:18:47 +00:00
await waitFor(() => {
expect(playMock).not.toHaveBeenCalled()
expect(goMock).not.toHaveBeenCalled()
})
})
}
2024-04-23 21:01:27 +00:00
private renderComponent (currentPlayable: Playable | null = null) {
2024-04-23 21:01:27 +00:00
return this.render(FooterPlayButton, {
global: {
provide: {
[<symbol>CurrentPlayableKey]: ref(currentPlayable)
2024-04-23 21:01:27 +00:00
}
}
})
}
2022-10-13 15:18:47 +00:00
}