diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue index 52da4d0146837e8fd7c556251262f629efd8249e..7c78abae77f538eae639297506bb98f6d098561c 100644 --- a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue +++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue @@ -136,8 +136,8 @@ export default { return __('Branch'); } }, - commitTitleText() { - return this.pipeline?.commit?.title || __("Can't find HEAD commit for this branch"); + commitTitle() { + return this.pipeline?.commit?.title; }, hasAuthor() { return ( @@ -159,22 +159,27 @@ export default { <div class="pipeline-tags" data-testid="pipeline-url-table-cell"> <template v-if="rearrangePipelinesTable"> <div class="commit-title gl-mb-2" data-testid="commit-title-container"> - <span class="gl-display-flex"> - <tooltip-on-truncate :title="commitTitleText" class="flex-truncate-child gl-flex-grow-1"> + <span v-if="commitTitle" class="gl-display-flex"> + <tooltip-on-truncate :title="commitTitle" class="flex-truncate-child gl-flex-grow-1"> <gl-link - :href="pipeline.path" - class="commit-row-message gl-text-blue-600!" + :href="commitUrl" + class="commit-row-message gl-text-gray-900" data-testid="commit-title" - data-qa-selector="pipeline_url_link" - >{{ commitTitleText }}</gl-link + >{{ commitTitle }}</gl-link > </tooltip-on-truncate> </span> + <span v-else>{{ __("Can't find HEAD commit for this branch") }}</span> </div> <div class="gl-mb-2"> - <span class="gl-font-weight-bold gl-text-gray-500" data-testid="pipeline-identifier"> + <gl-link + :href="pipeline.path" + class="gl-text-decoration-underline gl-text-blue-600!" + data-testid="pipeline-url-link" + data-qa-selector="pipeline_url_link" + > #{{ pipeline[pipelineKey] }} - </span> + </gl-link> <!--Commit row--> <div class="icon-container gl-display-inline-block"> <gl-icon diff --git a/spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb b/spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb index b77b3d69fc1855565dce0913186badd25e78a7e7..2a49109d360bb03610f957a080e39d516bb36f68 100644 --- a/spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb +++ b/spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb @@ -64,7 +64,7 @@ it 'sees branch pipelines and detached merge request pipelines in correct order' do page.within('.ci-table') do expect(page).to have_selector('.ci-created', count: 2) - expect(first('[data-testid="pipeline-identifier"]')).to have_content("##{detached_merge_request_pipeline.id}") + expect(first('[data-testid="pipeline-url-link"]')).to have_content("##{detached_merge_request_pipeline.id}") end end @@ -101,16 +101,16 @@ page.within('.ci-table') do expect(page).to have_selector('.ci-pending', count: 4) - expect(all('[data-testid="pipeline-identifier"]')[0]) + expect(all('[data-testid="pipeline-url-link"]')[0]) .to have_content("##{detached_merge_request_pipeline_2.id}") - expect(all('[data-testid="pipeline-identifier"]')[1]) + expect(all('[data-testid="pipeline-url-link"]')[1]) .to have_content("##{detached_merge_request_pipeline.id}") - expect(all('[data-testid="pipeline-identifier"]')[2]) + expect(all('[data-testid="pipeline-url-link"]')[2]) .to have_content("##{push_pipeline_2.id}") - expect(all('[data-testid="pipeline-identifier"]')[3]) + expect(all('[data-testid="pipeline-url-link"]')[3]) .to have_content("##{push_pipeline.id}") end end @@ -201,7 +201,7 @@ it 'sees a branch pipeline in pipeline tab' do page.within('.ci-table') do expect(page).to have_selector('.ci-created', count: 1) - expect(first('[data-testid="pipeline-identifier"]')).to have_content("##{push_pipeline.id}") + expect(first('[data-testid="pipeline-url-link"]')).to have_content("##{push_pipeline.id}") end end @@ -252,7 +252,7 @@ it 'sees branch pipelines and detached merge request pipelines in correct order' do page.within('.ci-table') do expect(page).to have_selector('.ci-pending', count: 2) - expect(first('[data-testid="pipeline-identifier"]')).to have_content("##{detached_merge_request_pipeline.id}") + expect(first('[data-testid="pipeline-url-link"]')).to have_content("##{detached_merge_request_pipeline.id}") end end @@ -295,16 +295,16 @@ page.within('.ci-table') do expect(page).to have_selector('.ci-pending', count: 4) - expect(all('[data-testid="pipeline-identifier"]')[0]) + expect(all('[data-testid="pipeline-url-link"]')[0]) .to have_content("##{detached_merge_request_pipeline_2.id}") - expect(all('[data-testid="pipeline-identifier"]')[1]) + expect(all('[data-testid="pipeline-url-link"]')[1]) .to have_content("##{detached_merge_request_pipeline.id}") - expect(all('[data-testid="pipeline-identifier"]')[2]) + expect(all('[data-testid="pipeline-url-link"]')[2]) .to have_content("##{push_pipeline_2.id}") - expect(all('[data-testid="pipeline-identifier"]')[3]) + expect(all('[data-testid="pipeline-url-link"]')[3]) .to have_content("##{push_pipeline.id}") end end diff --git a/spec/features/merge_request/user_sees_pipelines_spec.rb b/spec/features/merge_request/user_sees_pipelines_spec.rb index a356dd5089848cbe5a22f3b9f6289ccca4f6f1e2..266ae0d8c37433a8461f6947554a18fc3db251a3 100644 --- a/spec/features/merge_request/user_sees_pipelines_spec.rb +++ b/spec/features/merge_request/user_sees_pipelines_spec.rb @@ -134,7 +134,7 @@ create_merge_request_pipeline act_on_security_warning(action: 'Run pipeline') - check_pipeline(expected_project: parent_project, link_selector: 'pipeline-url-link') + check_pipeline(expected_project: parent_project) check_head_pipeline(expected_project: parent_project) end @@ -179,13 +179,13 @@ def create_merge_request_pipeline click_button('Run pipeline') end - def check_pipeline(expected_project:, link_selector: 'commit-title') + def check_pipeline(expected_project:) page.within('.ci-table') do expect(page).to have_selector('.commit', count: 2) page.within(first('.commit')) do page.within('.pipeline-tags') do - expect(page.find("[data-testid=#{link_selector}]")[:href]).to include(expected_project.full_path) + expect(page.find('[data-testid="pipeline-url-link"]')[:href]).to include(expected_project.full_path) expect(page).to have_content('detached') end page.within('.pipeline-triggerer') do diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb index d5b470194a26e100aadf1a39e07176def5b26bcf..37ac5a9d5a2e246e862d85cb434e073082268ac0 100644 --- a/spec/features/projects/pipelines/pipelines_spec.rb +++ b/spec/features/projects/pipelines/pipelines_spec.rb @@ -711,7 +711,7 @@ end expect(page.find('[data-testid="pipeline-th"]')).to have_content 'Pipeline' - expect(page.find('[data-testid="pipeline-identifier"]')).to have_content "##{pipeline.iid}" + expect(page.find('[data-testid="pipeline-url-link"]')).to have_content "##{pipeline.iid}" end end end diff --git a/spec/frontend/pipelines/mock_data.js b/spec/frontend/pipelines/mock_data.js index 8cb6cf3bed6b67d8b51e2fcc31878c2fc0a36404..59d4e808b326c3dfb04703bd63ef809647a8eb0f 100644 --- a/spec/frontend/pipelines/mock_data.js +++ b/spec/frontend/pipelines/mock_data.js @@ -676,7 +676,7 @@ export const mockPipeline = (projectPath) => { short_id: 'fd6df5b3', created_at: '2021-10-19T21:17:12.000+00:00', parent_ids: ['7147906b84306e83cb3fec6582a25390b75713c6'], - title: 'Commit Title', + title: 'Commit', message: 'Commit', author_name: 'Administrator', author_email: 'admin@example.com', @@ -1141,176 +1141,3 @@ export const mockPipelineBranch = () => { viewType: 'root', }; }; - -export const mockPipelineNoCommit = () => { - return { - pipeline: { - id: 268, - iid: 34, - user: { - id: 1, - username: 'root', - name: 'Administrator', - state: 'active', - avatar_url: - 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon', - web_url: 'http://gdk.test:3000/root', - show_status: false, - path: '/root', - }, - active: false, - source: 'push', - created_at: '2022-01-14T17:40:27.866Z', - updated_at: '2022-01-14T18:02:35.850Z', - path: '/root/mr-widgets/-/pipelines/268', - flags: { - stuck: false, - auto_devops: false, - merge_request: false, - yaml_errors: false, - retryable: true, - cancelable: false, - failure_reason: false, - detached_merge_request_pipeline: false, - merge_request_pipeline: false, - merge_train_pipeline: false, - latest: true, - }, - details: { - status: { - icon: 'status_warning', - text: 'passed', - label: 'passed with warnings', - group: 'success-with-warnings', - tooltip: 'passed', - has_details: true, - details_path: '/root/mr-widgets/-/pipelines/268', - illustration: null, - favicon: - '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png', - }, - stages: [ - { - name: 'validate', - title: 'validate: passed with warnings', - status: { - icon: 'status_warning', - text: 'passed', - label: 'passed with warnings', - group: 'success-with-warnings', - tooltip: 'passed', - has_details: true, - details_path: '/root/mr-widgets/-/pipelines/268#validate', - illustration: null, - favicon: - '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png', - }, - path: '/root/mr-widgets/-/pipelines/268#validate', - dropdown_path: '/root/mr-widgets/-/pipelines/268/stage.json?stage=validate', - }, - { - name: 'test', - title: 'test: passed', - status: { - icon: 'status_success', - text: 'passed', - label: 'passed', - group: 'success', - tooltip: 'passed', - has_details: true, - details_path: '/root/mr-widgets/-/pipelines/268#test', - illustration: null, - favicon: - '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png', - }, - path: '/root/mr-widgets/-/pipelines/268#test', - dropdown_path: '/root/mr-widgets/-/pipelines/268/stage.json?stage=test', - }, - { - name: 'build', - title: 'build: passed', - status: { - icon: 'status_success', - text: 'passed', - label: 'passed', - group: 'success', - tooltip: 'passed', - has_details: true, - details_path: '/root/mr-widgets/-/pipelines/268#build', - illustration: null, - favicon: - '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png', - }, - path: '/root/mr-widgets/-/pipelines/268#build', - dropdown_path: '/root/mr-widgets/-/pipelines/268/stage.json?stage=build', - }, - ], - duration: 75, - finished_at: '2022-01-14T18:02:35.842Z', - name: 'Pipeline', - manual_actions: [], - scheduled_actions: [], - }, - ref: { - name: 'update-ci', - path: '/root/mr-widgets/-/commits/update-ci', - tag: false, - branch: true, - merge_request: false, - }, - retry_path: '/root/mr-widgets/-/pipelines/268/retry', - delete_path: '/root/mr-widgets/-/pipelines/268', - failed_builds: [ - { - id: 1260, - name: 'fmt', - started: '2022-01-14T17:40:36.435Z', - complete: true, - archived: false, - build_path: '/root/mr-widgets/-/jobs/1260', - retry_path: '/root/mr-widgets/-/jobs/1260/retry', - playable: false, - scheduled: false, - created_at: '2022-01-14T17:40:27.879Z', - updated_at: '2022-01-14T17:40:42.129Z', - status: { - icon: 'status_warning', - text: 'failed', - label: 'failed (allowed to fail)', - group: 'failed-with-warnings', - tooltip: 'failed - (script failure) (allowed to fail)', - has_details: true, - details_path: '/root/mr-widgets/-/jobs/1260', - illustration: { - image: - '/assets/illustrations/skipped-job_empty-29a8a37d8a61d1b6f68cf3484f9024e53cd6eb95e28eae3554f8011a1146bf27.svg', - size: 'svg-430', - title: 'This job does not have a trace.', - }, - favicon: - '/assets/ci_favicons/favicon_status_failed-41304d7f7e3828808b0c26771f0309e55296819a9beea3ea9fbf6689d9857c12.png', - action: { - icon: 'retry', - title: 'Retry', - path: '/root/mr-widgets/-/jobs/1260/retry', - method: 'post', - button_title: 'Retry this job', - }, - }, - recoverable: false, - }, - ], - project: { - id: 23, - name: 'mr-widgets', - full_path: '/root/mr-widgets', - full_name: 'Administrator / mr-widgets', - }, - triggered_by: null, - triggered: [], - }, - pipelineScheduleUrl: 'foo', - pipelineKey: 'id', - viewType: 'root', - }; -}; diff --git a/spec/frontend/pipelines/pipeline_url_spec.js b/spec/frontend/pipelines/pipeline_url_spec.js index b24e2e09ea83d31e8f4e0acd0c03243311c441bb..2f083faaaa63fc4a1947abe34679d4ad542e5059 100644 --- a/spec/frontend/pipelines/pipeline_url_spec.js +++ b/spec/frontend/pipelines/pipeline_url_spec.js @@ -1,12 +1,7 @@ import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; import { trimText } from 'helpers/text_helper'; import PipelineUrlComponent from '~/pipelines/components/pipelines_list/pipeline_url.vue'; -import { - mockPipeline, - mockPipelineBranch, - mockPipelineTag, - mockPipelineNoCommit, -} from './mock_data'; +import { mockPipeline, mockPipelineBranch, mockPipelineTag } from './mock_data'; const projectPath = 'test/test'; @@ -31,7 +26,7 @@ describe('Pipeline Url Component', () => { const findCommitIconType = () => wrapper.findByTestId('commit-icon-type'); const findCommitTitleContainer = () => wrapper.findByTestId('commit-title-container'); - const findCommitTitle = () => wrapper.findByTestId('commit-title'); + const findCommitTitle = (commitWrapper) => commitWrapper.find('[data-testid="commit-title"]'); const defaultProps = mockPipeline(projectPath); @@ -237,33 +232,5 @@ describe('Pipeline Url Component', () => { expect(findCommitIconType().attributes('title')).toBe(expectedTitle); }, ); - - describe('with commit', () => { - beforeEach(() => { - createComponent({}, true); - }); - - it('displays commit title with link to pipeline', () => { - expect(findCommitTitle().attributes('href')).toBe(defaultProps.pipeline.path); - }); - - it('displays commit title text', () => { - expect(findCommitTitle().text()).toBe(defaultProps.pipeline.commit.title); - }); - }); - - describe('without commit', () => { - beforeEach(() => { - createComponent(mockPipelineNoCommit(), true); - }); - - it('displays cant find head commit text', () => { - expect(findCommitTitle().text()).toBe("Can't find HEAD commit for this branch"); - }); - - it('displays link to pipeline', () => { - expect(findCommitTitle().attributes('href')).toBe(mockPipelineNoCommit().pipeline.path); - }); - }); }); });