diff options
Diffstat (limited to 'spec/frontend/pipelines/pipeline_url_spec.js')
-rw-r--r-- | spec/frontend/pipelines/pipeline_url_spec.js | 349 |
1 files changed, 208 insertions, 141 deletions
diff --git a/spec/frontend/pipelines/pipeline_url_spec.js b/spec/frontend/pipelines/pipeline_url_spec.js index 912b5afe0e1..b24e2e09ea8 100644 --- a/spec/frontend/pipelines/pipeline_url_spec.js +++ b/spec/frontend/pipelines/pipeline_url_spec.js @@ -1,41 +1,48 @@ -import { shallowMount } from '@vue/test-utils'; +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'; const projectPath = 'test/test'; describe('Pipeline Url Component', () => { let wrapper; - const findTableCell = () => wrapper.find('[data-testid="pipeline-url-table-cell"]'); - const findPipelineUrlLink = () => wrapper.find('[data-testid="pipeline-url-link"]'); - const findScheduledTag = () => wrapper.find('[data-testid="pipeline-url-scheduled"]'); - const findLatestTag = () => wrapper.find('[data-testid="pipeline-url-latest"]'); - const findYamlTag = () => wrapper.find('[data-testid="pipeline-url-yaml"]'); - const findFailureTag = () => wrapper.find('[data-testid="pipeline-url-failure"]'); - const findAutoDevopsTag = () => wrapper.find('[data-testid="pipeline-url-autodevops"]'); - const findAutoDevopsTagLink = () => wrapper.find('[data-testid="pipeline-url-autodevops-link"]'); - const findStuckTag = () => wrapper.find('[data-testid="pipeline-url-stuck"]'); - const findDetachedTag = () => wrapper.find('[data-testid="pipeline-url-detached"]'); - const findForkTag = () => wrapper.find('[data-testid="pipeline-url-fork"]'); - const findTrainTag = () => wrapper.find('[data-testid="pipeline-url-train"]'); - - const defaultProps = { - pipeline: { - id: 1, - path: 'foo', - project: { full_path: `/${projectPath}` }, - flags: {}, - }, - pipelineScheduleUrl: 'foo', - pipelineKey: 'id', - }; - - const createComponent = (props) => { - wrapper = shallowMount(PipelineUrlComponent, { + const findTableCell = () => wrapper.findByTestId('pipeline-url-table-cell'); + const findPipelineUrlLink = () => wrapper.findByTestId('pipeline-url-link'); + const findScheduledTag = () => wrapper.findByTestId('pipeline-url-scheduled'); + const findLatestTag = () => wrapper.findByTestId('pipeline-url-latest'); + const findYamlTag = () => wrapper.findByTestId('pipeline-url-yaml'); + const findFailureTag = () => wrapper.findByTestId('pipeline-url-failure'); + const findAutoDevopsTag = () => wrapper.findByTestId('pipeline-url-autodevops'); + const findAutoDevopsTagLink = () => wrapper.findByTestId('pipeline-url-autodevops-link'); + const findStuckTag = () => wrapper.findByTestId('pipeline-url-stuck'); + const findDetachedTag = () => wrapper.findByTestId('pipeline-url-detached'); + const findForkTag = () => wrapper.findByTestId('pipeline-url-fork'); + const findTrainTag = () => wrapper.findByTestId('pipeline-url-train'); + const findRefName = () => wrapper.findByTestId('merge-request-ref'); + const findCommitShortSha = () => wrapper.findByTestId('commit-short-sha'); + const findCommitIcon = () => wrapper.findByTestId('commit-icon'); + const findCommitIconType = () => wrapper.findByTestId('commit-icon-type'); + + const findCommitTitleContainer = () => wrapper.findByTestId('commit-title-container'); + const findCommitTitle = () => wrapper.findByTestId('commit-title'); + + const defaultProps = mockPipeline(projectPath); + + const createComponent = (props, rearrangePipelinesTable = false) => { + wrapper = shallowMountExtended(PipelineUrlComponent, { propsData: { ...defaultProps, ...props }, provide: { targetProjectFullPath: projectPath, + glFeatures: { + rearrangePipelinesTable, + }, }, }); }; @@ -45,158 +52,218 @@ describe('Pipeline Url Component', () => { wrapper = null; }); - it('should render pipeline url table cell', () => { - createComponent(); + describe('with the rearrangePipelinesTable feature flag turned off', () => { + it('should render pipeline url table cell', () => { + createComponent(); - expect(findTableCell().exists()).toBe(true); - }); + expect(findTableCell().exists()).toBe(true); + }); - it('should render a link the provided path and id', () => { - createComponent(); + it('should render a link the provided path and id', () => { + createComponent(); - expect(findPipelineUrlLink().attributes('href')).toBe('foo'); + expect(findPipelineUrlLink().attributes('href')).toBe('foo'); - expect(findPipelineUrlLink().text()).toBe('#1'); - }); + expect(findPipelineUrlLink().text()).toBe('#1'); + }); - it('should not render tags when flags are not set', () => { - createComponent(); - - expect(findStuckTag().exists()).toBe(false); - expect(findLatestTag().exists()).toBe(false); - expect(findYamlTag().exists()).toBe(false); - expect(findAutoDevopsTag().exists()).toBe(false); - expect(findFailureTag().exists()).toBe(false); - expect(findScheduledTag().exists()).toBe(false); - expect(findForkTag().exists()).toBe(false); - expect(findTrainTag().exists()).toBe(false); - }); + it('should not render tags when flags are not set', () => { + createComponent(); + + expect(findStuckTag().exists()).toBe(false); + expect(findLatestTag().exists()).toBe(false); + expect(findYamlTag().exists()).toBe(false); + expect(findAutoDevopsTag().exists()).toBe(false); + expect(findFailureTag().exists()).toBe(false); + expect(findScheduledTag().exists()).toBe(false); + expect(findForkTag().exists()).toBe(false); + expect(findTrainTag().exists()).toBe(false); + }); - it('should render the stuck tag when flag is provided', () => { - createComponent({ - pipeline: { - flags: { - stuck: true, - }, - }, + it('should render the stuck tag when flag is provided', () => { + const stuckPipeline = defaultProps.pipeline; + stuckPipeline.flags.stuck = true; + + createComponent({ + ...stuckPipeline.pipeline, + }); + + expect(findStuckTag().text()).toContain('stuck'); }); - expect(findStuckTag().text()).toContain('stuck'); - }); + it('should render latest tag when flag is provided', () => { + const latestPipeline = defaultProps.pipeline; + latestPipeline.flags.latest = true; - it('should render latest tag when flag is provided', () => { - createComponent({ - pipeline: { - flags: { - latest: true, - }, - }, + createComponent({ + ...latestPipeline, + }); + + expect(findLatestTag().text()).toContain('latest'); }); - expect(findLatestTag().text()).toContain('latest'); - }); + it('should render a yaml badge when it is invalid', () => { + const yamlPipeline = defaultProps.pipeline; + yamlPipeline.flags.yaml_errors = true; - it('should render a yaml badge when it is invalid', () => { - createComponent({ - pipeline: { - flags: { - yaml_errors: true, - }, - }, + createComponent({ + ...yamlPipeline, + }); + + expect(findYamlTag().text()).toContain('yaml invalid'); }); - expect(findYamlTag().text()).toContain('yaml invalid'); - }); + it('should render an autodevops badge when flag is provided', () => { + const autoDevopsPipeline = defaultProps.pipeline; + autoDevopsPipeline.flags.auto_devops = true; - it('should render an autodevops badge when flag is provided', () => { - createComponent({ - pipeline: { - ...defaultProps.pipeline, - flags: { - auto_devops: true, - }, - }, + createComponent({ + ...autoDevopsPipeline, + }); + + expect(trimText(findAutoDevopsTag().text())).toBe('Auto DevOps'); + + expect(findAutoDevopsTagLink().attributes()).toMatchObject({ + href: '/help/topics/autodevops/index.md', + target: '_blank', + }); }); - expect(trimText(findAutoDevopsTag().text())).toBe('Auto DevOps'); + it('should render a detached badge when flag is provided', () => { + const detachedMRPipeline = defaultProps.pipeline; + detachedMRPipeline.flags.detached_merge_request_pipeline = true; - expect(findAutoDevopsTagLink().attributes()).toMatchObject({ - href: '/help/topics/autodevops/index.md', - target: '_blank', + createComponent({ + ...detachedMRPipeline, + }); + + expect(findDetachedTag().text()).toContain('detached'); }); - }); - it('should render a detached badge when flag is provided', () => { - createComponent({ - pipeline: { - flags: { - detached_merge_request_pipeline: true, - }, - }, + it('should render error badge when pipeline has a failure reason set', () => { + const failedPipeline = defaultProps.pipeline; + failedPipeline.flags.failure_reason = true; + failedPipeline.failure_reason = 'some reason'; + + createComponent({ + ...failedPipeline, + }); + + expect(findFailureTag().text()).toContain('error'); + expect(findFailureTag().attributes('title')).toContain('some reason'); }); - expect(findDetachedTag().text()).toContain('detached'); - }); + it('should render scheduled badge when pipeline was triggered by a schedule', () => { + const scheduledPipeline = defaultProps.pipeline; + scheduledPipeline.source = 'schedule'; - it('should render error badge when pipeline has a failure reason set', () => { - createComponent({ - pipeline: { - flags: { - failure_reason: true, - }, - failure_reason: 'some reason', - }, + createComponent({ + ...scheduledPipeline, + }); + + expect(findScheduledTag().exists()).toBe(true); + expect(findScheduledTag().text()).toContain('Scheduled'); }); - expect(findFailureTag().text()).toContain('error'); - expect(findFailureTag().attributes('title')).toContain('some reason'); - }); + it('should render the fork badge when the pipeline was run in a fork', () => { + const forkedPipeline = defaultProps.pipeline; + forkedPipeline.project.full_path = '/test/forked'; - it('should render scheduled badge when pipeline was triggered by a schedule', () => { - createComponent({ - pipeline: { - flags: {}, - source: 'schedule', - }, + createComponent({ + ...forkedPipeline, + }); + + expect(findForkTag().exists()).toBe(true); + expect(findForkTag().text()).toBe('fork'); }); - expect(findScheduledTag().exists()).toBe(true); - expect(findScheduledTag().text()).toContain('Scheduled'); - }); + it('should render the train badge when the pipeline is a merge train pipeline', () => { + const mergeTrainPipeline = defaultProps.pipeline; + mergeTrainPipeline.flags.merge_train_pipeline = true; - it('should render the fork badge when the pipeline was run in a fork', () => { - createComponent({ - pipeline: { - flags: {}, - project: { fullPath: '/test/forked' }, - }, + createComponent({ + ...mergeTrainPipeline, + }); + + expect(findTrainTag().text()).toContain('train'); }); - expect(findForkTag().exists()).toBe(true); - expect(findForkTag().text()).toBe('fork'); - }); + it('should not render the train badge when the pipeline is not a merge train pipeline', () => { + const mergeTrainPipeline = defaultProps.pipeline; + mergeTrainPipeline.flags.merge_train_pipeline = false; - it('should render the train badge when the pipeline is a merge train pipeline', () => { - createComponent({ - pipeline: { - flags: { - merge_train_pipeline: true, - }, - }, + createComponent({ + ...mergeTrainPipeline, + }); + + expect(findTrainTag().exists()).toBe(false); }); - expect(findTrainTag().text()).toContain('train'); + it('should not render the commit wrapper and commit-short-sha', () => { + createComponent(); + + expect(findCommitTitleContainer().exists()).toBe(false); + expect(findCommitShortSha().exists()).toBe(false); + }); }); - it('should not render the train badge when the pipeline is not a merge train pipeline', () => { - createComponent({ - pipeline: { - flags: { - merge_train_pipeline: false, - }, + describe('with the rearrangePipelinesTable feature flag turned on', () => { + it('should render the commit title, commit reference and commit-short-sha', () => { + createComponent({}, true); + + const commitWrapper = findCommitTitleContainer(); + + expect(findCommitTitle(commitWrapper).exists()).toBe(true); + expect(findRefName().exists()).toBe(true); + expect(findCommitShortSha().exists()).toBe(true); + }); + + it('should render commit icon tooltip', () => { + createComponent({}, true); + + expect(findCommitIcon().attributes('title')).toBe('Commit'); + }); + + it.each` + pipeline | expectedTitle + ${mockPipelineTag()} | ${'Tag'} + ${mockPipelineBranch()} | ${'Branch'} + ${mockPipeline()} | ${'Merge Request'} + `( + 'should render tooltip $expectedTitle for commit icon type', + ({ pipeline, expectedTitle }) => { + createComponent(pipeline, true); + + 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); + }); }); - expect(findTrainTag().exists()).toBe(false); + 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); + }); + }); }); }); |