From 408d32649f6593b36da142edcc53e98e2da994ec Mon Sep 17 00:00:00 2001 From: Ben Topping Date: Thu, 17 Oct 2024 15:12:42 +0100 Subject: [PATCH] feat(qcResultsUpload): moves QcResultsUpload components and service to v2 api --- .../qcResultsUpload/QcResultsUploadForm.vue | 21 +++--- src/services/traction/QcResultsUpload.js | 27 +++++--- .../specs/visit_qc_results_upload_page.cy.js | 4 -- tests/factories/QcResultUploadFactory.js | 27 ++++++++ .../QcResultsUploadForm.spec.js | 13 ++-- .../services/traction/QcResultsUpload.spec.js | 67 ++++++++----------- 6 files changed, 92 insertions(+), 67 deletions(-) create mode 100644 tests/factories/QcResultUploadFactory.js diff --git a/src/components/qcResultsUpload/QcResultsUploadForm.vue b/src/components/qcResultsUpload/QcResultsUploadForm.vue index 1116a4e8f..26f333eeb 100644 --- a/src/components/qcResultsUpload/QcResultsUploadForm.vue +++ b/src/components/qcResultsUpload/QcResultsUploadForm.vue @@ -75,7 +75,7 @@ export default { }, computed: { api() { - return this.$store.getters.api.v1 + return this.$store.getters.api.v2 }, qcResultUploadsRequest: ({ api }) => api.traction.qc_results_uploads.create, border() { @@ -113,17 +113,18 @@ export default { this.busy = true this.disableUpload = true - try { - const csv = await this.file.text() - const data = { csv: csv, usedBySelected: this.usedBySelected } - await createQcResultsUploadResource(this.qcResultUploadsRequest, data) - this.uploadSuccessful = true + const csv = await this.file.text() + const data = { csv: csv, usedBySelected: this.usedBySelected } + const { success, errors } = await createQcResultsUploadResource( + this.qcResultUploadsRequest, + data, + ) + this.uploadSuccessful = success + if (success) { this.showAlert(`Successfully imported: ${this.file.name}`, 'success') - } catch (e) { - this.uploadSuccessful = false - - this.showAlert(e, 'danger') + } else { + this.showAlert(errors || 'Unable to upload QC File', 'danger') } this.busy = false }, diff --git a/src/services/traction/QcResultsUpload.js b/src/services/traction/QcResultsUpload.js index ba6cf1ae0..a109867be 100644 --- a/src/services/traction/QcResultsUpload.js +++ b/src/services/traction/QcResultsUpload.js @@ -1,10 +1,21 @@ -import { handleResponse } from '@/api/v1/ResponseHelper' -/* - UPDATE -*/ +import { handleResponse } from '@/api/v2/ResponseHelper' +/** + * Creates a QC results upload resource. + * + * @param {Function} request - The request function to be called. + * @param {Object} params - The parameters for the request. + * @param {string} params.csv - The CSV data to be uploaded. + * @param {boolean} params.usedBySelected - Indicates if the resource is used by the selected entity. + * @returns {Promise} The data from the response if successful. + * @throws {Object} The errors from the response if unsuccessful. + */ const createQcResultsUploadResource = async (request, { csv, usedBySelected }) => { - const { success, data, errors } = await handleResponse( + const { + success, + body: { data = {} }, + errors = [], + } = await handleResponse( request({ data: { data: { @@ -18,10 +29,6 @@ const createQcResultsUploadResource = async (request, { csv, usedBySelected }) = }), ) - if (success) { - return data - } else { - throw errors - } + return { success, data, errors } } export { createQcResultsUploadResource } diff --git a/tests/e2e/specs/visit_qc_results_upload_page.cy.js b/tests/e2e/specs/visit_qc_results_upload_page.cy.js index bb2701730..210902ec7 100644 --- a/tests/e2e/specs/visit_qc_results_upload_page.cy.js +++ b/tests/e2e/specs/visit_qc_results_upload_page.cy.js @@ -2,10 +2,6 @@ describe('Extraction QC page', () => { beforeEach(() => { - cy.withFlags({ - dpl_478_enable_qc_results_upload: { enabled: true }, - }) - cy.visit('#/qc-results-upload') cy.get('#used-by-select-input').select('Extraction') cy.contains('Upload File') diff --git a/tests/factories/QcResultUploadFactory.js b/tests/factories/QcResultUploadFactory.js new file mode 100644 index 000000000..55b4cc76a --- /dev/null +++ b/tests/factories/QcResultUploadFactory.js @@ -0,0 +1,27 @@ +import fs from 'fs' +import BaseFactory from './BaseFactory.js' + +const defaultCsv = fs.readFileSync('./tests/data/csv/qc-results-upload.csv', 'utf8') +/* + * Factory for creating a QcResultUploadResponse object + * @returns a base factory object with the QcResultUpload data + */ +const PrinterFactory = (csv = defaultCsv, used_by = 'extraction') => { + const data = { + data: { + id: '69', + type: 'qc_results_uploads', + links: { + self: 'http://localhost:3100/v1/qc_results_uploads/69', + }, + attributes: { + csv_data: csv, + used_by, + }, + }, + } + + return { ...BaseFactory(data) } +} + +export default PrinterFactory diff --git a/tests/unit/components/qcResultsUpload/QcResultsUploadForm.spec.js b/tests/unit/components/qcResultsUpload/QcResultsUploadForm.spec.js index 8e59017d9..38e418a4e 100644 --- a/tests/unit/components/qcResultsUpload/QcResultsUploadForm.spec.js +++ b/tests/unit/components/qcResultsUpload/QcResultsUploadForm.spec.js @@ -68,7 +68,7 @@ describe('QcResultsUploadForm.vue', () => { describe('#computed', () => { it('gets the api request', () => { expect(form.qcResultUploadsRequest).toEqual( - store.getters.api.v1.traction.qc_results_uploads.create, + store.getters.api.v2.traction.qc_results_uploads.create, ) }) @@ -106,13 +106,13 @@ describe('QcResultsUploadForm.vue', () => { }) form.showAlert = vi.fn() - create = store.getters.api.v1.traction.qc_results_uploads.create + create = store.getters.api.v2.traction.qc_results_uploads.create }) it('handles a successful import', async () => { const createQcResultsUploadResource = vi .spyOn(QcResultsUpload, 'createQcResultsUploadResource') - .mockImplementation(() => {}) + .mockReturnValue({ success: true, errors: [] }) await form.postCSV() @@ -129,7 +129,7 @@ describe('QcResultsUploadForm.vue', () => { it('handles a failed import', async () => { const createQcResultsUploadResource = vi .spyOn(QcResultsUpload, 'createQcResultsUploadResource') - .mockRejectedValue('This is an error msg') + .mockReturnValue({ success: false, errors: 'This is an error msg' }) await form.postCSV() @@ -145,7 +145,10 @@ describe('QcResultsUploadForm.vue', () => { describe('#reEnable', () => { it('resets the file input and other data values', async () => { - vi.spyOn(QcResultsUpload, 'createQcResultsUploadResource').mockImplementation(() => {}) + vi.spyOn(QcResultsUpload, 'createQcResultsUploadResource').mockReturnValue({ + success: true, + errors: [], + }) await form.postCSV() diff --git a/tests/unit/services/traction/QcResultsUpload.spec.js b/tests/unit/services/traction/QcResultsUpload.spec.js index ae1aff00c..eb5684b5d 100644 --- a/tests/unit/services/traction/QcResultsUpload.spec.js +++ b/tests/unit/services/traction/QcResultsUpload.spec.js @@ -1,45 +1,37 @@ import fs from 'fs' -import { createQcResultsUploadResource } from '@/services/traction/QcResultsUpload' +import { createQcResultsUploadResource } from '@/services/traction/QcResultsUpload.js' +import QcResultUploadFactory from '@tests/factories/QcResultUploadFactory.js' + +const csv = fs.readFileSync('./tests/data/csv/qc-results-upload.csv', 'utf8') +const used_by = 'extraction' +const QcResultsUploadFactory = QcResultUploadFactory(csv, used_by) describe('QcResultsUpload', () => { describe('#createQcResultsUploadResource', () => { - const csv = fs.readFileSync('./tests/data/csv/pacbio-missing-source.csv', 'utf8') - - const usedBySelected = 'extraction' - - const createdReceptionResponse = { - status: 201, - statusText: 'Created', - data: { - id: '69', - type: 'qc_results_uploads', - links: { - self: 'http://localhost:3100/v1/qc_results_uploads/69', - }, - attributes: { - csv_data: csv, - used_by: usedBySelected, - }, - }, - } - const createQcResultsUploadRequest = vi.fn() it('successfully', async () => { - createQcResultsUploadRequest.mockResolvedValue(createdReceptionResponse) + createQcResultsUploadRequest.mockResolvedValue(QcResultsUploadFactory.responses.fetch) const response = await createQcResultsUploadResource(createQcResultsUploadRequest, { csv, - usedBySelected, + usedBySelected: used_by, }) - expect(response).toEqual(createdReceptionResponse.data) + expect(response).toEqual({ + success: true, + ...QcResultsUploadFactory.content, + errors: [], + }) }) it('generates a valid payload', async () => { - createQcResultsUploadRequest.mockResolvedValue(createdReceptionResponse) + createQcResultsUploadRequest.mockResolvedValue(QcResultsUploadFactory.responses.fetch) - await createQcResultsUploadResource(createQcResultsUploadRequest, { csv, usedBySelected }) + await createQcResultsUploadResource(createQcResultsUploadRequest, { + csv, + usedBySelected: used_by, + }) expect(createQcResultsUploadRequest).toHaveBeenCalledWith({ data: { @@ -47,7 +39,7 @@ describe('QcResultsUpload', () => { type: 'qc_results_uploads', attributes: { csv_data: csv, - used_by: usedBySelected, + used_by: used_by, }, }, }, @@ -55,19 +47,18 @@ describe('QcResultsUpload', () => { }) it('when the QcResultsUpload could not be created', async () => { - const failedResponse = { - status: 422, - statusText: 'Record not found', - data: { - errors: [{ title: 'error1', detail: 'There was an error.' }], - }, - } - - createQcResultsUploadRequest.mockRejectedValue({ response: failedResponse }) + createQcResultsUploadRequest.mockRejectedValue('There was an error') expect( - createQcResultsUploadResource(createQcResultsUploadRequest, { csv, usedBySelected }), - ).rejects.toThrow('error1 There was an error.') + await createQcResultsUploadResource(createQcResultsUploadRequest, { + csv, + usedBySelected: used_by, + }), + ).toEqual({ + success: false, + data: {}, + errors: 'There was an error', + }) }) }) })