diff --git a/src/assets/scss/index.scss b/src/assets/scss/index.scss index 7f6679149..14c1bd62e 100644 --- a/src/assets/scss/index.scss +++ b/src/assets/scss/index.scss @@ -43,4 +43,62 @@ $govuk-global-styles: true; .app-map { height: 500px; @include govuk-responsive-margin(6, $direction: "bottom"); -} \ No newline at end of file +} + +.task-div { + margin-bottom: 10px; + padding: 10px; +} + +.dataset-summary-grid { + display: flex; + flex-wrap: wrap; + column-gap: govuk-spacing(3); + row-gap: govuk-spacing(6); + align-items: stretch; +} + +.dataset-summary-grid .govuk-summary-card { + width: calc((100% / 3) - govuk-spacing(3)); +} + +.dataset-summary-grid .govuk-summary-card__title-wrapper { + align-items: flex-start; +} + +.dataset-status { + margin-bottom: govuk-spacing(6); + + display: flex; + column-gap: govuk-spacing(6); +} + +.dataset-status--item { + background-color: $govuk-brand-colour; + color: govuk-colour("white"); + + padding: govuk-spacing(2) govuk-spacing(3); + flex-grow: 1; + flex-basis: 0; + + @include govuk-font($size: 24, $weight: bold); +} + +.big-number { + @include govuk-font($size: 80, $weight: bold); + display: block; +} + +.planning-data-actions { + list-style: none; + margin: 0; + padding: 0; + + display: flex; + column-gap: govuk-spacing(2); +} + +code, +code * { + font-family: monospace; +} diff --git a/src/controllers/CheckAnswersController.js b/src/controllers/CheckAnswersController.js index 22766cbe6..1f5602e87 100644 --- a/src/controllers/CheckAnswersController.js +++ b/src/controllers/CheckAnswersController.js @@ -1,5 +1,5 @@ import PageController from './pageController.js' -import notifyClient from '../utils/mailClient.js' +import notifyClient from '../services/mailClient.js' import config from '../../config/index.js' const dataManagementEmail = process.env.DATA_MANAGEMENT_EMAIL || config.email.dataManagementEmail diff --git a/src/controllers/LpaOverviewController.js b/src/controllers/LpaOverviewController.js new file mode 100644 index 000000000..0a9e0c0c1 --- /dev/null +++ b/src/controllers/LpaOverviewController.js @@ -0,0 +1,42 @@ +import performanceDbApi from '../services/performanceDbApi.js' // Assume you have an API service module +import logger from '../utils/logger.js' + +const LpaOverviewController = { + async getOverview (req, res, next) { + try { + const lpa = req.params.lpa + + const response = await performanceDbApi.getLpaOverview(lpa) // Make API request + const data = response.data + + const datasets = Object.entries(data.datasets).map(([key, value]) => { + return { ...value, slug: key } + }) + const totalDatasets = datasets.length + const [datasetsWithEndpoints, datasetsWithIssues, datasetsWithErrors] = datasets.reduce((accumulator, dataset) => { + if (dataset.endpoint !== null) accumulator[0]++ + if (dataset.issue) accumulator[1]++ + if (dataset.error) accumulator[2]++ + return accumulator + }, [0, 0, 0]) + + const params = { + organisation: { + name: data.name + }, + datasets, + totalDatasets, + datasetsWithEndpoints, + datasetsWithIssues, + datasetsWithErrors + } + + res.render('manage/lpa-overview.html', params) + } catch (error) { + logger.error(error) + next(error) + } + } +} + +export default LpaOverviewController diff --git a/src/controllers/lpaDetailsController.js b/src/controllers/lpaDetailsController.js index 6301564af..6d391848f 100644 --- a/src/controllers/lpaDetailsController.js +++ b/src/controllers/lpaDetailsController.js @@ -1,5 +1,5 @@ import PageController from './pageController.js' -import { fetchLocalAuthorities } from '../utils/fetchLocalAuthorities.js' +import { fetchLocalAuthorities } from '../services/fetchLocalAuthorities.js' class LpaDetailsController extends PageController { async locals (req, res, next) { diff --git a/src/controllers/resultsController.js b/src/controllers/resultsController.js index 5c4cc7b90..8c290c735 100644 --- a/src/controllers/resultsController.js +++ b/src/controllers/resultsController.js @@ -1,5 +1,5 @@ import PageController from './pageController.js' -import { getRequestData } from '../utils/asyncRequestApi.js' +import { getRequestData } from '../services/asyncRequestApi.js' const failedFileRequestTemplate = 'results/failedFileRequest' const failedUrlRequestTemplate = 'results/failedUrlRequest' diff --git a/src/controllers/statusController.js b/src/controllers/statusController.js index e357b3abe..a5cba75ad 100644 --- a/src/controllers/statusController.js +++ b/src/controllers/statusController.js @@ -1,5 +1,5 @@ import PageController from './pageController.js' -import { getRequestData } from '../utils/asyncRequestApi.js' +import { getRequestData } from '../services/asyncRequestApi.js' import { finishedProcessingStatuses } from '../utils/utils.js' class StatusController extends PageController { diff --git a/src/controllers/submitUrlController.js b/src/controllers/submitUrlController.js index 3a06e2a43..18f4d8e94 100644 --- a/src/controllers/submitUrlController.js +++ b/src/controllers/submitUrlController.js @@ -1,5 +1,5 @@ import UploadController from './uploadController.js' -import { postUrlRequest } from '../utils/asyncRequestApi.js' +import { postUrlRequest } from '../services/asyncRequestApi.js' import { URL } from 'url' import logger from '../utils/logger.js' import axios from 'axios' diff --git a/src/controllers/uploadFileController.js b/src/controllers/uploadFileController.js index 8b464e46e..8302c3536 100644 --- a/src/controllers/uploadFileController.js +++ b/src/controllers/uploadFileController.js @@ -8,7 +8,7 @@ import multer from 'multer' import { promises as fs, createReadStream } from 'fs' import config from '../../config/index.js' import logger from '../utils/logger.js' -import { postFileRequest } from '../utils/asyncRequestApi.js' +import { postFileRequest } from '../services/asyncRequestApi.js' import { allowedFileTypes } from '../utils/utils.js' AWS.config.update({ diff --git a/src/filters/filters.js b/src/filters/filters.js index e9e8e5bd4..18c06ba93 100644 --- a/src/filters/filters.js +++ b/src/filters/filters.js @@ -4,33 +4,14 @@ import validationMessageLookup from './validationMessageLookup.js' import toErrorList from './toErrorList.js' import prettifyColumnName from './prettifyColumnName.js' import getFullServiceName from './getFullServiceName.js' +import { makeDatasetSlugToReadableNameFilter, createDatasetMapping } from './makeDatasetSlugToReadableNameFilter.js' const { govukMarkdown } = xGovFilters -/** - * - * @param {*} dataSubjects - * @returns {Map} - */ -function createDatasetMapping (dataSubjects) { - const mapping = new Map() - for (const data of Object.values(dataSubjects)) { - for (const dataset of data.dataSets) { - mapping.set(dataset.value, dataset.text) - } - } - return mapping -} - const addFilters = (nunjucksEnv, { dataSubjects }) => { const datasetNameMapping = createDatasetMapping(dataSubjects) - nunjucksEnv.addFilter('datasetSlugToReadableName', function (slug) { - const name = datasetNameMapping.get(slug) - if (!name) { - throw new Error(`Can't find a name for ${slug}`) - } - return name - }) + const datasetSlugToReadableName = makeDatasetSlugToReadableNameFilter(datasetNameMapping) + nunjucksEnv.addFilter('datasetSlugToReadableName', datasetSlugToReadableName) nunjucksEnv.addFilter('govukMarkdown', govukMarkdown) nunjucksEnv.addFilter('getkeys', getkeys) diff --git a/src/filters/makeDatasetSlugToReadableNameFilter.js b/src/filters/makeDatasetSlugToReadableNameFilter.js new file mode 100644 index 000000000..d03586697 --- /dev/null +++ b/src/filters/makeDatasetSlugToReadableNameFilter.js @@ -0,0 +1,38 @@ +/** + * Creates a filter function that takes a dataset slug as input and returns its corresponding readable name. + * The filter function uses a provided dataset name mapping to look up the readable name. + * + * @param {Map} datasetNameMapping - A map of dataset slugs to their corresponding readable names. + * @returns {(slug: string) => string} - A filter function that takes a dataset slug as input and returns its corresponding readable name. + */ +export const makeDatasetSlugToReadableNameFilter = (datasetNameMapping) => { + /** + * A filter function that takes a dataset slug as input and returns its corresponding readable name. + * + * @param {string} slug - The dataset slug to look up. + * @returns {string} - The readable name corresponding to the provided slug. + * @throws {Error} - If the provided slug is not found in the dataset name mapping. + */ + return (slug) => { + const name = datasetNameMapping.get(slug) + if (!name) { + throw new Error(`Can't find a name for ${slug}`) + } + return name + } +} + +/** + * + * @param {*} dataSubjects + * @returns {Map} + */ +export const createDatasetMapping = (dataSubjects) => { + const mapping = new Map() + for (const data of Object.values(dataSubjects)) { + for (const dataset of data.dataSets) { + mapping.set(dataset.value, dataset.text) + } + } + return mapping +} diff --git a/src/routes/api.js b/src/routes/api.js index d0ce754bd..4dc01638e 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -1,5 +1,5 @@ import express from 'express' -import { getRequestData } from '../utils/asyncRequestApi.js' +import { getRequestData } from '../services/asyncRequestApi.js' const router = express.Router() diff --git a/src/routes/manage.js b/src/routes/manage.js new file mode 100644 index 000000000..a4cb31ebd --- /dev/null +++ b/src/routes/manage.js @@ -0,0 +1,8 @@ +import express from 'express' +import LpaOverviewController from '../controllers/LpaOverviewController.js' + +const router = express.Router() + +router.get('/:lpa/overview', LpaOverviewController.getOverview) + +export default router diff --git a/src/serverSetup/routes.js b/src/serverSetup/routes.js index 7d56e5d3a..ad40b7a6b 100644 --- a/src/serverSetup/routes.js +++ b/src/serverSetup/routes.js @@ -3,6 +3,7 @@ import endpointSubmissionFormFormWisard from '../routes/form-wizard/endpoint-sub import accessibility from '../routes/accessibility.js' import polling from '../routes/api.js' import health from '../routes/health.js' +import manage from '../routes/manage.js' export function setupRoutes (app) { app.use('/', checkFormWizard) @@ -10,4 +11,5 @@ export function setupRoutes (app) { app.use('/accessibility', accessibility) app.use('/api', polling) app.use('/health', health) + app.use('/manage', manage) } diff --git a/src/utils/asyncRequestApi.js b/src/services/asyncRequestApi.js similarity index 100% rename from src/utils/asyncRequestApi.js rename to src/services/asyncRequestApi.js diff --git a/src/utils/fetchLocalAuthorities.js b/src/services/fetchLocalAuthorities.js similarity index 100% rename from src/utils/fetchLocalAuthorities.js rename to src/services/fetchLocalAuthorities.js diff --git a/src/utils/mailClient.js b/src/services/mailClient.js similarity index 100% rename from src/utils/mailClient.js rename to src/services/mailClient.js diff --git a/src/services/performanceDbApi.js b/src/services/performanceDbApi.js new file mode 100644 index 000000000..c111a15b3 --- /dev/null +++ b/src/services/performanceDbApi.js @@ -0,0 +1,47 @@ +export default { + getLpaOverview: async (lpa) => { + return { + data: { + name: 'Borechester City Council', + datasets: { + 'article-4-direction': { + endpoint: null + }, + 'article-4-direction-area': { + endpoint: null + }, + 'conservation-area': { + endpoint: 'http://conservation-area.json', + error: null, + issue: 'Endpoint has not been updated since 21 May 2023' + }, + 'conservation-area-document': { + endpoint: 'http://conservation-area-document.json', + error: null, + issue: null + }, + 'listed-building-outline': { + endpoint: 'http://listed-building-outline.json', + error: null, + issue: null + }, + tree: { + endpoint: 'http://tree.json', + error: null, + issue: 'There are 20 issues in this dataset' + }, + 'tree-preservation-order': { + endpoint: 'http://tree-preservation-order.json', + error: 'Error connecting to endpoint', + issue: null + }, + 'tree-preservation-zone': { + endpoint: 'http://tree-preservation-zone.json', + error: 'Error connecting to endpoint', + issue: null + } + } + } + } + } +} diff --git a/src/views/manage/lpa-overview.html b/src/views/manage/lpa-overview.html new file mode 100644 index 000000000..194bbe181 --- /dev/null +++ b/src/views/manage/lpa-overview.html @@ -0,0 +1,146 @@ +{% extends "layouts/main.html" %} + +{% from "govuk/components/breadcrumbs/macro.njk" import govukBreadcrumbs %} +{% from "govuk/components/tag/macro.njk" import govukTag %} + +{% set pageName = organisation.name + " overview" %} +{% set serviceType = 'Manage' %} + +{% block beforeContent %} +{{ super() }} + +{{ govukBreadcrumbs({ + items: [ + { + text: "Home", + href: "/overview/start" + }, + { + text: "Organisations", + href: "/overview/organisations" + } + ] +}) }} + +{% endblock %} + +{% block content %} + +
+
+ +

