Commit 2827e94f authored by mfluharty's avatar mfluharty

Add tests for new functionality

Add mock data arrays in new format
Test parsing with feature flag enabled and disabled
parent a456f23a
...@@ -88,3 +88,53 @@ export const issueDiff = [ ...@@ -88,3 +88,53 @@ export const issueDiff = [
urlPath: 'headPath/lib/six.rb#L6', urlPath: 'headPath/lib/six.rb#L6',
}, },
]; ];
export const reportIssues = {
status: 'failed',
new_errors: [
{
description:
'Method `long_if` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.',
severity: 'minor',
file_path: 'codequality.rb',
line: 5,
},
],
resolved_errors: [
{
description: 'Insecure Dependency',
severity: 'major',
file_path: 'lib/six.rb',
line: 22,
},
],
existing_errors: [],
summary: { total: 3, resolved: 0, errored: 3 },
};
export const parsedReportIssues = {
newIssues: [
{
description:
'Method `long_if` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.',
file_path: 'codequality.rb',
line: 5,
name:
'Method `long_if` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.',
path: 'codequality.rb',
severity: 'minor',
urlPath: 'null/codequality.rb#L5',
},
],
resolvedIssues: [
{
description: 'Insecure Dependency',
file_path: 'lib/six.rb',
line: 22,
name: 'Insecure Dependency',
path: 'lib/six.rb',
severity: 'major',
urlPath: 'null/lib/six.rb#L22',
},
],
};
...@@ -5,7 +5,14 @@ import axios from '~/lib/utils/axios_utils'; ...@@ -5,7 +5,14 @@ import axios from '~/lib/utils/axios_utils';
import * as actions from '~/reports/codequality_report/store/actions'; import * as actions from '~/reports/codequality_report/store/actions';
import * as types from '~/reports/codequality_report/store/mutation_types'; import * as types from '~/reports/codequality_report/store/mutation_types';
import createStore from '~/reports/codequality_report/store'; import createStore from '~/reports/codequality_report/store';
import { headIssues, baseIssues, mockParsedHeadIssues, mockParsedBaseIssues } from '../mock_data'; import {
headIssues,
baseIssues,
mockParsedHeadIssues,
mockParsedBaseIssues,
reportIssues,
parsedReportIssues,
} from '../mock_data';
// mock codequality comparison worker // mock codequality comparison worker
jest.mock('~/reports/codequality_report/workers/codequality_comparison_worker', () => jest.mock('~/reports/codequality_report/workers/codequality_comparison_worker', () =>
...@@ -39,6 +46,7 @@ describe('Codequality Reports actions', () => { ...@@ -39,6 +46,7 @@ describe('Codequality Reports actions', () => {
headPath: 'headPath', headPath: 'headPath',
baseBlobPath: 'baseBlobPath', baseBlobPath: 'baseBlobPath',
headBlobPath: 'headBlobPath', headBlobPath: 'headBlobPath',
reportsPath: 'reportsPath',
helpPath: 'codequalityHelpPath', helpPath: 'codequalityHelpPath',
}; };
...@@ -55,68 +63,119 @@ describe('Codequality Reports actions', () => { ...@@ -55,68 +63,119 @@ describe('Codequality Reports actions', () => {
describe('fetchReports', () => { describe('fetchReports', () => {
let mock; let mock;
let diffFeatureFlagEnabled;
beforeEach(() => { describe('with :codequality_mr_diff feature flag enabled', () => {
localState.headPath = `${TEST_HOST}/head.json`; beforeEach(() => {
localState.basePath = `${TEST_HOST}/base.json`; diffFeatureFlagEnabled = true;
mock = new MockAdapter(axios); localState.reportsPath = `${TEST_HOST}/codequality_reports.json`;
}); mock = new MockAdapter(axios);
});
afterEach(() => { afterEach(() => {
mock.restore(); mock.restore();
}); });
describe('on success', () => { describe('on success', () => {
it('commits REQUEST_REPORTS and dispatches receiveReportsSuccess', (done) => { it('commits REQUEST_REPORTS and dispatches receiveReportsSuccess', (done) => {
mock.onGet(`${TEST_HOST}/head.json`).reply(200, headIssues); mock.onGet(`${TEST_HOST}/codequality_reports.json`).reply(200, reportIssues);
mock.onGet(`${TEST_HOST}/base.json`).reply(200, baseIssues);
testAction(
testAction( actions.fetchReports,
actions.fetchReports, diffFeatureFlagEnabled,
null, localState,
localState, [{ type: types.REQUEST_REPORTS }],
[{ type: types.REQUEST_REPORTS }], [
[ {
{ payload: parsedReportIssues,
payload: { type: 'receiveReportsSuccess',
newIssues: [mockParsedHeadIssues[0]],
resolvedIssues: [mockParsedBaseIssues[0]],
}, },
type: 'receiveReportsSuccess', ],
}, done,
], );
done, });
);
}); });
});
describe('on error', () => { describe('on error', () => {
it('commits REQUEST_REPORTS and dispatches receiveReportsError', (done) => { it('commits REQUEST_REPORTS and dispatches receiveReportsError', (done) => {
mock.onGet(`${TEST_HOST}/head.json`).reply(500); mock.onGet(`${TEST_HOST}/codequality_reports.json`).reply(500);
testAction( testAction(
actions.fetchReports, actions.fetchReports,
null, diffFeatureFlagEnabled,
localState, localState,
[{ type: types.REQUEST_REPORTS }], [{ type: types.REQUEST_REPORTS }],
[{ type: 'receiveReportsError' }], [{ type: 'receiveReportsError', payload: expect.any(Error) }],
done, done,
); );
});
}); });
}); });
describe('with no base path', () => { describe('with :codequality_mr_diff feature flag disabled', () => {
it('commits REQUEST_REPORTS and dispatches receiveReportsError', (done) => { beforeEach(() => {
localState.basePath = null; diffFeatureFlagEnabled = false;
localState.headPath = `${TEST_HOST}/head.json`;
testAction( localState.basePath = `${TEST_HOST}/base.json`;
actions.fetchReports, mock = new MockAdapter(axios);
null, });
localState,
[{ type: types.REQUEST_REPORTS }], afterEach(() => {
[{ type: 'receiveReportsError' }], mock.restore();
done, });
);
describe('on success', () => {
it('commits REQUEST_REPORTS and dispatches receiveReportsSuccess', (done) => {
mock.onGet(`${TEST_HOST}/head.json`).reply(200, headIssues);
mock.onGet(`${TEST_HOST}/base.json`).reply(200, baseIssues);
testAction(
actions.fetchReports,
diffFeatureFlagEnabled,
localState,
[{ type: types.REQUEST_REPORTS }],
[
{
payload: {
newIssues: [mockParsedHeadIssues[0]],
resolvedIssues: [mockParsedBaseIssues[0]],
},
type: 'receiveReportsSuccess',
},
],
done,
);
});
});
describe('on error', () => {
it('commits REQUEST_REPORTS and dispatches receiveReportsError', (done) => {
mock.onGet(`${TEST_HOST}/head.json`).reply(500);
testAction(
actions.fetchReports,
diffFeatureFlagEnabled,
localState,
[{ type: types.REQUEST_REPORTS }],
[{ type: 'receiveReportsError' }],
done,
);
});
});
describe('with no base path', () => {
it('commits REQUEST_REPORTS and dispatches receiveReportsError', (done) => {
localState.basePath = null;
testAction(
actions.fetchReports,
diffFeatureFlagEnabled,
localState,
[{ type: types.REQUEST_REPORTS }],
[{ type: 'receiveReportsError' }],
done,
);
});
}); });
}); });
}); });
...@@ -142,7 +201,7 @@ describe('Codequality Reports actions', () => { ...@@ -142,7 +201,7 @@ describe('Codequality Reports actions', () => {
actions.receiveReportsError, actions.receiveReportsError,
null, null,
localState, localState,
[{ type: types.RECEIVE_REPORTS_ERROR }], [{ type: types.RECEIVE_REPORTS_ERROR, payload: null }],
[], [],
done, done,
); );
......
...@@ -55,6 +55,12 @@ describe('Codequality Reports mutations', () => { ...@@ -55,6 +55,12 @@ describe('Codequality Reports mutations', () => {
expect(localState.hasError).toEqual(false); expect(localState.hasError).toEqual(false);
}); });
it('clears statusReason', () => {
mutations.RECEIVE_REPORTS_SUCCESS(localState, {});
expect(localState.statusReason).toEqual('');
});
it('sets newIssues and resolvedIssues from response data', () => { it('sets newIssues and resolvedIssues from response data', () => {
const data = { newIssues: [{ id: 1 }], resolvedIssues: [{ id: 2 }] }; const data = { newIssues: [{ id: 1 }], resolvedIssues: [{ id: 2 }] };
mutations.RECEIVE_REPORTS_SUCCESS(localState, data); mutations.RECEIVE_REPORTS_SUCCESS(localState, data);
...@@ -76,5 +82,13 @@ describe('Codequality Reports mutations', () => { ...@@ -76,5 +82,13 @@ describe('Codequality Reports mutations', () => {
expect(localState.hasError).toEqual(true); expect(localState.hasError).toEqual(true);
}); });
it('sets statusReason to string from error response data', () => {
const data = { status_reason: 'This merge request does not have codequality reports' };
const error = { response: { data } };
mutations.RECEIVE_REPORTS_ERROR(localState, error);
expect(localState.statusReason).toEqual(data.status_reason);
});
}); });
}); });
...@@ -2,7 +2,13 @@ import { ...@@ -2,7 +2,13 @@ import {
parseCodeclimateMetrics, parseCodeclimateMetrics,
doCodeClimateComparison, doCodeClimateComparison,
} from '~/reports/codequality_report/store/utils/codequality_comparison'; } from '~/reports/codequality_report/store/utils/codequality_comparison';
import { baseIssues, mockParsedHeadIssues, mockParsedBaseIssues } from '../../mock_data'; import {
baseIssues,
mockParsedHeadIssues,
mockParsedBaseIssues,
reportIssues,
parsedReportIssues,
} from '../../mock_data';
jest.mock('~/reports/codequality_report/workers/codequality_comparison_worker', () => { jest.mock('~/reports/codequality_report/workers/codequality_comparison_worker', () => {
let mockPostMessageCallback; let mockPostMessageCallback;
...@@ -34,7 +40,7 @@ describe('Codequality report store utils', () => { ...@@ -34,7 +40,7 @@ describe('Codequality report store utils', () => {
let result; let result;
describe('parseCodeclimateMetrics', () => { describe('parseCodeclimateMetrics', () => {
it('should parse the received issues', () => { it('should parse the issues from codeclimate artifacts', () => {
[result] = parseCodeclimateMetrics(baseIssues, 'path'); [result] = parseCodeclimateMetrics(baseIssues, 'path');
expect(result.name).toEqual(baseIssues[0].check_name); expect(result.name).toEqual(baseIssues[0].check_name);
...@@ -42,6 +48,14 @@ describe('Codequality report store utils', () => { ...@@ -42,6 +48,14 @@ describe('Codequality report store utils', () => {
expect(result.line).toEqual(baseIssues[0].location.lines.begin); expect(result.line).toEqual(baseIssues[0].location.lines.begin);
}); });
it('should parse the issues from backend codequality diff', () => {
[result] = parseCodeclimateMetrics(reportIssues.new_errors, 'path');
expect(result.name).toEqual(parsedReportIssues.newIssues[0].name);
expect(result.path).toEqual(parsedReportIssues.newIssues[0].path);
expect(result.line).toEqual(parsedReportIssues.newIssues[0].line);
});
describe('when an issue has no location or path', () => { describe('when an issue has no location or path', () => {
const issue = { description: 'Insecure Dependency' }; const issue = { description: 'Insecure Dependency' };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment