File size: 5,757 Bytes
3b6afc0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
import { render, waitFor } from 'layout-test-utils';
import userEvent from '@testing-library/user-event';
import Registration from '../Registration';
import * as mockDataProvider from '@librechat/data-provider';
jest.mock('@librechat/data-provider');
const setup = ({
useGetUserQueryReturnValue = {
isLoading: false,
isError: false,
data: {},
},
useRegisterUserMutationReturnValue = {
isLoading: false,
isError: false,
mutate: jest.fn(),
data: {},
isSuccess: false,
},
useGetStartupCongfigReturnValue = {
isLoading: false,
isError: false,
data: {
googleLoginEnabled: true,
openidLoginEnabled: true,
openidLabel: 'Test OpenID',
openidImageUrl: 'http://test-server.com',
githubLoginEnabled: true,
discordLoginEnabled: true,
registrationEnabled: true,
socialLoginEnabled: true,
serverDomain: 'mock-server',
},
},
} = {}) => {
const mockUseRegisterUserMutation = jest
.spyOn(mockDataProvider, 'useRegisterUserMutation')
//@ts-ignore - we don't need all parameters of the QueryObserverSuccessResult
.mockReturnValue(useRegisterUserMutationReturnValue);
const mockUseGetUserQuery = jest
.spyOn(mockDataProvider, 'useGetUserQuery')
//@ts-ignore - we don't need all parameters of the QueryObserverSuccessResult
.mockReturnValue(useGetUserQueryReturnValue);
const mockUseGetStartupConfig = jest
.spyOn(mockDataProvider, 'useGetStartupConfig')
//@ts-ignore - we don't need all parameters of the QueryObserverSuccessResult
.mockReturnValue(useGetStartupCongfigReturnValue);
const renderResult = render(<Registration />);
return {
...renderResult,
mockUseRegisterUserMutation,
mockUseGetUserQuery,
mockUseGetStartupConfig,
};
};
test('renders registration form', () => {
const { getByText, getByTestId, getByRole } = setup();
expect(getByText(/Create your account/i)).toBeInTheDocument();
expect(getByRole('textbox', { name: /Full name/i })).toBeInTheDocument();
expect(getByRole('form', { name: /Registration form/i })).toBeVisible();
expect(getByRole('textbox', { name: /Username/i })).toBeInTheDocument();
expect(getByRole('textbox', { name: /Email/i })).toBeInTheDocument();
expect(getByTestId('password')).toBeInTheDocument();
expect(getByTestId('confirm_password')).toBeInTheDocument();
expect(getByRole('button', { name: /Submit registration/i })).toBeInTheDocument();
expect(getByRole('link', { name: 'Login' })).toBeInTheDocument();
expect(getByRole('link', { name: 'Login' })).toHaveAttribute('href', '/login');
expect(getByRole('link', { name: /Login with Google/i })).toBeInTheDocument();
expect(getByRole('link', { name: /Login with Google/i })).toHaveAttribute(
'href',
'mock-server/oauth/google',
);
});
test('calls registerUser.mutate on registration', async () => {
const mutate = jest.fn();
const { getByTestId, getByRole, history } = setup({
// @ts-ignore - we don't need all parameters of the QueryObserverResult
useLoginUserReturnValue: {
isLoading: false,
mutate: mutate,
isError: false,
isSuccess: true,
},
});
await userEvent.type(getByRole('textbox', { name: /Full name/i }), 'John Doe');
await userEvent.type(getByRole('textbox', { name: /Username/i }), 'johndoe');
await userEvent.type(getByRole('textbox', { name: /Email/i }), '[email protected]');
await userEvent.type(getByTestId('password'), 'password');
await userEvent.type(getByTestId('confirm_password'), 'password');
await userEvent.click(getByRole('button', { name: /Submit registration/i }));
waitFor(() => {
expect(mutate).toHaveBeenCalled();
expect(history.location.pathname).toBe('/chat/new');
});
});
test('shows validation error messages', async () => {
const { getByTestId, getAllByRole, getByRole } = setup();
await userEvent.type(getByRole('textbox', { name: /Full name/i }), 'J');
await userEvent.type(getByRole('textbox', { name: /Username/i }), 'j');
await userEvent.type(getByRole('textbox', { name: /Email/i }), 'test');
await userEvent.type(getByTestId('password'), 'pass');
await userEvent.type(getByTestId('confirm_password'), 'password1');
const alerts = getAllByRole('alert');
expect(alerts).toHaveLength(5);
expect(alerts[0]).toHaveTextContent(/Name must be at least 3 characters/i);
expect(alerts[1]).toHaveTextContent(/Username must be at least 3 characters/i);
expect(alerts[2]).toHaveTextContent(/You must enter a valid email address/i);
expect(alerts[3]).toHaveTextContent(/Password must be at least 8 characters/i);
expect(alerts[4]).toHaveTextContent(/Passwords do not match/i);
});
test('shows error message when registration fails', async () => {
const mutate = jest.fn();
const { getByTestId, getByRole } = setup({
useRegisterUserMutationReturnValue: {
isLoading: false,
isError: true,
mutate: mutate,
error: new Error('Registration failed'),
data: {},
isSuccess: false,
},
});
await userEvent.type(getByRole('textbox', { name: /Full name/i }), 'John Doe');
await userEvent.type(getByRole('textbox', { name: /Username/i }), 'johndoe');
await userEvent.type(getByRole('textbox', { name: /Email/i }), '[email protected]');
await userEvent.type(getByTestId('password'), 'password');
await userEvent.type(getByTestId('confirm_password'), 'password');
await userEvent.click(getByRole('button', { name: /Submit registration/i }));
waitFor(() => {
expect(screen.getByRole('alert')).toBeInTheDocument();
expect(screen.getByRole('alert')).toHaveTextContent(
/There was an error attempting to register your account. Please try again. Registration failed/i,
);
});
});
|