go.chromium.org/luci@v0.0.0-20240309015107-7cdc2e660f33/milo/ui/src/core/pages/login_page.test.tsx (about) 1 // Copyright 2023 The LUCI Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 import { render, screen } from '@testing-library/react'; 16 import { Outlet, RouterProvider, createMemoryRouter } from 'react-router-dom'; 17 18 import { ANONYMOUS_IDENTITY } from '@/common/api/auth_state'; 19 import { SyncedSearchParamsProvider } from '@/generic_libs/hooks/synced_search_params'; 20 import { FakeAuthStateProvider } from '@/testing_tools/fakes/fake_auth_state_provider'; 21 22 import { LoginPage } from './login_page'; 23 24 describe('LoginPage', () => { 25 it('should have the correct login link', () => { 26 const router = createMemoryRouter( 27 [ 28 { 29 element: ( 30 <SyncedSearchParamsProvider> 31 <Outlet /> 32 </SyncedSearchParamsProvider> 33 ), 34 children: [ 35 { 36 path: 'path/prefix', 37 children: [ 38 { 39 index: true, 40 element: <LoginPage />, 41 }, 42 ], 43 }, 44 ], 45 }, 46 ], 47 { initialEntries: ['/path/prefix'] }, 48 ); 49 50 render( 51 <FakeAuthStateProvider value={{ identity: ANONYMOUS_IDENTITY }}> 52 <RouterProvider router={router} /> 53 </FakeAuthStateProvider>, 54 ); 55 56 expect(screen.getByText('login')).toHaveAttribute( 57 'href', 58 '/auth/openid/login?r=%2F', 59 ); 60 }); 61 62 it('should have the correct login link when redirect link is specified', () => { 63 const router = createMemoryRouter( 64 [ 65 { 66 element: ( 67 <SyncedSearchParamsProvider> 68 <Outlet /> 69 </SyncedSearchParamsProvider> 70 ), 71 children: [ 72 { 73 path: 'path/prefix', 74 children: [ 75 { 76 index: true, 77 element: <LoginPage />, 78 }, 79 ], 80 }, 81 ], 82 }, 83 ], 84 { initialEntries: ['/path/prefix?redirect=%2fto%2fhere'] }, 85 ); 86 render( 87 <FakeAuthStateProvider value={{ identity: ANONYMOUS_IDENTITY }}> 88 <RouterProvider router={router} /> 89 </FakeAuthStateProvider>, 90 ); 91 92 expect(screen.getByText('login')).toHaveAttribute( 93 'href', 94 '/auth/openid/login?r=%2Fto%2Fhere', 95 ); 96 }); 97 98 it('should redirect correctly when user signs in without clicking the login link', () => { 99 const router = createMemoryRouter( 100 [ 101 { 102 element: ( 103 <SyncedSearchParamsProvider> 104 <Outlet /> 105 </SyncedSearchParamsProvider> 106 ), 107 children: [ 108 { 109 path: 'path/prefix', 110 children: [{ index: true, element: <LoginPage /> }], 111 }, 112 { 113 path: 'to/here', 114 children: [{ index: true, element: <>reached</> }], 115 }, 116 ], 117 }, 118 ], 119 { initialEntries: ['/path/prefix?redirect=%2fto%2fhere'] }, 120 ); 121 const { rerender } = render( 122 <FakeAuthStateProvider value={{ identity: ANONYMOUS_IDENTITY }}> 123 <RouterProvider router={router} /> 124 </FakeAuthStateProvider>, 125 ); 126 expect(screen.queryByText('reached')).not.toBeInTheDocument(); 127 128 rerender( 129 <FakeAuthStateProvider value={{ identity: 'signed-in-in-another-page' }}> 130 <RouterProvider router={router} /> 131 </FakeAuthStateProvider>, 132 ); 133 expect(screen.getByText('reached')).toBeInTheDocument(); 134 }); 135 });