Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions src/middleware/lpa-overview.middleware.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ const fetchEntityCounts = fetchOneFromAllDatasets({
* @param {string} [dataset.endpoint] - Optional endpoint URL
* @param {string} dataset.status - Dataset status
* @param {number} dataset.endpointCount - Number of endpoints
* @param {number} dataset.endpointErrorCount - Number of endpoints with error
* @param {number} dataset.issueCount - Number of issues
* @returns {number[]} Updated accumulator
*/
const orgStatsReducer = (accumulator, dataset) => {
Expand Down Expand Up @@ -214,6 +216,7 @@ export function prepareDatasetObjects (req, res, next) {
}

const endpointCount = datasetEndpoints.length
const endpointErrorCount = datasetEndpoints.filter(endpoint => endpoint.latest_status !== '200').length
const allError = datasetEndpoints.every(endpoint => endpoint.latest_status !== '200')
const someError = datasetEndpoints.some(endpoint => endpoint.latest_status !== '200')
const httpStatus = allError ? datasetEndpoints[0]?.latest_status : undefined
Expand All @@ -230,7 +233,7 @@ export function prepareDatasetObjects (req, res, next) {
status = 'Live'
}

return { dataset, error, issueCount, status, endpointCount }
return { dataset, error, issueCount, status, endpointCount, endpointErrorCount }
})

next()
Expand Down Expand Up @@ -259,7 +262,6 @@ export function prepareOverviewTemplateParams (req, res, next) {
for (const provision of provisions ?? []) {
provisionData.set(provision.dataset, provision)
}

// add in any of the missing key 8 datasets
const keys = new Set(datasets.map(d => d.dataset))
availableDatasets.forEach((dataset) => {
Expand All @@ -276,10 +278,8 @@ export function prepareOverviewTemplateParams (req, res, next) {
})

const isODPMember = provisions.findIndex((p) => p.project === 'open-digital-planning') >= 0

const totalDatasets = datasets.length
const [datasetsWithEndpoints, datasetsWithIssues, datasetsWithErrors] = datasets.reduce(orgStatsReducer, [0, 0, 0])

const datasetsByReason = _.groupBy(datasets, (ds) => {
const reason = provisionData.get(ds.dataset)?.provision_reason
switch (reason) {
Expand Down
3 changes: 2 additions & 1 deletion src/routes/schemas.js
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,8 @@ const DatasetItem = v.strictObject({
project: v.optional(v.string()),
// synthetic entry, represents a user friendly count (e.g. count missing value in a column as 1 issue)
numIssues: v.optional(v.number()),
notice: v.optional(DeadlineNoticeField)
notice: v.optional(DeadlineNoticeField),
endpointErrorCount: v.optional(v.number())
})

export const OrgOverviewPage = v.strictObject({
Expand Down
5 changes: 3 additions & 2 deletions src/views/organisations/overview.html
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ <h3 class="govuk-heading-m">
<p>{{ dataset.error }}</p>
{% endif %}
{% elif dataset.status == 'Needs fixing' %}
<p>There {{ "is" | pluralise(dataset.issueCount) }} {{ dataset.issueCount }} {{ "issue" | pluralise(dataset.issueCount) }} in this dataset</p>
{% set totalIssues = (dataset.issueCount or 0) + (dataset.endpointErrorCount or 0) %}
<p>There {{ "is" | pluralise(totalIssues) }} {{ totalIssues }} {{ "issue" | pluralise(totalIssues) }} in this dataset</p>
{% else %}
<p>Endpoint URL submitted</p>
{% endif %}
Expand Down Expand Up @@ -111,7 +112,7 @@ <h1 class="govuk-heading-xl">

<div class="dataset-status--item">
<span class="big-number">{{datasetsWithErrors}}</span>
endpoint URL{{ "s" if (datasetsWithErrors != 1) }} with errors
dataset{{ "s" if (datasetsWithErrors != 1) }} with endpoint errors
</div>

<div class="dataset-status--item">
Expand Down
48 changes: 40 additions & 8 deletions test/unit/middleware/lpa-overview.middleware.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,28 +30,32 @@ const reqTemplate = {
issueCount: 0,
endpointCount: 1,
error: undefined,
status: 'Live'
status: 'Live',
endpointErrorCount: 0
},
{
dataset: 'dataset2',
issueCount: 0,
endpointCount: 0,
error: undefined,
status: 'Needs fixing'
status: 'Needs fixing',
endpointErrorCount: 0
},
{
dataset: 'dataset3',
issueCount: 0,
endpointCount: 1,
error: undefined,
status: 'Error'
status: 'Error',
endpointErrorCount: 1
},
{
dataset: 'dataset4',
issueCount: 0,
endpointCount: 0,
error: 'There was a 404 error',
status: 'Error'
status: 'Error',
endpointErrorCount: 1
}

],
Expand Down Expand Up @@ -80,6 +84,7 @@ describe('lpa-overview.middleware', () => {
describe('prepareOverviewTemplateParams', () => {
it('should render the overview page', async () => {
const req = structuredClone(reqTemplate)
req.datasets[1].issueCount = 1
const res = { render: vi.fn() }

prepareOverviewTemplateParams(req, res, () => { })
Expand All @@ -88,12 +93,12 @@ describe('lpa-overview.middleware', () => {
organisation: { name: 'Example LPA', organisation: 'LPA' },
datasets: {
statutory: expect.arrayContaining([
{ endpointCount: 1, status: 'Live', dataset: 'dataset1', error: undefined, issueCount: 0 },
{ endpointCount: 1, status: 'Error', dataset: 'dataset3', error: undefined, issueCount: 0 }
{ endpointCount: 1, status: 'Live', dataset: 'dataset1', error: undefined, issueCount: 0, endpointErrorCount: 0 },
{ endpointCount: 1, status: 'Error', dataset: 'dataset3', error: undefined, issueCount: 0, endpointErrorCount: 1 }
]),
other: expect.arrayContaining([
{ endpointCount: 0, status: 'Needs fixing', dataset: 'dataset2', error: undefined, issueCount: 0 },
{ endpointCount: 0, status: 'Error', dataset: 'dataset4', error: 'There was a 404 error', issueCount: 0 }
{ endpointCount: 0, status: 'Needs fixing', dataset: 'dataset2', error: undefined, issueCount: 1, endpointErrorCount: 0 },
{ endpointCount: 0, status: 'Error', dataset: 'dataset4', error: 'There was a 404 error', issueCount: 0, endpointErrorCount: 1 }
])
},
totalDatasets: 4,
Expand Down Expand Up @@ -138,6 +143,33 @@ describe('lpa-overview.middleware', () => {
expect(ds4.status).toBe('Error')
expect(ds4.error).toBe(req.datasets[3].error) // Error message should be left untouched
})

it('should display a combined count of issues and endpoint errors in the dataset', () => {
const req = structuredClone(reqTemplate)
req.datasets[1].issueCount = 1
req.datasets[1].endpointErrorCount = 2
const res = { render: vi.fn() }

prepareOverviewTemplateParams(req, res, () => { })

const { doc } = getRenderedErrorCards(req.templateParams)
const hint = doc.querySelector('[data-dataset-status="Needs fixing"] .govuk-task-list__hint')

expect(hint?.textContent.trim()).toBe('There are 3 issues in this dataset')
})

it('should display a count of issue when there is only one issue', () => {
const req = structuredClone(reqTemplate)
req.datasets[1].issueCount = 1
const res = { render: vi.fn() }

prepareOverviewTemplateParams(req, res, () => { })

const { doc } = getRenderedErrorCards(req.templateParams)
const hint = doc.querySelector('[data-dataset-status="Needs fixing"] .govuk-task-list__hint')

expect(hint?.textContent.trim()).toBe('There is 1 issue in this dataset')
})
})

describe('prepareDatasetObjects()', () => {
Expand Down
2 changes: 1 addition & 1 deletion test/unit/views/organisations/lpaOverviewPage.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ describe(`LPA Overview Page (seed: ${seed})`, () => {

it('Datasets with errors gives the correct value', () => {
expect(statsBoxes[1].textContent).toContain(params.datasetsWithErrors)
expect(statsBoxes[1].textContent).toMatch(/endpoint URLs? with errors/)
expect(statsBoxes[1].textContent).toMatch(/datasets? with endpoint errors/)
})

it('Datasets with issues gives the correct value', () => {
Expand Down