import * as React from 'react'
import { render, screen } from '@testing-library/react'
import UserEdit from './UserEdit'
import { describe, it, expect, vi } from 'vitest'
const defaultUser = {
id: 'user1',
userName: 'testuser',
name: 'Test User',
email: 'test@example.com',
isAdmin: false,
libraries: [
{ id: 1, name: 'Library 1', path: '/music1' },
{ id: 2, name: 'Library 2', path: '/music2' },
],
lastLoginAt: '2023-01-01T12:00:00Z',
lastAccessAt: '2023-01-02T12:00:00Z',
updatedAt: '2023-01-03T12:00:00Z',
createdAt: '2023-01-04T12:00:00Z',
}
const adminUser = {
...defaultUser,
id: 'admin1',
userName: 'admin',
name: 'Admin User',
isAdmin: true,
}
// Mock React-Admin completely with simpler implementations
vi.mock('react-admin', () => ({
Edit: ({ children, title }) => (
{title}
{children}
),
SimpleForm: ({ children }) => (
),
TextInput: ({ source }) => ,
BooleanInput: ({ source }) => (
),
DateField: ({ source }) => (
Date
),
PasswordInput: ({ source }) => (
),
Toolbar: ({ children }) => {children}
,
SaveButton: () => ,
FormDataConsumer: ({ children }) => children({ formData: {} }),
Typography: ({ children }) => {children}
,
required: () => () => null,
email: () => () => null,
useMutation: () => [vi.fn()],
useNotify: () => vi.fn(),
useRedirect: () => vi.fn(),
useRefresh: () => vi.fn(),
usePermissions: () => ({ permissions: 'admin' }),
useTranslate: () => (key) => key,
}))
vi.mock('./LibrarySelectionField.jsx', () => ({
LibrarySelectionField: () => ,
}))
vi.mock('./DeleteUserButton', () => ({
__esModule: true,
default: () => ,
}))
vi.mock('../common', () => ({
Title: ({ subTitle }) => {subTitle}
,
}))
// Mock Material-UI
vi.mock('@material-ui/core/styles', () => ({
makeStyles: () => () => ({}),
}))
vi.mock('@material-ui/core', () => ({
Typography: ({ children }) => {children}
,
}))
describe('', () => {
it('should render the user edit form', () => {
render()
// Check if the edit component renders
expect(screen.getByTestId('edit-component')).toBeInTheDocument()
expect(screen.getByTestId('simple-form')).toBeInTheDocument()
})
it('should render text inputs for admin users', () => {
render()
// Should render username input for admin
expect(screen.getByTestId('text-input-userName')).toBeInTheDocument()
expect(screen.getByTestId('text-input-name')).toBeInTheDocument()
expect(screen.getByTestId('text-input-email')).toBeInTheDocument()
})
it('should render admin checkbox for admin permissions', () => {
render()
// Should render isAdmin checkbox for admin users
expect(screen.getByTestId('boolean-input-isAdmin')).toBeInTheDocument()
})
it('should render date fields', () => {
render()
expect(screen.getByTestId('date-field-lastLoginAt')).toBeInTheDocument()
expect(screen.getByTestId('date-field-lastAccessAt')).toBeInTheDocument()
expect(screen.getByTestId('date-field-updatedAt')).toBeInTheDocument()
expect(screen.getByTestId('date-field-createdAt')).toBeInTheDocument()
})
it('should not render username input for non-admin users', () => {
render()
// Should not render username input for non-admin
expect(screen.queryByTestId('text-input-userName')).not.toBeInTheDocument()
// But should still render name and email
expect(screen.getByTestId('text-input-name')).toBeInTheDocument()
expect(screen.getByTestId('text-input-email')).toBeInTheDocument()
})
})