UNPKG

@ministryofjustice/hmpps-digital-prison-reporting-frontend

Version:

The Digital Prison Reporting Frontend contains templates and code to help display data effectively in UI applications.

149 lines (125 loc) 4.75 kB
/* eslint-disable prefer-destructuring */ /* eslint-disable @typescript-eslint/no-explicit-any */ import { Response, Request } from 'express' import { Url } from 'url' import { Services } from '../../../../../types/Services' // Clients import MockDashboardClient from '../../../../../../../test-app/mocks/mockClients/dashboards/mock-client' import DashboardClient from '../../../../../data/dashboardClient' // Utils import DashboardUtils from './utils' import UserReportsUtils from '../../../../../components/user-reports/utils' // Services import { BookmarkService, ReportingService, RequestedReportService, RecentlyViewedStoreService, DashboardService, } from '../../../../../services' // Mocks import MockDashboardRequestData from '../../../../../../../test-app/mocks/mockClients/store/mockRequestedDashboardData' import MockDefinitions from '../../../../../../../test-app/mocks/mockClients/reports/mockReportDefinition' import { RequestedReport } from '../../../../../types/UserReports' import { ChartCardData } from '../../../../../types/Charts' import { FilterValue } from '../../../../../components/_filters/types' jest.mock('parseurl', () => ({ __esModule: true, default: jest.fn().mockImplementation(() => ({ pathname: 'pathname', search: 'search' } as Url)), })) describe('DashboardUtils', () => { let req: Request let res: Response describe('renderAsyncDashboard', () => { let dashboardClient: DashboardClient let dashboardService: DashboardService let services: Services let recentlyViewedService: RecentlyViewedStoreService let requestedReportService: RequestedReportService let reportingService: ReportingService let bookmarkService: BookmarkService let updateLastViewedSpy: jest.SpyInstance< Promise<void>, [ { req: Request services: Services reportStateData: RequestedReport userId: string search: string href: string filters: FilterValue[] }, ], any > beforeEach(() => { jest.clearAllMocks() jest.spyOn(UserReportsUtils, 'updateLastViewed').mockResolvedValue(null) dashboardClient = new MockDashboardClient() as unknown as DashboardClient dashboardService = new DashboardService(dashboardClient) recentlyViewedService = { setRecentlyViewed: jest.fn(), } as unknown as RecentlyViewedStoreService requestedReportService = { getReportByTableId: jest.fn().mockResolvedValue(MockDashboardRequestData.readyDashboard), updateLastViewed: jest.fn(), } as unknown as RequestedReportService reportingService = { getDefinitions: jest.fn().mockResolvedValue(MockDefinitions.reports), } as unknown as ReportingService bookmarkService = { isBookmarked: jest.fn().mockResolvedValue(true), } as unknown as BookmarkService updateLastViewedSpy = jest.spyOn(UserReportsUtils, 'updateLastViewed').mockResolvedValue(null) req = { params: { reportId: 'mock-dashboards', id: 'test-dashboard-8', }, query: { 'filters.establishment_id': 'MDI', }, } as unknown as Request res = { locals: { user: { token: 'ToK3n', uuid: 'Us3rId', }, }, } as unknown as Response services = { dashboardService, requestedReportService, recentlyViewedService, reportingService, bookmarkService, } as unknown as Services }) it('should return the data to render a dashboard', async () => { const result = await DashboardUtils.renderAsyncDashboard({ req, res, services, }) expect(result.dashboardData.name).toEqual('Test Dashboard') expect(result.dashboardData.description).toEqual('Dashboard used for testing testing') expect(result.dashboardData.sections.length).toEqual(7) expect(result.dashboardData.sections[0].title).toEqual('Section 1 - Ethnicity charts') expect(result.dashboardData.sections[1].title).toEqual('Section 2 - Nationality charts') expect(result.dashboardData.sections[2].title).toEqual('Section 3 - Religion charts') const chartData = result.dashboardData.sections[0].visualisations[0].data as ChartCardData expect(chartData.chart.type).toEqual('bar') expect(chartData.table.head.length).toEqual(3) }) it('should mark the dashboard as recently viewed', async () => { await DashboardUtils.renderAsyncDashboard({ req, res, services, }) expect(updateLastViewedSpy).toHaveBeenCalledTimes(1) }) }) })