|
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') |
|
|
|
.mockReturnValue(useRegisterUserMutationReturnValue); |
|
const mockUseGetUserQuery = jest |
|
.spyOn(mockDataProvider, 'useGetUserQuery') |
|
|
|
.mockReturnValue(useGetUserQueryReturnValue); |
|
const mockUseGetStartupConfig = jest |
|
.spyOn(mockDataProvider, 'useGetStartupConfig') |
|
|
|
.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({ |
|
|
|
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, |
|
); |
|
}); |
|
}); |
|
|