Skip to content

Commit

Permalink
Merge branch 'master' into feat-HospitalRun#1969
Browse files Browse the repository at this point in the history
  • Loading branch information
HospitalRun Bot committed Jun 7, 2020
2 parents 10f5c77 + f3b3c7f commit abcf92c
Show file tree
Hide file tree
Showing 2 changed files with 206 additions and 72 deletions.
116 changes: 116 additions & 0 deletions src/__tests__/components/Sidebar.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,33 @@ import createMockStore from 'redux-mock-store'
import thunk from 'redux-thunk'

import Sidebar from '../../components/Sidebar'
import Permissions from '../../model/Permissions'
import { RootState } from '../../store'

const mockStore = createMockStore<RootState, any>([thunk])

describe('Sidebar', () => {
let history = createMemoryHistory()
const allPermissions = [
Permissions.ReadPatients,
Permissions.WritePatients,
Permissions.ReadAppointments,
Permissions.WriteAppointments,
Permissions.DeleteAppointment,
Permissions.AddAllergy,
Permissions.AddDiagnosis,
Permissions.RequestLab,
Permissions.CancelLab,
Permissions.CompleteLab,
Permissions.ViewLab,
Permissions.ViewLabs,
Permissions.ViewIncidents,
Permissions.ViewIncident,
Permissions.ReportIncident,
]
const store = mockStore({
components: { sidebarCollapsed: false },
user: { permissions: allPermissions },
} as any)
const setup = (location: string) => {
history = createMemoryHistory()
Expand All @@ -32,6 +51,23 @@ describe('Sidebar', () => {
)
}

const setupNoPermissions = (location: string) => {
history = createMemoryHistory()
history.push(location)
return mount(
<Router history={history}>
<Provider
store={mockStore({
components: { sidebarCollapsed: false },
user: { permissions: [] },
} as any)}
>
<Sidebar />
</Provider>
</Router>,
)
}

describe('dashboard links', () => {
it('should render the dashboard link', () => {
const wrapper = setup('/')
Expand Down Expand Up @@ -80,6 +116,16 @@ describe('Sidebar', () => {
expect(listItems.at(3).text().trim()).toEqual('patients.newPatient')
})

it('should not render the new_patient link when the user does not have write patient privileges', () => {
const wrapper = setupNoPermissions('/patients')

const listItems = wrapper.find(ListItem)

listItems.forEach((_, i) => {
expect(listItems.at(i).text().trim()).not.toEqual('patients.newPatient')
})
})

it('should render the patients_list link', () => {
const wrapper = setup('/patients')

Expand All @@ -88,6 +134,16 @@ describe('Sidebar', () => {
expect(listItems.at(4).text().trim()).toEqual('patients.patientsList')
})

it('should not render the patients_list link when the user does not have read patient privileges', () => {
const wrapper = setupNoPermissions('/patients')

const listItems = wrapper.find(ListItem)

listItems.forEach((_, i) => {
expect(listItems.at(i).text().trim()).not.toEqual('patients.patientsList')
})
})

it('main patients link should be active when the current path is /patients', () => {
const wrapper = setup('/patients')

Expand Down Expand Up @@ -169,6 +225,16 @@ describe('Sidebar', () => {
expect(listItems.at(4).text().trim()).toEqual('scheduling.appointments.new')
})

it('should not render the new appointment link when the user does not have write appointments privileges', () => {
const wrapper = setupNoPermissions('/appointments')

const listItems = wrapper.find(ListItem)

listItems.forEach((_, i) => {
expect(listItems.at(i).text().trim()).not.toEqual('scheduling.appointments.new')
})
})

it('should render the appointments schedule link', () => {
const wrapper = setup('/appointments')

Expand All @@ -177,6 +243,16 @@ describe('Sidebar', () => {
expect(listItems.at(5).text().trim()).toEqual('scheduling.appointments.schedule')
})

it('should not render the appointments schedule link when the user does not have read appointments privileges', () => {
const wrapper = setupNoPermissions('/appointments')

const listItems = wrapper.find(ListItem)

listItems.forEach((_, i) => {
expect(listItems.at(i).text().trim()).not.toEqual('scheduling.appointments.schedule')
})
})

it('main scheduling link should be active when the current path is /appointments', () => {
const wrapper = setup('/appointments')

Expand Down Expand Up @@ -258,6 +334,16 @@ describe('Sidebar', () => {
expect(listItems.at(5).text().trim()).toEqual('labs.requests.new')
})

it('should not render the new labs request link when user does not have request labs privileges', () => {
const wrapper = setupNoPermissions('/labs')

const listItems = wrapper.find(ListItem)

listItems.forEach((_, i) => {
expect(listItems.at(i).text().trim()).not.toEqual('labs.requests.new')
})
})

it('should render the labs list link', () => {
const wrapper = setup('/labs')

Expand All @@ -266,6 +352,16 @@ describe('Sidebar', () => {
expect(listItems.at(6).text().trim()).toEqual('labs.requests.label')
})

it('should not render the labs list link when user does not have view labs privileges', () => {
const wrapper = setupNoPermissions('/labs')

const listItems = wrapper.find(ListItem)

listItems.forEach((_, i) => {
expect(listItems.at(i).text().trim()).not.toEqual('labs.requests.label')
})
})

it('main labs link should be active when the current path is /labs', () => {
const wrapper = setup('/labs')

Expand Down Expand Up @@ -347,6 +443,16 @@ describe('Sidebar', () => {
expect(listItems.at(6).text().trim()).toEqual('incidents.reports.new')
})

it('should not render the new incident report link when user does not have the report incidents privileges', () => {
const wrapper = setupNoPermissions('/incidents')

const listItems = wrapper.find(ListItem)

listItems.forEach((_, i) => {
expect(listItems.at(i).text().trim()).not.toEqual('incidents.reports.new')
})
})

it('should render the incidents list link', () => {
const wrapper = setup('/incidents')

Expand All @@ -355,6 +461,16 @@ describe('Sidebar', () => {
expect(listItems.at(7).text().trim()).toEqual('incidents.reports.label')
})

it('should not render the incidents list link when user does not have the view incidents privileges', () => {
const wrapper = setupNoPermissions('/incidents')

const listItems = wrapper.find(ListItem)

listItems.forEach((_, i) => {
expect(listItems.at(i).text().trim()).not.toEqual('incidents.reports.label')
})
})

it('main incidents link should be active when the current path is /incidents', () => {
const wrapper = setup('/incidents')

Expand Down
162 changes: 90 additions & 72 deletions src/components/Sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@ import { useTranslation } from 'react-i18next'
import { useSelector, useDispatch } from 'react-redux'
import { useLocation, useHistory } from 'react-router-dom'

import Permissions from '../model/Permissions'
import { RootState } from '../store'
import { updateSidebar } from './component-slice'

const Sidebar = () => {
const dispatch = useDispatch()
const { sidebarCollapsed } = useSelector((state: RootState) => state.components)
const permissions = useSelector((state: RootState) => state.user.permissions)

const { t } = useTranslation()
const path = useLocation()
Expand Down Expand Up @@ -118,24 +120,28 @@ const Sidebar = () => {
</ListItem>
{splittedPath[1].includes('patient') && expandedItem === 'patient' && (
<List layout="flush">
<ListItem
className="nav-item"
style={listSubItemStyleNew}
onClick={() => navigateTo('/patients/new')}
active={splittedPath[1].includes('patients') && splittedPath.length > 2}
>
<Icon icon="patient-add" style={iconMargin} />
{!sidebarCollapsed && t('patients.newPatient')}
</ListItem>
<ListItem
className="nav-item"
style={listSubItemStyle}
onClick={() => navigateTo('/patients')}
active={splittedPath[1].includes('patients') && splittedPath.length < 3}
>
<Icon icon="incident" style={iconMargin} />
{!sidebarCollapsed && t('patients.patientsList')}
</ListItem>
{permissions.includes(Permissions.WritePatients) && (
<ListItem
className="nav-item"
style={listSubItemStyleNew}
onClick={() => navigateTo('/patients/new')}
active={splittedPath[1].includes('patients') && splittedPath.length > 2}
>
<Icon icon="patient-add" style={iconMargin} />
{!sidebarCollapsed && t('patients.newPatient')}
</ListItem>
)}
{permissions.includes(Permissions.ReadPatients) && (
<ListItem
className="nav-item"
style={listSubItemStyle}
onClick={() => navigateTo('/patients')}
active={splittedPath[1].includes('patients') && splittedPath.length < 3}
>
<Icon icon="incident" style={iconMargin} />
{!sidebarCollapsed && t('patients.patientsList')}
</ListItem>
)}
</List>
)}
</>
Expand Down Expand Up @@ -164,24 +170,28 @@ const Sidebar = () => {
</ListItem>
{splittedPath[1].includes('appointment') && expandedItem === 'appointment' && (
<List layout="flush" className="nav flex-column">
<ListItem
className="nav-item"
style={listSubItemStyleNew}
onClick={() => navigateTo('/appointments/new')}
active={splittedPath[1].includes('appointments') && splittedPath.length > 2}
>
<Icon icon="appointment-add" style={iconMargin} />
{!sidebarCollapsed && t('scheduling.appointments.new')}
</ListItem>
<ListItem
className="nav-item"
style={listSubItemStyle}
onClick={() => navigateTo('/appointments')}
active={splittedPath[1].includes('appointments') && splittedPath.length < 3}
>
<Icon icon="incident" style={iconMargin} />
{!sidebarCollapsed && t('scheduling.appointments.schedule')}
</ListItem>
{permissions.includes(Permissions.WriteAppointments) && (
<ListItem
className="nav-item"
style={listSubItemStyleNew}
onClick={() => navigateTo('/appointments/new')}
active={splittedPath[1].includes('appointments') && splittedPath.length > 2}
>
<Icon icon="appointment-add" style={iconMargin} />
{!sidebarCollapsed && t('scheduling.appointments.new')}
</ListItem>
)}
{permissions.includes(Permissions.ReadAppointments) && (
<ListItem
className="nav-item"
style={listSubItemStyle}
onClick={() => navigateTo('/appointments')}
active={splittedPath[1].includes('appointments') && splittedPath.length < 3}
>
<Icon icon="incident" style={iconMargin} />
{!sidebarCollapsed && t('scheduling.appointments.schedule')}
</ListItem>
)}
</List>
)}
</>
Expand Down Expand Up @@ -210,24 +220,28 @@ const Sidebar = () => {
</ListItem>
{splittedPath[1].includes('labs') && expandedItem === 'labs' && (
<List layout="flush" className="nav flex-column">
<ListItem
className="nav-item"
style={listSubItemStyleNew}
onClick={() => navigateTo('/labs/new')}
active={splittedPath[1].includes('labs') && splittedPath.length > 2}
>
<Icon icon="add" style={iconMargin} />
{!sidebarCollapsed && t('labs.requests.new')}
</ListItem>
<ListItem
className="nav-item"
style={listSubItemStyle}
onClick={() => navigateTo('/labs')}
active={splittedPath[1].includes('labs') && splittedPath.length < 3}
>
<Icon icon="incident" style={iconMargin} />
{!sidebarCollapsed && t('labs.requests.label')}
</ListItem>
{permissions.includes(Permissions.RequestLab) && (
<ListItem
className="nav-item"
style={listSubItemStyleNew}
onClick={() => navigateTo('/labs/new')}
active={splittedPath[1].includes('labs') && splittedPath.length > 2}
>
<Icon icon="add" style={iconMargin} />
{!sidebarCollapsed && t('labs.requests.new')}
</ListItem>
)}
{permissions.includes(Permissions.ViewLabs) && (
<ListItem
className="nav-item"
style={listSubItemStyle}
onClick={() => navigateTo('/labs')}
active={splittedPath[1].includes('labs') && splittedPath.length < 3}
>
<Icon icon="incident" style={iconMargin} />
{!sidebarCollapsed && t('labs.requests.label')}
</ListItem>
)}
</List>
)}
</>
Expand Down Expand Up @@ -256,24 +270,28 @@ const Sidebar = () => {
</ListItem>
{splittedPath[1].includes('incidents') && expandedItem === 'incidents' && (
<List layout="flush" className="nav flex-column">
<ListItem
className="nav-item"
style={listSubItemStyleNew}
onClick={() => navigateTo('/incidents/new')}
active={splittedPath[1].includes('incidents') && splittedPath.length > 2}
>
<Icon icon="add" style={iconMargin} />
{!sidebarCollapsed && t('incidents.reports.new')}
</ListItem>
<ListItem
className="nav-item"
style={listSubItemStyle}
onClick={() => navigateTo('/incidents')}
active={splittedPath[1].includes('incidents') && splittedPath.length < 3}
>
<Icon icon="incident" style={iconMargin} />
{!sidebarCollapsed && t('incidents.reports.label')}
</ListItem>
{permissions.includes(Permissions.ReportIncident) && (
<ListItem
className="nav-item"
style={listSubItemStyleNew}
onClick={() => navigateTo('/incidents/new')}
active={splittedPath[1].includes('incidents') && splittedPath.length > 2}
>
<Icon icon="add" style={iconMargin} />
{!sidebarCollapsed && t('incidents.reports.new')}
</ListItem>
)}
{permissions.includes(Permissions.ViewIncidents) && (
<ListItem
className="nav-item"
style={listSubItemStyle}
onClick={() => navigateTo('/incidents')}
active={splittedPath[1].includes('incidents') && splittedPath.length < 3}
>
<Icon icon="incident" style={iconMargin} />
{!sidebarCollapsed && t('incidents.reports.label')}
</ListItem>
)}
</List>
)}
</>
Expand Down

0 comments on commit abcf92c

Please sign in to comment.