import * as React from 'react'; import { render, screen, fireEvent, waitFor } from '@testing-library/react'; import { MemoryRouter, Routes, Route } from 'react-router-dom'; import expect from 'expect'; import { CoreAdminContext } from '../core/CoreAdminContext'; import useLogin from './useLogin'; describe('useLogin', () => { describe('redirect after login', () => { it('should redirect to home page by default', async () => { const Login = () => { const login = useLogin(); return ; }; const authProvider = { login: () => Promise.resolve(), checkError: error => Promise.resolve(), checkAuth: params => Promise.resolve(), logout: () => Promise.resolve(), getIdentity: () => Promise.resolve({ id: 'joe' }), getPermissions: () => Promise.resolve(), }; render( Home} /> } /> ); await screen.findByText('Login'); fireEvent.click(screen.getByText('Login')); await screen.findByText('Home'); }); it('should redirect to the redirectTo returned by login', async () => { const Login = () => { const login = useLogin(); return ; }; const authProvider = { login: () => Promise.resolve({ redirectTo: '/foo' }), checkError: error => Promise.resolve(), checkAuth: params => Promise.resolve(), logout: () => Promise.resolve(), getIdentity: () => Promise.resolve({ id: 'joe' }), getPermissions: () => Promise.resolve(), }; render( Home} /> } /> Foo} /> ); await screen.findByText('Login'); fireEvent.click(screen.getByText('Login')); await screen.findByText('Foo'); }); it('should not redirect if login returns redirectTo false', async () => { const Login = () => { const login = useLogin(); return ; }; const authProvider = { login: () => Promise.resolve({ redirectTo: false }), checkError: error => Promise.resolve(), checkAuth: params => Promise.resolve(), logout: () => Promise.resolve(), getIdentity: () => Promise.resolve({ id: 'joe' }), getPermissions: () => Promise.resolve(), }; render( Home} /> } /> ); await screen.findByText('Login'); fireEvent.click(screen.getByText('Login')); await waitFor( // there is no other way to know if the login has been done () => new Promise(resolve => setTimeout(resolve, 50)) ); expect(screen.queryByText('Home')).toBeNull(); expect(screen.queryByText('Login')).not.toBeNull(); }); }); });