115 lines
3.1 KiB
JavaScript
115 lines
3.1 KiB
JavaScript
import { describe, it, expect, vi } from 'vitest'
|
|
import { mount } from '@vue/test-utils'
|
|
import WardTable from '@/components/ward/WardTable.vue'
|
|
|
|
const { mockPush } = vi.hoisted(() => ({
|
|
mockPush: vi.fn(),
|
|
}))
|
|
|
|
vi.mock('vue-router', () => ({
|
|
useRouter: () => ({ push: mockPush }),
|
|
}))
|
|
|
|
const patients = [
|
|
{
|
|
encounterId: 'enc-1',
|
|
firstName: 'Alice',
|
|
lastName: 'A',
|
|
mrn: 'M1',
|
|
roomBed: '101',
|
|
status: 'Active',
|
|
news2Score: 3,
|
|
sofaScore: 4,
|
|
sofaDelta: 0,
|
|
gcsScore: 15,
|
|
qsofaScore: 0,
|
|
attendingPhysician: 'Dr. A',
|
|
admittedAt: '2026-06-21T10:00:00Z',
|
|
lastObservationAt: '2026-06-23T13:00:00Z',
|
|
sepsisActive: false,
|
|
openAlertCount: 0,
|
|
},
|
|
{
|
|
encounterId: 'enc-2',
|
|
firstName: 'Bob',
|
|
lastName: 'B',
|
|
mrn: 'M2',
|
|
roomBed: '102',
|
|
status: 'Active',
|
|
news2Score: 5,
|
|
sofaScore: 6,
|
|
sofaDelta: 1,
|
|
gcsScore: 12,
|
|
qsofaScore: 1,
|
|
attendingPhysician: 'Dr. B',
|
|
admittedAt: '2026-06-22T10:00:00Z',
|
|
lastObservationAt: '2026-06-23T10:00:00Z',
|
|
sepsisActive: false,
|
|
openAlertCount: 1,
|
|
},
|
|
{
|
|
encounterId: 'enc-3',
|
|
firstName: 'Carol',
|
|
lastName: 'C',
|
|
mrn: 'M3',
|
|
roomBed: '103',
|
|
status: 'Active',
|
|
news2Score: 8,
|
|
sofaScore: 10,
|
|
sofaDelta: 2,
|
|
gcsScore: 8,
|
|
qsofaScore: 2,
|
|
attendingPhysician: 'Dr. C',
|
|
admittedAt: '2026-06-20T10:00:00Z',
|
|
lastObservationAt: '2026-06-23T08:00:00Z',
|
|
sepsisActive: true,
|
|
openAlertCount: 3,
|
|
},
|
|
]
|
|
|
|
describe('WardTable', () => {
|
|
const sortProps = {
|
|
sortField: 'news2Score',
|
|
sortDirection: 'desc',
|
|
}
|
|
|
|
it('rendersAllPatientRows', () => {
|
|
const wrapper = mount(WardTable, { props: { patients, ...sortProps } })
|
|
expect(wrapper.findAll('tbody tr')).toHaveLength(3)
|
|
})
|
|
|
|
it('emitsClickWithEncounterId', async () => {
|
|
mockPush.mockClear()
|
|
const wrapper = mount(WardTable, { props: { patients, ...sortProps } })
|
|
await wrapper.findAll('tbody tr')[2].trigger('click')
|
|
expect(mockPush).toHaveBeenCalledWith({
|
|
name: 'PatientDetail',
|
|
params: { encounterId: 'enc-3' },
|
|
})
|
|
})
|
|
|
|
it('showsCriticalBadgeForHighNews2', () => {
|
|
const wrapper = mount(WardTable, { props: { patients, ...sortProps } })
|
|
const highRiskRow = wrapper.findAll('tbody tr')[2]
|
|
expect(highRiskRow.html()).toContain('text-severity-critical')
|
|
})
|
|
|
|
it('showsExtendedClinicalColumns', () => {
|
|
const wrapper = mount(WardTable, { props: { patients, ...sortProps } })
|
|
const header = wrapper.find('thead').text()
|
|
expect(header).toContain('SOFA')
|
|
expect(header).toContain('GCS')
|
|
expect(header).toContain('Department')
|
|
expect(header).toContain('Last vitals')
|
|
expect(wrapper.text()).toContain('Dr. C')
|
|
expect(wrapper.text()).toContain('Δ+2')
|
|
})
|
|
|
|
it('emitsSortWhenHeaderClicked', async () => {
|
|
const wrapper = mount(WardTable, { props: { patients, ...sortProps } })
|
|
const roomHeader = wrapper.findAll('thead button').find(button => button.text().includes('Room'))
|
|
await roomHeader.trigger('click')
|
|
expect(wrapper.emitted('sort')).toEqual([['roomBed']])
|
|
})
|
|
})
|