From 088117fa762f8a1076491683318eb764f474ae14 Mon Sep 17 00:00:00 2001 From: knolnsokn <113459475+knolnsokn@users.noreply.github.com> Date: Tue, 4 Oct 2022 10:26:38 -0400 Subject: [PATCH] Closes #64 - Add logout button (#160) --- .../MenuList/LogoutButton.test.tsx | 39 +++++++++++++++ .../NavigationBar/MenuList/LogoutButton.tsx | 18 +++++++ .../NavigationBar/MenuList/MenuList.test.tsx | 49 +++++++++++++++++++ .../UI/NavigationBar/MenuList/MenuList.tsx | 5 ++ 4 files changed, 111 insertions(+) create mode 100644 src/components/UI/NavigationBar/MenuList/LogoutButton.test.tsx create mode 100644 src/components/UI/NavigationBar/MenuList/LogoutButton.tsx create mode 100644 src/components/UI/NavigationBar/MenuList/MenuList.test.tsx diff --git a/src/components/UI/NavigationBar/MenuList/LogoutButton.test.tsx b/src/components/UI/NavigationBar/MenuList/LogoutButton.test.tsx new file mode 100644 index 00000000..53b9d5c1 --- /dev/null +++ b/src/components/UI/NavigationBar/MenuList/LogoutButton.test.tsx @@ -0,0 +1,39 @@ +import { fireEvent, render, screen, waitFor } from '@testing-library/react' +import { NavigationBarContextProvider } from 'components/UI/NavigationBar/NavigationBarContext' +import { mockAxios } from 'test/axios-mock' +import { TServerConfig } from 'test/test-values' +import { LoggedInProviders } from 'test/testMocks' + +import { MenuList } from './MenuList' + +describe('LogoutButton', () => { + test('logs user out when clicked', async () => { + mockAxios + .onGet('/config') + .reply(200, Object.assign({}, TServerConfig, { auth_enabled: true })) + + render( + + () => { + // noop + }} + drawerIsOpen={true} + > + + + , + ) + + await waitFor(() => { + expect(screen.getByText('Logout')).toBeInTheDocument() + }) + + const logOutButton = screen.getByText('Logout') + fireEvent.click(logOutButton) + + await waitFor(() => { + expect(screen.queryByText('Logout')).not.toBeInTheDocument() + }) + }) +}) diff --git a/src/components/UI/NavigationBar/MenuList/LogoutButton.tsx b/src/components/UI/NavigationBar/MenuList/LogoutButton.tsx new file mode 100644 index 00000000..09797d84 --- /dev/null +++ b/src/components/UI/NavigationBar/MenuList/LogoutButton.tsx @@ -0,0 +1,18 @@ +import LogoutIcon from '@mui/icons-material/Logout' +import { ListItemButton, ListItemIcon, ListItemText } from '@mui/material' +import { AuthContainer } from 'containers/AuthContainer' + +const LogoutButton = () => { + const { logout } = AuthContainer.useContainer() + + return ( + + + + + + + ) + +} +export { LogoutButton } diff --git a/src/components/UI/NavigationBar/MenuList/MenuList.test.tsx b/src/components/UI/NavigationBar/MenuList/MenuList.test.tsx new file mode 100644 index 00000000..0028a1c9 --- /dev/null +++ b/src/components/UI/NavigationBar/MenuList/MenuList.test.tsx @@ -0,0 +1,49 @@ +import { render, screen, waitFor } from '@testing-library/react' +import { NavigationBarContextProvider } from 'components/UI/NavigationBar/NavigationBarContext' +import { mockAxios } from 'test/axios-mock' +import { TServerConfig } from 'test/test-values' +import { AllProviders, LoggedInProviders } from 'test/testMocks' + +import { MenuList } from './MenuList' + +describe('Menu List', () => { + test('should hide Logout button when not logged in', async () => { + render( + + () => { + // noop + }} + drawerIsOpen={true} + > + + + , + ) + await waitFor(() => { + expect(screen.queryByText('Logout')).not.toBeInTheDocument() + }) + }) + + test('should show logout button when logged in', async () => { + mockAxios + .onGet('/config') + .reply(200, Object.assign({}, TServerConfig, { auth_enabled: true })) + + render( + + () => { + // noop + }} + drawerIsOpen={true} + > + + + , + ) + await waitFor(() => { + expect(screen.getByText('Logout')).toBeInTheDocument() + }) + }) +}) diff --git a/src/components/UI/NavigationBar/MenuList/MenuList.tsx b/src/components/UI/NavigationBar/MenuList/MenuList.tsx index ce54b5f2..d216dbe2 100644 --- a/src/components/UI/NavigationBar/MenuList/MenuList.tsx +++ b/src/components/UI/NavigationBar/MenuList/MenuList.tsx @@ -4,10 +4,14 @@ import FactoryIcon from '@mui/icons-material/Factory' import { Divider, MenuList as MuiMenuList } from '@mui/material' import { AdminMenu } from 'components/UI/NavigationBar/MenuList/AdminMenu' import { ListItemLink } from 'components/UI/NavigationBar/MenuList/ListItemLink' +import { LogoutButton } from 'components/UI/NavigationBar/MenuList/LogoutButton' import { OptionsMenu } from 'components/UI/NavigationBar/MenuList/OptionsMenu' +import { AuthContainer } from 'containers/AuthContainer' import * as React from 'react' const MenuList = () => { + const { user } = AuthContainer.useContainer() + return ( {mainEntries.map((entry: mainEntriesType) => { @@ -24,6 +28,7 @@ const MenuList = () => { + {user && } ) }