import Home from '@components/pages/home/Home';
import installI18nModule from '@i18n/i18n-module';
import { cleanup, render, screen, waitFor } from '@testing-library/react';
import { http, HttpHandler, HttpResponse } from 'msw';
import { setupServer, SetupServerApi } from 'msw/node';
import { configureGlobalInjector, Injector } from 'plume-ts-di';
import React from 'react';
import { afterAll, afterEach, beforeAll, describe, expect, it } from 'vitest';
import { createInjector } from '../../../TestUtils';
// Set up mock HTTP server with default handler
const restHandlers: HttpHandler[] = [
http.get(
'/api/example/test/*',
() => {
return HttpResponse.json({ name: 'John Doe' });
},
),
];
const server: SetupServerApi = setupServer(...restHandlers);
describe('Home Component', () => {
// 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('renders successfully with API response', async () => {
render(
,
);
// Should show loading and title initially
expect(screen.getByText(/Home page/)).toBeInTheDocument();
expect(screen.getByText('Loading...')).toBeInTheDocument();
// Wait for API response
await waitFor(() => {
// Check that the success message and name are displayed
expect(screen.getByText(/API call success!/)).toBeInTheDocument();
expect(screen.getByText(/John Doe/)).toBeInTheDocument();
});
});
it('renders error state when API call fails', async () => {
// Override the default handler to simulate an error
server.use(
http.get('/api/example/test/*', () => {
return HttpResponse.json(
{
errorCode: 'INTERNAL_ERROR',
statusArguments: [],
},
{
status: 500,
},
);
}),
);
render(
,
);
expect(screen.getByText('Loading...')).toBeInTheDocument();
await waitFor(() => {
expect(screen.getByText(/Could not call API:/)).toBeInTheDocument();
expect(screen.getByText(/An unexpected error occurred/)).toBeInTheDocument();
});
});
});