import { renderHook } from '@testing-library/react-hooks'
import { describe, it, expect, beforeEach, vi } from 'vitest'
import {
useSelectedLibraries,
useLibraryFilter,
useIsLibrarySelected,
} from './useLibrarySelection'
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, [])
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)
})
})
})