import { cleanup, fireEvent, render } from '@testing-library/react'; import { http, HttpHandler, HttpResponse } from 'msw'; import { setupServer, SetupServerApi } from 'msw/node'; import { configureGlobalInjector, Injector } from 'plume-ts-di'; import { afterAll, afterEach, beforeAll, describe, expect, it } from 'vitest'; import Login from '../../../../src/components/features/login/Login'; import { createInjector } from '../../../TestUtils'; import installI18nModule from '@i18n/i18n-module'; // Set up mock HTTP server with default handler const restHandlers: HttpHandler[] = [ http.post('/api/admin/session', () => { return HttpResponse.json( { errorCode: 'WRONG_LOGIN_OR_PASSWORD', statusArguments: [], }, { status: 400, }, ); }), ]; const server: SetupServerApi = setupServer(...restHandlers); describe('Login', () => { // Set up DI and mock server beforeAll(() => { const injector: Injector = createInjector(); installI18nModule(injector); configureGlobalInjector(injector); server.listen({ onUnhandledRequest: 'error' }); }); // Clean up after tests afterAll(() => server.close()); // Reset handlers after each test afterEach(() => { cleanup(); server.resetHandlers(); }); it('should render a not disabled button', () => { const wrapper = render( , ); const button: HTMLElement | null = wrapper.queryByTestId('login-form-submit'); expect(button).toHaveProperty('disabled', false); expect(button).toBeDefined(); }); it('should not render an alert box', () => { const wrapper = render( , ); const alert: HTMLElement | null = wrapper.queryByTestId('login-alert'); expect(alert).toBeNull(); }); it('should render an alert box', async () => { const wrapper = render( , ); // Get input and fill values const userName: HTMLElement = await wrapper.findByTestId('login-form-username'); fireEvent.change(userName.querySelector('input')!, { target: { value: 'jdoe' } }); const password: HTMLElement = await wrapper.findByTestId('login-form-password'); fireEvent.change(password.querySelector('input')!, { target: { value: 'password' } }); // Submit form const form: HTMLElement = await wrapper.findByTestId('login-form'); fireEvent.submit(form); const alert: HTMLElement = await wrapper.findByTestId('login-alert'); expect(alert).toBeDefined(); expect(alert.textContent).toBe('User name or password incorrect'); }); });