import { describe, it, expect, vi, beforeEach } from 'vitest' import { render, screen, fireEvent } from '@testing-library/react' import { CommitDialog } from './CommitDialog' describe('CommitDialog', () => { const onCommit = vi.fn() const onClose = vi.fn() beforeEach(() => { vi.clearAllMocks() }) function getActionButton(name = 'Commit & Push') { return screen.getByRole('button', { name }) } it('shows file count badge', () => { render() expect(screen.getByText('3 files changed')).toBeInTheDocument() }) it('shows singular file count', () => { render() expect(screen.getByText('1 file changed')).toBeInTheDocument() }) it('disables Commit button when message is empty', () => { render() expect(getActionButton()).toBeDisabled() }) it('enables Commit button when message is typed', () => { render() const textarea = screen.getByPlaceholderText('Commit message...') fireEvent.change(textarea, { target: { value: 'fix: bug fix' } }) expect(getActionButton()).not.toBeDisabled() }) it('calls onCommit with trimmed message on button click', () => { render() const textarea = screen.getByPlaceholderText('Commit message...') fireEvent.change(textarea, { target: { value: ' fix: bug fix ' } }) fireEvent.click(getActionButton()) expect(onCommit).toHaveBeenCalledWith('fix: bug fix') }) it('calls onCommit on Cmd+Enter', () => { render() const textarea = screen.getByPlaceholderText('Commit message...') fireEvent.change(textarea, { target: { value: 'fix: test' } }) fireEvent.keyDown(textarea, { key: 'Enter', metaKey: true }) expect(onCommit).toHaveBeenCalledWith('fix: test') }) it('calls onClose on Escape', () => { render() const textarea = screen.getByPlaceholderText('Commit message...') fireEvent.keyDown(textarea, { key: 'Escape' }) expect(onClose).toHaveBeenCalled() }) it('calls onClose on Cancel button click', () => { render() fireEvent.click(screen.getByText('Cancel')) expect(onClose).toHaveBeenCalled() }) it('does not call onCommit when message is whitespace only', () => { render() const textarea = screen.getByPlaceholderText('Commit message...') fireEvent.change(textarea, { target: { value: ' ' } }) fireEvent.click(getActionButton()) expect(onCommit).not.toHaveBeenCalled() }) it('renders nothing when not open', () => { const { container } = render() expect(container.querySelector('textarea')).toBeNull() }) it('pre-populates message with suggestedMessage', () => { render() const textarea = screen.getByPlaceholderText('Commit message...') expect(textarea).toHaveValue('Update alpha, beta') }) it('enables Commit button when suggestedMessage is provided', () => { render() expect(getActionButton()).not.toBeDisabled() }) it('submits suggestedMessage on Cmd+Enter without user edits', () => { render() const textarea = screen.getByPlaceholderText('Commit message...') fireEvent.keyDown(textarea, { key: 'Enter', metaKey: true }) expect(onCommit).toHaveBeenCalledWith('Update alpha') }) it('allows user to edit the suggested message', () => { render() const textarea = screen.getByPlaceholderText('Commit message...') fireEvent.change(textarea, { target: { value: 'fix: corrected typo in alpha' } }) fireEvent.click(getActionButton()) expect(onCommit).toHaveBeenCalledWith('fix: corrected typo in alpha') }) it('switches to local-only copy when commitMode is local', () => { render() expect(screen.getByRole('heading', { name: 'Commit' })).toBeInTheDocument() expect(screen.getByText('This vault has no git remote configured. Tolaria will create a local commit only.')).toBeInTheDocument() expect(screen.getByText('Cmd+Enter to commit locally')).toBeInTheDocument() expect(getActionButton('Commit')).toBeDisabled() }) })