Merge branch '44296-commit-path' into 'master'
Resolve "Cannot read property 'commit_path' of null" Closes #44296 See merge request gitlab-org/gitlab-ce!18231
This commit is contained in:
commit
9e13ca6a3a
3 changed files with 104 additions and 49 deletions
|
@ -1,56 +1,61 @@
|
||||||
<script>
|
<script>
|
||||||
/* eslint-disable vue/require-default-prop */
|
/* eslint-disable vue/require-default-prop */
|
||||||
import pipelineStage from '~/pipelines/components/stage.vue';
|
import PipelineStage from '~/pipelines/components/stage.vue';
|
||||||
import ciIcon from '~/vue_shared/components/ci_icon.vue';
|
import CiIcon from '~/vue_shared/components/ci_icon.vue';
|
||||||
import icon from '~/vue_shared/components/icon.vue';
|
import Icon from '~/vue_shared/components/icon.vue';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'MRWidgetPipeline',
|
name: 'MRWidgetPipeline',
|
||||||
components: {
|
components: {
|
||||||
pipelineStage,
|
PipelineStage,
|
||||||
ciIcon,
|
CiIcon,
|
||||||
icon,
|
Icon,
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
pipeline: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
},
|
},
|
||||||
props: {
|
// This prop needs to be camelCase, html attributes are case insensive
|
||||||
pipeline: {
|
// https://vuejs.org/v2/guide/components.html#camelCase-vs-kebab-case
|
||||||
type: Object,
|
hasCi: {
|
||||||
required: true,
|
type: Boolean,
|
||||||
},
|
required: false,
|
||||||
// This prop needs to be camelCase, html attributes are case insensive
|
|
||||||
// https://vuejs.org/v2/guide/components.html#camelCase-vs-kebab-case
|
|
||||||
hasCi: {
|
|
||||||
type: Boolean,
|
|
||||||
required: false,
|
|
||||||
},
|
|
||||||
ciStatus: {
|
|
||||||
type: String,
|
|
||||||
required: false,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
computed: {
|
ciStatus: {
|
||||||
hasPipeline() {
|
type: String,
|
||||||
return this.pipeline && Object.keys(this.pipeline).length > 0;
|
required: false,
|
||||||
},
|
|
||||||
hasCIError() {
|
|
||||||
return this.hasCi && !this.ciStatus;
|
|
||||||
},
|
|
||||||
status() {
|
|
||||||
return this.pipeline.details &&
|
|
||||||
this.pipeline.details.status ? this.pipeline.details.status : {};
|
|
||||||
},
|
|
||||||
hasStages() {
|
|
||||||
return this.pipeline.details &&
|
|
||||||
this.pipeline.details.stages &&
|
|
||||||
this.pipeline.details.stages.length;
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
};
|
},
|
||||||
|
computed: {
|
||||||
|
hasPipeline() {
|
||||||
|
return this.pipeline && Object.keys(this.pipeline).length > 0;
|
||||||
|
},
|
||||||
|
hasCIError() {
|
||||||
|
return this.hasCi && !this.ciStatus;
|
||||||
|
},
|
||||||
|
status() {
|
||||||
|
return this.pipeline.details && this.pipeline.details.status
|
||||||
|
? this.pipeline.details.status
|
||||||
|
: {};
|
||||||
|
},
|
||||||
|
hasStages() {
|
||||||
|
return (
|
||||||
|
this.pipeline.details && this.pipeline.details.stages && this.pipeline.details.stages.length
|
||||||
|
);
|
||||||
|
},
|
||||||
|
hasCommitInfo() {
|
||||||
|
return this.pipeline.commit && Object.keys(this.pipeline.commit).length > 0;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
v-if="hasPipeline || hasCIError"
|
v-if="hasPipeline || hasCIError"
|
||||||
class="mr-widget-heading">
|
class="mr-widget-heading"
|
||||||
|
>
|
||||||
<div class="ci-widget media">
|
<div class="ci-widget media">
|
||||||
<template v-if="hasCIError">
|
<template v-if="hasCIError">
|
||||||
<div class="ci-status-icon ci-status-icon-failed ci-error js-ci-error append-right-10">
|
<div class="ci-status-icon ci-status-icon-failed ci-error js-ci-error append-right-10">
|
||||||
|
@ -77,13 +82,17 @@
|
||||||
#{{ pipeline.id }}
|
#{{ pipeline.id }}
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
{{ pipeline.details.status.label }} for
|
{{ pipeline.details.status.label }}
|
||||||
|
|
||||||
<a
|
<template v-if="hasCommitInfo">
|
||||||
:href="pipeline.commit.commit_path"
|
for
|
||||||
class="commit-sha js-commit-link"
|
|
||||||
>
|
<a
|
||||||
{{ pipeline.commit.short_id }}</a>.
|
:href="pipeline.commit.commit_path"
|
||||||
|
class="commit-sha js-commit-link"
|
||||||
|
>
|
||||||
|
{{ pipeline.commit.short_id }}</a>.
|
||||||
|
</template>
|
||||||
|
|
||||||
<span class="mr-widget-pipeline-graph">
|
<span class="mr-widget-pipeline-graph">
|
||||||
<span
|
<span
|
||||||
|
|
6
changelogs/unreleased/44296-commit-path.yml
Normal file
6
changelogs/unreleased/44296-commit-path.yml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
title: Verifiy if pipeline has commit idetails and render information in MR widget
|
||||||
|
when branch is deleted
|
||||||
|
merge_request:
|
||||||
|
author:
|
||||||
|
type: fixed
|
|
@ -113,6 +113,46 @@ describe('MRWidgetPipeline', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('without commit path', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
const mockCopy = Object.assign({}, mockData);
|
||||||
|
delete mockCopy.pipeline.commit;
|
||||||
|
|
||||||
|
vm = mountComponent(Component, {
|
||||||
|
pipeline: mockCopy.pipeline,
|
||||||
|
hasCi: true,
|
||||||
|
ciStatus: 'success',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render pipeline ID', () => {
|
||||||
|
expect(
|
||||||
|
vm.$el.querySelector('.pipeline-id').textContent.trim(),
|
||||||
|
).toEqual(`#${mockData.pipeline.id}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render pipeline status', () => {
|
||||||
|
expect(
|
||||||
|
vm.$el.querySelector('.media-body').textContent.trim(),
|
||||||
|
).toContain(mockData.pipeline.details.status.label);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
vm.$el.querySelector('.js-commit-link'),
|
||||||
|
).toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render pipeline graph', () => {
|
||||||
|
expect(vm.$el.querySelector('.mr-widget-pipeline-graph')).toBeDefined();
|
||||||
|
expect(vm.$el.querySelectorAll('.stage-container').length).toEqual(mockData.pipeline.details.stages.length);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render coverage information', () => {
|
||||||
|
expect(
|
||||||
|
vm.$el.querySelector('.media-body').textContent,
|
||||||
|
).toContain(`Coverage ${mockData.pipeline.coverage}`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('without coverage', () => {
|
describe('without coverage', () => {
|
||||||
it('should not render a coverage', () => {
|
it('should not render a coverage', () => {
|
||||||
const mockCopy = Object.assign({}, mockData);
|
const mockCopy = Object.assign({}, mockData);
|
||||||
|
|
Loading…
Reference in a new issue