import { render, screen, fireEvent, waitFor } from '@testing-library/react' import { describe, it, expect, vi } from 'vitest' import { GitRequiredModal } from './GitRequiredModal' describe('GitRequiredModal', () => { it('renders title and explanation', () => { render() expect(screen.getByText('Git repository required')).toBeInTheDocument() expect(screen.getByText(/track changes/)).toBeInTheDocument() }) it('renders both action buttons', () => { render() expect(screen.getByText('Create repository')).toBeInTheDocument() expect(screen.getByText('Choose another vault')).toBeInTheDocument() }) it('calls onCreateRepo when primary button clicked', async () => { const onCreateRepo = vi.fn().mockResolvedValue(undefined) render() fireEvent.click(screen.getByText('Create repository')) expect(onCreateRepo).toHaveBeenCalledOnce() }) it('calls onChooseVault when secondary button clicked', () => { const onChooseVault = vi.fn() render() fireEvent.click(screen.getByText('Choose another vault')) expect(onChooseVault).toHaveBeenCalledOnce() }) it('disables buttons and shows spinner while creating', async () => { let resolve: () => void const onCreateRepo = vi.fn().mockReturnValue(new Promise(r => { resolve = r })) render() fireEvent.click(screen.getByText('Create repository')) await waitFor(() => { expect(screen.getByText('Creating…')).toBeInTheDocument() }) resolve!() }) it('shows error message when creation fails', async () => { const onCreateRepo = vi.fn().mockRejectedValue(new Error('Permission denied')) render() fireEvent.click(screen.getByText('Create repository')) await waitFor(() => { expect(screen.getByText(/Permission denied/)).toBeInTheDocument() }) }) })