Commit a3dd88cd authored by Lukas Eipert's avatar Lukas Eipert

Polish security report externalizations

This reduces the amount of translations needed to fully translate the
security report summaries and also makes some untranslatable cases
translatable.

Changes include:

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