Commit c54cb259 authored by Mayra Cabrera's avatar Mayra Cabrera

Merge branch 'revert-9f5f9e09' into 'master'

Revert !58833 [RUN AS-IF-FOSS]

See merge request gitlab-org/gitlab!59293
parents a4bdedad 686dea83
...@@ -184,7 +184,12 @@ export default { ...@@ -184,7 +184,12 @@ export default {
'viewDiffsFileByFile', 'viewDiffsFileByFile',
'mrReviews', 'mrReviews',
]), ]),
...mapGetters('diffs', ['whichCollapsedTypes', 'isParallelView', 'currentDiffIndex']), ...mapGetters('diffs', [
'whichCollapsedTypes',
'isParallelView',
'currentDiffIndex',
'fileCodequalityDiff',
]),
...mapGetters(['isNotesFetched', 'getNoteableData']), ...mapGetters(['isNotesFetched', 'getNoteableData']),
diffs() { diffs() {
if (!this.viewDiffsFileByFile) { if (!this.viewDiffsFileByFile) {
...@@ -282,6 +287,7 @@ export default { ...@@ -282,6 +287,7 @@ export default {
endpointMetadata: this.endpointMetadata, endpointMetadata: this.endpointMetadata,
endpointBatch: this.endpointBatch, endpointBatch: this.endpointBatch,
endpointCoverage: this.endpointCoverage, endpointCoverage: this.endpointCoverage,
endpointCodequality: this.endpointCodequality,
endpointUpdateUser: this.endpointUpdateUser, endpointUpdateUser: this.endpointUpdateUser,
projectPath: this.projectPath, projectPath: this.projectPath,
dismissEndpoint: this.dismissEndpoint, dismissEndpoint: this.dismissEndpoint,
...@@ -291,10 +297,6 @@ export default { ...@@ -291,10 +297,6 @@ export default {
mrReviews: this.rehydratedMrReviews, mrReviews: this.rehydratedMrReviews,
}); });
if (this.endpointCodequality) {
this.setCodequalityEndpoint(this.endpointCodequality);
}
if (this.shouldShow) { if (this.shouldShow) {
this.fetchData(); this.fetchData();
} }
...@@ -339,7 +341,6 @@ export default { ...@@ -339,7 +341,6 @@ export default {
...mapActions('diffs', [ ...mapActions('diffs', [
'moveToNeighboringCommit', 'moveToNeighboringCommit',
'setBaseConfig', 'setBaseConfig',
'setCodequalityEndpoint',
'fetchDiffFilesMeta', 'fetchDiffFilesMeta',
'fetchDiffFilesBatch', 'fetchDiffFilesBatch',
'fetchCoverageFiles', 'fetchCoverageFiles',
...@@ -531,6 +532,7 @@ export default { ...@@ -531,6 +532,7 @@ export default {
:help-page-path="helpPagePath" :help-page-path="helpPagePath"
:can-current-user-fork="canCurrentUserFork" :can-current-user-fork="canCurrentUserFork"
:view-diffs-file-by-file="viewDiffsFileByFile" :view-diffs-file-by-file="viewDiffsFileByFile"
:codequality-diff="fileCodequalityDiff(file.file_path)"
/> />
<div <div
v-if="showFileByFileNavigation" v-if="showFileByFileNavigation"
......
...@@ -67,6 +67,11 @@ export default { ...@@ -67,6 +67,11 @@ export default {
type: Boolean, type: Boolean,
required: true, required: true,
}, },
codequalityDiff: {
type: Array,
required: false,
default: () => [],
},
}, },
data() { data() {
return { return {
...@@ -80,7 +85,7 @@ export default { ...@@ -80,7 +85,7 @@ export default {
genericError: GENERIC_ERROR, genericError: GENERIC_ERROR,
}, },
computed: { computed: {
...mapState('diffs', ['currentDiffFileId', 'codequalityDiff']), ...mapState('diffs', ['currentDiffFileId']),
...mapGetters(['isNotesFetched']), ...mapGetters(['isNotesFetched']),
...mapGetters('diffs', ['getDiffFileDiscussions']), ...mapGetters('diffs', ['getDiffFileDiscussions']),
viewBlobHref() { viewBlobHref() {
...@@ -149,9 +154,7 @@ export default { ...@@ -149,9 +154,7 @@ export default {
return loggedIn && featureOn; return loggedIn && featureOn;
}, },
hasCodequalityChanges() { hasCodequalityChanges() {
return ( return this.codequalityDiff.length > 0;
this.codequalityDiff?.files && this.codequalityDiff?.files[this.file.file_path]?.length > 0
);
}, },
}, },
watch: { watch: {
......
import Cookies from 'js-cookie'; import Cookies from 'js-cookie';
import Visibility from 'visibilityjs';
import Vue from 'vue'; import Vue from 'vue';
import { deprecatedCreateFlash as createFlash } from '~/flash'; import { deprecatedCreateFlash as createFlash } from '~/flash';
import { diffViewerModes } from '~/ide/constants'; import { diffViewerModes } from '~/ide/constants';
...@@ -52,12 +53,15 @@ import { ...@@ -52,12 +53,15 @@ import {
prepareLineForRenamedFile, prepareLineForRenamedFile,
} from './utils'; } from './utils';
let eTagPoll;
export const setBaseConfig = ({ commit }, options) => { export const setBaseConfig = ({ commit }, options) => {
const { const {
endpoint, endpoint,
endpointMetadata, endpointMetadata,
endpointBatch, endpointBatch,
endpointCoverage, endpointCoverage,
endpointCodequality,
endpointUpdateUser, endpointUpdateUser,
projectPath, projectPath,
dismissEndpoint, dismissEndpoint,
...@@ -71,6 +75,7 @@ export const setBaseConfig = ({ commit }, options) => { ...@@ -71,6 +75,7 @@ export const setBaseConfig = ({ commit }, options) => {
endpointMetadata, endpointMetadata,
endpointBatch, endpointBatch,
endpointCoverage, endpointCoverage,
endpointCodequality,
endpointUpdateUser, endpointUpdateUser,
projectPath, projectPath,
dismissEndpoint, dismissEndpoint,
...@@ -233,6 +238,48 @@ export const fetchCoverageFiles = ({ commit, state }) => { ...@@ -233,6 +238,48 @@ export const fetchCoverageFiles = ({ commit, state }) => {
coveragePoll.makeRequest(); coveragePoll.makeRequest();
}; };
export const clearEtagPoll = () => {
eTagPoll = null;
};
export const stopCodequalityPolling = () => {
if (eTagPoll) eTagPoll.stop();
};
export const restartCodequalityPolling = () => {
if (eTagPoll) eTagPoll.restart();
};
export const fetchCodequality = ({ commit, state, dispatch }) => {
eTagPoll = new Poll({
resource: {
getCodequalityDiffReports: (endpoint) => axios.get(endpoint),
},
data: state.endpointCodequality,
method: 'getCodequalityDiffReports',
successCallback: ({ status, data }) => {
if (status === httpStatusCodes.OK) {
commit(types.SET_CODEQUALITY_DATA, data);
eTagPoll.stop();
}
},
errorCallback: () => createFlash(__('Something went wrong on our end. Please try again!')),
});
if (!Visibility.hidden()) {
eTagPoll.makeRequest();
}
Visibility.change(() => {
if (!Visibility.hidden()) {
dispatch('restartCodequalityPolling');
} else {
dispatch('stopCodequalityPolling');
}
});
};
export const setHighlightedRow = ({ commit }, lineCode) => { export const setHighlightedRow = ({ commit }, lineCode) => {
const fileHash = lineCode.split('_')[0]; const fileHash = lineCode.split('_')[0];
commit(types.SET_HIGHLIGHTED_ROW, lineCode); commit(types.SET_HIGHLIGHTED_ROW, lineCode);
......
...@@ -135,6 +135,16 @@ export const fileLineCoverage = (state) => (file, line) => { ...@@ -135,6 +135,16 @@ export const fileLineCoverage = (state) => (file, line) => {
return {}; return {};
}; };
/**
* Returns the codequality diff data for a given file
* @param {string} filePath
* @returns {Array}
*/
export const fileCodequalityDiff = (state) => (filePath) => {
if (!state.codequalityDiff.files || !state.codequalityDiff.files[filePath]) return [];
return state.codequalityDiff.files[filePath];
};
/** /**
* Returns index of a currently selected diff in diffFiles * Returns index of a currently selected diff in diffFiles
* @returns {number} * @returns {number}
......
...@@ -30,6 +30,7 @@ export default () => ({ ...@@ -30,6 +30,7 @@ export default () => ({
startVersion: null, // Null unless a target diff is selected for comparison that is not the "base" diff startVersion: null, // Null unless a target diff is selected for comparison that is not the "base" diff
diffFiles: [], diffFiles: [],
coverageFiles: {}, coverageFiles: {},
codequalityDiff: {},
mergeRequestDiffs: [], mergeRequestDiffs: [],
mergeRequestDiff: null, mergeRequestDiff: null,
diffViewType: getViewTypeFromQueryString() || viewTypeFromCookie || defaultViewType, diffViewType: getViewTypeFromQueryString() || viewTypeFromCookie || defaultViewType,
......
import * as actions from 'ee_else_ce/diffs/store/actions'; import * as actions from '../actions';
import createState from 'ee_else_ce/diffs/store/modules/diff_state';
import mutations from 'ee_else_ce/diffs/store/mutations';
import * as getters from '../getters'; import * as getters from '../getters';
import mutations from '../mutations';
import createState from './diff_state';
export default () => ({ export default () => ({
namespaced: true, namespaced: true,
......
...@@ -11,6 +11,7 @@ export const SET_MR_FILE_REVIEWS = 'SET_MR_FILE_REVIEWS'; ...@@ -11,6 +11,7 @@ export const SET_MR_FILE_REVIEWS = 'SET_MR_FILE_REVIEWS';
export const SET_DIFF_VIEW_TYPE = 'SET_DIFF_VIEW_TYPE'; export const SET_DIFF_VIEW_TYPE = 'SET_DIFF_VIEW_TYPE';
export const SET_COVERAGE_DATA = 'SET_COVERAGE_DATA'; export const SET_COVERAGE_DATA = 'SET_COVERAGE_DATA';
export const SET_CODEQUALITY_DATA = 'SET_CODEQUALITY_DATA';
export const SET_MERGE_REQUEST_DIFFS = 'SET_MERGE_REQUEST_DIFFS'; export const SET_MERGE_REQUEST_DIFFS = 'SET_MERGE_REQUEST_DIFFS';
export const TOGGLE_LINE_HAS_FORM = 'TOGGLE_LINE_HAS_FORM'; export const TOGGLE_LINE_HAS_FORM = 'TOGGLE_LINE_HAS_FORM';
export const ADD_CONTEXT_LINES = 'ADD_CONTEXT_LINES'; export const ADD_CONTEXT_LINES = 'ADD_CONTEXT_LINES';
......
...@@ -33,6 +33,7 @@ export default { ...@@ -33,6 +33,7 @@ export default {
endpointMetadata, endpointMetadata,
endpointBatch, endpointBatch,
endpointCoverage, endpointCoverage,
endpointCodequality,
endpointUpdateUser, endpointUpdateUser,
projectPath, projectPath,
dismissEndpoint, dismissEndpoint,
...@@ -46,6 +47,7 @@ export default { ...@@ -46,6 +47,7 @@ export default {
endpointMetadata, endpointMetadata,
endpointBatch, endpointBatch,
endpointCoverage, endpointCoverage,
endpointCodequality,
endpointUpdateUser, endpointUpdateUser,
projectPath, projectPath,
dismissEndpoint, dismissEndpoint,
...@@ -89,6 +91,10 @@ export default { ...@@ -89,6 +91,10 @@ export default {
Object.assign(state, { coverageFiles }); Object.assign(state, { coverageFiles });
}, },
[types.SET_CODEQUALITY_DATA](state, codequalityDiffData) {
Object.assign(state, { codequalityDiff: codequalityDiffData });
},
[types.RENDER_FILE](state, file) { [types.RENDER_FILE](state, file) {
renderFile(file); renderFile(file);
}, },
......
...@@ -12,7 +12,7 @@ export default { ...@@ -12,7 +12,7 @@ export default {
i18n: { i18n: {
badgeTitle: __('Code Quality'), badgeTitle: __('Code Quality'),
badgeTooltip: __( badgeTooltip: __(
'The merge request has made changes to this file that affect the number of code quality violations in it.', 'The merge request has been updated, and the number of code quality violations in this file has changed.',
), ),
}, },
}; };
......
import Visibility from 'visibilityjs';
import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import httpStatusCodes from '~/lib/utils/http_status';
import Poll from '~/lib/utils/poll';
import { __ } from '~/locale';
import * as types from './mutation_types';
export * from '~/diffs/store/actions';
let codequalityPoll;
export const setCodequalityEndpoint = ({ commit }, endpoint) => {
commit(types.SET_CODEQUALITY_ENDPOINT, endpoint);
};
export const clearCodequalityPoll = () => {
codequalityPoll = null;
};
export const stopCodequalityPolling = () => {
if (codequalityPoll) codequalityPoll.stop();
};
export const restartCodequalityPolling = () => {
if (codequalityPoll) codequalityPoll.restart();
};
export const fetchCodequality = ({ commit, state, dispatch }) => {
codequalityPoll = new Poll({
resource: {
getCodequalityDiffReports: (endpoint) => axios.get(endpoint),
},
data: state.endpointCodequality,
method: 'getCodequalityDiffReports',
successCallback: ({ status, data }) => {
if (status === httpStatusCodes.OK) {
commit(types.SET_CODEQUALITY_DATA, data);
dispatch('stopCodequalityPolling');
}
},
errorCallback: () =>
createFlash(__('Something went wrong on our end while loading the code quality diff.')),
});
if (!Visibility.hidden()) {
codequalityPoll.makeRequest();
}
Visibility.change(() => {
if (!Visibility.hidden()) {
dispatch('restartCodequalityPolling');
} else {
dispatch('stopCodequalityPolling');
}
});
};
import createStateCE from '~/diffs/store/modules/diff_state';
export default () => ({
...createStateCE(),
endpointCodequality: '',
codequalityDiff: {},
});
export const SET_CODEQUALITY_ENDPOINT = 'SET_CODEQUALITY_ENDPOINT';
export const SET_CODEQUALITY_DATA = 'SET_CODEQUALITY_DATA';
import CEMutations from '~/diffs/store/mutations';
import * as types from './mutation_types';
export default {
...CEMutations,
[types.SET_CODEQUALITY_ENDPOINT](state, endpoint) {
Object.assign(state, { endpointCodequality: endpoint });
},
[types.SET_CODEQUALITY_DATA](state, codequalityDiffData) {
Object.assign(state, { codequalityDiff: codequalityDiffData });
},
};
import { mount, createLocalVue } from '@vue/test-utils'; import { shallowMount, createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex'; import Vuex from 'vuex';
import CodeQualityBadge from 'ee/diffs/components/code_quality_badge.vue'; import CodeQualityBadge from 'ee/diffs/components/code_quality_badge.vue';
...@@ -9,7 +9,7 @@ import createDiffsStore from '~/diffs/store/modules'; ...@@ -9,7 +9,7 @@ import createDiffsStore from '~/diffs/store/modules';
const getReadableFile = () => JSON.parse(JSON.stringify(diffFileMockDataReadable)); const getReadableFile = () => JSON.parse(JSON.stringify(diffFileMockDataReadable));
function createComponent({ withCodequality = true }) { function createComponent({ first = false, last = false, options = {}, props = {} }) {
const file = getReadableFile(); const file = getReadableFile();
const localVue = createLocalVue(); const localVue = createLocalVue();
...@@ -23,31 +23,18 @@ function createComponent({ withCodequality = true }) { ...@@ -23,31 +23,18 @@ function createComponent({ withCodequality = true }) {
store.state.diffs.diffFiles = [file]; store.state.diffs.diffFiles = [file];
if (withCodequality) { const wrapper = shallowMount(DiffFileComponent, {
store.state.diffs.codequalityDiff = {
files: {
[file.file_path]: [
{ line: 1, description: 'Unexpected alert.', severity: 'minor' },
{
line: 3,
description: 'Arrow function has too many statements (52). Maximum allowed is 30.',
severity: 'minor',
},
],
},
};
}
const wrapper = mount(DiffFileComponent, {
store, store,
localVue, localVue,
propsData: { propsData: {
file, file,
canCurrentUserFork: false, canCurrentUserFork: false,
viewDiffsFileByFile: false, viewDiffsFileByFile: false,
isFirstFile: false, isFirstFile: first,
isLastFile: false, isLastFile: last,
...props,
}, },
...options,
}); });
return { return {
...@@ -65,24 +52,27 @@ describe('EE DiffFile', () => { ...@@ -65,24 +52,27 @@ describe('EE DiffFile', () => {
}); });
describe('code quality badge', () => { describe('code quality badge', () => {
describe('when there is diff data for the file', () => { it('is shown when there is diff data for the file', () => {
beforeEach(() => { ({ wrapper } = createComponent({
({ wrapper } = createComponent({ withCodequality: true })); props: {
}); codequalityDiff: [
{ line: 1, description: 'Unexpected alert.', severity: 'minor' },
it('shows the code quality badge', () => { {
expect(wrapper.find(CodeQualityBadge).exists()).toBe(true); line: 3,
}); description: 'Arrow function has too many statements (52). Maximum allowed is 30.',
severity: 'minor',
},
],
},
}));
expect(wrapper.find(CodeQualityBadge)).toExist();
}); });
describe('when there is no diff data for the file', () => { it('is not shown when there is no diff data for the file', () => {
beforeEach(() => { ({ wrapper } = createComponent({}));
({ wrapper } = createComponent({ withCodequality: false }));
});
it('does not show the code quality badge', () => { expect(wrapper.find(CodeQualityBadge)).toExist();
expect(wrapper.find(CodeQualityBadge).exists()).toBe(false);
});
}); });
}); });
}); });
import MockAdapter from 'axios-mock-adapter';
import {
setCodequalityEndpoint,
clearCodequalityPoll,
stopCodequalityPolling,
fetchCodequality,
} from 'ee/diffs/store/actions';
import * as types from 'ee/diffs/store/mutation_types';
import testAction from 'helpers/vuex_action_helper';
import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
jest.mock('~/flash');
describe('EE DiffsStoreActions', () => {
describe('setCodequalityEndpoint', () => {
it('should set given endpoint', (done) => {
const endpoint = '/codequality_mr_diff.json';
testAction(
setCodequalityEndpoint,
{ endpoint },
{},
[{ type: types.SET_CODEQUALITY_ENDPOINT, payload: { endpoint } }],
[],
done,
);
});
});
describe('fetchCodequality', () => {
let mock;
const endpoint = '/codequality_mr_diff.json';
beforeEach(() => {
mock = new MockAdapter(axios);
});
afterEach(() => {
stopCodequalityPolling();
clearCodequalityPoll();
});
it('should commit SET_CODEQUALITY_DATA with received response and stop polling', (done) => {
const data = {
files: { 'app.js': [{ line: 1, description: 'Unexpected alert.', severity: 'minor' }] },
};
mock.onGet(endpoint).reply(200, { data });
testAction(
fetchCodequality,
{},
{ endpointCodequality: endpoint },
[{ type: types.SET_CODEQUALITY_DATA, payload: { data } }],
[{ type: 'stopCodequalityPolling' }],
done,
);
});
it('should show flash on API error', (done) => {
mock.onGet(endpoint).reply(400);
testAction(fetchCodequality, {}, { endpoint }, [], [], () => {
expect(createFlash).toHaveBeenCalledTimes(1);
expect(createFlash).toHaveBeenCalledWith(expect.stringMatching('Something went wrong'));
done();
});
});
});
});
import * as types from 'ee/diffs/store/mutation_types';
import mutations from 'ee/diffs/store/mutations';
describe('EE DiffsStoreMutations', () => {
describe('SET_CODEQUALITY_ENDPOINT', () => {
it('sets the endpoint into state', () => {
const state = {};
const endpoint = '/codequality_mr_diff.json';
mutations[types.SET_CODEQUALITY_ENDPOINT](state, endpoint);
expect(state.endpointCodequality).toEqual(endpoint);
});
});
describe('SET_CODEQUALITY_DATA', () => {
it('should set codequality data', () => {
const state = { codequalityDiff: {} };
const codequality = {
files: { 'app.js': [{ line: 1, description: 'Unexpected alert.', severity: 'minor' }] },
};
mutations[types.SET_CODEQUALITY_DATA](state, codequality);
expect(state.codequalityDiff).toEqual(codequality);
});
});
});
...@@ -29053,9 +29053,6 @@ msgstr "" ...@@ -29053,9 +29053,6 @@ msgstr ""
msgid "Something went wrong on our end" msgid "Something went wrong on our end"
msgstr "" msgstr ""
msgid "Something went wrong on our end while loading the code quality diff."
msgstr ""
msgid "Something went wrong on our end." msgid "Something went wrong on our end."
msgstr "" msgstr ""
...@@ -31027,7 +31024,7 @@ msgstr "" ...@@ -31027,7 +31024,7 @@ msgstr ""
msgid "The merge request can now be merged." msgid "The merge request can now be merged."
msgstr "" msgstr ""
msgid "The merge request has made changes to this file that affect the number of code quality violations in it." msgid "The merge request has been updated, and the number of code quality violations in this file has changed."
msgstr "" msgstr ""
msgid "The metric must be one of %{metrics}." msgid "The metric must be one of %{metrics}."
......
...@@ -17,6 +17,9 @@ import { ...@@ -17,6 +17,9 @@ import {
fetchDiffFilesBatch, fetchDiffFilesBatch,
fetchDiffFilesMeta, fetchDiffFilesMeta,
fetchCoverageFiles, fetchCoverageFiles,
clearEtagPoll,
stopCodequalityPolling,
fetchCodequality,
assignDiscussionsToDiff, assignDiscussionsToDiff,
removeDiscussionsFromDiff, removeDiscussionsFromDiff,
startRenderDiffsQueue, startRenderDiffsQueue,
...@@ -98,6 +101,7 @@ describe('DiffsStoreActions', () => { ...@@ -98,6 +101,7 @@ describe('DiffsStoreActions', () => {
const endpointMetadata = '/diffs/set/endpoint/metadata'; const endpointMetadata = '/diffs/set/endpoint/metadata';
const endpointBatch = '/diffs/set/endpoint/batch'; const endpointBatch = '/diffs/set/endpoint/batch';
const endpointCoverage = '/diffs/set/coverage_reports'; const endpointCoverage = '/diffs/set/coverage_reports';
const endpointCodequality = '/diffs/set/codequality_diff';
const projectPath = '/root/project'; const projectPath = '/root/project';
const dismissEndpoint = '/-/user_callouts'; const dismissEndpoint = '/-/user_callouts';
const showSuggestPopover = false; const showSuggestPopover = false;
...@@ -109,6 +113,7 @@ describe('DiffsStoreActions', () => { ...@@ -109,6 +113,7 @@ describe('DiffsStoreActions', () => {
endpointBatch, endpointBatch,
endpointMetadata, endpointMetadata,
endpointCoverage, endpointCoverage,
endpointCodequality,
projectPath, projectPath,
dismissEndpoint, dismissEndpoint,
showSuggestPopover, showSuggestPopover,
...@@ -118,6 +123,7 @@ describe('DiffsStoreActions', () => { ...@@ -118,6 +123,7 @@ describe('DiffsStoreActions', () => {
endpointBatch: '', endpointBatch: '',
endpointMetadata: '', endpointMetadata: '',
endpointCoverage: '', endpointCoverage: '',
endpointCodequality: '',
projectPath: '', projectPath: '',
dismissEndpoint: '', dismissEndpoint: '',
showSuggestPopover: true, showSuggestPopover: true,
...@@ -130,6 +136,7 @@ describe('DiffsStoreActions', () => { ...@@ -130,6 +136,7 @@ describe('DiffsStoreActions', () => {
endpointMetadata, endpointMetadata,
endpointBatch, endpointBatch,
endpointCoverage, endpointCoverage,
endpointCodequality,
projectPath, projectPath,
dismissEndpoint, dismissEndpoint,
showSuggestPopover, showSuggestPopover,
...@@ -299,6 +306,47 @@ describe('DiffsStoreActions', () => { ...@@ -299,6 +306,47 @@ describe('DiffsStoreActions', () => {
}); });
}); });
describe('fetchCodequality', () => {
let mock;
const endpointCodequality = '/fetch';
beforeEach(() => {
mock = new MockAdapter(axios);
});
afterEach(() => {
stopCodequalityPolling();
clearEtagPoll();
});
it('should commit SET_CODEQUALITY_DATA with received response', (done) => {
const data = {
files: { 'app.js': [{ line: 1, description: 'Unexpected alert.', severity: 'minor' }] },
};
mock.onGet(endpointCodequality).reply(200, { data });
testAction(
fetchCodequality,
{},
{ endpointCodequality },
[{ type: types.SET_CODEQUALITY_DATA, payload: { data } }],
[],
done,
);
});
it('should show flash on API error', (done) => {
mock.onGet(endpointCodequality).reply(400);
testAction(fetchCodequality, {}, { endpointCodequality }, [], [], () => {
expect(createFlash).toHaveBeenCalledTimes(1);
expect(createFlash).toHaveBeenCalledWith(expect.stringMatching('Something went wrong'));
done();
});
});
});
describe('setHighlightedRow', () => { describe('setHighlightedRow', () => {
it('should mark currently selected diff and set lineHash and fileHash of highlightedRow', () => { it('should mark currently selected diff and set lineHash and fileHash of highlightedRow', () => {
testAction(setHighlightedRow, 'ABC_123', {}, [ testAction(setHighlightedRow, 'ABC_123', {}, [
......
...@@ -376,6 +376,26 @@ describe('Diffs Module Getters', () => { ...@@ -376,6 +376,26 @@ describe('Diffs Module Getters', () => {
}); });
}); });
describe('fileCodequalityDiff', () => {
beforeEach(() => {
Object.assign(localState.codequalityDiff, {
files: { 'app.js': [{ line: 1, description: 'Unexpected alert.', severity: 'minor' }] },
});
});
it('returns empty array when no codequality data is available', () => {
Object.assign(localState.codequalityDiff, {});
expect(getters.fileCodequalityDiff(localState)('test.js')).toEqual([]);
});
it('returns array when codequality data is available for given file', () => {
expect(getters.fileCodequalityDiff(localState)('app.js')).toEqual([
{ line: 1, description: 'Unexpected alert.', severity: 'minor' },
]);
});
});
describe('suggestionCommitMessage', () => { describe('suggestionCommitMessage', () => {
let rootState; let rootState;
......
...@@ -115,6 +115,19 @@ describe('DiffsStoreMutations', () => { ...@@ -115,6 +115,19 @@ describe('DiffsStoreMutations', () => {
}); });
}); });
describe('SET_CODEQUALITY_DATA', () => {
it('should set codequality data', () => {
const state = { codequalityDiff: {} };
const codequality = {
files: { 'app.js': [{ line: 1, description: 'Unexpected alert.', severity: 'minor' }] },
};
mutations[types.SET_CODEQUALITY_DATA](state, codequality);
expect(state.codequalityDiff).toEqual(codequality);
});
});
describe('SET_DIFF_VIEW_TYPE', () => { describe('SET_DIFF_VIEW_TYPE', () => {
it('should set diff view type properly', () => { it('should set diff view type properly', () => {
const state = {}; const state = {};
......
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