import React from 'react'; import { server } from '@/client/mocks/server'; import { getTRPCMockError } from '@/client/mocks/getTrpcMock'; import { useToastStore } from '../../../../state/toastStore'; import { SettingsContainer } from './SettingsContainer'; import { fireEvent, render, renderHook, screen, waitFor } from '../../../../../../tests/test-utils'; describe('Test: SettingsContainer', () => { it('should render without error', () => { render(); expect(screen.getByText('General settings')).toBeInTheDocument(); }); it('should show toast if updateSettings mutation fails', async () => { // arrange const { result } = renderHook(() => useToastStore()); server.use(getTRPCMockError({ path: ['system', 'updateSettings'], type: 'mutation', status: 500, message: 'Something went wrong' })); render(); const submitButton = screen.getByRole('button', { name: 'Save' }); await waitFor(() => { expect(screen.getByDisplayValue('1.1.1.1')).toBeInTheDocument(); }); // act fireEvent.click(submitButton); // assert await waitFor(() => { expect(result.current.toasts).toHaveLength(1); expect(result.current.toasts[0].status).toEqual('error'); expect(result.current.toasts[0].title).toEqual('Error saving settings'); }); }); it('should put zod errors in the fields', async () => { // arrange server.use(getTRPCMockError({ path: ['system', 'updateSettings'], zodError: { dnsIp: 'invalid ip' }, type: 'mutation', status: 500, message: 'Something went wrong' })); render(); const submitButton = screen.getByRole('button', { name: 'Save' }); // act fireEvent.click(submitButton); await waitFor(() => { expect(screen.getByText('invalid ip')).toBeInTheDocument(); }); }); it('should show toast if updateSettings mutation succeeds', async () => { // arrange const { result } = renderHook(() => useToastStore()); render(); const submitButton = screen.getByRole('button', { name: 'Save' }); // act fireEvent.click(submitButton); // assert await waitFor(() => { expect(result.current.toasts).toHaveLength(1); expect(result.current.toasts[0].status).toEqual('success'); }); }); });