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( , ) 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() }) })