forked from HHS/TANF-app
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #2069 from raft-tech/feat/1787-site-map-redo
Feat/1787 site map redo
- Loading branch information
Showing
8 changed files
with
273 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,16 +1,79 @@ | ||
import React from 'react' | ||
import { render } from '@testing-library/react' | ||
import configureStore from 'redux-mock-store' | ||
import thunk from 'redux-thunk' | ||
import { Provider } from 'react-redux' | ||
|
||
import Footer from './Footer' | ||
import { permissions } from '../Header/developer_permissions' | ||
|
||
describe('Footer', () => { | ||
const unauthenticatedInitialState = { | ||
router: { location: { pathname: '/profile' } }, | ||
auth: { | ||
authenticated: false, | ||
}, | ||
} | ||
const adminInitialState = { | ||
router: { location: { pathname: '/profile' } }, | ||
auth: { | ||
authenticated: true, | ||
roles: [{ id: 1, name: 'Developer', permissions }], | ||
}, | ||
} | ||
|
||
const basicAuthenticatedInitialState = { | ||
router: { location: { pathname: '/profile' } }, | ||
auth: { authenticated: true }, | ||
} | ||
const mockStore = configureStore([thunk]) | ||
it('renders the children & families logo', () => { | ||
const { container } = render(<Footer />) | ||
const store = mockStore(unauthenticatedInitialState) | ||
const { container } = render( | ||
<Provider store={store}> | ||
<Footer /> | ||
</Provider> | ||
) | ||
expect(container.querySelector('img')).toBeInTheDocument() | ||
}) | ||
|
||
it('renders the privacy policy link', () => { | ||
const { getByText } = render(<Footer />) | ||
it('renders the privacy policy link as an unauthenticated user', () => { | ||
const store = mockStore(unauthenticatedInitialState) | ||
const { getByText } = render( | ||
<Provider store={store}> | ||
<Footer /> | ||
</Provider> | ||
) | ||
expect(getByText('Privacy policy')).toBeInTheDocument() | ||
}) | ||
|
||
it('renders the privacy policy link as an authenticated user', () => { | ||
const store = mockStore(basicAuthenticatedInitialState) | ||
const { getByText } = render( | ||
<Provider store={store}> | ||
<Footer /> | ||
</Provider> | ||
) | ||
expect(getByText('Privacy policy')).toBeInTheDocument() | ||
}) | ||
|
||
it('renders the site map link if a user is authenticated', () => { | ||
const store = mockStore(basicAuthenticatedInitialState) | ||
const { getByText } = render( | ||
<Provider store={store}> | ||
<Footer /> | ||
</Provider> | ||
) | ||
expect(getByText('Site Map')).toBeInTheDocument() | ||
}) | ||
|
||
it('does not render the sitemap link if a user is not authenticated', () => { | ||
const store = mockStore(unauthenticatedInitialState) | ||
const { queryByText } = render( | ||
<Provider store={store}> | ||
<Footer /> | ||
</Provider> | ||
) | ||
expect(queryByText('Site Map')).not.toBeInTheDocument() | ||
}) | ||
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
import React from 'react' | ||
import { | ||
canViewAdmin, | ||
userAccessRequestApproved, | ||
} from '../../utils/canViewAdmin' | ||
|
||
const SiteMap = ({ user }) => ( | ||
<div className="margin-top-5"> | ||
<SiteMap.Link text="Home" link="/home" /> | ||
<SiteMap.Link | ||
text="Privacy Policy" | ||
link="https://www.acf.hhs.gov/privacy-policy" | ||
target="_blank" | ||
/> | ||
{userAccessRequestApproved(user) && ( | ||
<SiteMap.Link text="Data Files" link="/data-files" /> | ||
)} | ||
<SiteMap.Link text="Profile" link="/profile" /> | ||
|
||
{canViewAdmin(user) && ( | ||
<SiteMap.Link | ||
text="Admin" | ||
link={`${process.env.REACT_APP_BACKEND_HOST}/admin/`} | ||
/> | ||
)} | ||
</div> | ||
) | ||
|
||
SiteMap.Link = ({ text, link, target = '_self' }) => ( | ||
<a | ||
className="usa-footer__primary-link" | ||
href={link} | ||
target={target} | ||
rel="noopener noreferrer" | ||
> | ||
{text} | ||
</a> | ||
) | ||
|
||
export default SiteMap |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
import React from 'react' | ||
import { render } from '@testing-library/react' | ||
import SiteMap from './SiteMap' | ||
import { mount } from 'enzyme' | ||
|
||
describe('SiteMap', () => { | ||
const initialState = { | ||
router: { location: { pathname: '/home' } }, | ||
auth: { | ||
user: { | ||
email: 'test@test.com', | ||
roles: [{ id: 1, name: 'Developer', permissions: [] }], | ||
access_request: true, | ||
}, | ||
authenticated: true, | ||
}, | ||
} | ||
|
||
it('When an authenticated Developer visits the sitemap', () => { | ||
const user = { | ||
email: 'hi@bye.com', | ||
roles: [{ id: 1, name: 'Developer', permissions: [] }], | ||
access_request: true, | ||
} | ||
|
||
const { getByText } = render(<SiteMap user={user}></SiteMap>) | ||
|
||
const locations = [ | ||
'Home', | ||
'Privacy Policy', | ||
'Data Files', | ||
'Profile', | ||
'Admin', | ||
] | ||
for (let location of locations) { | ||
expect(getByText(location)).toBeInTheDocument() | ||
} | ||
}) | ||
|
||
it('When an authenticated OFA System Admin visits the sitemap', () => { | ||
const user = { | ||
email: 'hi@bye.com', | ||
roles: [{ id: 1, name: 'OFA System Admin', permissions: [] }], | ||
access_request: true, | ||
} | ||
|
||
const { getByText } = render(<SiteMap user={user}></SiteMap>) | ||
|
||
const locations = [ | ||
'Home', | ||
'Privacy Policy', | ||
'Data Files', | ||
'Profile', | ||
'Admin', | ||
] | ||
for (let location of locations) { | ||
expect(getByText(location)).toBeInTheDocument() | ||
} | ||
}) | ||
|
||
it('When an authenticated ACF OCIO visits the sitemap', () => { | ||
const user = { | ||
email: 'hi@bye.com', | ||
roles: [{ id: 1, name: 'ACF OCIO', permissions: [] }], | ||
access_request: true, | ||
} | ||
|
||
const { getByText } = render(<SiteMap user={user}></SiteMap>) | ||
|
||
const locations = [ | ||
'Home', | ||
'Privacy Policy', | ||
'Data Files', | ||
'Profile', | ||
'Admin', | ||
] | ||
for (let location of locations) { | ||
expect(getByText(location)).toBeInTheDocument() | ||
} | ||
}) | ||
it('When an authenticated Data Analyst visits the sitemap', () => { | ||
const user = { | ||
email: 'hi@bye.com', | ||
roles: [{ id: 1, name: 'Data Analyst', permissions: [] }], | ||
access_request: true, | ||
} | ||
|
||
const { getByText } = render(<SiteMap user={user}></SiteMap>) | ||
|
||
const locations = ['Home', 'Privacy Policy', 'Data Files', 'Profile'] | ||
for (let location of locations) { | ||
expect(getByText(location)).toBeInTheDocument() | ||
} | ||
const wrapper = mount(<SiteMap user={user}></SiteMap>) | ||
expect(wrapper.html()).not.toContain('Admin') | ||
expect(wrapper.html()).toContain('Home') | ||
}) | ||
|
||
it('When an authenticated user that does not yet have access visits the sitemap', () => { | ||
const user = { | ||
email: 'hi@bye.com', | ||
roles: [], | ||
access_request: false, | ||
} | ||
|
||
const { getByText } = render(<SiteMap user={user}></SiteMap>) | ||
|
||
const locations = ['Home', 'Privacy Policy', 'Profile'] | ||
for (let location of locations) { | ||
expect(getByText(location)).toBeInTheDocument() | ||
} | ||
const wrapper = mount(<SiteMap user={user}></SiteMap>) | ||
expect(wrapper.html()).not.toContain('Admin') | ||
expect(wrapper.html()).toContain('Home') | ||
}) | ||
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
import SiteMap from './SiteMap' | ||
|
||
export default SiteMap |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
const isMemberOfOne = (user, groupNames) => | ||
user?.roles?.some((role) => groupNames.includes(role.name)) | ||
|
||
export const userAccessRequestApproved = (user) => | ||
user?.['access_request'] && user?.roles?.length > 0 | ||
|
||
export const canViewAdmin = (user) => | ||
userAccessRequestApproved(user) && | ||
isMemberOfOne(user, [ | ||
'Developer', | ||
'OFA System Admin', | ||
'ACF OCIO', | ||
'OFA Admin', | ||
]) |