import { useState } from 'react' import { beforeEach, describe, expect, it, vi } from 'vitest' import { render } from 'vitest-browser-react' import { userEvent } from 'vitest/browser' import { showSubmittedData } from '@/lib/show-submitted-data' import { type User } from '../data/schema' import { UsersDeleteDialog } from './users-delete-dialog' vi.mock('@/lib/show-submitted-data', () => ({ showSubmittedData: vi.fn() })) const MOCK_USER: User = { id: 'user-delete-test', firstName: 'John', lastName: 'Doe', username: 'john_doe', email: 'johndoe@shadcn-admin.com', phoneNumber: '+959123456789', status: 'active', role: 'manager', createdAt: new Date('2026-01-01'), updatedAt: new Date('2026-02-02'), } describe('UsersDeleteDialog', () => { beforeEach(() => vi.clearAllMocks()) it('renders the dialog with the correct title, description, input and buttons', async () => { const { getByText, getByRole } = await render( ) const title = getByRole('heading', { level: 2, name: /Delete User/i, }) const desc = getByText( new RegExp(`Are you sure you want to delete ${MOCK_USER.username}?`, 'i') ) const usernameInput = getByRole('textbox', { name: /Username/i }) const cancelButton = getByRole('button', { name: /Cancel/i }) const deleteButton = getByRole('button', { name: /Delete/i }) expect(title).toBeInTheDocument() expect(desc).toBeInTheDocument() expect(usernameInput).toBeInTheDocument() expect(cancelButton).toBeInTheDocument() expect(deleteButton).toBeInTheDocument() expect(deleteButton).toBeDisabled() }) it('keeps the delete button disabled until the username input is filled correctly', async () => { const { getByRole } = await render( ) const usernameInput = getByRole('textbox', { name: /Username/i }) const deleteButton = getByRole('button', { name: /Delete/i }) expect(deleteButton).toBeDisabled() await userEvent.fill(usernameInput, 'wrong-username') expect(deleteButton).toBeDisabled() await userEvent.fill(usernameInput, MOCK_USER.username) expect(deleteButton).toBeEnabled() }) it('closes the dialog when the cancel button is clicked', async () => { const onOpenChange = vi.fn() const { getByRole } = await render( ) const cancelButton = getByRole('button', { name: /Cancel/i }) await userEvent.click(cancelButton) expect(onOpenChange).toHaveBeenCalledOnce() expect(onOpenChange).toHaveBeenCalledWith(false) }) it('resets the username input when the dialog is closed and reopened', async () => { function Harness() { const [open, setOpen] = useState(true) return ( <> {open ? ( ) : null} ) } const { getByRole } = await render() const usernameInput = getByRole('textbox', { name: /Username/i }) await userEvent.fill(usernameInput, MOCK_USER.username) expect(usernameInput).toHaveValue(MOCK_USER.username) const closeButton = getByRole('button', { name: /Cancel/i }) await userEvent.click(closeButton) const reopenButton = getByRole('button', { name: /Reopen/i }) await userEvent.click(reopenButton) expect(usernameInput).toHaveValue('') }) it('shows the submitted data when deleted successfully', async () => { const onOpenChange = vi.fn() const { getByRole } = await render( ) const usernameInput = getByRole('textbox', { name: /Username/i }) const deleteButton = getByRole('button', { name: /Delete/i }) expect(deleteButton).toBeDisabled() await userEvent.fill(usernameInput, MOCK_USER.username) expect(deleteButton).toBeEnabled() await userEvent.click(deleteButton) expect(onOpenChange).toHaveBeenCalledOnce() expect(onOpenChange).toHaveBeenCalledWith(false) expect(showSubmittedData).toHaveBeenCalledOnce() expect(showSubmittedData).toHaveBeenCalledWith( MOCK_USER, 'The following user has been deleted:' ) }) it('deletes successfully when press Enter key on the username input', async () => { const onOpenChange = vi.fn() const { getByRole } = await render( ) const usernameInput = getByRole('textbox', { name: /Username/i }) const deleteButton = getByRole('button', { name: /Delete/i }) expect(deleteButton).toBeDisabled() await userEvent.fill(usernameInput, MOCK_USER.username) expect(deleteButton).toBeEnabled() await userEvent.keyboard('{Enter}') expect(onOpenChange).toHaveBeenCalledOnce() expect(onOpenChange).toHaveBeenCalledWith(false) expect(showSubmittedData).toHaveBeenCalledOnce() expect(showSubmittedData).toHaveBeenCalledWith( MOCK_USER, 'The following user has been deleted:' ) }) })