import * as React from 'react'; import { render, screen, fireEvent, waitFor } from '@testing-library/react'; import { Basic, ErrorCase, ResetIdentity } from './useGetIdentity.stories'; import useGetIdentity from './useGetIdentity'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { AuthContext } from './AuthContext'; describe('useGetIdentity', () => { it('should return the identity', async () => { render(); await screen.findByText('John Doe'); }); it('should return the authProvider error', async () => { jest.spyOn(console, 'error').mockImplementationOnce(() => {}); render(); await screen.findByText('Error'); }); it('should allow to update the identity after a change', async () => { render(); expect(await screen.findByText('John Doe')).not.toBeNull(); const input = screen.getByDisplayValue('John Doe'); fireEvent.change(input, { target: { value: 'Jane Doe' } }); fireEvent.click(screen.getByText('Save')); await screen.findByText('Jane Doe'); expect(screen.queryByText('John Doe')).toBeNull(); }); it('should not throw errors when there is no authProvider.getIdentity', async () => { const authProvider = { login: () => Promise.resolve(), logout: () => Promise.resolve(), checkAuth: () => Promise.resolve(), checkError: () => Promise.resolve(), getPermissions: () => Promise.resolve(), }; const Identity = () => { const { data, error, isPending } = useGetIdentity({ retry: false }); return isPending ? ( <>Loading ) : error ? ( <>{`Error: ${error.message}`} ) : ( <>{JSON.stringify(data)} ); }; render( ); await waitFor(() => { expect(screen.queryByText('Loading')).toBeNull(); }); expect(screen.queryByText(/Error/)).toBeNull(); expect(screen.queryByText('{"id":""}')).not.toBeNull(); }); it('should abort the request if the query is canceled', async () => { const abort = jest.fn(); const authProvider = { getIdentity: jest.fn( ({ signal }) => new Promise(() => { signal.addEventListener('abort', () => { abort(signal.reason); }); }) ) as any, } as any; const queryClient = new QueryClient(); const Identity = () => { const { data, error, isPending } = useGetIdentity({ retry: false }); return isPending ? ( <>Loading ) : error ? ( <>{`Error: ${error.message}`} ) : ( <>{String(data)} ); }; render( ); await waitFor(() => { expect(authProvider.getIdentity).toHaveBeenCalled(); }); queryClient.cancelQueries({ queryKey: ['auth', 'getIdentity'], }); await waitFor(() => { expect(abort).toHaveBeenCalled(); }); }); });