From 4b3c11cc68ff5b722608040ab6b01c801ae7f164 Mon Sep 17 00:00:00 2001 From: Chrtorres Date: Thu, 14 Mar 2024 15:04:41 -0400 Subject: [PATCH 01/14] Fixed header response to browser, NavLink underline styling, and Crossfeed logo routing to dashboard --- frontend/src/components/Header.tsx | 212 +++------------------------- frontend/src/components/NavItem.tsx | 4 +- 2 files changed, 21 insertions(+), 195 deletions(-) diff --git a/frontend/src/components/Header.tsx b/frontend/src/components/Header.tsx index e6b751dd..368b8a27 100644 --- a/frontend/src/components/Header.tsx +++ b/frontend/src/components/Header.tsx @@ -33,6 +33,7 @@ const classes = { inner: `${PREFIX}-inner`, menuButton: `${PREFIX}-menuButton`, logo: `${PREFIX}-logo`, + logoBox: `${PREFIX}-logoBox`, spacing: `${PREFIX}-spacing`, activeLink: `${PREFIX}-activeLink`, activeMobileLink: `${PREFIX}-activeMobileLink`, @@ -46,44 +47,31 @@ const classes = { const Root = styled('div')(({ theme }) => ({ [`.${classes.inner}`]: { - maxWidth: 1440, - width: '250%', + maxWidth: '1440px', + width: '100%', margin: '0 auto' }, [`.${classes.menuButton}`]: { marginLeft: theme.spacing(2), display: 'flex', - [theme.breakpoints.up('sm')]: { + [theme.breakpoints.up('xl')]: { display: 'none' } }, [`.${classes.logo}`]: { width: 150, + minWidth: 150, padding: theme.spacing(), paddingLeft: 0, [theme.breakpoints.down('xl')]: { display: 'flex' } }, - [`.${classes.spacing}`]: { flexGrow: 1 }, - - [`.${classes.activeLink}`]: { - ':after': { - content: "''", - position: 'absolute', - bottom: 0, - left: 0, - width: '100%', - height: 2, - backgroundColor: 'white' - } - }, - [`.${classes.activeMobileLink}`]: { fontWeight: 700, '&:after': { @@ -238,7 +226,7 @@ const HeaderNoCtx: React.FC = (props) => { title: 'Overview', path: '/', users: ALL_USERS, - exact: true + exact: true, }, { title: 'Inventory', @@ -246,24 +234,6 @@ const HeaderNoCtx: React.FC = (props) => { users: ALL_USERS, exact: false }, - - /* - Hiding Feeds page until finished - { title: 'Feeds', - path: '/feeds', - users: ALL_USERS, - exact: false - },*/ - - /* - Hiding Reports page until finished - { - title: 'Reports', - path: '/reports', - users: ALL_USERS, - exact: true - },*/ - { title: 'Scans', path: '/scans', @@ -272,55 +242,12 @@ const HeaderNoCtx: React.FC = (props) => { } ].filter(({ users }) => (users & userLevel) > 0); - const userMenu: NavItemType = { - title: ( -
- My Account -
- ), - path: '#', - exact: false, - nested: [ - { - title: 'Manage Organizations', - path: '/organizations', - users: GLOBAL_ADMIN, - exact: true - }, - // { - // title: 'My Organizations', - // path: '/organizations', - // users: STANDARD_USER, - // exact: true - // }, - { - title: 'Manage Users', - path: '/users', - users: GLOBAL_ADMIN, - exact: true - }, - { - title: 'My Settings', - path: '/settings', - users: ALL_USERS, - exact: true - }, - { - title: 'Logout', - path: '/settings', - users: ALL_USERS, - onClick: logout, - exact: true - } - ].filter(({ users }) => (users & userLevel) > 0) - }; - - const userItemsSmall: NavItemType[] = [ + const userItems: NavItemType[] = [ { title: 'My Account', path: '#', users: ALL_USERS, - exact: true + exact: false, }, { title: 'Manage Organizations', @@ -328,12 +255,6 @@ const HeaderNoCtx: React.FC = (props) => { users: GLOBAL_ADMIN, exact: true }, - // { - // title: 'My Organizations', - // path: '/organizations', - // users: STANDARD_USER, - // exact: true - // }, { title: 'Manage Users', path: '/users', @@ -355,26 +276,16 @@ const HeaderNoCtx: React.FC = (props) => { } ].filter(({ users }) => (users & userLevel) > 0); - const orgPageMatch = useRouteMatch('/organizations/:id'); - const desktopNavItems: JSX.Element[] = navItems.map((item) => ( )); - const navItemsToUse = () => { - if (isSmall) { - return userItemsSmall; - } else { - return navItems; - } - }; - return (
- + = (props) => { }); }} /> - {organizations.length > 1 && ( - <> -
- - option?.name === value?.name - } - options={[{ name: 'All Organizations' }].concat( - organizations - )} - autoComplete={false} - className={classes.selectOrg} - classes={{ - option: classes.option - }} - value={ - showAllOrganizations - ? { name: 'All Organizations' } - : currentOrganization ?? undefined - } - filterOptions={(options, state) => { - // If already selected, show all - if ( - options.find( - (option) => - option?.name.toLowerCase() === - state.inputValue.toLowerCase() - ) - ) { - return options; - } - return options.filter( - (option) => - option?.name - .toLowerCase() - .includes(state.inputValue.toLowerCase()) - ); - }} - disableClearable - blurOnSelect - selectOnFocus - getOptionLabel={(option) => option!.name} - renderOption={(props, option) => ( -
  • {option!.name}
  • - )} - onChange={( - event: any, - value: Organization | { name: string } | undefined - ) => { - if (value && 'id' in value) { - setOrganization(value); - setShowAllOrganizations(false); - if (value.name === 'Election') { - setShowMaps(true); - } else { - setShowMaps(false); - } - - // Check if we're on an organization page and, if so, update it to the new organization - if (orgPageMatch !== null) { - if (!tags.find((e) => e.id === value.id)) { - history.push(`/organizations/${value.id}`); - } - } - } else { - setShowAllOrganizations(true); - setShowMaps(false); - } - }} - renderInput={(params) => ( - - )} - /> - - )} - {isSmall ? null : } + setNavOpen((open) => !open)} + > + + )} - setNavOpen((open) => !open)} - > - -
    - = (props) => { data-testid="mobilenav" > - {navItemsToUse().map(({ title, path, nested, onClick }) => ( + {userItems.map(({ title, path, nested, onClick }) => ( {path && ( ({ position: 'absolute', bottom: 0, left: 6, - width: '100%', + width: '85%', height: 2, backgroundColor: 'white' } @@ -152,7 +152,7 @@ const Root = styled('div')(({ theme }) => ({ bottom: 0, left: 0, height: '100%', - width: 2, + width: '85%', backgroundColor: theme.palette.primary.main } }, From 268c9842c5f37429eeec6be2fb9124de7a881b4a Mon Sep 17 00:00:00 2001 From: Chrtorres Date: Mon, 18 Mar 2024 10:15:28 -0400 Subject: [PATCH 02/14] Removed unused variables --- frontend/src/components/Header.tsx | 64 +++-------------------------- frontend/src/components/NavItem.tsx | 1 - 2 files changed, 5 insertions(+), 60 deletions(-) diff --git a/frontend/src/components/Header.tsx b/frontend/src/components/Header.tsx index 368b8a27..dab3ce9e 100644 --- a/frontend/src/components/Header.tsx +++ b/frontend/src/components/Header.tsx @@ -8,7 +8,6 @@ import { Drawer, ListItem, List, - TextField, useMediaQuery, useTheme } from '@mui/material'; @@ -35,10 +34,8 @@ const classes = { logo: `${PREFIX}-logo`, logoBox: `${PREFIX}-logoBox`, spacing: `${PREFIX}-spacing`, - activeLink: `${PREFIX}-activeLink`, activeMobileLink: `${PREFIX}-activeMobileLink`, link: `${PREFIX}-link`, - userLink: `${PREFIX}-userLink`, lgNav: `${PREFIX}-lgNav`, mobileNav: `${PREFIX}-mobileNav`, selectOrg: `${PREFIX}-selectOrg`, @@ -95,23 +92,6 @@ const Root = styled('div')(({ theme }) => ({ borderBottom: '2px solid transparent', fontWeight: 600 }, - - [`.${classes.userLink}`]: { - [theme.breakpoints.down('md')]: { - display: 'flex' - }, - [theme.breakpoints.up('lg')]: { - display: 'flex', - alignItems: 'center', - marginLeft: '1rem', - '& svg': { - marginRight: theme.spacing() - }, - border: 'none', - textDecoration: 'none' - } - }, - [`.${classes.lgNav}`]: { display: 'flex', [theme.breakpoints.down('sm')]: { @@ -122,38 +102,6 @@ const Root = styled('div')(({ theme }) => ({ [`.${classes.mobileNav}`]: { padding: `${theme.spacing(2)} ${theme.spacing()}px` }, - - [`.${classes.selectOrg}`]: { - border: '1px solid #FFFFFF', - borderRadius: '5px', - width: '200px', - padding: '3px', - marginLeft: '20px', - '& svg': { - color: 'white' - }, - '& input': { - color: 'white', - width: '100%' - }, - '& input:focus': { - outlineWidth: 0 - }, - '& fieldset': { - borderStyle: 'none' - }, - '& div div': { - paddingTop: '0 !important' - }, - '& div div div': { - marginTop: '-3px !important' - }, - height: '45px' - }, - - [` .${classes.option}`]: { - fontSize: 15 - } })); const GLOBAL_ADMIN = 2; @@ -190,7 +138,6 @@ const HeaderNoCtx: React.FC = (props) => { >([]); const [tags, setTags] = useState([]); const theme = useTheme(); - const isSmall = useMediaQuery(theme.breakpoints.down('md')); let userLevel = 0; if (user && user.isRegistered) { @@ -226,7 +173,7 @@ const HeaderNoCtx: React.FC = (props) => { title: 'Overview', path: '/', users: ALL_USERS, - exact: true, + exact: true }, { title: 'Inventory', @@ -247,7 +194,7 @@ const HeaderNoCtx: React.FC = (props) => { title: 'My Account', path: '#', users: ALL_USERS, - exact: false, + exact: false }, { title: 'Manage Organizations', @@ -283,9 +230,9 @@ const HeaderNoCtx: React.FC = (props) => { return ( -
    + {/*
    */} - + = (props) => { />
    {desktopNavItems.slice()}
    -
    {userLevel > 0 && ( @@ -322,7 +268,7 @@ const HeaderNoCtx: React.FC = (props) => { )} -
    + {/*
    */} ({ [`& .${classesNav.userLink}`]: { display: 'flex', alignItems: 'center', - '& svg': { marginRight: theme.spacing() } From dd36b9cc68d80fccef51761b603af5f1aa0d0f44 Mon Sep 17 00:00:00 2001 From: Chrtorres Date: Mon, 18 Mar 2024 10:17:00 -0400 Subject: [PATCH 03/14] Removed Spacing errors --- frontend/src/components/Header.tsx | 74 +++++++++++++++--------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/frontend/src/components/Header.tsx b/frontend/src/components/Header.tsx index dab3ce9e..b7ca7a9d 100644 --- a/frontend/src/components/Header.tsx +++ b/frontend/src/components/Header.tsx @@ -101,7 +101,7 @@ const Root = styled('div')(({ theme }) => ({ [`.${classes.mobileNav}`]: { padding: `${theme.spacing(2)} ${theme.spacing()}px` - }, + } })); const GLOBAL_ADMIN = 2; @@ -231,43 +231,43 @@ const HeaderNoCtx: React.FC = (props) => { {/*
    */} - - - Crossfeed Icon Navigate Home - -
    {desktopNavItems.slice()}
    -
    + + + Crossfeed Icon Navigate Home + +
    {desktopNavItems.slice()}
    +
    - {userLevel > 0 && ( - <> - { - if (location.pathname !== '/inventory') - history.push('/inventory?q=' + value); - setSearchTerm(value, { - shouldClearFilters: false, - autocompleteResults: false - }); - }} - /> - setNavOpen((open) => !open)} - > - - - - )} - + {userLevel > 0 && ( + <> + { + if (location.pathname !== '/inventory') + history.push('/inventory?q=' + value); + setSearchTerm(value, { + shouldClearFilters: false, + autocompleteResults: false + }); + }} + /> + setNavOpen((open) => !open)} + > + + + + )} + {/*
    */} Date: Mon, 18 Mar 2024 12:20:24 -0400 Subject: [PATCH 04/14] Corrected unused variables and removed filter org logic --- frontend/src/components/Header.tsx | 78 +++++++++++++++--------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/frontend/src/components/Header.tsx b/frontend/src/components/Header.tsx index b7ca7a9d..b66fa6dd 100644 --- a/frontend/src/components/Header.tsx +++ b/frontend/src/components/Header.tsx @@ -101,7 +101,7 @@ const Root = styled('div')(({ theme }) => ({ [`.${classes.mobileNav}`]: { padding: `${theme.spacing(2)} ${theme.spacing()}px` - } + }, })); const GLOBAL_ADMIN = 2; @@ -230,45 +230,45 @@ const HeaderNoCtx: React.FC = (props) => { return ( - {/*
    */} - - - Crossfeed Icon Navigate Home - -
    {desktopNavItems.slice()}
    -
    - - {userLevel > 0 && ( - <> - { - if (location.pathname !== '/inventory') - history.push('/inventory?q=' + value); - setSearchTerm(value, { - shouldClearFilters: false, - autocompleteResults: false - }); - }} +
    + + + Crossfeed Icon Navigate Home - setNavOpen((open) => !open)} - > - - - - )} - - {/*
    */} + +
    {desktopNavItems.slice()}
    +
    + + {userLevel > 0 && ( + <> + { + if (location.pathname !== '/inventory') + history.push('/inventory?q=' + value); + setSearchTerm(value, { + shouldClearFilters: false, + autocompleteResults: false + }); + }} + /> + setNavOpen((open) => !open)} + > + + + + )} + +
    Date: Tue, 19 Mar 2024 10:50:34 -0400 Subject: [PATCH 05/14] Corrected lint issues: Unused Varibales --- frontend/src/components/Header.tsx | 55 +++--------------------------- 1 file changed, 5 insertions(+), 50 deletions(-) diff --git a/frontend/src/components/Header.tsx b/frontend/src/components/Header.tsx index b66fa6dd..37c34637 100644 --- a/frontend/src/components/Header.tsx +++ b/frontend/src/components/Header.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useState } from 'react'; +import React, { useState } from 'react'; import { styled } from '@mui/material/styles'; import { NavLink, Link, useHistory, useLocation } from 'react-router-dom'; import { @@ -7,24 +7,15 @@ import { IconButton, Drawer, ListItem, - List, - useMediaQuery, - useTheme + List } from '@mui/material'; -import { - Menu as MenuIcon, - AccountCircle as UserIcon, - ArrowDropDown -} from '@mui/icons-material'; +import { Menu as MenuIcon } from '@mui/icons-material'; import { NavItem } from './NavItem'; -import { useRouteMatch } from 'react-router-dom'; import { useAuthContext } from 'context'; import logo from '../assets/crossfeed.svg'; import { withSearch } from '@elastic/react-search-ui'; import { ContextType } from 'context/SearchProvider'; import { SearchBar } from 'components'; -import { Autocomplete } from '@mui/material'; -import { Organization, OrganizationTag } from 'types'; const PREFIX = 'Header'; @@ -32,13 +23,11 @@ const classes = { inner: `${PREFIX}-inner`, menuButton: `${PREFIX}-menuButton`, logo: `${PREFIX}-logo`, - logoBox: `${PREFIX}-logoBox`, spacing: `${PREFIX}-spacing`, activeMobileLink: `${PREFIX}-activeMobileLink`, link: `${PREFIX}-link`, lgNav: `${PREFIX}-lgNav`, mobileNav: `${PREFIX}-mobileNav`, - selectOrg: `${PREFIX}-selectOrg`, option: `${PREFIX}-option` }; @@ -101,7 +90,7 @@ const Root = styled('div')(({ theme }) => ({ [`.${classes.mobileNav}`]: { padding: `${theme.spacing(2)} ${theme.spacing()}px` - }, + } })); const GLOBAL_ADMIN = 2; @@ -122,22 +111,8 @@ const HeaderNoCtx: React.FC = (props) => { const history = useHistory(); const location = useLocation(); - const { - currentOrganization, - setOrganization, - showAllOrganizations, - setShowAllOrganizations, - setShowMaps, - user, - logout, - apiGet - } = useAuthContext(); + const { user, logout } = useAuthContext(); const [navOpen, setNavOpen] = useState(false); - const [organizations, setOrganizations] = useState< - (Organization | OrganizationTag)[] - >([]); - const [tags, setTags] = useState([]); - const theme = useTheme(); let userLevel = 0; if (user && user.isRegistered) { @@ -148,26 +123,6 @@ const HeaderNoCtx: React.FC = (props) => { } } - const fetchOrganizations = useCallback(async () => { - try { - const rows = await apiGet('/v2/organizations/'); - let tags: (OrganizationTag | Organization)[] = []; - if (userLevel === GLOBAL_ADMIN) { - tags = await apiGet('/organizations/tags'); - await setTags(tags as OrganizationTag[]); - } - await setOrganizations(tags.concat(rows)); - } catch (e) { - console.log(e); - } - }, [apiGet, setOrganizations, userLevel]); - - React.useEffect(() => { - if (userLevel > 0) { - fetchOrganizations(); - } - }, [fetchOrganizations, userLevel]); - const navItems: NavItemType[] = [ { title: 'Overview', From aa589664094cc044d615f90470e870ccf384ffb9 Mon Sep 17 00:00:00 2001 From: Chrtorres Date: Tue, 19 Mar 2024 14:43:47 -0400 Subject: [PATCH 06/14] Updated header tests/snapshots to reflect removed Nav items --- .../__snapshots__/header.spec.tsx.snap | 44 ++-------------- .../src/components/__tests__/header.spec.tsx | 50 +++---------------- 2 files changed, 11 insertions(+), 83 deletions(-) diff --git a/frontend/src/components/__tests__/__snapshots__/header.spec.tsx.snap b/frontend/src/components/__tests__/__snapshots__/header.spec.tsx.snap index 83e5f878..a09bf2bf 100644 --- a/frontend/src/components/__tests__/__snapshots__/header.spec.tsx.snap +++ b/frontend/src/components/__tests__/__snapshots__/header.spec.tsx.snap @@ -3,7 +3,7 @@ exports[`Header component matches snapshot 1`] = ` - + + +
    diff --git a/frontend/src/components/__tests__/header.spec.tsx b/frontend/src/components/__tests__/header.spec.tsx index 659723d6..d9493ac5 100644 --- a/frontend/src/components/__tests__/header.spec.tsx +++ b/frontend/src/components/__tests__/header.spec.tsx @@ -14,13 +14,8 @@ describe('Header component', () => { }); it('can expand drawer', async () => { - const { getByLabelText, getByTestId, queryByTestId } = render(
    ); + const { queryByTestId } = render(
    ); expect(queryByTestId('mobilenav')).not.toBeInTheDocument(); - expect(getByLabelText('toggle mobile menu')).toBeInTheDocument(); - fireEvent.click(getByLabelText('toggle mobile menu')); - await waitFor(() => { - expect(getByTestId('mobilenav')).toBeInTheDocument(); - }); }); it('shows no links for unauthenticated user', () => { From 2bacc0d6ac26d9d9715eaef99e8181b7d2246bd6 Mon Sep 17 00:00:00 2001 From: Amelia Vance Date: Wed, 27 Mar 2024 11:29:07 -0400 Subject: [PATCH 11/14] Update user type permission views in Header.tsx --- frontend/src/components/Header.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/Header.tsx b/frontend/src/components/Header.tsx index 767b4df6..ace0f480 100644 --- a/frontend/src/components/Header.tsx +++ b/frontend/src/components/Header.tsx @@ -184,9 +184,12 @@ const HeaderNoCtx: React.FC = (props) => { let userLevel = 0; if (user && user.isRegistered) { - if (user.userType === 'standard' || user.userType === 'globalView') { + if (user.userType === 'standard') { userLevel = STANDARD_USER; - } else if (user.userType === 'globalAdmin') { + } else if ( + user.userType === 'globalAdmin' || + user.userType === 'globalView' + ) { userLevel = GLOBAL_ADMIN; } else if (user.userType === 'regionalAdmin') { userLevel = REGIONAL_ADMIN; From e3c126168d8bfb3fed86f5f790d270e16a9c02c6 Mon Sep 17 00:00:00 2001 From: Amelia Vance Date: Wed, 27 Mar 2024 11:29:46 -0400 Subject: [PATCH 12/14] Update user type permission views in Users.tsx --- frontend/src/pages/Users/Users.tsx | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/frontend/src/pages/Users/Users.tsx b/frontend/src/pages/Users/Users.tsx index f9ce36bd..a6140e28 100644 --- a/frontend/src/pages/Users/Users.tsx +++ b/frontend/src/pages/Users/Users.tsx @@ -92,21 +92,28 @@ export const Users: React.FC = () => { const fetchUsers = useCallback(async () => { try { const rows = await apiGet(`/users/`); - rows.forEach((obj) => { - obj.lastLoggedInString = obj.lastLoggedIn - ? `${formatDistanceToNow(parseISO(obj.lastLoggedIn))} ago` + rows.forEach((row) => { + row.lastLoggedInString = row.lastLoggedIn + ? `${formatDistanceToNow(parseISO(row.lastLoggedIn))} ago` : 'None'; - obj.dateToUSigned = obj.dateAcceptedTerms - ? `${formatDistanceToNow(parseISO(obj.dateAcceptedTerms))} ago` + row.dateToUSigned = row.dateAcceptedTerms + ? `${formatDistanceToNow(parseISO(row.dateAcceptedTerms))} ago` : 'None'; - obj.orgs = obj.roles - ? obj.roles + row.orgs = row.roles + ? row.roles .filter((role) => role.approved) .map((role) => role.organization.name) .join(', ') : 'None'; }); - setUsers(rows); + if (user?.userType === 'globalAdmin') { + setUsers(rows); + } else if (user?.userType === 'regionalAdmin' && user?.regionId) { + rows.filter((row) => row.regionId === user.regionId); + setUsers(rows); + } else if (user) { + setUsers([user]); + } setErrorStates({ ...errorStates, getUsersError: '' }); } catch (e: any) { setErrorStates({ ...errorStates, getUsersError: e.message }); From 65e3e86b4c3abad7debce0e90c5df8fb8160a9f6 Mon Sep 17 00:00:00 2001 From: Amelia Vance Date: Wed, 27 Mar 2024 11:30:29 -0400 Subject: [PATCH 13/14] Update alert message in OrganizationList.tsx --- frontend/src/components/OrganizationList/OrganizationList.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/OrganizationList/OrganizationList.tsx b/frontend/src/components/OrganizationList/OrganizationList.tsx index eb1b4601..5639cc40 100644 --- a/frontend/src/components/OrganizationList/OrganizationList.tsx +++ b/frontend/src/components/OrganizationList/OrganizationList.tsx @@ -105,7 +105,7 @@ export const OrganizationList: React.FC<{ {organizations?.length === 0 ? ( - No organizations found. + Unable to load organizations. ) : ( Date: Wed, 27 Mar 2024 13:12:21 -0400 Subject: [PATCH 14/14] Remove unused imports and variables from header.spec.tsx --- frontend/src/components/__tests__/header.spec.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/__tests__/header.spec.tsx b/frontend/src/components/__tests__/header.spec.tsx index d9493ac5..7b1189d8 100644 --- a/frontend/src/components/__tests__/header.spec.tsx +++ b/frontend/src/components/__tests__/header.spec.tsx @@ -1,7 +1,6 @@ import React from 'react'; -import { render, fireEvent, testUser, testOrganization } from 'test-utils'; +import { render, testUser, testOrganization } from 'test-utils'; import { Header } from '../Header'; -import { waitFor } from '@testing-library/react'; jest.mock('@elastic/react-search-ui', () => ({ withSearch: () => (comp: any) => comp @@ -46,7 +45,7 @@ describe('Header component', () => { }); it('shows correct links for ORG_ADMIN', () => { - const { getByText, queryByText } = render(
    , { + const { getByText } = render(
    , { authContext: { user: { ...testUser, userType: 'standard', isRegistered: true }, currentOrganization: { ...testOrganization }