Skip to content

Commit

Permalink
Merge pull request #2003 from sanger/Y24-344-qc-result-upload-fetch-m…
Browse files Browse the repository at this point in the history
…igration

Y24-344 - QC Results Upload migration to fetch.
  • Loading branch information
BenTopping authored Oct 21, 2024
2 parents 6410f26 + f94e72a commit 7a0a171
Show file tree
Hide file tree
Showing 6 changed files with 92 additions and 67 deletions.
21 changes: 11 additions & 10 deletions src/components/qcResultsUpload/QcResultsUploadForm.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down Expand Up @@ -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
},
Expand Down
27 changes: 17 additions & 10 deletions src/services/traction/QcResultsUpload.js
Original file line number Diff line number Diff line change
@@ -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<Object>} 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: {
Expand All @@ -18,10 +29,6 @@ const createQcResultsUploadResource = async (request, { csv, usedBySelected }) =
}),
)

if (success) {
return data
} else {
throw errors
}
return { success, data, errors }
}
export { createQcResultsUploadResource }
4 changes: 0 additions & 4 deletions tests/e2e/specs/visit_qc_results_upload_page.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down
27 changes: 27 additions & 0 deletions tests/factories/QcResultUploadFactory.js
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)
})

Expand Down Expand Up @@ -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()

Expand All @@ -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()

Expand All @@ -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()

Expand Down
67 changes: 29 additions & 38 deletions tests/unit/services/traction/QcResultsUpload.spec.js
Original file line number Diff line number Diff line change
@@ -1,73 +1,64 @@
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: {
data: {
type: 'qc_results_uploads',
attributes: {
csv_data: csv,
used_by: usedBySelected,
used_by: used_by,
},
},
},
})
})

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',
})
})
})
})

0 comments on commit 7a0a171

Please sign in to comment.