| import { render, getByTestId } from 'test/layout-test-utils'; |
| import userEvent from '@testing-library/user-event'; |
| import type { TStartupConfig } from 'librechat-data-provider'; |
| import * as endpointQueries from '~/data-provider/Endpoints/queries'; |
| import * as miscDataProvider from '~/data-provider/Misc/queries'; |
| import * as authMutations from '~/data-provider/Auth/mutations'; |
| import * as authQueries from '~/data-provider/Auth/queries'; |
| import Login from '../LoginForm'; |
|
|
| jest.mock('librechat-data-provider/react-query'); |
|
|
| const mockLogin = jest.fn(); |
|
|
| const mockStartupConfig: TStartupConfig = { |
| socialLogins: ['google', 'facebook', 'openid', 'github', 'discord', 'saml'], |
| discordLoginEnabled: true, |
| facebookLoginEnabled: true, |
| githubLoginEnabled: true, |
| googleLoginEnabled: true, |
| openidLoginEnabled: true, |
| openidLabel: 'Test OpenID', |
| openidImageUrl: 'http://test-server.com', |
| samlLoginEnabled: true, |
| samlLabel: 'Test SAML', |
| samlImageUrl: 'http://test-server.com', |
| registrationEnabled: true, |
| emailLoginEnabled: true, |
| socialLoginEnabled: true, |
| passwordResetEnabled: true, |
| serverDomain: 'mock-server', |
| appTitle: '', |
| ldap: { |
| enabled: false, |
| }, |
| emailEnabled: false, |
| checkBalance: false, |
| showBirthdayIcon: false, |
| helpAndFaqURL: '', |
| }; |
|
|
| const setup = ({ |
| useGetUserQueryReturnValue = { |
| isLoading: false, |
| isError: false, |
| data: {}, |
| }, |
| useLoginUserReturnValue = { |
| isLoading: false, |
| isError: false, |
| mutate: jest.fn(), |
| data: {}, |
| isSuccess: false, |
| }, |
| useRefreshTokenMutationReturnValue = { |
| isLoading: false, |
| isError: false, |
| mutate: jest.fn(), |
| data: { |
| token: 'mock-token', |
| user: {}, |
| }, |
| }, |
| useGetStartupConfigReturnValue = { |
| isLoading: false, |
| isError: false, |
| data: mockStartupConfig, |
| }, |
| useGetBannerQueryReturnValue = { |
| isLoading: false, |
| isError: false, |
| data: {}, |
| }, |
| } = {}) => { |
| const mockUseLoginUser = jest |
| .spyOn(authMutations, 'useLoginUserMutation') |
| |
| .mockReturnValue(useLoginUserReturnValue); |
| const mockUseGetUserQuery = jest |
| .spyOn(authQueries, 'useGetUserQuery') |
| |
| .mockReturnValue(useGetUserQueryReturnValue); |
| const mockUseGetStartupConfig = jest |
| .spyOn(endpointQueries, 'useGetStartupConfig') |
| |
| .mockReturnValue(useGetStartupConfigReturnValue); |
| const mockUseRefreshTokenMutation = jest |
| .spyOn(authMutations, 'useRefreshTokenMutation') |
| |
| .mockReturnValue(useRefreshTokenMutationReturnValue); |
| const mockUseGetBannerQuery = jest |
| .spyOn(miscDataProvider, 'useGetBannerQuery') |
| |
| .mockReturnValue(useGetBannerQueryReturnValue); |
| return { |
| mockUseLoginUser, |
| mockUseGetUserQuery, |
| mockUseGetStartupConfig, |
| mockUseRefreshTokenMutation, |
| mockUseGetBannerQuery, |
| }; |
| }; |
|
|
| beforeEach(() => { |
| setup(); |
| }); |
|
|
| test('renders login form', () => { |
| const { getByLabelText } = render( |
| <Login onSubmit={mockLogin} startupConfig={mockStartupConfig} />, |
| ); |
| expect(getByLabelText(/email/i)).toBeInTheDocument(); |
| expect(getByLabelText(/password/i)).toBeInTheDocument(); |
| }); |
|
|
| test('submits login form', async () => { |
| const { getByLabelText, getByRole } = render( |
| <Login onSubmit={mockLogin} startupConfig={mockStartupConfig} />, |
| ); |
| const emailInput = getByLabelText(/email/i); |
| const passwordInput = getByLabelText(/password/i); |
| const submitButton = getByTestId(document.body, 'login-button'); |
|
|
| await userEvent.type(emailInput, 'test@example.com'); |
| await userEvent.type(passwordInput, 'password'); |
| await userEvent.click(submitButton); |
|
|
| expect(mockLogin).toHaveBeenCalledWith({ email: 'test@example.com', password: 'password' }); |
| }); |
|
|
| test('displays validation error messages', async () => { |
| const { getByLabelText, getByRole, getByText } = render( |
| <Login onSubmit={mockLogin} startupConfig={mockStartupConfig} />, |
| ); |
| const emailInput = getByLabelText(/email/i); |
| const passwordInput = getByLabelText(/password/i); |
| const submitButton = getByTestId(document.body, 'login-button'); |
|
|
| await userEvent.type(emailInput, 'test'); |
| await userEvent.type(passwordInput, 'pass'); |
| await userEvent.click(submitButton); |
|
|
| expect(getByText(/You must enter a valid email address/i)).toBeInTheDocument(); |
| expect(getByText(/Password must be at least 8 characters/i)).toBeInTheDocument(); |
| }); |
|
|