import React from 'react'; import { fireEvent, render, screen, waitFor, renderHook } from '../../../../../../tests/test-utils'; import { getTRPCMock, getTRPCMockError } from '../../../../mocks/getTrpcMock'; import { server } from '../../../../mocks/server'; import { useToastStore } from '../../../../state/toastStore'; import { ResetPasswordContainer } from './ResetPasswordContainer'; const pushFn = jest.fn(); jest.mock('next/router', () => { const actualRouter = jest.requireActual('next-router-mock'); return { ...actualRouter, useRouter: () => ({ ...actualRouter.useRouter(), push: pushFn, }), }; }); describe('ResetPasswordContainer', () => { it('should render the component', () => { render(); expect(screen.getByText('Reset your password')).toBeInTheDocument(); expect(screen.getByText('Run this command on your server and then refresh this page')).toBeInTheDocument(); expect(screen.getByText('./scripts/reset-password.sh')).toBeInTheDocument(); }); it('should render the password reset success message', async () => { // Arrange const email = 'test@test.com'; render(); const resetPasswordForm = screen.getByRole('button', { name: 'Reset password' }); const newPassword = 'new_password'; const response = { email }; server.use(getTRPCMock({ path: ['auth', 'changeOperatorPassword'], type: 'mutation', response, delay: 100 })); const passwordInput = screen.getByLabelText('Password'); const confirmPasswordInput = screen.getByLabelText('Confirm password'); // Act fireEvent.change(passwordInput, { target: { value: newPassword } }); fireEvent.change(confirmPasswordInput, { target: { value: newPassword } }); fireEvent.click(resetPasswordForm); // Assert await waitFor(() => { expect(screen.getByText('Password reset')).toBeInTheDocument(); expect(screen.getByText(`Your password has been reset. You can now login with your new password. And your email ${email}`)).toBeInTheDocument(); expect(screen.getByText('Back to login')).toBeInTheDocument(); }); }); it('should show error toast if reset password mutation fails', async () => { // Arrange const { result, unmount } = renderHook(() => useToastStore()); render(); const resetPasswordForm = screen.getByRole('button', { name: 'Reset password' }); fireEvent.click(resetPasswordForm); const newPassword = 'new_password'; const error = { message: 'Something went wrong' }; server.use(getTRPCMockError({ path: ['auth', 'changeOperatorPassword'], type: 'mutation', message: error.message })); const passwordInput = screen.getByLabelText('Password'); const confirmPasswordInput = screen.getByLabelText('Confirm password'); // Act fireEvent.change(passwordInput, { target: { value: newPassword } }); fireEvent.change(confirmPasswordInput, { target: { value: newPassword } }); fireEvent.click(resetPasswordForm); // Assert await waitFor(() => { expect(result.current.toasts[0].description).toBe(error.message); }); unmount(); }); it('should call the cancel request mutation when cancel button is clicked', async () => { // Arrange const { result, unmount } = renderHook(() => useToastStore()); render(); server.use(getTRPCMock({ path: ['auth', 'cancelPasswordChangeRequest'], type: 'mutation', response: true })); const cancelRequestForm = screen.getByRole('button', { name: 'Cancel password change request' }); // Act fireEvent.click(cancelRequestForm); // Assert await waitFor(() => { expect(result.current.toasts[0].title).toBe('Password change request cancelled'); }); unmount(); }); it('should redirect to login page when Back to login button is clicked', async () => { // Arrange render(); server.use(getTRPCMock({ path: ['auth', 'changeOperatorPassword'], type: 'mutation', response: { email: 'goofy@test.com' } })); const resetPasswordForm = screen.getByRole('button', { name: 'Reset password' }); const passwordInput = screen.getByLabelText('Password'); const confirmPasswordInput = screen.getByLabelText('Confirm password'); const newPassword = 'new_password'; fireEvent.change(passwordInput, { target: { value: newPassword } }); fireEvent.change(confirmPasswordInput, { target: { value: newPassword } }); fireEvent.click(resetPasswordForm); await waitFor(() => { expect(screen.getByText('Back to login')).toBeInTheDocument(); }); // Act const backToLoginButton = screen.getByRole('button', { name: 'Back to login' }); fireEvent.click(backToLoginButton); // Assert await waitFor(() => { expect(pushFn).toHaveBeenCalledWith('/login'); }); }); });