🏡 index : quine-global/quintodrome.git

import React from 'react'
import { render, screen, fireEvent, waitFor } from '@testing-library/react'
import { ThemeProvider, createTheme } from '@material-ui/core/styles'
import { describe, it, expect, vi, beforeEach } from 'vitest'
import AlbumActions from './AlbumActions'

const { mockConfig, mockPermissions } = vi.hoisted(() => ({
  mockConfig: {
    enableSharing: false,
    enableDownloads: false,
    losslessFormats: 'FLAC,WAV',
  },
  mockPermissions: { value: 'admin' },
}))
vi.mock('../config', () => ({ default: mockConfig }))

vi.mock('react-redux', () => ({
  useDispatch: () => vi.fn(),
  useSelector: () => ({}),
}))

const mockRefreshMetadata = vi.fn()

vi.mock('react-admin', async (importOriginal) => {
  const actual = await importOriginal()
  return {
    ...actual,
    useNotify: () => vi.fn(),
    useDataProvider: () => ({ refreshMetadata: mockRefreshMetadata }),
    usePermissions: () => ({ permissions: mockPermissions.value }),
    useTranslate: () => (x) => x,
  }
})

describe('AlbumActions', () => {
  const record = { id: 'al1', name: 'Album', size: 1024 }
  const refreshLabel = 'resources.album.actions.refresh'

  beforeEach(() => {
    vi.clearAllMocks()
    mockPermissions.value = 'admin'
    mockRefreshMetadata.mockResolvedValue({ data: { id: 'al1' } })
  })

  const renderAlbumActions = () =>
    render(
      <ThemeProvider theme={createTheme()}>
        <AlbumActions record={record} ids={[]} data={{}} />
      </ThemeProvider>,
    )

  it('refreshes the album metadata for admins', async () => {
    renderAlbumActions()
    fireEvent.click(screen.getByRole('button', { name: refreshLabel }))

    await waitFor(() =>
      expect(mockRefreshMetadata).toHaveBeenCalledWith('album', 'al1'),
    )
  })

  it('hides the action for non-admin users', () => {
    mockPermissions.value = 'regular'
    renderAlbumActions()
    expect(
      screen.queryByRole('button', { name: refreshLabel }),
    ).not.toBeInTheDocument()
  })
})