mirror of
https://github.com/navidrome/navidrome.git
synced 2026-10-10 19:37:08 +02:00
204 lines
6 KiB
JavaScript
204 lines
6 KiB
JavaScript
|
|
import { renderHook } from '@testing-library/react-hooks'
|
||
|
|
import { describe, it, expect, beforeEach, vi } from 'vitest'
|
||
|
|
import {
|
||
|
|
useSelectedLibraries,
|
||
|
|
useLibraryFilter,
|
||
|
|
useIsLibrarySelected,
|
||
|
|
} from './useLibrarySelection'
|
||
|
|
|
||
|
|
// Mock dependencies
|
||
|
|
vi.mock('react-redux', () => ({
|
||
|
|
useSelector: vi.fn(),
|
||
|
|
}))
|
||
|
|
|
||
|
|
describe('Library Selection Hooks', () => {
|
||
|
|
const mockLibraries = [
|
||
|
|
{ id: '1', name: 'Music Library' },
|
||
|
|
{ id: '2', name: 'Podcasts' },
|
||
|
|
{ id: '3', name: 'Audiobooks' },
|
||
|
|
]
|
||
|
|
|
||
|
|
let mockUseSelector
|
||
|
|
|
||
|
|
beforeEach(async () => {
|
||
|
|
vi.clearAllMocks()
|
||
|
|
const { useSelector } = await import('react-redux')
|
||
|
|
mockUseSelector = vi.mocked(useSelector)
|
||
|
|
})
|
||
|
|
|
||
|
|
const setupSelector = (
|
||
|
|
userLibraries = mockLibraries,
|
||
|
|
selectedLibraries = [],
|
||
|
|
) => {
|
||
|
|
mockUseSelector.mockImplementation((selector) =>
|
||
|
|
selector({
|
||
|
|
library: {
|
||
|
|
userLibraries,
|
||
|
|
selectedLibraries,
|
||
|
|
},
|
||
|
|
}),
|
||
|
|
)
|
||
|
|
}
|
||
|
|
|
||
|
|
describe('useSelectedLibraries', () => {
|
||
|
|
it('should return selected library IDs when libraries are explicitly selected', async () => {
|
||
|
|
setupSelector(mockLibraries, ['1', '2'])
|
||
|
|
|
||
|
|
const { result } = renderHook(() => useSelectedLibraries())
|
||
|
|
|
||
|
|
expect(result.current).toEqual(['1', '2'])
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should return all user library IDs when no libraries are selected and user has libraries', async () => {
|
||
|
|
setupSelector(mockLibraries, [])
|
||
|
|
|
||
|
|
const { result } = renderHook(() => useSelectedLibraries())
|
||
|
|
|
||
|
|
expect(result.current).toEqual(['1', '2', '3'])
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should return empty array when no libraries are selected and user has no libraries', async () => {
|
||
|
|
setupSelector([], [])
|
||
|
|
|
||
|
|
const { result } = renderHook(() => useSelectedLibraries())
|
||
|
|
|
||
|
|
expect(result.current).toEqual([])
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should return selected libraries even if they are all user libraries', async () => {
|
||
|
|
setupSelector(mockLibraries, ['1', '2', '3'])
|
||
|
|
|
||
|
|
const { result } = renderHook(() => useSelectedLibraries())
|
||
|
|
|
||
|
|
expect(result.current).toEqual(['1', '2', '3'])
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should return single selected library', async () => {
|
||
|
|
setupSelector(mockLibraries, ['2'])
|
||
|
|
|
||
|
|
const { result } = renderHook(() => useSelectedLibraries())
|
||
|
|
|
||
|
|
expect(result.current).toEqual(['2'])
|
||
|
|
})
|
||
|
|
})
|
||
|
|
|
||
|
|
describe('useLibraryFilter', () => {
|
||
|
|
it('should return empty object when user has only one library', async () => {
|
||
|
|
setupSelector([mockLibraries[0]], ['1'])
|
||
|
|
|
||
|
|
const { result } = renderHook(() => useLibraryFilter())
|
||
|
|
|
||
|
|
expect(result.current).toEqual({})
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should return empty object when no libraries are selected (defaults to all)', async () => {
|
||
|
|
setupSelector([mockLibraries[0]], [])
|
||
|
|
|
||
|
|
const { result } = renderHook(() => useLibraryFilter())
|
||
|
|
|
||
|
|
expect(result.current).toEqual({})
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should return libraryIds filter when multiple libraries are available and some are selected', async () => {
|
||
|
|
setupSelector(mockLibraries, ['1', '2'])
|
||
|
|
|
||
|
|
const { result } = renderHook(() => useLibraryFilter())
|
||
|
|
|
||
|
|
expect(result.current).toEqual({
|
||
|
|
libraryIds: ['1', '2'],
|
||
|
|
})
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should return libraryIds filter when multiple libraries are available and all are selected', async () => {
|
||
|
|
setupSelector(mockLibraries, ['1', '2', '3'])
|
||
|
|
|
||
|
|
const { result } = renderHook(() => useLibraryFilter())
|
||
|
|
|
||
|
|
expect(result.current).toEqual({
|
||
|
|
libraryIds: ['1', '2', '3'],
|
||
|
|
})
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should return empty object when user has no libraries', async () => {
|
||
|
|
setupSelector([], [])
|
||
|
|
|
||
|
|
const { result } = renderHook(() => useLibraryFilter())
|
||
|
|
|
||
|
|
expect(result.current).toEqual({})
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should return libraryIds filter for default selection when multiple libraries available', async () => {
|
||
|
|
setupSelector(mockLibraries, []) // No explicit selection, should default to all
|
||
|
|
|
||
|
|
const { result } = renderHook(() => useLibraryFilter())
|
||
|
|
|
||
|
|
expect(result.current).toEqual({
|
||
|
|
libraryIds: ['1', '2', '3'],
|
||
|
|
})
|
||
|
|
})
|
||
|
|
})
|
||
|
|
|
||
|
|
describe('useIsLibrarySelected', () => {
|
||
|
|
it('should return true when library is explicitly selected', async () => {
|
||
|
|
setupSelector(mockLibraries, ['1', '3'])
|
||
|
|
|
||
|
|
const { result: result1 } = renderHook(() => useIsLibrarySelected('1'))
|
||
|
|
const { result: result2 } = renderHook(() => useIsLibrarySelected('3'))
|
||
|
|
|
||
|
|
expect(result1.current).toBe(true)
|
||
|
|
expect(result2.current).toBe(true)
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should return false when library is not explicitly selected', async () => {
|
||
|
|
setupSelector(mockLibraries, ['1', '3'])
|
||
|
|
|
||
|
|
const { result } = renderHook(() => useIsLibrarySelected('2'))
|
||
|
|
|
||
|
|
expect(result.current).toBe(false)
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should return true when no explicit selection (defaults to all) and library exists', async () => {
|
||
|
|
setupSelector(mockLibraries, [])
|
||
|
|
|
||
|
|
const { result: result1 } = renderHook(() => useIsLibrarySelected('1'))
|
||
|
|
const { result: result2 } = renderHook(() => useIsLibrarySelected('2'))
|
||
|
|
const { result: result3 } = renderHook(() => useIsLibrarySelected('3'))
|
||
|
|
|
||
|
|
expect(result1.current).toBe(true)
|
||
|
|
expect(result2.current).toBe(true)
|
||
|
|
expect(result3.current).toBe(true)
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should return false when library does not exist in user libraries', async () => {
|
||
|
|
setupSelector(mockLibraries, [])
|
||
|
|
|
||
|
|
const { result } = renderHook(() => useIsLibrarySelected('999'))
|
||
|
|
|
||
|
|
expect(result.current).toBe(false)
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should return false when user has no libraries', async () => {
|
||
|
|
setupSelector([], [])
|
||
|
|
|
||
|
|
const { result } = renderHook(() => useIsLibrarySelected('1'))
|
||
|
|
|
||
|
|
expect(result.current).toBe(false)
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should handle undefined libraryId', async () => {
|
||
|
|
setupSelector(mockLibraries, ['1'])
|
||
|
|
|
||
|
|
const { result } = renderHook(() => useIsLibrarySelected(undefined))
|
||
|
|
|
||
|
|
expect(result.current).toBe(false)
|
||
|
|
})
|
||
|
|
|
||
|
|
it('should handle null libraryId', async () => {
|
||
|
|
setupSelector(mockLibraries, ['1'])
|
||
|
|
|
||
|
|
const { result } = renderHook(() => useIsLibrarySelected(null))
|
||
|
|
|
||
|
|
expect(result.current).toBe(false)
|
||
|
|
})
|
||
|
|
})
|
||
|
|
})
|