SettingsContainer.test.tsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import React from 'react';
  2. import { server } from '@/client/mocks/server';
  3. import { getTRPCMockError } from '@/client/mocks/getTrpcMock';
  4. import { useToastStore } from '../../../../state/toastStore';
  5. import { SettingsContainer } from './SettingsContainer';
  6. import { fireEvent, render, renderHook, screen, waitFor } from '../../../../../../tests/test-utils';
  7. describe('Test: SettingsContainer', () => {
  8. it('should render without error', () => {
  9. render(<SettingsContainer />);
  10. expect(screen.getByText('General settings')).toBeInTheDocument();
  11. });
  12. it('should show toast if updateSettings mutation fails', async () => {
  13. // arrange
  14. const { result } = renderHook(() => useToastStore());
  15. server.use(getTRPCMockError({ path: ['system', 'updateSettings'], type: 'mutation', status: 500, message: 'Something went wrong' }));
  16. render(<SettingsContainer />);
  17. const submitButton = screen.getByRole('button', { name: 'Save' });
  18. await waitFor(() => {
  19. expect(screen.getByDisplayValue('1.1.1.1')).toBeInTheDocument();
  20. });
  21. // act
  22. fireEvent.click(submitButton);
  23. // assert
  24. await waitFor(() => {
  25. expect(result.current.toasts).toHaveLength(1);
  26. expect(result.current.toasts[0].status).toEqual('error');
  27. expect(result.current.toasts[0].title).toEqual('Error saving settings');
  28. });
  29. });
  30. it('should put zod errors in the fields', async () => {
  31. // arrange
  32. server.use(getTRPCMockError({ path: ['system', 'updateSettings'], zodError: { dnsIp: 'invalid ip' }, type: 'mutation', status: 500, message: 'Something went wrong' }));
  33. render(<SettingsContainer />);
  34. const submitButton = screen.getByRole('button', { name: 'Save' });
  35. // act
  36. fireEvent.click(submitButton);
  37. await waitFor(() => {
  38. expect(screen.getByText('invalid ip')).toBeInTheDocument();
  39. });
  40. });
  41. it('should show toast if updateSettings mutation succeeds', async () => {
  42. // arrange
  43. const { result } = renderHook(() => useToastStore());
  44. render(<SettingsContainer />);
  45. const submitButton = screen.getByRole('button', { name: 'Save' });
  46. // act
  47. fireEvent.click(submitButton);
  48. // assert
  49. await waitFor(() => {
  50. expect(result.current.toasts).toHaveLength(1);
  51. expect(result.current.toasts[0].status).toEqual('success');
  52. });
  53. });
  54. });