mirror of
https://github.com/navidrome/navidrome.git
synced 2026-10-10 19:37:08 +02:00
90 lines
2.6 KiB
JavaScript
90 lines
2.6 KiB
JavaScript
|
|
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
||
|
|
import wrapperDataProvider from './wrapperDataProvider'
|
||
|
|
|
||
|
|
const { mockProvider, mockHttpClient } = vi.hoisted(() => ({
|
||
|
|
mockProvider: {
|
||
|
|
update: vi.fn(),
|
||
|
|
create: vi.fn(),
|
||
|
|
getOne: vi.fn(),
|
||
|
|
},
|
||
|
|
mockHttpClient: vi.fn(),
|
||
|
|
}))
|
||
|
|
|
||
|
|
vi.mock('ra-data-json-server', () => ({ default: () => mockProvider }))
|
||
|
|
vi.mock('./httpClient', () => ({ default: mockHttpClient }))
|
||
|
|
|
||
|
|
describe('wrapperDataProvider', () => {
|
||
|
|
beforeEach(() => {
|
||
|
|
vi.clearAllMocks()
|
||
|
|
localStorage.clear()
|
||
|
|
mockProvider.update.mockResolvedValue({ data: { id: 'u1' } })
|
||
|
|
mockProvider.create.mockResolvedValue({ data: { id: 'u1' } })
|
||
|
|
mockHttpClient.mockResolvedValue({ json: [] })
|
||
|
|
})
|
||
|
|
|
||
|
|
describe('update user', () => {
|
||
|
|
it('sets library associations when an admin edits a non-admin user', async () => {
|
||
|
|
localStorage.setItem('role', 'admin')
|
||
|
|
|
||
|
|
await wrapperDataProvider.update('user', {
|
||
|
|
id: 'u1',
|
||
|
|
data: { name: 'Sam', isAdmin: false, libraryIds: [1] },
|
||
|
|
})
|
||
|
|
|
||
|
|
expect(mockProvider.update).toHaveBeenCalledWith(
|
||
|
|
'user',
|
||
|
|
expect.objectContaining({ id: 'u1' }),
|
||
|
|
)
|
||
|
|
expect(mockHttpClient).toHaveBeenCalledWith('/api/user/u1/library', {
|
||
|
|
method: 'PUT',
|
||
|
|
body: JSON.stringify({ libraryIds: [1] }),
|
||
|
|
})
|
||
|
|
})
|
||
|
|
|
||
|
|
it('does not call the admin-only library endpoint when a non-admin edits their own profile', async () => {
|
||
|
|
localStorage.setItem('role', 'regular')
|
||
|
|
|
||
|
|
await wrapperDataProvider.update('user', {
|
||
|
|
id: 'u1',
|
||
|
|
data: {
|
||
|
|
name: 'Sam',
|
||
|
|
isAdmin: false,
|
||
|
|
libraryIds: [1],
|
||
|
|
currentPassword: 'old',
|
||
|
|
password: 'new',
|
||
|
|
},
|
||
|
|
})
|
||
|
|
|
||
|
|
expect(mockProvider.update).toHaveBeenCalled()
|
||
|
|
expect(mockHttpClient).not.toHaveBeenCalled()
|
||
|
|
})
|
||
|
|
|
||
|
|
it('does not set library associations when the edited user is an admin', async () => {
|
||
|
|
localStorage.setItem('role', 'admin')
|
||
|
|
|
||
|
|
await wrapperDataProvider.update('user', {
|
||
|
|
id: 'u1',
|
||
|
|
data: { name: 'Sam', isAdmin: true, libraryIds: [1] },
|
||
|
|
})
|
||
|
|
|
||
|
|
expect(mockProvider.update).toHaveBeenCalled()
|
||
|
|
expect(mockHttpClient).not.toHaveBeenCalled()
|
||
|
|
})
|
||
|
|
|
||
|
|
it('strips libraryIds from the user update payload', async () => {
|
||
|
|
localStorage.setItem('role', 'admin')
|
||
|
|
|
||
|
|
await wrapperDataProvider.update('user', {
|
||
|
|
id: 'u1',
|
||
|
|
data: { name: 'Sam', isAdmin: false, libraryIds: [1] },
|
||
|
|
})
|
||
|
|
|
||
|
|
expect(mockProvider.update).toHaveBeenCalledWith(
|
||
|
|
'user',
|
||
|
|
expect.objectContaining({
|
||
|
|
data: { name: 'Sam', isAdmin: false },
|
||
|
|
}),
|
||
|
|
)
|
||
|
|
})
|
||
|
|
})
|
||
|
|
})
|