import React from 'react'; import { render, screen, fireEvent, waitFor } from '@testing-library/react'; import CreateTicket from '../user/pages/CreateTicket'; import { MemoryRouter } from 'react-router-dom'; import { mockedNavigate } from '../../jest.setup'; // Mock translation service jest.mock('../services/translationService', () => ({ translateText: jest.fn((text) => Promise.resolve(text)), SUPPORTED_LANGUAGES: [ { code: 'en', label: 'English' }, { code: 'es', label: 'Spanish' } ] })); describe('CreateTicket Component', () => { beforeEach(() => { jest.clearAllMocks(); }); test('renders the CreateTicket component in manual mode by default', () => { render( ); expect(screen.getByText('Report a New Issue')).toBeInTheDocument(); expect(screen.getByPlaceholderText(/Describe your problem/i)).toBeInTheDocument(); }); test('pre-fills title and renders dynamic form fields when a template is activated', async () => { render( ); // Select the VPN Connectivity template button const vpnBtn = screen.getByText('VPN Connectivity Issue'); fireEvent.click(vpnBtn); // Click on "Use This Template" button to activate const useTemplateBtn = screen.getByRole('button', { name: /Use This Template/i }); fireEvent.click(useTemplateBtn); // Check if the title input is now pre-filled const titleInput = screen.getByPlaceholderText(/Brief summary of your issue/i); expect(titleInput.value).toBe('Unable to connect to company VPN'); // Check if the dynamic form fields appear expect(screen.getByLabelText(/Error Message/i)).toBeInTheDocument(); expect(screen.getByLabelText(/Device & OS/i)).toBeInTheDocument(); }); test('serializes fields correctly and navigates to AI processing on submit', async () => { render( ); // Select and activate template const vpnBtn = screen.getByText('VPN Connectivity Issue'); fireEvent.click(vpnBtn); const useTemplateBtn = screen.getByRole('button', { name: /Use This Template/i }); fireEvent.click(useTemplateBtn); // Fill in required fields const errorTextarea = screen.getByPlaceholderText(/Paste the exact error here/i); fireEvent.change(errorTextarea, { target: { value: 'Connection timeout error 404' } }); const deviceInput = screen.getByPlaceholderText(/e.g., Windows 11 laptop/i); fireEvent.change(deviceInput, { target: { value: 'Windows 11 PC' } }); // Select dropdown options const locationSelect = screen.getByLabelText(/Location/i); fireEvent.change(locationSelect, { target: { value: 'Home WiFi' } }); const internetSelect = screen.getByLabelText(/Internet Status/i); fireEvent.change(internetSelect, { target: { value: 'Working' } }); // Submit the form const submitBtn = screen.getByRole('button', { name: /Submit Ticket/i }); fireEvent.click(submitBtn); // Verify navigation was triggered with serialized state await waitFor(() => { expect(mockedNavigate).toHaveBeenCalled(); }); const navArgs = mockedNavigate.mock.calls[0]; expect(navArgs[0]).toBe('/ai-processing'); const state = navArgs[1].state; expect(state.ticket_title).toBe('Unable to connect to company VPN'); expect(state.template_used).toBe(true); expect(state.original_text).toContain('Error Message: Connection timeout error 404'); expect(state.original_text).toContain('Device & OS: Windows 11 PC'); expect(state.original_text).toContain('Location: Home WiFi'); expect(state.original_text).toContain('Internet Status: Working'); }); });