+ {{ pageName }} +

+
+
+ +
+
+
+
+ {{datasetsWithEndpoints}}/{{totalDatasets}} + datasets provided +
+ +
+ {{datasetsWithErrors}} + datasets with errors +
+ +
+ {{datasetsWithIssues}} + datasets with issues +
+
+
+
+ +
+
+ +

Datasets

+
    + + {% for dataset in datasets %} + + {% endfor %} + +
+
+
+ +
+
+

View your task list to fix and improve your datasets

+
+
+ +{% endblock %} \ No newline at end of file diff --git a/test/unit/checkAnswersController.test.js b/test/unit/checkAnswersController.test.js index f09881836..9323b253b 100644 --- a/test/unit/checkAnswersController.test.js +++ b/test/unit/checkAnswersController.test.js @@ -1,10 +1,10 @@ /* eslint-disable new-cap */ import { describe, it, vi, expect, beforeEach } from 'vitest' -import notifyClient from '../../src/utils/mailClient.js' +import notifyClient from '../../src/services/mailClient.js' import config from '../../config/index.js' -vi.mock('../../src/utils/mailClient.js') +vi.mock('../../src/services/mailClient.js') function makeRequest () { return { diff --git a/test/unit/fetchLocalAuthorities.test.js b/test/unit/fetchLocalAuthorities.test.js index 9b3c73f26..23380347d 100644 --- a/test/unit/fetchLocalAuthorities.test.js +++ b/test/unit/fetchLocalAuthorities.test.js @@ -1,6 +1,6 @@ import axios from 'axios' import { vi, it, describe, expect } from 'vitest' -import { fetchLocalAuthorities } from '../../src/utils/fetchLocalAuthorities' +import { fetchLocalAuthorities } from '../../src/services/fetchLocalAuthorities' // Mock axios.get to return a fake response vi.mock('axios') diff --git a/test/unit/lpaDetailsController.test.js b/test/unit/lpaDetailsController.test.js index 21355a83d..2d98156be 100644 --- a/test/unit/lpaDetailsController.test.js +++ b/test/unit/lpaDetailsController.test.js @@ -4,14 +4,14 @@ import PageController from '../../src/controllers/pageController.js' import { vi, it, describe, expect, beforeEach, afterEach } from 'vitest' -vi.mock('../../src/utils/fetchLocalAuthorities.js') +vi.mock('../../src/services/fetchLocalAuthorities.js') describe('lpaDetailsController', async () => { let fetchLocalAuthorities let controller beforeEach(async () => { - fetchLocalAuthorities = await import('../../src/utils/fetchLocalAuthorities') + fetchLocalAuthorities = await import('../../src/services/fetchLocalAuthorities') const LpaDetailsController = await import('../../src/controllers/lpaDetailsController.js') controller = new LpaDetailsController.default({ route: '/lpa-details' diff --git a/test/unit/lpaOverviewController.test.js b/test/unit/lpaOverviewController.test.js new file mode 100644 index 000000000..d55223d16 --- /dev/null +++ b/test/unit/lpaOverviewController.test.js @@ -0,0 +1,61 @@ +import { describe, it, vi, expect, beforeEach } from 'vitest' +import LpaOverviewController from '../../src/controllers/LpaOverviewController.js' +import performanceDbApi from '../../src/services/performanceDbApi.js' + +vi.mock('../../src/services/performanceDbApi.js') + +describe('LpaOverviewController', () => { + beforeEach(() => { + vi.resetAllMocks() + }) + + it('should render the lpa overview page', async () => { + const req = { params: { lpa: 'test-lpa' } } + const res = { render: vi.fn() } + const next = vi.fn() + + const expectedResponse = { + data: { + name: 'Test LPA', + datasets: { + dataset1: { endpoint: 'https://example.com', issue: false, error: false }, + dataset2: { endpoint: null, issue: true, error: false }, + dataset3: { endpoint: 'https://example.com', issue: false, error: true } + } + } + } + + performanceDbApi.getLpaOverview = vi.fn().mockResolvedValue(expectedResponse) + + await LpaOverviewController.getOverview(req, res, next) + + expect(res.render).toHaveBeenCalledTimes(1) + expect(res.render).toHaveBeenCalledWith('manage/lpa-overview.html', expect.objectContaining({ + organisation: { name: 'Test LPA' }, + datasets: expect.arrayContaining([ + { endpoint: 'https://example.com', issue: false, error: false, slug: 'dataset1' }, + { endpoint: null, issue: true, error: false, slug: 'dataset2' }, + { endpoint: 'https://example.com', issue: false, error: true, slug: 'dataset3' } + ]), + totalDatasets: 3, + datasetsWithEndpoints: 2, + datasetsWithIssues: 1, + datasetsWithErrors: 1 + })) + }) + + it('should catch and pass errors to the next function', async () => { + const req = { params: { lpa: 'test-lpa' } } + const res = { } + const next = vi.fn() + + const error = new Error('Test error') + + vi.mocked(performanceDbApi.getLpaOverview).mockRejectedValue(error) + + await LpaOverviewController.getOverview(req, res, next) + + expect(next).toHaveBeenCalledTimes(1) + expect(next).toHaveBeenCalledWith(error) + }) +}) diff --git a/test/unit/lpaOverviewPage.test.js b/test/unit/lpaOverviewPage.test.js new file mode 100644 index 000000000..b12efc6ba --- /dev/null +++ b/test/unit/lpaOverviewPage.test.js @@ -0,0 +1,158 @@ +import { describe, it, expect } from 'vitest' +import config from '../../config/index.js' +import nunjucks from 'nunjucks' +import addFilters from '../../src/filters/filters' +import { runGenericPageTests } from './generic-page.js' +import jsdom from 'jsdom' +import { dataSubjects } from '../../src/utils/utils.js' +import { makeDatasetSlugToReadableNameFilter, createDatasetMapping } from '../../src/filters/makeDatasetSlugToReadableNameFilter.js' + +const nunjucksEnv = nunjucks.configure([ + 'src/views', + 'src/views/check', + 'src/views/submit', + 'node_modules/govuk-frontend/dist/', + 'node_modules/@x-govuk/govuk-prototype-components/' +], { + dev: true, + noCache: true, + watch: true +}) + +addFilters(nunjucksEnv, { dataSubjects }) + +describe('LPA Overview Page', () => { + const params = { + organisation: { + name: 'mock org' + }, + serviceName: config.serviceName, + datasetsWithEndpoints: 2, + totalDatasets: 8, + datasetsWithErrors: 2, + datasetsWithIssues: 2, + datasets: [ + { + slug: 'article-4-direction', + endpoint: null + }, + { + slug: 'article-4-direction-area', + endpoint: null + }, + { + slug: 'conservation-area', + endpoint: 'http://conservation-area.json', + error: null, + issue: 'Endpoint has not been updated since 21 May 2023' + }, + { + slug: 'conservation-area-document', + endpoint: 'http://conservation-area-document.json', + error: null, + issue: null + }, + { + slug: 'listed-building-outline', + endpoint: 'http://listed-building-outline.json', + error: null, + issue: null + }, + { + slug: 'tree', + endpoint: 'http://tree.json', + error: null, + issue: 'There are 20 issues in this dataset' + }, + { + slug: 'tree-preservation-order', + endpoint: 'http://tree-preservation-order.json', + error: 'Error connecting to endpoint', + issue: null + }, + { + slug: 'tree-preservation-zone', + endpoint: 'http://tree-preservation-zone.json', + error: 'Error connecting to endpoint', + issue: null + } + ] + } + const html = nunjucks.render('manage/lpa-overview.html', params) + + const dom = new jsdom.JSDOM(html) + const document = dom.window.document + + runGenericPageTests(html, { + pageTitle: 'mock org overview - Manage planning and housing data for England', + serviceName: config.serviceName + }) + + const statsBoxes = document.querySelector('.dataset-status').children + it('Datasets provided gives the correct value', () => { + expect(statsBoxes[0].textContent).toContain('2/8') + expect(statsBoxes[0].textContent).toContain('datasets provided') + }) + + it('Datasets with errors gives the correct value', () => { + expect(statsBoxes[1].textContent).toContain('2') + expect(statsBoxes[1].textContent).toContain('datasets with errors') + }) + + it('Datasets with issues gives the correct value', () => { + expect(statsBoxes[2].textContent).toContain('2') + expect(statsBoxes[2].textContent).toContain('datasets with issues') + }) + + const datasetCards = document.querySelector('.govuk-task-list').children + it('The correct number of dataset cards are rendered with the correct titles', () => { + expect(datasetCards.length).toEqual(params.datasets.length) + + const datasetMapping = createDatasetMapping(dataSubjects) + const datasetSlugToReadableName = makeDatasetSlugToReadableNameFilter(datasetMapping) + + params.datasets.forEach((dataset, i) => { + expect(datasetCards[i].querySelector('.govuk-heading-m').textContent).toContain(datasetSlugToReadableName(dataset.slug)) + }) + }) + + it('The dataset cards are rendered with the correct hints', () => { + params.datasets.forEach((dataset, i) => { + const expectedHint = !dataset.endpoint ? 'Endpoint not provided' : dataset.error ? dataset.error : dataset.issue ? dataset.issue : 'Endpoint provided' + expect(datasetCards[i].querySelector('.govuk-task-list__hint').textContent).toContain(expectedHint) + }) + }) + + it('Renders the correct actions on each dataset card', () => { + params.datasets.forEach((dataset, i) => { + const expectedActions = [] + if (!dataset.endpoint) { + expectedActions.push({ text: 'Add endpoint', href: '/taskLists/taskChecklist' }) + } + if (dataset.error) { + expectedActions.push({ text: 'Fix errors', href: '/taskLists/taskChecklist' }) + } else if (dataset.issue) { + expectedActions.push({ text: 'Fix issues', href: '/taskLists/taskChecklist' }) + } + if (dataset.endpoint) { + expectedActions.push({ text: 'View data', href: '/taskLists/taskChecklist' }) + } + + const actions = datasetCards[i].querySelector('.planning-data-actions').children + expectedActions.forEach((expectedAction, j) => { + expect(actions[j].textContent, `expect action ${expectedAction.text} for dataset ${dataset.slug}`).toContain(expectedAction.text) + const actionLink = actions[j].querySelector('a') + expect(actionLink.href).toBe(expectedAction.href) + }) + }) + }) + + it('Renders the correct status on each dataset card', () => { + params.datasets.forEach((dataset, i) => { + const expectedHint = !dataset.endpoint ? 'Not provided' : dataset.error ? 'Error' : dataset.issue ? 'Issues' : 'No issues' + + const statusIndicator = datasetCards[i].querySelector('.govuk-task-list__status') + expect(statusIndicator.textContent).toContain(expectedHint) + }) + }) +}) diff --git a/test/unit/publishRequestAPI.test.js b/test/unit/publishRequestAPI.test.js index 70cda772e..da2001548 100644 --- a/test/unit/publishRequestAPI.test.js +++ b/test/unit/publishRequestAPI.test.js @@ -1,5 +1,5 @@ import { it, describe, expect, afterEach, vi } from 'vitest' -import { postFileRequest, postUrlRequest, getRequestData } from '../../src/utils/asyncRequestApi.js' +import { postFileRequest, postUrlRequest, getRequestData } from '../../src/services/asyncRequestApi.js' import axios from 'axios' import RequestData from '../../src/models/requestData.js' import config from '../../config/index.js' diff --git a/test/unit/resultsController.test.js b/test/unit/resultsController.test.js index 7d95eb5ea..6a2400ad8 100644 --- a/test/unit/resultsController.test.js +++ b/test/unit/resultsController.test.js @@ -2,7 +2,7 @@ import ResultsController from '../../src/controllers/resultsController.js' import { describe, it, vi, expect, beforeEach } from 'vitest' describe('ResultsController', () => { - vi.mock('@/utils/asyncRequestApi.js') + vi.mock('@/services/asyncRequestApi.js') let asyncRequestApi let resultsController @@ -14,7 +14,7 @@ describe('ResultsController', () => { } beforeEach(async () => { - asyncRequestApi = await import('@/utils/asyncRequestApi') + asyncRequestApi = await import('@/services/asyncRequestApi') resultsController = new ResultsController({ route: '/results' diff --git a/test/unit/statusController.test.js b/test/unit/statusController.test.js index 192801751..d5ceaea50 100644 --- a/test/unit/statusController.test.js +++ b/test/unit/statusController.test.js @@ -2,13 +2,13 @@ import StatusController from '../../src/controllers/statusController.js' import { describe, it, vi, expect, beforeEach } from 'vitest' describe('StatusController', () => { - vi.mock('@/utils/asyncRequestApi.js') + vi.mock('@/services/asyncRequestApi.js') let asyncRequestApi let statusController beforeEach(async () => { - asyncRequestApi = await import('@/utils/asyncRequestApi') + asyncRequestApi = await import('@/services/asyncRequestApi') statusController = new StatusController({ route: '/status' diff --git a/test/unit/submitUrlController.test.js b/test/unit/submitUrlController.test.js index 6b31e205c..6f84397f1 100644 --- a/test/unit/submitUrlController.test.js +++ b/test/unit/submitUrlController.test.js @@ -3,7 +3,7 @@ import { describe, it, expect, vi, beforeEach } from 'vitest' import SubmitUrlController from '../../src/controllers/submitUrlController.js' describe('SubmitUrlController', async () => { - vi.mock('@/utils/asyncRequestApi.js') + vi.mock('@/services/asyncRequestApi.js') let submitUrlController let asyncRequestApi @@ -23,7 +23,7 @@ describe('SubmitUrlController', async () => { }) beforeEach(async () => { - asyncRequestApi = await import('@/utils/asyncRequestApi') + asyncRequestApi = await import('@/services/asyncRequestApi') asyncRequestApi.postUrlRequest = vi.fn() submitUrlController = new SubmitUrlController({ diff --git a/test/unit/uploadFileController.test.js b/test/unit/uploadFileController.test.js index beff51f62..2ae08dd76 100644 --- a/test/unit/uploadFileController.test.js +++ b/test/unit/uploadFileController.test.js @@ -6,7 +6,7 @@ describe('UploadFileController', () => { let uploadFileController let asyncRequestApi - vi.mock('@/utils/asyncRequestApi.js') + vi.mock('@/services/asyncRequestApi.js') vi.mock('fs', async () => { const actual = await vi.importActual('fs') @@ -36,7 +36,7 @@ describe('UploadFileController', () => { }) beforeEach(async () => { - asyncRequestApi = await import('@/utils/asyncRequestApi') + asyncRequestApi = await import('@/services/asyncRequestApi') asyncRequestApi.postFileRequest = vi.fn().mockResolvedValue('1234') uploadFileController = new UploadFileController({