Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BHBC 1286: UI Development - for displaying data from uploaded and validated file #445

Merged
merged 17 commits into from
Aug 10, 2021
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export const GET: Operation = [getObservationSubmission()];

GET.apiDoc = {
description: 'Fetches an observation submission for a survey.',
tags: ['attachments'],
tags: ['observation_submission'],
security: [
{
Bearer: [SYSTEM_ROLE.SYSTEM_ADMIN, SYSTEM_ROLE.PROJECT_ADMIN]
Expand All @@ -40,7 +40,7 @@ GET.apiDoc = {
],
responses: {
200: {
description: 'Survey get response file description array.',
description: 'Observation submission get response.',
content: {
'application/json': {
schema: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,6 @@ export function getSingleSubmissionURL(): RequestHandler {

try {
const getSurveySubmissionOccurrenceSQLStatement = getSurveySubmissionOccurrenceSQL(
Number(req.params.surveyId),
sdevalapurkar marked this conversation as resolved.
Show resolved Hide resolved
Number(req.params.submissionId)
);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
import chai, { expect } from 'chai';
import { describe } from 'mocha';
import sinon from 'sinon';
import sinonChai from 'sinon-chai';
import * as view from './view';
import * as db from '../../../../../../../../database/db';
import * as survey_occurrence_queries from '../../../../../../../../queries/survey/survey-occurrence-queries';
import SQL from 'sql-template-strings';
import * as file_utils from '../../../../../../../../utils/file-utils';
import * as media_utils from '../../../../../../../../utils/media/media-utils';
import { GetObjectOutput } from 'aws-sdk/clients/s3';

chai.use(sinonChai);

describe('getObservationSubmissionCSVForView', () => {
const dbConnectionObj = {
systemUserId: () => {
return null;
},
open: async () => {
// do nothing
},
release: () => {
// do nothing
},
commit: async () => {
// do nothing
},
rollback: async () => {
// do nothing
},
query: async () => {
// do nothing
}
};

const sampleReq = {
keycloak_token: {},
params: {
projectId: 1,
surveyId: 1,
submissionId: 1
}
} as any;

// let actualResult: any = null;

// const sampleRes = {
// status: () => {
// return {
// json: (result: any) => {
// actualResult = result;
// }
// };
// }
// };

afterEach(() => {
sinon.restore();
});

it('should throw a 400 error when no projectId is provided', async () => {
sinon.stub(db, 'getDBConnection').returns(dbConnectionObj);

try {
const result = view.getObservationSubmissionCSVForView();
await result(
{ ...sampleReq, params: { ...sampleReq.params, projectId: null } },
(null as unknown) as any,
(null as unknown) as any
);
expect.fail();
} catch (actualError) {
expect(actualError.status).to.equal(400);
expect(actualError.message).to.equal('Missing required path param `projectId`');
}
});

it('should throw a 400 error when no surveyId is provided', async () => {
sinon.stub(db, 'getDBConnection').returns(dbConnectionObj);

try {
const result = view.getObservationSubmissionCSVForView();
await result(
{ ...sampleReq, params: { ...sampleReq.params, surveyId: null } },
(null as unknown) as any,
(null as unknown) as any
);
expect.fail();
} catch (actualError) {
expect(actualError.status).to.equal(400);
expect(actualError.message).to.equal('Missing required path param `surveyId`');
}
});

it('should throw a 400 error when no submissionId is provided', async () => {
sinon.stub(db, 'getDBConnection').returns(dbConnectionObj);

try {
const result = view.getObservationSubmissionCSVForView();
await result(
{ ...sampleReq, params: { ...sampleReq.params, submissionId: null } },
(null as unknown) as any,
(null as unknown) as any
);
expect.fail();
} catch (actualError) {
expect(actualError.status).to.equal(400);
expect(actualError.message).to.equal('Missing required path param `submissionId`');
}
});

it('should throw a 400 error when no sql statement returned for getSurveySubmissionOccurrenceSQL', async () => {
sinon.stub(db, 'getDBConnection').returns({
...dbConnectionObj,
systemUserId: () => {
return 20;
}
});

sinon.stub(survey_occurrence_queries, 'getSurveySubmissionOccurrenceSQL').returns(null);

try {
const result = view.getObservationSubmissionCSVForView();

await result(sampleReq, (null as unknown) as any, (null as unknown) as any);
expect.fail();
} catch (actualError) {
expect(actualError.status).to.equal(400);
expect(actualError.message).to.equal('Failed to build SQL get statement');
}
});

it('should throw a 500 error when no s3 file fetched', async () => {
const mockQuery = sinon.stub();

mockQuery.resolves({
rows: [
{
id: 13,
file_name: 'filename.txt'
}
]
});

sinon.stub(db, 'getDBConnection').returns({
...dbConnectionObj,
systemUserId: () => {
return 20;
},
query: mockQuery
});

sinon.stub(survey_occurrence_queries, 'getSurveySubmissionOccurrenceSQL').returns(SQL`something`);
sinon.stub(file_utils, 'generateS3FileKey').resolves('validkey');
sinon.stub(file_utils, 'getFileFromS3').resolves((null as unknown) as GetObjectOutput);

try {
const result = view.getObservationSubmissionCSVForView();

await result(sampleReq, (null as unknown) as any, (null as unknown) as any);
expect.fail();
} catch (actualError) {
expect(actualError.status).to.equal(500);
expect(actualError.message).to.equal('Failed to retrieve file from S3');
}
});

it('should throw a 500 error when fails to parse media file', async () => {
const mockQuery = sinon.stub();

mockQuery.resolves({
rows: [
{
id: 13,
file_name: 'filename.txt'
}
]
});

sinon.stub(db, 'getDBConnection').returns({
...dbConnectionObj,
systemUserId: () => {
return 20;
},
query: mockQuery
});

sinon.stub(survey_occurrence_queries, 'getSurveySubmissionOccurrenceSQL').returns(SQL`something`);
sinon.stub(file_utils, 'generateS3FileKey').resolves('validkey');
sinon.stub(file_utils, 'getFileFromS3').resolves({ file: 'myfile' } as GetObjectOutput);
sinon.stub(media_utils, 'parseUnknownMedia').returns([]);

try {
const result = view.getObservationSubmissionCSVForView();

await result(sampleReq, (null as unknown) as any, (null as unknown) as any);
expect.fail();
} catch (actualError) {
expect(actualError.status).to.equal(500);
expect(actualError.message).to.equal('Failed to parse media file');
}
});
});
Loading