Commit c0883901 authored by Phil Hughes's avatar Phil Hughes

Merge branch '342902-add-mr-details-to-compliance-report' into 'master'

Show the MR details for a merge request violation

See merge request gitlab-org/gitlab!76732
parents 7336ec90 30d292ef
...@@ -3,8 +3,8 @@ import { GlAlert, GlLoadingIcon, GlTable } from '@gitlab/ui'; ...@@ -3,8 +3,8 @@ import { GlAlert, GlLoadingIcon, GlTable } from '@gitlab/ui';
import * as Sentry from '@sentry/browser'; import * as Sentry from '@sentry/browser';
import { __ } from '~/locale'; import { __ } from '~/locale';
import { thWidthClass } from '~/lib/utils/table_utility'; import { thWidthClass } from '~/lib/utils/table_utility';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
import complianceViolationsQuery from '../graphql/compliance_violations.query.graphql'; import complianceViolationsQuery from '../graphql/compliance_violations.query.graphql';
import { mapResponse } from '../graphql/mappers';
import EmptyState from './empty_state.vue'; import EmptyState from './empty_state.vue';
import MergeCommitsExportButton from './merge_requests/merge_commits_export_button.vue'; import MergeCommitsExportButton from './merge_requests/merge_commits_export_button.vue';
import ViolationReason from './violations/reason.vue'; import ViolationReason from './violations/reason.vue';
...@@ -18,6 +18,7 @@ export default { ...@@ -18,6 +18,7 @@ export default {
GlTable, GlTable,
MergeCommitsExportButton, MergeCommitsExportButton,
ViolationReason, ViolationReason,
TimeAgoTooltip,
}, },
props: { props: {
emptyStateSvgPath: { emptyStateSvgPath: {
...@@ -45,7 +46,7 @@ export default { ...@@ -45,7 +46,7 @@ export default {
}; };
}, },
update(data) { update(data) {
return mapResponse(data?.group?.mergeRequestViolations?.nodes || []); return data?.group?.mergeRequestViolations?.nodes;
}, },
error(e) { error(e) {
Sentry.captureException(e); Sentry.captureException(e);
...@@ -73,12 +74,12 @@ export default { ...@@ -73,12 +74,12 @@ export default {
{ {
key: 'reason', key: 'reason',
label: __('Violation'), label: __('Violation'),
thClass: thWidthClass(25), thClass: thWidthClass(15),
}, },
{ {
key: 'mergeRequest', key: 'mergeRequest',
label: __('Merge request'), label: __('Merge request'),
thClass: thWidthClass(30), thClass: thWidthClass(40),
}, },
{ {
key: 'mergedAt', key: 'mergedAt',
...@@ -128,6 +129,12 @@ export default { ...@@ -128,6 +129,12 @@ export default {
<template #cell(reason)="{ item: { reason, violatingUser } }"> <template #cell(reason)="{ item: { reason, violatingUser } }">
<violation-reason :reason="reason" :user="violatingUser" /> <violation-reason :reason="reason" :user="violatingUser" />
</template> </template>
<template #cell(mergeRequest)="{ item: { mergeRequest } }">
{{ mergeRequest.title }}
</template>
<template #cell(mergedAt)="{ item: { mergeRequest } }">
<time-ago-tooltip :time="mergeRequest.mergedAt" />
</template>
</gl-table> </gl-table>
<empty-state v-else :image-path="emptyStateSvgPath" /> <empty-state v-else :image-path="emptyStateSvgPath" />
</section> </section>
......
export const mapResponse = (response) => {
return response.map((item) => {
return {
...item,
mergedAt: item.mergeRequest.mergedAt,
};
});
};
import { mapResponse } from 'ee/compliance_dashboard/graphql/mappers';
describe('Mappers', () => {
describe('mapResponse', () => {
it('returns an empty array if it receives one', () => {
expect(mapResponse([])).toStrictEqual([]);
});
it('returns the correct array if it receives data', () => {
expect(mapResponse([{ mergeRequest: { mergedAt: '1970-01-01' } }])).toStrictEqual([
{ mergeRequest: { mergedAt: '1970-01-01' }, mergedAt: '1970-01-01' },
]);
});
});
});
...@@ -10,6 +10,7 @@ import ViolationReason from 'ee/compliance_dashboard/components/violations/reaso ...@@ -10,6 +10,7 @@ import ViolationReason from 'ee/compliance_dashboard/components/violations/reaso
import resolvers from 'ee/compliance_dashboard/graphql/resolvers'; import resolvers from 'ee/compliance_dashboard/graphql/resolvers';
import waitForPromises from 'helpers/wait_for_promises'; import waitForPromises from 'helpers/wait_for_promises';
import createMockApollo from 'helpers/mock_apollo_helper'; import createMockApollo from 'helpers/mock_apollo_helper';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
Vue.use(VueApollo); Vue.use(VueApollo);
...@@ -27,6 +28,7 @@ describe('ComplianceReport component', () => { ...@@ -27,6 +28,7 @@ describe('ComplianceReport component', () => {
const findEmptyState = () => wrapper.findComponent(EmptyState); const findEmptyState = () => wrapper.findComponent(EmptyState);
const findMergeCommitsExportButton = () => wrapper.findComponent(MergeCommitsExportButton); const findMergeCommitsExportButton = () => wrapper.findComponent(MergeCommitsExportButton);
const findViolationReason = () => wrapper.findComponent(ViolationReason); const findViolationReason = () => wrapper.findComponent(ViolationReason);
const findTimeAgoTooltip = () => wrapper.findComponent(TimeAgoTooltip);
const findTableHeaders = () => findViolationsTable().findAll('th'); const findTableHeaders = () => findViolationsTable().findAll('th');
const findTablesFirstRowData = () => const findTablesFirstRowData = () =>
...@@ -112,15 +114,14 @@ describe('ComplianceReport component', () => { ...@@ -112,15 +114,14 @@ describe('ComplianceReport component', () => {
// Note: This should be refactored as each table component is created // Note: This should be refactored as each table component is created
// Severity: https://gitlab.com/gitlab-org/gitlab/-/issues/342900 // Severity: https://gitlab.com/gitlab-org/gitlab/-/issues/342900
// Merge request and date merged: https://gitlab.com/gitlab-org/gitlab/-/issues/342902
it('has the correct first row data', () => { it('has the correct first row data', () => {
const headerTexts = findTablesFirstRowData().wrappers.map((d) => d.text()); const headerTexts = findTablesFirstRowData().wrappers.map((d) => d.text());
expect(headerTexts).toEqual([ expect(headerTexts).toEqual([
'1', '1',
'Approved by committer', 'Approved by committer',
expect.anything(), 'Officiis architecto voluptas ut sit qui qui quisquam sequi consectetur porro.',
'2021-11-25T11:56:52.215Z', 'in 1 year',
]); ]);
}); });
...@@ -135,6 +136,14 @@ describe('ComplianceReport component', () => { ...@@ -135,6 +136,14 @@ describe('ComplianceReport component', () => {
user, user,
}); });
}); });
it('renders the time ago tooltip', () => {
const {
mergeRequest: { mergedAt },
} = mockResolver().mergeRequestViolations.nodes[0];
expect(findTimeAgoTooltip().props('time')).toBe(mergedAt);
});
}); });
describe('when there are no violations', () => { describe('when there are no violations', () => {
......
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