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';
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',
);
});
......
......@@ -168,26 +168,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 ""
......@@ -6636,14 +6616,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 ""
......@@ -8554,16 +8526,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 ""
......@@ -8591,61 +8553,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"
......@@ -8718,13 +8706,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"
......@@ -8733,9 +8718,6 @@ msgstr ""
msgid "ciReport|Security scanning failed loading any results"
msgstr ""
msgid "ciReport|Security scanning is loading"
msgstr ""
msgid "ciReport|Severity"
msgstr ""
......@@ -8809,19 +8791,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