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  });