import { render, screen, fireEvent, waitFor } from '@testing-library/react' import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import Contact from '../app/kontakt/page' // Mock fetch const fetchMock = vi.fn() global.fetch = fetchMock // Mock alert const alertMock = vi.fn() global.alert = alertMock describe('Contact Page', () => { beforeEach(() => { fetchMock.mockClear() alertMock.mockClear() }) it('renders the contact form correctly', () => { render() expect(screen.getByLabelText(/Name \*/i)).toBeInTheDocument() expect(screen.getByLabelText(/Firma/i)).toBeInTheDocument() expect(screen.getByLabelText(/E-Mail \*/i)).toBeInTheDocument() expect(screen.getByLabelText(/Nachricht \*/i)).toBeInTheDocument() expect(screen.getByRole('button', { name: /Nachricht senden/i })).toBeInTheDocument() }) it('submits the form successfully', async () => { fetchMock.mockResolvedValueOnce({ ok: true, json: async () => ({ success: true }), }) render() fireEvent.change(screen.getByLabelText(/Name \*/i), { target: { value: 'John Doe' } }) fireEvent.change(screen.getByLabelText(/Firma/i), { target: { value: 'Acme Corp' } }) fireEvent.change(screen.getByLabelText(/E-Mail \*/i), { target: { value: 'john@example.com' } }) fireEvent.change(screen.getByLabelText(/Nachricht \*/i), { target: { value: 'This is a test message that is long enough.' } }) fireEvent.click(screen.getByRole('button', { name: /Nachricht senden/i })) await waitFor(() => { expect(fetchMock).toHaveBeenCalledTimes(1) expect(fetchMock).toHaveBeenCalledWith('/api/contact', expect.objectContaining({ method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: 'John Doe', company: 'Acme Corp', email: 'john@example.com', message: 'This is a test message that is long enough.', website: '' }), })) }) expect(screen.getByText(/Nachricht gesendet/i)).toBeInTheDocument() expect(screen.getByText(/Vielen Dank für Ihre Anfrage/i)).toBeInTheDocument() }) it('handles submission errors', async () => { fetchMock.mockResolvedValueOnce({ ok: false, json: async () => ({ error: 'Server error' }), }) render() fireEvent.change(screen.getByLabelText(/Name \*/i), { target: { value: 'John Doe' } }) fireEvent.change(screen.getByLabelText(/E-Mail \*/i), { target: { value: 'john@example.com' } }) fireEvent.change(screen.getByLabelText(/Nachricht \*/i), { target: { value: 'This is a test message that is long enough.' } }) fireEvent.click(screen.getByRole('button', { name: /Nachricht senden/i })) await waitFor(() => { expect(alertMock).toHaveBeenCalledWith('Fehler: Server error') }) }) it('handles network errors', async () => { fetchMock.mockRejectedValueOnce(new Error('Network error')) render() fireEvent.change(screen.getByLabelText(/Name \*/i), { target: { value: 'John Doe' } }) fireEvent.change(screen.getByLabelText(/E-Mail \*/i), { target: { value: 'john@example.com' } }) fireEvent.change(screen.getByLabelText(/Nachricht \*/i), { target: { value: 'This is a test message that is long enough.' } }) fireEvent.click(screen.getByRole('button', { name: /Nachricht senden/i })) await waitFor(() => { expect(alertMock).toHaveBeenCalledWith('Es gab einen Fehler beim Senden Ihrer Nachricht.') }) }) })