Commit 45bd054f authored by Filipa Lacerda's avatar Filipa Lacerda

Merge branch '6079-ignore-dismissed-issues-in-count' into 'master'

Make wording in security report summaries more consistent

Closes #7383

See merge request gitlab-org/gitlab-ee!7373
parents 6ff23241 a3dd88cd
......@@ -3,12 +3,14 @@ import { mapState } from 'vuex';
import $ from 'jquery';
import { n__, s__ } from '~/locale';
import CiIcon from '~/vue_shared/components/ci_icon.vue';
import messages from 'ee/vue_shared/security_reports/store/messages';
export default {
name: 'SummaryReport',
components: {
CiIcon,
},
messages,
computed: {
...mapState(['sast', 'dependencyScanning', 'dast', 'sastContainer']),
sastLink() {
......@@ -123,10 +125,10 @@ export default {
class="prepend-left-10 flex flex-align-self-center"
>
<template v-if="hasSastError">
{{ s__('ciReport|SAST resulted in error while loading results') }}
{{ $options.messages.SAST_HAS_ERROR }}
</template>
<template v-else-if="isLoadingSast">
{{ s__('ciReport|SAST is loading') }}
{{ $options.messages.SAST_IS_LOADING }}
</template>
<template v-else>
{{ s__('ciReport|SAST detected') }}
......@@ -157,10 +159,10 @@ export default {
class="prepend-left-10 flex flex-align-self-center"
>
<template v-if="hasDependencyScanningError">
{{ s__('ciReport|Dependency scanning resulted in error while loading results') }}
{{ $options.messages.DEPENDENCY_SCANNING_HAS_ERROR }}
</template>
<template v-else-if="isLoadingDependencyScanning">
{{ s__('ciReport|Dependency scanning is loading') }}
{{ $options.messages.DEPENDENCY_SCANNING_IS_LOADING }}
</template>
<template v-else>
{{ s__('ciReport|Dependency scanning detected') }}
......@@ -191,10 +193,10 @@ export default {
class="prepend-left-10 flex flex-align-self-center"
>
<template v-if="hasSastContainerError">
{{ s__('ciReport|Container scanning resulted in error while loading results') }}
{{ $options.messages.CONTAINER_SCANNING_HAS_ERROR }}
</template>
<template v-else-if="isLoadingSastContainer">
{{ s__('ciReport|Container scanning is loading') }}
{{ $options.messages.CONTAINER_SCANNING_IS_LOADING }}
</template>
<template v-else>
{{ s__('ciReport|Container scanning detected') }}
......@@ -225,10 +227,10 @@ export default {
class="prepend-left-10 flex flex-align-self-center"
>
<template v-if="hasDastError">
{{ s__('ciReport|DAST resulted in error while loading results') }}
{{ $options.messages.DAST_HAS_ERROR }}
</template>
<template v-else-if="isLoadingDast">
{{ s__('ciReport|DAST is loading') }}
{{ $options.messages.DAST_IS_LOADING }}
</template>
<template v-else>
{{ s__('ciReport|DAST detected') }}
......
......@@ -7,12 +7,14 @@ import { componentNames } from 'ee/vue_shared/components/reports/issue_body';
import IssueModal from './components/modal.vue';
import mixin from './mixins/security_report_mixin';
import reportsMixin from './mixins/reports_mixin';
import messages from './store/messages';
export default {
components: {
ReportSection,
IssueModal,
},
messages,
mixins: [mixin, reportsMixin],
props: {
alwaysOpen: {
......@@ -93,22 +95,25 @@ export default {
...mapState(['sast', 'dependencyScanning', 'sastContainer', 'dast']),
sastText() {
return this.summaryTextBuilder('SAST', this.sast.newIssues.length);
return this.summaryTextBuilder(messages.SAST, this.sast.newIssues.length);
},
dependencyScanningText() {
return this.summaryTextBuilder(
'Dependency scanning',
messages.DEPENDENCY_SCANNING,
this.dependencyScanning.newIssues.length,
);
},
sastContainerText() {
return this.summaryTextBuilder('Container scanning', this.sastContainer.newIssues.length);
return this.summaryTextBuilder(
messages.CONTAINER_SCANNING,
this.sastContainer.newIssues.length,
);
},
dastText() {
return this.summaryTextBuilder('DAST', this.dast.newIssues.length);
return this.summaryTextBuilder(messages.DAST, this.dast.newIssues.length);
},
issuesCount() {
......@@ -184,27 +189,21 @@ export default {
'setCanCreateIssuePermission',
'setCanCreateFeedbackPermission',
]),
summaryTextBuilder(type, issuesCount = 0) {
summaryTextBuilder(reportType, issuesCount = 0) {
if (issuesCount === 0) {
return sprintf(s__('ciReport|%{type} detected no vulnerabilities'), {
type,
return sprintf(s__('ciReport|%{reportType} detected no vulnerabilities'), {
reportType,
});
}
return sprintf(
n__('%{type} detected 1 vulnerability', '%{type} detected %{vulnerabilityCount} vulnerabilities', issuesCount),
{ type, vulnerabilityCount: issuesCount },
n__(
'ciReport|%{reportType} detected %{vulnerabilityCount} vulnerability',
'ciReport|%{reportType} detected %{vulnerabilityCount} vulnerabilities',
issuesCount,
),
{ reportType, vulnerabilityCount: issuesCount },
);
},
translateText(type) {
return {
error: sprintf(s__('ciReport|%{reportName} resulted in error while loading results'), {
reportName: type,
}),
loading: sprintf(s__('ciReport|%{reportName} is loading'), {
reportName: type,
}),
};
},
},
};
</script>
......@@ -215,8 +214,8 @@ export default {
:always-open="alwaysOpen"
:component="$options.componentNames.SastIssueBody"
:status="checkReportStatus(sast.isLoading, sast.hasError)"
:loading-text="translateText('SAST').loading"
:error-text="translateText('SAST').error"
:loading-text="$options.messages.SAST_IS_LOADING"
:error-text="$options.messages.SAST_HAS_ERROR"
:success-text="sastText"
:unresolved-issues="sast.newIssues"
:has-issues="sast.newIssues.length > 0"
......@@ -229,8 +228,8 @@ export default {
:always-open="alwaysOpen"
:component="$options.componentNames.SastIssueBody"
:status="checkReportStatus(dependencyScanning.isLoading, dependencyScanning.hasError)"
:loading-text="translateText('Dependency scanning').loading"
:error-text="translateText('Dependency scanning').error"
:loading-text="$options.messages.DEPENDENCY_SCANNING_IS_LOADING"
:error-text="$options.messages.DEPENDENCY_SCANNING_HAS_ERROR"
:success-text="dependencyScanningText"
:unresolved-issues="dependencyScanning.newIssues"
:has-issues="dependencyScanning.newIssues.length > 0"
......@@ -243,8 +242,8 @@ export default {
:always-open="alwaysOpen"
:component="$options.componentNames.SastContainerIssueBody"
:status="checkReportStatus(sastContainer.isLoading, sastContainer.hasError)"
:loading-text="translateText('Container scanning').loading"
:error-text="translateText('Container scanning').error"
:loading-text="$options.messages.CONTAINER_SCANNING_IS_LOADING"
:error-text="$options.messages.CONTAINER_SCANNING_HAS_ERROR"
:success-text="sastContainerText"
:unresolved-issues="sastContainer.newIssues"
:has-issues="sastContainer.newIssues.length > 0"
......@@ -257,8 +256,8 @@ export default {
:always-open="alwaysOpen"
:component="$options.componentNames.DastIssueBody"
:status="checkReportStatus(dast.isLoading, dast.hasError)"
:loading-text="translateText('DAST').loading"
:error-text="translateText('DAST').error"
:loading-text="$options.messages.DAST_IS_LOADING"
:error-text="$options.messages.DAST_HAS_ERROR"
:success-text="dastText"
:unresolved-issues="dast.newIssues"
:has-issues="dast.newIssues.length > 0"
......
export const SAST = 'SAST';
export const DAST = 'DAST';
export const SAST_CONTAINER = 'SAST_CONTAINER';
export const LOADING = 'LOADING';
export const ERROR = 'ERROR';
export const SUCCESS = 'SUCCESS';
import { n__, s__ } from '~/locale';
import { textBuilder, statusIcon } from './utils';
import { s__, sprintf } from '~/locale';
import { groupedTextBuilder, statusIcon } from './utils';
import { LOADING, ERROR, SUCCESS } from './constants';
import messages from './messages';
export const groupedSastText = ({ sast }) => {
if (sast.hasError) {
return s__('ciReport|SAST resulted in error while loading results');
const groupedReportText = (report, name, errorMessage, loadingMessage) => {
if (report.hasError) {
return errorMessage;
}
if (sast.isLoading) {
return s__('ciReport|SAST is loading');
if (report.isLoading) {
return loadingMessage;
}
return textBuilder(
'SAST',
sast.paths,
sast.newIssues.length,
sast.resolvedIssues.length,
sast.allIssues.length,
return groupedTextBuilder(
name,
report.paths,
(report.newIssues || []).length,
(report.resolvedIssues || []).length,
(report.allIssues || []).length,
);
};
export const groupedSastContainerText = ({ sastContainer }) => {
if (sastContainer.hasError) {
return s__('ciReport|Container scanning resulted in error while loading results');
}
if (sastContainer.isLoading) {
return s__('ciReport|Container scanning is loading');
}
export const groupedSastText = ({ sast }) =>
groupedReportText(sast, messages.SAST, messages.SAST_HAS_ERROR, messages.SAST_IS_LOADING);
return textBuilder(
'Container scanning',
sastContainer.paths,
sastContainer.newIssues.length,
sastContainer.resolvedIssues.length,
export const groupedSastContainerText = ({ sastContainer }) =>
groupedReportText(
sastContainer,
messages.CONTAINER_SCANNING,
messages.CONTAINER_SCANNING_HAS_ERROR,
messages.CONTAINER_SCANNING_IS_LOADING,
);
};
export const groupedDastText = ({ dast }) => {
if (dast.hasError) {
return s__('ciReport|DAST resulted in error while loading results');
}
if (dast.isLoading) {
return s__('ciReport|DAST is loading');
}
return textBuilder('DAST', dast.paths, dast.newIssues.length, dast.resolvedIssues.length);
};
export const groupedDependencyText = ({ dependencyScanning }) => {
if (dependencyScanning.hasError) {
return s__('ciReport|Dependency scanning resulted in error while loading results');
}
if (dependencyScanning.isLoading) {
return s__('ciReport|Dependency scanning is loading');
}
export const groupedDastText = ({ dast }) =>
groupedReportText(dast, messages.DAST, messages.DAST_HAS_ERROR, messages.DAST_IS_LOADING);
return textBuilder(
'Dependency scanning',
dependencyScanning.paths,
dependencyScanning.newIssues.length,
dependencyScanning.resolvedIssues.length,
dependencyScanning.allIssues.length,
export const groupedDependencyText = ({ dependencyScanning }) =>
groupedReportText(
dependencyScanning,
messages.DEPENDENCY_SCANNING,
messages.DEPENDENCY_SCANNING_HAS_ERROR,
messages.DEPENDENCY_SCANNING_IS_LOADING,
);
};
export const groupedSummaryText = (state, getters) => {
const { added, fixed } = state.summaryCounts;
const reportType = s__('ciReport|Security scanning');
// All reports are loading
if (getters.areAllReportsLoading) {
return s__('ciReport|Security scanning is loading');
return sprintf(messages.TRANSLATION_IS_LOADING, { reportType });
}
// All reports returned error
......@@ -80,53 +56,25 @@ export const groupedSummaryText = (state, getters) => {
return s__('ciReport|Security scanning failed loading any results');
}
// No base is present in any report
if (getters.noBaseInAllReports) {
if (added > 0) {
return n__(
'Security scanning detected %d vulnerability for the source branch only',
'Security scanning detected %d vulnerabilities for the source branch only',
added,
);
}
return s__(
'Security scanning detected no vulnerabilities for the source branch only',
);
}
const { added, fixed, existing } = state.summaryCounts;
const text = [s__('ciReport|Security scanning')];
let status = '';
if (getters.areReportsLoading && getters.anyReportHasError) {
text.push('(is loading, errors when loading results)');
status = s__('ciReport|(is loading, errors when loading results)');
} else if (getters.areReportsLoading && !getters.anyReportHasError) {
text.push('(is loading)');
status = s__('ciReport|(is loading)');
} else if (!getters.areReportsLoading && getters.anyReportHasError) {
text.push('(errors when loading results)');
status = s__('ciReport|(errors when loading results)');
}
if (added > 0 && fixed === 0) {
text.push(n__('detected %d new vulnerability', 'detected %d new vulnerabilities', added));
}
/*
In order to correct wording, we ne to set the base property to true,
if at least one report has a base.
*/
const paths = { head: true, base: !getters.noBaseInAllReports };
if (added > 0 && fixed > 0) {
text.push(
`${n__('detected %d new vulnerability', 'detected %d new vulnerabilities', added)} ${n__(
'and %d fixed vulnerability',
'and %d fixed vulnerabilities',
fixed,
)}`,
);
}
if (added === 0 && fixed > 0) {
text.push(n__('detected %d fixed vulnerability', 'detected %d fixed vulnerabilities', fixed));
}
if (added === 0 && fixed === 0) {
text.push(s__('detected no vulnerabilities'));
}
return text.join(' ');
return groupedTextBuilder(reportType, paths, added, fixed, existing, status);
};
export const summaryStatus = (state, getters) => {
......
import { s__, sprintf } from '~/locale';
const TRANSLATION_IS_LOADING = s__('ciReport|%{reportType} is loading');
const TRANSLATION_HAS_ERROR = s__('ciReport|%{reportType}: Loading resulted in an error');
const SAST = s__('ciReport|SAST');
const DAST = s__('ciReport|DAST');
const CONTAINER_SCANNING = s__('ciReport|Container scanning');
const DEPENDENCY_SCANNING = s__('ciReport|Dependency scanning');
export default {
SAST,
DAST,
CONTAINER_SCANNING,
DEPENDENCY_SCANNING,
TRANSLATION_IS_LOADING,
TRANSLATION_HAS_ERROR,
SAST_IS_LOADING: sprintf(TRANSLATION_IS_LOADING, { reportType: SAST }),
SAST_HAS_ERROR: sprintf(TRANSLATION_HAS_ERROR, { reportType: SAST }),
DAST_IS_LOADING: sprintf(TRANSLATION_IS_LOADING, { reportType: DAST }),
DAST_HAS_ERROR: sprintf(TRANSLATION_HAS_ERROR, { reportType: DAST }),
CONTAINER_SCANNING_IS_LOADING: sprintf(TRANSLATION_IS_LOADING, {
reportType: CONTAINER_SCANNING,
}),
CONTAINER_SCANNING_HAS_ERROR: sprintf(TRANSLATION_HAS_ERROR, { reportType: CONTAINER_SCANNING }),
DEPENDENCY_SCANNING_IS_LOADING: sprintf(TRANSLATION_IS_LOADING, {
reportType: DEPENDENCY_SCANNING,
}),
DEPENDENCY_SCANNING_HAS_ERROR: sprintf(TRANSLATION_HAS_ERROR, {
reportType: DEPENDENCY_SCANNING,
}),
};
......@@ -84,6 +84,7 @@ export default {
state.summaryCounts.added += newIssues.length;
state.summaryCounts.fixed += resolvedIssues.length;
state.summaryCounts.existing += allIssues.length;
} else if (reports.head && !reports.base) {
const newIssues = parseSastIssues(reports.head, reports.enrichData, state.blobPath.head);
......@@ -179,8 +180,8 @@ export default {
Vue.set(state.dast, 'newIssues', newIssues);
Vue.set(state.dast, 'resolvedIssues', resolvedIssues);
Vue.set(state.dast, 'isLoading', false);
state.summaryCounts.added += newIssues.length;
state.summaryCounts.added += newIssues.length;
state.summaryCounts.fixed += resolvedIssues.length;
} else if (reports.head && reports.head.site && !reports.base) {
const newIssues = parseDastIssues(reports.head.site.alerts, reports.enrichData);
......@@ -245,6 +246,7 @@ export default {
state.summaryCounts.added += newIssues.length;
state.summaryCounts.fixed += resolvedIssues.length;
state.summaryCounts.existing += allIssues.length;
}
if (reports.head && !reports.base) {
......
......@@ -4,6 +4,7 @@ export default () => ({
summaryCounts: {
added: 0,
fixed: 0,
existing: 0,
},
blobPath: {
......
......@@ -252,75 +252,62 @@ export const filterByKey = (firstArray = [], secondArray = [], key = '') =>
export const getUnapprovedVulnerabilities = (issues = [], unapproved = []) =>
issues.filter(item => unapproved.find(el => el === item.vulnerability));
export const textBuilder = (
type = '',
export const groupedTextBuilder = (
reportType = '',
paths = {},
newIssues = 0,
resolvedIssues = 0,
allIssues = 0,
status = '',
) => {
// with no new or fixed but with vulnerabilities
if (newIssues === 0 && resolvedIssues === 0 && allIssues) {
return sprintf(s__('ciReport|%{type} detected no new security vulnerabilities'), { type });
}
let baseString = '';
if (!paths.base) {
if (newIssues > 0) {
return sprintf(
n__(
'%{type} detected 1 vulnerability for the source branch only',
'%{type} detected %{vulnerabilityCount} vulnerabilities for the source branch only',
newIssues,
),
{ type, vulnerabilityCount: newIssues },
baseString = n__(
'ciReport|%{reportType} %{status} detected %{newCount} vulnerability for the source branch only',
'ciReport|%{reportType} %{status} detected %{newCount} vulnerabilities for the source branch only',
newIssues,
);
}
return sprintf('%{type} detected no vulnerabilities for the source branch only', { type });
} else if (paths.base && paths.head) {
// With no issues
if (newIssues === 0 && resolvedIssues === 0 && allIssues === 0) {
return sprintf(s__('ciReport|%{type} detected no security vulnerabilities'), { type });
}
// with only new issues
if (newIssues > 0 && resolvedIssues === 0) {
return sprintf(
n__(
'%{type} detected 1 new vulnerability',
'%{type} detected %{vulnerabilityCount} new vulnerabilities',
newIssues,
),
{ type, vulnerabilityCount: newIssues },
} else {
baseString = s__(
'ciReport|%{reportType} %{status} detected no vulnerabilities for the source branch only',
);
}
// with new and fixed issues
} else if (paths.base && paths.head) {
if (newIssues > 0 && resolvedIssues > 0) {
return `${sprintf(
n__(
'%{type} detected 1 new vulnerability',
'%{type} detected %{vulnerabilityCount} new vulnerabilities',
newIssues,
),
{ type, vulnerabilityCount: newIssues },
)}
${n__('and 1 fixed vulnerability', 'and %d fixed vulnerabilities', resolvedIssues)}`;
}
// with only fixed issues
if (newIssues === 0 && resolvedIssues > 0) {
return sprintf(
n__(
'%{type} detected 1 fixed vulnerability',
'%{type} detected %{vulnerabilityCount} fixed vulnerabilities',
resolvedIssues,
),
{ type, vulnerabilityCount: resolvedIssues },
baseString = s__(
'ciReport|%{reportType} %{status} detected %{newCount} new, and %{fixedCount} fixed vulnerabilities',
);
} else if (newIssues > 0 && resolvedIssues === 0) {
baseString = n__(
'ciReport|%{reportType} %{status} detected %{newCount} new vulnerability',
'ciReport|%{reportType} %{status} detected %{newCount} new vulnerabilities',
newIssues,
);
} else if (newIssues === 0 && resolvedIssues > 0) {
baseString = n__(
'ciReport|%{reportType} %{status} detected %{fixedCount} fixed vulnerability',
'ciReport|%{reportType} %{status} detected %{fixedCount} fixed vulnerabilities',
resolvedIssues,
);
} else if (allIssues > 0) {
baseString = s__('ciReport|%{reportType} %{status} detected no new vulnerabilities');
} else {
baseString = s__('ciReport|%{reportType} %{status} detected no vulnerabilities');
}
}
return '';
if (!status) {
baseString = baseString.replace('%{status}', '').replace(' ', ' ');
}
return sprintf(baseString, {
status,
reportType,
newCount: newIssues,
fixedCount: resolvedIssues,
});
};
export const statusIcon = (loading = false, failed = false, newIssues = 0, neutralIssues = 0) => {
......
---
title: Polish security report externalizations
merge_request: 7373
author:
type: changed
......@@ -116,7 +116,7 @@ describe('Report summary widget', () => {
.querySelector('.js-sast-summary')
.textContent.trim()
.replace(/\s\s+/g, ' '),
).toEqual('SAST resulted in error while loading results');
).toEqual('SAST: Loading resulted in an error');
expect(vm.$el.querySelector('.js-sast-summary .js-ci-status-icon-warning')).not.toBeNull();
done();
......@@ -131,7 +131,7 @@ describe('Report summary widget', () => {
.querySelector('.js-dss-summary')
.textContent.trim()
.replace(/\s\s+/g, ' '),
).toEqual('Dependency scanning resulted in error while loading results');
).toEqual('Dependency scanning: Loading resulted in an error');
expect(vm.$el.querySelector('.js-dss-summary .js-ci-status-icon-warning')).not.toBeNull();
})
......@@ -147,7 +147,7 @@ describe('Report summary widget', () => {
.querySelector('.js-sast-container-summary')
.textContent.trim()
.replace(/\s\s+/g, ' '),
).toEqual('Container scanning resulted in error while loading results');
).toEqual('Container scanning: Loading resulted in an error');
expect(vm.$el.querySelector('.js-sast-container-summary .js-ci-status-icon-warning')).not.toBeNull();
})
......@@ -163,7 +163,7 @@ describe('Report summary widget', () => {
.querySelector('.js-dast-summary')
.textContent.trim()
.replace(/\s\s+/g, ' '),
).toEqual('DAST resulted in error while loading results');
).toEqual('DAST: Loading resulted in an error');
expect(vm.$el.querySelector('.js-dast-summary .js-ci-status-icon-warning')).not.toBeNull();
})
......
......@@ -212,6 +212,8 @@ describe('Card security reports app', () => {
// Renders DAST result
expect(vm.$el.textContent).toContain('DAST detected 2 vulnerabilities');
expect(vm.$el.textContent).not.toContain('for the source branch only');
done();
}, 0);
});
......@@ -245,14 +247,10 @@ describe('Card security reports app', () => {
setTimeout(() => {
expect(vm.$el.querySelector('.fa-spinner')).toBeNull();
expect(vm.$el.textContent).toContain('SAST resulted in error while loading results');
expect(vm.$el.textContent).toContain(
'Dependency scanning resulted in error while loading results',
);
expect(vm.$el.textContent).toContain(
'Container scanning resulted in error while loading results',
);
expect(vm.$el.textContent).toContain('DAST resulted in error while loading results');
expect(vm.$el.textContent).toContain('SAST: Loading resulted in an error');
expect(vm.$el.textContent).toContain('Dependency scanning: Loading resulted in an error');
expect(vm.$el.textContent).toContain('Container scanning: Loading resulted in an error');
expect(vm.$el.textContent).toContain('DAST: Loading resulted in an error');
done();
}, 0);
});
......
......@@ -74,16 +74,12 @@ describe('Grouped security reports app', () => {
);
expect(vm.$el.querySelector('.js-collapse-btn').textContent.trim()).toEqual('Expand');
expect(trimText(vm.$el.textContent)).toContain('SAST: Loading resulted in an error');
expect(trimText(vm.$el.textContent)).toContain(
'SAST resulted in error while loading results',
'Dependency scanning: Loading resulted in an error',
);
expect(trimText(vm.$el.textContent)).toContain(
'Dependency scanning resulted in error while loading results',
);
expect(vm.$el.textContent).toContain(
'Container scanning resulted in error while loading results',
);
expect(vm.$el.textContent).toContain('DAST resulted in error while loading results');
expect(vm.$el.textContent).toContain('Container scanning: Loading resulted in an error');
expect(vm.$el.textContent).toContain('DAST: Loading resulted in an error');
done();
}, 0);
});
......@@ -184,7 +180,7 @@ describe('Grouped security reports app', () => {
// Renders the summary text
expect(vm.$el.querySelector('.js-code-text').textContent.trim()).toEqual(
'Security scanning detected 6 new vulnerabilities and 2 fixed vulnerabilities',
'Security scanning detected 6 new, and 2 fixed vulnerabilities',
);
// Renders the expand button
......@@ -192,12 +188,12 @@ describe('Grouped security reports app', () => {
// Renders Sast result
expect(trimText(vm.$el.textContent)).toContain(
'SAST detected 2 new vulnerabilities and 1 fixed vulnerability',
'SAST detected 2 new, and 1 fixed vulnerabilities',
);
// Renders DSS result
expect(trimText(vm.$el.textContent)).toContain(
'Dependency scanning detected 2 new vulnerabilities and 1 fixed vulnerability',
'Dependency scanning detected 2 new, and 1 fixed vulnerabilities',
);
// Renders container scanning result
expect(vm.$el.textContent).toContain('Container scanning detected 1 new vulnerability');
......
......@@ -35,7 +35,6 @@ describe('Split security reports app', () => {
store: createStore(),
props: {
headBlobPath: 'path',
baseBlobPath: 'path',
sastHeadPath: 'sast_head.json',
dependencyScanningHeadPath: 'dss_head.json',
dastHeadPath: 'dast_head.json',
......@@ -79,7 +78,6 @@ describe('Split security reports app', () => {
store: createStore(),
props: {
headBlobPath: 'path',
baseBlobPath: 'path',
sastHeadPath: 'sast_head.json',
dependencyScanningHeadPath: 'dss_head.json',
dastHeadPath: 'dast_head.json',
......@@ -110,6 +108,8 @@ describe('Split security reports app', () => {
// Renders DAST result
expect(vm.$el.textContent).toContain('DAST detected 2 vulnerabilities');
expect(vm.$el.textContent).not.toContain('for the source branch only');
done();
}, 0);
});
......@@ -159,7 +159,6 @@ describe('Split security reports app', () => {
store: createStore(),
props: {
headBlobPath: 'path',
baseBlobPath: 'path',
sastHeadPath: 'sast_head.json',
dependencyScanningHeadPath: 'dss_head.json',
dastHeadPath: 'dast_head.json',
......@@ -181,14 +180,10 @@ describe('Split security reports app', () => {
setTimeout(() => {
expect(vm.$el.querySelector('.fa-spinner')).toBeNull();
expect(vm.$el.textContent).toContain('SAST resulted in error while loading results');
expect(vm.$el.textContent).toContain(
'Dependency scanning resulted in error while loading results',
);
expect(vm.$el.textContent).toContain(
'Container scanning resulted in error while loading results',
);
expect(vm.$el.textContent).toContain('DAST resulted in error while loading results');
expect(vm.$el.textContent).toContain('SAST: Loading resulted in an error');
expect(vm.$el.textContent).toContain('Dependency scanning: Loading resulted in an error');
expect(vm.$el.textContent).toContain('Container scanning: Loading resulted in an error');
expect(vm.$el.textContent).toContain('DAST: Loading resulted in an error');
done();
}, 0);
});
......
......@@ -16,7 +16,7 @@ import {
} from 'ee/vue_shared/security_reports/store/getters';
describe('Security reports getters', () => {
function removeBreakLine (data) {
function removeBreakLine(data) {
return data.replace(/\r?\n|\r/g, '').replace(/\s\s+/g, ' ');
}
......@@ -27,16 +27,18 @@ describe('Security reports getters', () => {
newState.sast.paths.head = 'foo';
newState.sast.paths.base = 'bar';
expect(groupedSastText(newState)).toEqual('SAST detected no security vulnerabilities');
expect(groupedSastText(newState)).toEqual('SAST detected no vulnerabilities');
});
});
describe('with only `all` issues', () => {
it('returns no new issues text', () => {
const newState = state();
newState.sast.paths.head = 'foo';
newState.sast.paths.base = 'bar';
newState.sast.allIssues = [{}];
expect(groupedSastText(newState)).toEqual('SAST detected no new security vulnerabilities');
expect(groupedSastText(newState)).toEqual('SAST detected no new vulnerabilities');
});
});
......@@ -73,7 +75,7 @@ describe('Security reports getters', () => {
newState.sast.resolvedIssues = [{}];
expect(removeBreakLine(groupedSastText(newState))).toEqual(
'SAST detected 1 new vulnerability and 1 fixed vulnerability',
'SAST detected 1 new, and 1 fixed vulnerabilities',
);
});
});
......@@ -94,7 +96,7 @@ describe('Security reports getters', () => {
const newState = state();
newState.sast.hasError = true;
expect(groupedSastText(newState)).toEqual('SAST resulted in error while loading results');
expect(groupedSastText(newState)).toEqual('SAST: Loading resulted in an error');
});
});
......@@ -117,7 +119,7 @@ describe('Security reports getters', () => {
newState.sastContainer.paths.base = 'foo';
expect(groupedSastContainerText(newState)).toEqual(
'Container scanning detected no security vulnerabilities',
'Container scanning detected no vulnerabilities',
);
});
});
......@@ -157,7 +159,7 @@ describe('Security reports getters', () => {
newState.sastContainer.resolvedIssues = [{}];
expect(removeBreakLine(groupedSastContainerText(newState))).toEqual(
'Container scanning detected 1 new vulnerability and 1 fixed vulnerability',
'Container scanning detected 1 new, and 1 fixed vulnerabilities',
);
});
});
......@@ -184,7 +186,7 @@ describe('Security reports getters', () => {
newState.dast.paths.head = 'foo';
newState.dast.paths.base = 'foo';
expect(groupedDastText(newState)).toEqual('DAST detected no security vulnerabilities');
expect(groupedDastText(newState)).toEqual('DAST detected no vulnerabilities');
});
});
......@@ -221,7 +223,7 @@ describe('Security reports getters', () => {
newState.dast.resolvedIssues = [{}];
expect(removeBreakLine(groupedDastText(newState))).toEqual(
'DAST detected 1 new vulnerability and 1 fixed vulnerability',
'DAST detected 1 new, and 1 fixed vulnerabilities',
);
});
});
......@@ -246,7 +248,7 @@ describe('Security reports getters', () => {
newState.dependencyScanning.paths.base = 'foo';
expect(groupedDependencyText(newState)).toEqual(
'Dependency scanning detected no security vulnerabilities',
'Dependency scanning detected no vulnerabilities',
);
});
});
......@@ -285,7 +287,7 @@ describe('Security reports getters', () => {
newState.dependencyScanning.resolvedIssues = [{}];
expect(removeBreakLine(groupedDependencyText(newState))).toEqual(
'Dependency scanning detected 1 new vulnerability and 1 fixed vulnerability',
'Dependency scanning detected 1 new, and 1 fixed vulnerabilities',
);
});
});
......@@ -323,9 +325,7 @@ describe('Security reports getters', () => {
noBaseInAllReports: true,
areReportsLoading: false,
}),
).toEqual(
'Security scanning detected no vulnerabilities for the source branch only',
);
).toEqual('Security scanning detected no vulnerabilities for the source branch only');
});
it('returns is loading text', () => {
......@@ -343,6 +343,7 @@ describe('Security reports getters', () => {
newState.summaryCounts = {
added: 2,
fixed: 4,
existing: 5,
};
expect(
......@@ -351,7 +352,7 @@ describe('Security reports getters', () => {
noBaseInAllReports: false,
areReportsLoading: false,
}),
).toContain('Security scanning detected 2 new vulnerabilities and 4 fixed vulnerabilities');
).toEqual('Security scanning detected 2 new, and 4 fixed vulnerabilities');
});
it('returns added text', () => {
......@@ -359,6 +360,7 @@ describe('Security reports getters', () => {
newState.summaryCounts = {
added: 2,
fixed: 0,
existing: 5,
};
expect(
......@@ -367,7 +369,7 @@ describe('Security reports getters', () => {
noBaseInAllReports: false,
areReportsLoading: false,
}),
).toContain('Security scanning detected 2 new vulnerabilities');
).toEqual('Security scanning detected 2 new vulnerabilities');
});
it('returns fixed text', () => {
......@@ -375,6 +377,7 @@ describe('Security reports getters', () => {
newState.summaryCounts = {
added: 0,
fixed: 4,
existing: 5,
};
expect(
......@@ -383,7 +386,7 @@ describe('Security reports getters', () => {
noBaseInAllReports: false,
areReportsLoading: false,
}),
).toContain('Security scanning detected 4 fixed vulnerabilities');
).toEqual('Security scanning detected 4 fixed vulnerabilities');
});
it('returns added and fixed while loading text', () => {
......@@ -391,6 +394,7 @@ describe('Security reports getters', () => {
newState.summaryCounts = {
added: 2,
fixed: 4,
existing: 5,
};
expect(
......@@ -399,9 +403,41 @@ describe('Security reports getters', () => {
noBaseInAllReports: false,
areReportsLoading: true,
}),
).toContain(
'Security scanning (is loading) detected 2 new vulnerabilities and 4 fixed vulnerabilities',
);
).toEqual('Security scanning (is loading) detected 2 new, and 4 fixed vulnerabilities');
});
it('returns no new text if there are existing ones', () => {
const newState = state();
newState.summaryCounts = {
added: 0,
fixed: 0,
existing: 5,
};
expect(
groupedSummaryText(newState, {
allReportsHaveError: false,
noBaseInAllReports: false,
areReportsLoading: false,
}),
).toEqual('Security scanning detected no new vulnerabilities');
});
it('returns no text if there are existing ones', () => {
const newState = state();
newState.summaryCounts = {
added: 0,
fixed: 0,
existing: 0,
};
expect(
groupedSummaryText(newState, {
allReportsHaveError: false,
noBaseInAllReports: false,
areReportsLoading: false,
}),
).toEqual('Security scanning detected no vulnerabilities');
});
});
......
......@@ -118,6 +118,7 @@ describe('security reports mutations', () => {
expect(stateCopy.sast.isLoading).toEqual(false);
expect(stateCopy.sast.newIssues).toEqual(parsedSastIssuesHead);
expect(stateCopy.sast.resolvedIssues).toEqual(parsedSastBaseStore);
expect(stateCopy.summaryCounts).toEqual({ added: 2, fixed: 1, existing: 1 });
});
});
......@@ -130,6 +131,7 @@ describe('security reports mutations', () => {
expect(stateCopy.sast.isLoading).toEqual(false);
expect(stateCopy.sast.newIssues).toEqual(parsedSastIssuesStore);
expect(stateCopy.summaryCounts).toEqual({ added: 3, fixed: 0, existing: 0 });
});
});
});
......@@ -177,6 +179,7 @@ describe('security reports mutations', () => {
expect(stateCopy.sastContainer.isLoading).toEqual(false);
expect(stateCopy.sastContainer.newIssues).toEqual(dockerNewIssues);
expect(stateCopy.sastContainer.resolvedIssues).toEqual([]);
expect(stateCopy.summaryCounts).toEqual({ added: 1, fixed: 0, existing: 0 });
});
});
......@@ -188,6 +191,7 @@ describe('security reports mutations', () => {
expect(stateCopy.sastContainer.isLoading).toEqual(false);
expect(stateCopy.sastContainer.newIssues).toEqual(dockerOnlyHeadParsed);
expect(stateCopy.summaryCounts).toEqual({ added: 2, fixed: 0, existing: 0 });
});
});
});
......@@ -237,6 +241,7 @@ describe('security reports mutations', () => {
expect(stateCopy.dast.newIssues).toEqual(parsedDastNewIssues);
expect(stateCopy.dast.resolvedIssues).toEqual([]);
expect(stateCopy.summaryCounts).toEqual({ added: 1, fixed: 0, existing: 0 });
});
});
......@@ -248,6 +253,7 @@ describe('security reports mutations', () => {
expect(stateCopy.dast.isLoading).toEqual(false);
expect(stateCopy.dast.newIssues).toEqual(parsedDast);
expect(stateCopy.summaryCounts).toEqual({ added: 2, fixed: 0, existing: 0 });
});
});
});
......@@ -297,8 +303,10 @@ describe('security reports mutations', () => {
expect(stateCopy.dependencyScanning.isLoading).toEqual(false);
expect(stateCopy.dependencyScanning.newIssues).toEqual(parsedDependencyScanningIssuesHead);
expect(stateCopy.dependencyScanning.resolvedIssues)
.toEqual(parsedDependencyScanningBaseStore);
expect(stateCopy.dependencyScanning.resolvedIssues).toEqual(
parsedDependencyScanningBaseStore,
);
expect(stateCopy.summaryCounts).toEqual({ added: 2, fixed: 1, existing: 1 });
});
});
......@@ -310,6 +318,7 @@ describe('security reports mutations', () => {
});
expect(stateCopy.dependencyScanning.isLoading).toEqual(false);
expect(stateCopy.dependencyScanning.newIssues).toEqual(parsedDependencyScanningIssuesStore);
expect(stateCopy.summaryCounts).toEqual({ added: 3, fixed: 0, existing: 0 });
});
});
});
......@@ -486,7 +495,7 @@ describe('security reports mutations', () => {
it('updates issue in the new issues list', () => {
stateCopy.sast.newIssues = parsedSastIssuesHead;
stateCopy.sast.resolvedIssues = [];
stateCopy.sast.AllIssues = [];
stateCopy.sast.allIssues = [];
const updatedIssue = {
...parsedSastIssuesHead[0],
foo: 'bar',
......@@ -499,7 +508,7 @@ describe('security reports mutations', () => {
it('updates issue in the resolved issues list', () => {
stateCopy.sast.newIssues = [];
stateCopy.sast.resolvedIssues = parsedSastIssuesHead;
stateCopy.sast.AllIssues = [];
stateCopy.sast.allIssues = [];
const updatedIssue = {
...parsedSastIssuesHead[0],
foo: 'bar',
......@@ -512,14 +521,14 @@ describe('security reports mutations', () => {
it('updates issue in the all issues list', () => {
stateCopy.sast.newIssues = [];
stateCopy.sast.resolvedIssues = [];
stateCopy.sast.AllIssues = parsedSastIssuesHead;
stateCopy.sast.allIssues = parsedSastIssuesHead;
const updatedIssue = {
...parsedSastIssuesHead[0],
foo: 'bar',
};
mutations[types.UPDATE_SAST_ISSUE](stateCopy, updatedIssue);
expect(stateCopy.sast.AllIssues[0]).toEqual(updatedIssue);
expect(stateCopy.sast.allIssues[0]).toEqual(updatedIssue);
});
});
......@@ -527,7 +536,7 @@ describe('security reports mutations', () => {
it('updates issue in the new issues list', () => {
stateCopy.dependencyScanning.newIssues = parsedDependencyScanningIssuesHead;
stateCopy.dependencyScanning.resolvedIssues = [];
stateCopy.dependencyScanning.AllIssues = [];
stateCopy.dependencyScanning.allIssues = [];
const updatedIssue = {
...parsedDependencyScanningIssuesHead[0],
foo: 'bar',
......@@ -540,7 +549,7 @@ describe('security reports mutations', () => {
it('updates issue in the resolved issues list', () => {
stateCopy.sast.newIssues = [];
stateCopy.sast.resolvedIssues = parsedDependencyScanningIssuesHead;
stateCopy.sast.AllIssues = [];
stateCopy.sast.allIssues = [];
const updatedIssue = {
...parsedDependencyScanningIssuesHead[0],
foo: 'bar',
......@@ -553,14 +562,14 @@ describe('security reports mutations', () => {
it('updates issue in the all issues list', () => {
stateCopy.dependencyScanning.newIssues = [];
stateCopy.dependencyScanning.resolvedIssues = [];
stateCopy.dependencyScanning.AllIssues = parsedDependencyScanningIssuesHead;
stateCopy.dependencyScanning.allIssues = parsedDependencyScanningIssuesHead;
const updatedIssue = {
...parsedDependencyScanningIssuesHead[0],
foo: 'bar',
};
mutations[types.UPDATE_DEPENDENCY_SCANNING_ISSUE](stateCopy, updatedIssue);
expect(stateCopy.dependencyScanning.AllIssues[0]).toEqual(updatedIssue);
expect(stateCopy.dependencyScanning.allIssues[0]).toEqual(updatedIssue);
});
});
......@@ -617,4 +626,3 @@ describe('security reports mutations', () => {
});
});
});
......@@ -7,7 +7,7 @@ import {
parseDastIssues,
filterByKey,
getUnapprovedVulnerabilities,
textBuilder,
groupedTextBuilder,
statusIcon,
} from 'ee/vue_shared/security_reports/store/utils';
import {
......@@ -200,27 +200,29 @@ describe('security reports utils', () => {
describe('textBuilder', () => {
describe('with no issues', () => {
it('should return no vulnerabiltities text', () => {
expect(textBuilder('', { head: 'foo', base: 'bar' }, 0, 0, 0)).toEqual(
' detected no security vulnerabilities',
expect(groupedTextBuilder('', { head: 'foo', base: 'bar' }, 0, 0, 0)).toEqual(
' detected no vulnerabilities',
);
});
});
describe('with only `all` issues', () => {
it('should return no new vulnerabiltities text', () => {
expect(textBuilder('', {}, 0, 0, 1)).toEqual(' detected no new security vulnerabilities');
expect(groupedTextBuilder('', { head: 'foo', base: 'bar' }, 0, 0, 1)).toEqual(
' detected no new vulnerabilities',
);
});
});
describe('with new issues and without base', () => {
it('should return unable to compare text', () => {
expect(textBuilder('', { head: 'foo' }, 1, 0, 0)).toEqual(
expect(groupedTextBuilder('', { head: 'foo' }, 1, 0, 0)).toEqual(
' detected 1 vulnerability for the source branch only',
);
});
it('should return unable to compare text with no vulnerability', () => {
expect(textBuilder('', { head: 'foo' }, 0, 0, 0)).toEqual(
expect(groupedTextBuilder('', { head: 'foo' }, 0, 0, 0)).toEqual(
' detected no vulnerabilities for the source branch only',
);
});
......@@ -229,10 +231,10 @@ describe('security reports utils', () => {
describe('with base and head', () => {
describe('with only new issues', () => {
it('should return new issues text', () => {
expect(textBuilder('', { head: 'foo', base: 'foo' }, 1, 0, 0)).toEqual(
expect(groupedTextBuilder('', { head: 'foo', base: 'foo' }, 1, 0, 0)).toEqual(
' detected 1 new vulnerability',
);
expect(textBuilder('', { head: 'foo', base: 'foo' }, 2, 0, 0)).toEqual(
expect(groupedTextBuilder('', { head: 'foo', base: 'foo' }, 2, 0, 0)).toEqual(
' detected 2 new vulnerabilities',
);
});
......@@ -241,20 +243,20 @@ describe('security reports utils', () => {
describe('with new and resolved issues', () => {
it('should return new and fixed issues text', () => {
expect(
textBuilder('', { head: 'foo', base: 'foo' }, 1, 1, 0).replace(/\n+\s+/m, ' '),
).toEqual(' detected 1 new vulnerability and 1 fixed vulnerability');
groupedTextBuilder('', { head: 'foo', base: 'foo' }, 1, 1, 0).replace(/\n+\s+/m, ' '),
).toEqual(' detected 1 new, and 1 fixed vulnerabilities');
expect(
textBuilder('', { head: 'foo', base: 'foo' }, 2, 2, 0).replace(/\n+\s+/m, ' '),
).toEqual(' detected 2 new vulnerabilities and 2 fixed vulnerabilities');
groupedTextBuilder('', { head: 'foo', base: 'foo' }, 2, 2, 0).replace(/\n+\s+/m, ' '),
).toEqual(' detected 2 new, and 2 fixed vulnerabilities');
});
});
describe('with only resolved issues', () => {
it('should return fixed issues text', () => {
expect(textBuilder('', { head: 'foo', base: 'foo' }, 0, 1, 0)).toEqual(
expect(groupedTextBuilder('', { head: 'foo', base: 'foo' }, 0, 1, 0)).toEqual(
' detected 1 fixed vulnerability',
);
expect(textBuilder('', { head: 'foo', base: 'foo' }, 0, 2, 0)).toEqual(
expect(groupedTextBuilder('', { head: 'foo', base: 'foo' }, 0, 2, 0)).toEqual(
' detected 2 fixed vulnerabilities',
);
});
......
......@@ -171,26 +171,6 @@ msgstr ""
msgid "%{title} changes"
msgstr ""
msgid "%{type} detected 1 fixed vulnerability"
msgid_plural "%{type} detected %{vulnerabilityCount} fixed vulnerabilities"
msgstr[0] ""
msgstr[1] ""
msgid "%{type} detected 1 new vulnerability"
msgid_plural "%{type} detected %{vulnerabilityCount} new vulnerabilities"
msgstr[0] ""
msgstr[1] ""
msgid "%{type} detected 1 vulnerability"
msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
msgstr[0] ""
msgstr[1] ""
msgid "%{type} detected 1 vulnerability for the source branch only"
msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities for the source branch only"
msgstr[0] ""
msgstr[1] ""
msgid "%{unstaged} unstaged and %{staged} staged changes"
msgstr ""
......@@ -6684,14 +6664,6 @@ msgstr ""
msgid "Security Dashboard"
msgstr ""
msgid "Security scanning detected %d vulnerability for the source branch only"
msgid_plural "Security scanning detected %d vulnerabilities for the source branch only"
msgstr[0] ""
msgstr[1] ""
msgid "Security scanning detected no vulnerabilities for the source branch only"
msgstr ""
msgid "SecurityDashboard| The security dashboard displays the latest security report. Use it to find and fix vulnerabilities."
msgstr ""
......@@ -8611,16 +8583,6 @@ msgstr ""
msgid "among other things"
msgstr ""
msgid "and %d fixed vulnerability"
msgid_plural "and %d fixed vulnerabilities"
msgstr[0] ""
msgstr[1] ""
msgid "and 1 fixed vulnerability"
msgid_plural "and %d fixed vulnerabilities"
msgstr[0] ""
msgstr[1] ""
msgid "assign yourself"
msgstr ""
......@@ -8648,61 +8610,87 @@ msgstr ""
msgid "ciReport|%{remainingPackagesCount} more"
msgstr ""
msgid "ciReport|%{reportName} is loading"
msgid "ciReport|%{reportType} %{status} detected %{fixedCount} fixed vulnerability"
msgid_plural "ciReport|%{reportType} %{status} detected %{fixedCount} fixed vulnerabilities"
msgstr[0] ""
msgstr[1] ""
msgid "ciReport|%{reportType} %{status} detected %{newCount} new vulnerability"
msgid_plural "ciReport|%{reportType} %{status} detected %{newCount} new vulnerabilities"
msgstr[0] ""
msgstr[1] ""
msgid "ciReport|%{reportType} %{status} detected %{newCount} new, and %{fixedCount} fixed vulnerabilities"
msgstr ""
msgid "ciReport|%{reportName} resulted in error while loading results"
msgid "ciReport|%{reportType} %{status} detected %{newCount} vulnerability for the source branch only"
msgid_plural "ciReport|%{reportType} %{status} detected %{newCount} vulnerabilities for the source branch only"
msgstr[0] ""
msgstr[1] ""
msgid "ciReport|%{reportType} %{status} detected no new vulnerabilities"
msgstr ""
msgid "ciReport|%{type} detected no new security vulnerabilities"
msgid "ciReport|%{reportType} %{status} detected no vulnerabilities"
msgstr ""
msgid "ciReport|%{type} detected no security vulnerabilities"
msgid "ciReport|%{reportType} %{status} detected no vulnerabilities for the source branch only"
msgstr ""
msgid "ciReport|%{type} detected no vulnerabilities"
msgid "ciReport|%{reportType} detected %{vulnerabilityCount} vulnerability"
msgid_plural "ciReport|%{reportType} detected %{vulnerabilityCount} vulnerabilities"
msgstr[0] ""
msgstr[1] ""
msgid "ciReport|%{reportType} detected no vulnerabilities"
msgstr ""
msgid "ciReport|Class"
msgid "ciReport|%{reportType} is loading"
msgstr ""
msgid "ciReport|Code quality"
msgid "ciReport|%{reportType}: Loading resulted in an error"
msgstr ""
msgid "ciReport|Confidence"
msgid "ciReport|(errors when loading results)"
msgstr ""
msgid "ciReport|Container scanning detected"
msgid "ciReport|(is loading)"
msgstr ""
msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
msgid "ciReport|(is loading, errors when loading results)"
msgstr ""
msgid "ciReport|Container scanning is loading"
msgid "ciReport|Class"
msgstr ""
msgid "ciReport|Container scanning resulted in error while loading results"
msgid "ciReport|Code quality"
msgstr ""
msgid "ciReport|DAST detected"
msgid "ciReport|Confidence"
msgstr ""
msgid "ciReport|DAST is loading"
msgid "ciReport|Container scanning"
msgstr ""
msgid "ciReport|DAST resulted in error while loading results"
msgid "ciReport|Container scanning detected"
msgstr ""
msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code's dependencies."
msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
msgstr ""
msgid "ciReport|Dependency scanning detected"
msgid "ciReport|DAST"
msgstr ""
msgid "ciReport|DAST detected"
msgstr ""
msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code's dependencies."
msgstr ""
msgid "ciReport|Dependency scanning is loading"
msgid "ciReport|Dependency scanning"
msgstr ""
msgid "ciReport|Dependency scanning resulted in error while loading results"
msgid "ciReport|Dependency scanning detected"
msgstr ""
msgid "ciReport|Description"
......@@ -8775,13 +8763,10 @@ msgstr ""
msgid "ciReport|Revert dismissal"
msgstr ""
msgid "ciReport|SAST detected"
msgid "ciReport|SAST"
msgstr ""
msgid "ciReport|SAST is loading"
msgstr ""
msgid "ciReport|SAST resulted in error while loading results"
msgid "ciReport|SAST detected"
msgstr ""
msgid "ciReport|Security scanning"
......@@ -8790,9 +8775,6 @@ msgstr ""
msgid "ciReport|Security scanning failed loading any results"
msgstr ""
msgid "ciReport|Security scanning is loading"
msgstr ""
msgid "ciReport|Severity"
msgstr ""
......@@ -8866,19 +8848,6 @@ msgstr[1] ""
msgid "deploy token"
msgstr ""
msgid "detected %d fixed vulnerability"
msgid_plural "detected %d fixed vulnerabilities"
msgstr[0] ""
msgstr[1] ""
msgid "detected %d new vulnerability"
msgid_plural "detected %d new vulnerabilities"
msgstr[0] ""
msgstr[1] ""
msgid "detected no vulnerabilities"
msgstr ""
msgid "disabled"
msgstr ""
......
......@@ -96,7 +96,7 @@ describe('ee merge request widget options', () => {
vm.$el.querySelector('.js-sast-widget .report-block-list-issue-description')
.textContent,
),
).toEqual('SAST detected 2 new vulnerabilities and 1 fixed vulnerability');
).toEqual('SAST detected 2 new, and 1 fixed vulnerabilities');
done();
}, 0);
});
......@@ -118,7 +118,7 @@ describe('ee merge request widget options', () => {
vm.$el.querySelector('.js-sast-widget .report-block-list-issue-description')
.textContent,
),
).toEqual('SAST detected no new security vulnerabilities');
).toEqual('SAST detected no new vulnerabilities');
done();
}, 0);
});
......@@ -140,7 +140,7 @@ describe('ee merge request widget options', () => {
vm.$el.querySelector('.js-sast-widget .report-block-list-issue-description')
.textContent,
).trim(),
).toEqual('SAST detected no security vulnerabilities');
).toEqual('SAST detected no vulnerabilities');
done();
}, 0);
});
......@@ -158,7 +158,7 @@ describe('ee merge request widget options', () => {
it('should render error indicator', done => {
setTimeout(() => {
expect(removeBreakLine(vm.$el.querySelector('.js-sast-widget').textContent)).toContain(
'SAST resulted in error while loading results',
'SAST: Loading resulted in an error',
);
done();
}, 0);
......@@ -212,7 +212,7 @@ describe('ee merge request widget options', () => {
'.js-dependency-scanning-widget .report-block-list-issue-description',
).textContent,
),
).toEqual('Dependency scanning detected 2 new vulnerabilities and 1 fixed vulnerability');
).toEqual('Dependency scanning detected 2 new, and 1 fixed vulnerabilities');
done();
}, 0);
});
......@@ -235,7 +235,7 @@ describe('ee merge request widget options', () => {
'.js-dependency-scanning-widget .report-block-list-issue-description',
).textContent,
),
).toEqual('Dependency scanning detected no new security vulnerabilities');
).toEqual('Dependency scanning detected no new vulnerabilities');
done();
}, 0);
});
......@@ -258,7 +258,7 @@ describe('ee merge request widget options', () => {
'.js-dependency-scanning-widget .report-block-list-issue-description',
).textContent,
),
).toEqual('Dependency scanning detected no security vulnerabilities');
).toEqual('Dependency scanning detected no vulnerabilities');
done();
}, 0);
});
......@@ -277,7 +277,7 @@ describe('ee merge request widget options', () => {
setTimeout(() => {
expect(
removeBreakLine(vm.$el.querySelector('.js-dependency-scanning-widget').textContent),
).toContain('Dependency scanning resulted in error while loading results');
).toContain('Dependency scanning: Loading resulted in an error');
done();
}, 0);
});
......@@ -588,7 +588,7 @@ describe('ee merge request widget options', () => {
it('should render error indicator', done => {
setTimeout(() => {
expect(vm.$el.querySelector('.js-sast-container').textContent.trim()).toContain(
'Container scanning resulted in error while loading results',
'Container scanning: Loading resulted in an error',
);
done();
}, 0);
......@@ -658,7 +658,7 @@ describe('ee merge request widget options', () => {
it('should render error indicator', done => {
setTimeout(() => {
expect(vm.$el.querySelector('.js-dast-widget').textContent.trim()).toContain(
'DAST resulted in error while loading results',
'DAST: Loading resulted in an error',
);
done();
}, 0);
......
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