Skip to content
代码片段 群组 项目
提交 45ec3362 编辑于 作者: Jay Montal's avatar Jay Montal 提交者: Phil Hughes
浏览文件

Create list for standards adherence report

- Adds list using GlTable

Changelog: added
EE: true
上级 20c6e78b
No related branches found
No related tags found
无相关合并请求
显示
527 个添加95 个删除
......@@ -8,7 +8,7 @@ const AT_LEAST_TWO_APPROVALS = 'AT_LEAST_TWO_APPROVALS';
export const FAIL_STATUS = 'FAIL';
export const NO_STANDARDS_ADHERENCES_FOUND = s__(
'ComplianceReport|No projects with standards adherence checks found',
'ComplianceStandardsAdherence|No projects with standards adherence checks found',
);
export const STANDARDS_ADHERENCE_CHECK_LABELS = {
......@@ -33,6 +33,30 @@ export const STANDARDS_ADHERENCE_CHECK_DESCRIPTIONS = {
),
};
export const STANDARDS_ADHERENCE_CHECK_FAILURE_REASONS = {
[PREVENT_APPROVAL_BY_MERGE_REQUEST_AUTHOR]: s__(
'ComplianceStandardsAdherence|No rule is configured to prevent author approved merge requests.',
),
[PREVENT_APPROVAL_BY_MERGE_REQUEST_COMMITTERS]: s__(
'ComplianceStandardsAdherence|No rule configured to prevent merge requests approved by committers.',
),
[AT_LEAST_TWO_APPROVALS]: s__(
'ComplianceStandardsAdherence|No rule is configured to require two approvals.',
),
};
export const STANDARDS_ADHERENCE_CHECK_MR_FIX_TITLE = s__(
'ComplianceStandardsAdherence|The following features help satisfy this requirement.',
);
export const STANDARDS_ADHERENCE_CHECK_MR_FIX_FEATURES = [
{
title: s__('ComplianceStandardsAdherence|Merge request approval rules'),
description: s__(
"ComplianceStandardsAdherence|Update approval settings in the project's merge request settings to satisfy this requirement.",
),
},
];
const GITLAB = 'GITLAB';
export const STANDARDS_ADHERENCE_STANARD_LABELS = {
......
<script>
import { GlDrawer, GlIcon, GlBadge, GlButton, GlLink } from '@gitlab/ui';
import { DRAWER_Z_INDEX } from '~/lib/utils/constants';
import { getContentWrapperHeight } from '~/lib/utils/dom_utils';
import { joinPaths } from '~/lib/utils/url_utility';
import { helpPagePath } from '~/helpers/help_page_helper';
import {
FAIL_STATUS,
STANDARDS_ADHERENCE_CHECK_DESCRIPTIONS,
STANDARDS_ADHERENCE_CHECK_FAILURE_REASONS,
STANDARDS_ADHERENCE_CHECK_MR_FIX_TITLE,
STANDARDS_ADHERENCE_CHECK_MR_FIX_FEATURES,
STANDARDS_ADHERENCE_CHECK_LABELS,
} from './constants';
export default {
name: 'FixSuggestionsSidebar',
components: {
GlDrawer,
GlIcon,
GlBadge,
GlButton,
GlLink,
},
props: {
groupPath: {
type: String,
required: true,
},
showDrawer: {
type: Boolean,
required: false,
default: false,
},
adherence: {
type: Object,
required: true,
},
},
computed: {
getDrawerHeaderHeight() {
return getContentWrapperHeight();
},
project() {
return this.adherence.project;
},
projectMRSettingsPath() {
return joinPaths(this.project.webUrl, '-', 'settings', 'merge_requests');
},
isFailedStatus() {
return this.adherence.status === FAIL_STATUS;
},
adherenceCheckName() {
return STANDARDS_ADHERENCE_CHECK_LABELS[this.adherence.checkName];
},
adherenceCheckDescription() {
return STANDARDS_ADHERENCE_CHECK_DESCRIPTIONS[this.adherence.checkName];
},
adherenceCheckFailureReason() {
return STANDARDS_ADHERENCE_CHECK_FAILURE_REASONS[this.adherence.checkName];
},
},
standardsAdherenceCheckMRFixTitle: STANDARDS_ADHERENCE_CHECK_MR_FIX_TITLE,
standardsAdherenceCheckMRFixes: STANDARDS_ADHERENCE_CHECK_MR_FIX_FEATURES,
projectMRSettingsDocsPath: helpPagePath('user/project/merge_requests/approvals/rules'),
DRAWER_Z_INDEX,
};
</script>
<template>
<gl-drawer
:open="showDrawer"
:header-height="getDrawerHeaderHeight"
:z-index="$options.DRAWER_Z_INDEX"
@close="$emit('close')"
>
<template #title>
<div>
<h2 class="gl-mt-0" data-testid="sidebar-title">{{ adherenceCheckName }}</h2>
<div>
<span v-if="isFailedStatus" class="gl-text-red-500 gl-font-weight-bold">
<gl-icon name="status_failed" /> {{ __('Fail') }}
</span>
<span v-else class="gl-text-green-500 gl-font-weight-bold">
<gl-icon name="status_success" /> {{ __('Success') }}
</span>
<gl-link :href="project.webUrl"> {{ project.name }} </gl-link>
<span v-for="framework in project.complianceFrameworks.nodes" :key="framework.id">
<gl-badge size="sm" class="gl-mt-3"> {{ framework.name }}</gl-badge>
</span>
</div>
</div>
</template>
<template #default>
<div>
<h4 data-testid="sidebar-requirement-title" class="gl-mt-0">
{{ s__('ComplianceStandardsAdherence|Requirement') }}
</h4>
<span data-testid="sidebar-requirement-content">{{ adherenceCheckDescription }}</span>
</div>
<div>
<h4 data-testid="sidebar-failure-title" class="gl-mt-0">
{{ s__('ComplianceStandardsAdherence|Failure reason') }}
</h4>
<span data-testid="sidebar-failure-content">{{ adherenceCheckFailureReason }}</span>
</div>
<div data-testid="sidebar-how-to-fix">
<div>
<h4 class="gl-mt-0">{{ s__('ComplianceStandardsAdherence|How to fix') }}</h4>
</div>
<div class="gl-my-5">
{{ $options.standardsAdherenceCheckMRFixTitle }}
</div>
<div
v-for="fix in $options.standardsAdherenceCheckMRFixes"
:key="fix.title"
class="gl-mb-4"
>
<div class="gl-my-2 gl-font-weight-bold">{{ fix.title }}</div>
<div class="gl-mb-4">{{ fix.description }}</div>
<gl-button
class="gl-my-3"
size="small"
category="secondary"
variant="confirm"
:href="projectMRSettingsPath"
data-testid="sidebar-mr-settings-button"
>
{{ __('Manage rules') }}
</gl-button>
<gl-button
size="small"
:href="$options.projectMRSettingsDocsPath"
data-testid="sidebar-mr-settings-learn-more-button"
>
{{ __('Learn more') }}
</gl-button>
</div>
</div>
</template>
</gl-drawer>
</template>
<script>
import { GlTable, GlIcon, GlLink, GlBadge } from '@gitlab/ui';
import { GlTable, GlIcon, GlLink, GlBadge, GlLoadingIcon } from '@gitlab/ui';
import * as Sentry from '@sentry/browser';
import { formatDate } from '~/lib/utils/datetime_utility';
import getProjectComplianceStandardsAdherence from '../../graphql/compliance_standards_adherence.query.graphql';
......@@ -10,7 +10,7 @@ import {
STANDARDS_ADHERENCE_STANARD_LABELS,
NO_STANDARDS_ADHERENCES_FOUND,
} from './constants';
// import FixSuggestionsSidebar from './fix_suggestions_sidebar.vue';
import FixSuggestionsSidebar from './fix_suggestions_sidebar.vue';
export default {
name: 'ComplianceStandardsAdherenceTable',
......@@ -19,7 +19,8 @@ export default {
GlIcon,
GlLink,
GlBadge,
// FixSuggestionsSidebar,
GlLoadingIcon,
FixSuggestionsSidebar,
},
props: {
groupPath: {
......@@ -33,7 +34,8 @@ export default {
adherences: {
list: [],
},
showDrawer: false,
drawerId: null,
drawerAdherence: {},
};
},
apollo: {
......@@ -56,6 +58,14 @@ export default {
},
},
},
computed: {
isLoading() {
return this.$apollo.queries.adherences.loading;
},
showDrawer() {
return this.drawerId !== null;
},
},
methods: {
adherenceCheckName(check) {
return STANDARDS_ADHERENCE_CHECK_LABELS[check];
......@@ -66,15 +76,27 @@ export default {
adherenceStandardLabel(standard) {
return STANDARDS_ADHERENCE_STANARD_LABELS[standard];
},
closeDrawer() {
this.showDrawer = false;
},
formatDate(dateString) {
return formatDate(dateString, 'mmm d, yyyy');
},
isFailedStatus(status) {
return status === FAIL_STATUS;
},
toggleDrawer(item) {
if (this.drawerId === item.id) {
this.closeDrawer();
} else {
this.openDrawer(item);
}
},
openDrawer(item) {
this.drawerAdherence = item;
this.drawerId = item.id;
},
closeDrawer() {
this.drawerAdherence = {};
this.drawerId = null;
},
},
fields: [
{
......@@ -119,60 +141,57 @@ export default {
</script>
<template>
<gl-table
:fields="$options.fields"
:items="adherences.list"
:empty-text="$options.noStandardsAdherencesFound"
show-empty
>
<template #cell(status)="{ item: { status } }">
<span v-if="isFailedStatus(status)" class="gl-text-red-500">
<gl-icon name="status_failed" /> {{ __('Fail') }}
</span>
<span v-else class="gl-text-green-500">
<gl-icon name="status_success" /> {{ __('Success') }}
</span>
</template>
<template #cell(project)="{ item: { project } }">
<div>{{ project.name }}</div>
<div v-for="framework in project.complianceFrameworks.nodes" :key="framework.id">
<gl-badge size="sm" class="gl-mt-3"> {{ framework.name }}</gl-badge>
</div>
</template>
<template #cell(checks)="{ item: { checkName } }">
<div class="gl-font-weight-bold">{{ adherenceCheckName(checkName) }}</div>
<div class="gl-mt-2">{{ adherenceCheckDescription(checkName) }}</div>
</template>
<section>
<gl-table
:fields="$options.fields"
:items="adherences.list"
:busy="isLoading"
:empty-text="$options.noStandardsAdherencesFound"
show-empty
>
<template #table-busy>
<gl-loading-icon size="lg" color="dark" class="gl-my-5" />
</template>
<template #cell(status)="{ item: { status } }">
<span v-if="isFailedStatus(status)" class="gl-text-red-500">
<gl-icon name="status_failed" /> {{ __('Fail') }}
</span>
<span v-else class="gl-text-green-500">
<gl-icon name="status_success" /> {{ __('Success') }}
</span>
</template>
<template #cell(standard)="{ item: { standard } }">
{{ adherenceStandardLabel(standard) }}
</template>
<template #cell(project)="{ item: { project } }">
<div>{{ project.name }}</div>
<div v-for="framework in project.complianceFrameworks.nodes" :key="framework.id">
<gl-badge size="sm" class="gl-mt-3"> {{ framework.name }}</gl-badge>
</div>
</template>
<template #cell(lastScanned)="{ item: { updatedAt } }">
{{ formatDate(updatedAt) }}
</template>
<template #cell(checks)="{ item: { checkName } }">
<div class="gl-font-weight-bold">{{ adherenceCheckName(checkName) }}</div>
<div class="gl-mt-2">{{ adherenceCheckDescription(checkName) }}</div>
</template>
<!-- Note: This template will be replaced with the template below -->
<!-- as this is part of https://gitlab.com/gitlab-org/gitlab/-/issues/413718 -->
<template #cell(fixSuggestions)="{}">
<gl-link @click="showDrawer = true">{{
s__('ComplianceStandardsAdherence|View details')
}}</gl-link>
</template>
<template #cell(standard)="{ item: { standard } }">
{{ adherenceStandardLabel(standard) }}
</template>
<!-- <template #cell(fixSuggestions)="{ item: { status, project, checks, fixSuggestions } }">-->
<!-- <gl-link @click="showDrawer = true">{{ fixSuggestions }}</gl-link>-->
<template #cell(lastScanned)="{ item: { updatedAt } }">
{{ formatDate(updatedAt) }}
</template>
<!-- <fix-suggestions-sidebar-->
<!-- :status="status"-->
<!-- :project="project"-->
<!-- :title="checks.name"-->
<!-- :description="checks.description"-->
<!-- :show-drawer="showDrawer"-->
<!-- @close="closeDrawer"-->
<!-- />-->
<!-- </template>-->
</gl-table>
<template #cell(fixSuggestions)="{ item }">
<gl-link @click="toggleDrawer(item)">{{
s__('ComplianceStandardsAdherence|View details')
}}</gl-link>
</template>
</gl-table>
<fix-suggestions-sidebar
:group-path="groupPath"
:show-drawer="showDrawer"
:adherence="drawerAdherence"
@close="closeDrawer"
/>
</section>
</template>
......@@ -11,6 +11,7 @@ query getProjectComplianceStandardsAdherence($fullPath: ID!) {
project {
id
name
webUrl
complianceFrameworks {
nodes {
id
......
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import FixSuggestionsSidebar from 'ee/compliance_dashboard/components/standards_adherence_report/fix_suggestions_sidebar.vue';
describe('FixSuggestionsSidebar component', () => {
let wrapper;
const findRequirementSectionTitle = () => wrapper.findByTestId('sidebar-requirement-title');
const findRequirementSectionContent = () => wrapper.findByTestId('sidebar-requirement-content');
const findFailureSectionReasonTitle = () => wrapper.findByTestId('sidebar-failure-title');
const findFailureSectionReasonContent = () => wrapper.findByTestId('sidebar-failure-content');
const findHowToFixSection = () => wrapper.findByTestId('sidebar-how-to-fix');
const findManageRulesBtn = () => wrapper.findByTestId('sidebar-mr-settings-button');
const findLearnMoreBtn = () => wrapper.findByTestId('sidebar-mr-settings-learn-more-button');
const createComponent = ({ propsData = {} } = {}) => {
wrapper = shallowMountExtended(FixSuggestionsSidebar, {
propsData: {
showDrawer: true,
groupPath: 'example-group',
...propsData,
},
});
};
describe('default behavior', () => {
beforeEach(() => {
createComponent({
propsData: {
adherence: {
checkName: '',
status: 'PASS',
project: {
id: 'gid://gitlab/Project/21',
name: 'example project',
},
},
},
});
});
describe('for drawer body content', () => {
it('renders the `requirement` title', () => {
expect(findRequirementSectionTitle().text()).toBe('Requirement');
});
it('renders the `failure reason` title', () => {
expect(findFailureSectionReasonTitle().text()).toBe('Failure reason');
});
it('renders the `how to fix` title and description', () => {
expect(findHowToFixSection().text()).toContain('How to fix');
expect(findHowToFixSection().text()).toContain(
'The following features help satisfy this requirement',
);
});
});
});
describe('content for each check type', () => {
beforeEach(() => {
createComponent({
propsData: {
adherence: {
checkName: 'PREVENT_APPROVAL_BY_MERGE_REQUEST_AUTHOR',
status: 'PASS',
project: {
id: 'gid://gitlab/Project/21',
name: 'example project',
webUrl: 'example.com/groups/example-group/example-project',
},
},
},
});
});
describe('for checks related to MRs', () => {
describe('for the `how to fix` section', () => {
it('has the details', () => {
expect(findHowToFixSection().text()).toContain('Merge request approval rules');
expect(findHowToFixSection().text()).toContain(
"Update approval settings in the project's merge request settings to satisfy this requirement.",
);
});
it('has the `manage rules` button', () => {
expect(findManageRulesBtn().text()).toBe('Manage rules');
expect(findManageRulesBtn().attributes('href')).toBe(
'example.com/groups/example-group/example-project/-/settings/merge_requests',
);
});
it('has the `learn more` button', () => {
expect(findLearnMoreBtn().text()).toBe('Learn more');
expect(findLearnMoreBtn().attributes('href')).toBe(
'/help/user/project/merge_requests/approvals/rules',
);
});
});
describe.each`
checkName | expectedRequirement | expectedFailureReason
${'PREVENT_APPROVAL_BY_MERGE_REQUEST_AUTHOR'} | ${'Have a valid rule that prevents author approved merge requests'} | ${'No rule is configured to prevent author approved merge requests.'}
${'PREVENT_APPROVAL_BY_MERGE_REQUEST_COMMITTERS'} | ${'Have a valid rule that prevents merge requests approved by committers'} | ${'No rule configured to prevent merge requests approved by committers.'}
${'AT_LEAST_TWO_APPROVALS'} | ${'Have a valid rule that requires any merge request to have more than two approvals'} | ${'No rule is configured to require two approvals.'}
`('when check is $checkName', ({ checkName, expectedRequirement, expectedFailureReason }) => {
beforeEach(() => {
createComponent({
propsData: {
adherence: {
checkName,
status: 'PASS',
project: {
id: 'gid://gitlab/Project/21',
name: 'example project',
},
},
},
});
});
it('renders the requirement', () => {
expect(findRequirementSectionContent().text()).toBe(expectedRequirement);
});
it('renders the failure reason', () => {
expect(findFailureSectionReasonContent().text()).toBe(expectedFailureReason);
});
});
});
});
});
import { mount } from '@vue/test-utils';
import { shallowMount } from '@vue/test-utils';
import { GlAlert } from '@gitlab/ui';
import ComplianceStandardsAdherenceReport from 'ee/compliance_dashboard/components/standards_adherence_report/report.vue';
import ComplianceStandardsAdherenceTable from 'ee/compliance_dashboard/components/standards_adherence_report/standards_adherence_table.vue';
......@@ -12,7 +12,7 @@ describe('ComplianceStandardsAdherenceReport component', () => {
const findAdherencesTable = () => wrapper.findComponent(ComplianceStandardsAdherenceTable);
const createComponent = () => {
wrapper = mount(ComplianceStandardsAdherenceReport, {
wrapper = shallowMount(ComplianceStandardsAdherenceReport, {
propsData: {
groupPath,
},
......
import { GlAlert, GlTable } from '@gitlab/ui';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import { GlAlert, GlLoadingIcon, GlTable, GlLink } from '@gitlab/ui';
import VueApollo from 'vue-apollo';
import Vue, { nextTick } from 'vue';
import { mount } from '@vue/test-utils';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import ComplianceStandardsAdherenceTable from 'ee/compliance_dashboard/components/standards_adherence_report/standards_adherence_table.vue';
import FixSuggestionsSidebar from 'ee/compliance_dashboard/components/standards_adherence_report/fix_suggestions_sidebar.vue';
import waitForPromises from 'helpers/wait_for_promises';
import createMockApollo from 'helpers/mock_apollo_helper';
import getProjectComplianceStandardsAdherence from 'ee/compliance_dashboard/graphql/compliance_standards_adherence.query.graphql';
import { createComplianceAdherencesResponse } from '../../mock_data';
Vue.use(VueApollo);
describe('ComplianceStandardsAdherenceTable component', () => {
let wrapper;
const adherencesResponse = (checkName) => createComplianceAdherencesResponse({ checkName });
const adherences = (checkName) =>
adherencesResponse(checkName).data.group.projectComplianceStandardsAdherence.nodes;
const defaultAdherencesResponse = createComplianceAdherencesResponse();
const mockGraphQlSuccess = jest.fn().mockResolvedValue(defaultAdherencesResponse);
const mockGraphQlLoading = jest.fn().mockResolvedValue(new Promise(() => {}));
const createMockApolloProvider = (resolverMock) => {
return createMockApollo([[getProjectComplianceStandardsAdherence, resolverMock]]);
};
const findErrorMessage = () => wrapper.findComponent(GlAlert);
const findStandardsAdherenceTable = () => wrapper.findComponent(GlTable);
const findFixSuggestionSidebar = () => wrapper.findComponent(FixSuggestionsSidebar);
const findTableLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findTableHeaders = () => findStandardsAdherenceTable().findAll('th');
const findTableRows = () => findStandardsAdherenceTable().findAll('tr');
const findFirstTableRow = () => findTableRows().at(1);
const findFirstTableRowData = () => findFirstTableRow().findAll('td');
const findViewDetails = () => wrapper.findComponent(GlLink);
const createComponent = ({
propsData = {},
data = {},
checkName = 'AT_LEAST_TWO_APPROVALS',
} = {}) => {
wrapper = mountExtended(ComplianceStandardsAdherenceTable, {
propsData: {
groupPath: 'example-group',
...propsData,
},
data() {
return {
adherences: {
list: adherences(checkName),
},
...data,
};
},
});
const openSidebar = async () => {
await findViewDetails().trigger('click');
await nextTick();
};
const createComponent = ({ propsData = {}, resolverMock = mockGraphQlLoading } = {}) => {
wrapper = extendedWrapper(
mount(ComplianceStandardsAdherenceTable, {
apolloProvider: createMockApolloProvider(resolverMock),
propsData: {
groupPath: 'example-group',
...propsData,
},
}),
);
};
describe('default behavior', () => {
......@@ -62,11 +73,19 @@ describe('ComplianceStandardsAdherenceTable component', () => {
});
describe('when there are standards adherence checks available', () => {
describe('when check is `PREVENT_APPROVAL_BY_MERGE_REQUEST_AUTHOR`', () => {
beforeEach(() => {
createComponent({ checkName: 'PREVENT_APPROVAL_BY_MERGE_REQUEST_AUTHOR' });
});
beforeEach(() => {
createComponent({ resolverMock: mockGraphQlSuccess });
return waitForPromises();
});
it('does not render the table loading icon', () => {
expect(mockGraphQlSuccess).toHaveBeenCalledTimes(1);
expect(findTableLoadingIcon().exists()).toBe(false);
});
describe('when check is `PREVENT_APPROVAL_BY_MERGE_REQUEST_AUTHOR`', () => {
it('renders the table row properly', () => {
const rowText = findFirstTableRowData().wrappers.map((e) => e.text());
......@@ -83,7 +102,16 @@ describe('ComplianceStandardsAdherenceTable component', () => {
describe('when check is `PREVENT_APPROVAL_BY_MERGE_REQUEST_COMMITTERS`', () => {
beforeEach(() => {
createComponent({ checkName: 'PREVENT_APPROVAL_BY_MERGE_REQUEST_COMMITTERS' });
const preventApprovalbyMRCommitersAdherencesResponse = createComplianceAdherencesResponse({
checkName: 'PREVENT_APPROVAL_BY_MERGE_REQUEST_COMMITTERS',
});
const mockResolver = jest
.fn()
.mockResolvedValue(preventApprovalbyMRCommitersAdherencesResponse);
createComponent({ resolverMock: mockResolver });
return waitForPromises();
});
it('renders the table row properly', () => {
......@@ -102,7 +130,14 @@ describe('ComplianceStandardsAdherenceTable component', () => {
describe('when check is `AT_LEAST_TWO_APPROVALS`', () => {
beforeEach(() => {
createComponent();
const atLeastTwoApprovalsAdherencesResponse = createComplianceAdherencesResponse({
checkName: 'AT_LEAST_TWO_APPROVALS',
});
const mockResolver = jest.fn().mockResolvedValue(atLeastTwoApprovalsAdherencesResponse);
createComponent({ resolverMock: mockResolver });
return waitForPromises();
});
it('renders the table row properly', () => {
......@@ -122,7 +157,12 @@ describe('ComplianceStandardsAdherenceTable component', () => {
describe('when there are no standards adherence checks available', () => {
beforeEach(() => {
createComponent({ data: { adherences: { list: [] } } });
const noAdherencesResponse = createComplianceAdherencesResponse({ count: 0 });
const mockResolver = jest.fn().mockResolvedValue(noAdherencesResponse);
createComponent({ resolverMock: mockResolver });
return waitForPromises();
});
it('renders the empty table message', () => {
......@@ -131,4 +171,36 @@ describe('ComplianceStandardsAdherenceTable component', () => {
);
});
});
describe('fixSuggestionSidebar', () => {
beforeEach(() => {
createComponent({ resolverMock: mockGraphQlSuccess });
return waitForPromises();
});
describe('closing the sidebar', () => {
it('has the correct props when closed', async () => {
await openSidebar();
await findFixSuggestionSidebar().vm.$emit('close');
expect(findFixSuggestionSidebar().props('groupPath')).toBe('example-group');
expect(findFixSuggestionSidebar().props('showDrawer')).toBe(false);
expect(findFixSuggestionSidebar().props('adherence')).toStrictEqual({});
});
});
describe('opening the sidebar', () => {
it('has the correct props when opened', async () => {
await openSidebar();
expect(findFixSuggestionSidebar().props('groupPath')).toBe('example-group');
expect(findFixSuggestionSidebar().props('showDrawer')).toBe(true);
expect(findFixSuggestionSidebar().props('adherence')).toStrictEqual(
wrapper.vm.adherences.list[0],
);
});
});
});
});
......@@ -45,6 +45,7 @@ export const createComplianceAdherence = (id, checkName) => ({
project: {
id: 'gid://gitlab/Project/1',
name: 'Example Project',
webUrl: 'example.com/groups/example-group/example-project',
complianceFrameworks: {
nodes: {
id: 'gid://gitlab/ComplianceManagement::Framework/1',
......@@ -52,6 +53,7 @@ export const createComplianceAdherence = (id, checkName) => ({
description: 'asds',
color: '#0000ff',
__typename: 'ComplianceFramework',
default: true,
},
},
},
......@@ -63,7 +65,10 @@ export const createComplianceAdherencesResponse = ({
} = {}) => ({
data: {
group: {
id: 'gid://gitlab/Group/1',
__typename: 'Group',
projectComplianceStandardsAdherence: {
__typename: 'ComplianceAdherenceConnection',
nodes: Array(count)
.fill(null)
.map((_, id) => createComplianceAdherence(id, checkName)),
......
......@@ -12277,9 +12277,6 @@ msgstr ""
msgid "ComplianceReport|No projects found that match filters"
msgstr ""
 
msgid "ComplianceReport|No projects with standards adherence checks found"
msgstr ""
msgid "ComplianceReport|No violations found"
msgstr ""
 
......@@ -12313,6 +12310,9 @@ msgstr ""
msgid "ComplianceStandardsAdherence|At least two approvals"
msgstr ""
 
msgid "ComplianceStandardsAdherence|Failure reason"
msgstr ""
msgid "ComplianceStandardsAdherence|Have a valid rule that prevents author approved merge requests"
msgstr ""
 
......@@ -12322,12 +12322,39 @@ msgstr ""
msgid "ComplianceStandardsAdherence|Have a valid rule that requires any merge request to have more than two approvals"
msgstr ""
 
msgid "ComplianceStandardsAdherence|How to fix"
msgstr ""
msgid "ComplianceStandardsAdherence|Merge request approval rules"
msgstr ""
msgid "ComplianceStandardsAdherence|No projects with standards adherence checks found"
msgstr ""
msgid "ComplianceStandardsAdherence|No rule configured to prevent merge requests approved by committers."
msgstr ""
msgid "ComplianceStandardsAdherence|No rule is configured to prevent author approved merge requests."
msgstr ""
msgid "ComplianceStandardsAdherence|No rule is configured to require two approvals."
msgstr ""
msgid "ComplianceStandardsAdherence|Prevent authors as approvers"
msgstr ""
 
msgid "ComplianceStandardsAdherence|Prevent committers as approvers"
msgstr ""
 
msgid "ComplianceStandardsAdherence|Requirement"
msgstr ""
msgid "ComplianceStandardsAdherence|The following features help satisfy this requirement."
msgstr ""
msgid "ComplianceStandardsAdherence|Update approval settings in the project's merge request settings to satisfy this requirement."
msgstr ""
msgid "ComplianceStandardsAdherence|View details"
msgstr ""
 
......@@ -28378,6 +28405,9 @@ msgstr ""
msgid "Manage projects."
msgstr ""
 
msgid "Manage rules"
msgstr ""
msgid "Manage two-factor authentication"
msgstr ""
 
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册