import { mount } from 'enzyme'; import React from 'react'; import type { ITriggersPageContentProps } from './TriggersPageContent'; import { TriggersPageContent } from './TriggersPageContent'; import { ApplicationModelBuilder } from '../../../application'; import { ArtifactReferenceService } from '../../../artifact/ArtifactReferenceService'; import type { IExpectedArtifact, ITrigger } from '../../../domain'; import { Registry } from '../../../registry'; describe('', () => { let removeReferencesFromStagesSpy: jasmine.Spy; let updatePipelineSpy: jasmine.Spy; let props: ITriggersPageContentProps; let newTrigger: ITrigger; let triggerA: ITrigger; let triggerB: ITrigger; let expectedArtifactA: IExpectedArtifact; let expectedArtifactB: IExpectedArtifact; beforeEach(() => { spyOn(Registry.pipeline, 'getTriggerTypes').and.returnValue([{ key: 'cron' }, { key: 'git' }]); removeReferencesFromStagesSpy = spyOn(ArtifactReferenceService, 'removeReferencesFromStages'); updatePipelineSpy = jasmine.createSpy('updatePipeline'); props = { application: ApplicationModelBuilder.createApplicationForTests('my-application'), pipeline: { application: 'my-application', id: 'pipeline-id', limitConcurrent: true, keepWaitingPipelines: true, name: 'My Pipeline', parameterConfig: [], stages: [], triggers: [], }, updatePipelineConfig: updatePipelineSpy, }; newTrigger = { enabled: true, type: null }; triggerA = { enabled: true, type: 'cron' }; triggerB = { enabled: true, type: 'git' }; expectedArtifactA = { id: 'expected-artifact-a', displayName: 'tasty-otter-27', useDefaultArtifact: false, usePriorArtifact: false, matchArtifact: null, defaultArtifact: null, }; expectedArtifactB = { id: 'expected-artifact-b', displayName: 'sad-tarantula-28', useDefaultArtifact: false, usePriorArtifact: false, matchArtifact: null, defaultArtifact: null, }; }); describe('Adding a trigger', () => { it('Adds a first trigger to the pipeline', () => { const component = mount(); expect(updatePipelineSpy).toHaveBeenCalledTimes(0); component.find('.btn-add-trigger').simulate('click'); expect(updatePipelineSpy).toHaveBeenCalledTimes(1); expect(updatePipelineSpy).toHaveBeenCalledWith({ triggers: [newTrigger] }); }); it('Adds a second trigger to the pipeline', () => { const component = mount( , ); expect(updatePipelineSpy).toHaveBeenCalledTimes(0); component.find('.btn-add-trigger').simulate('click'); expect(updatePipelineSpy).toHaveBeenCalledTimes(1); expect(updatePipelineSpy).toHaveBeenCalledWith({ triggers: [triggerA, newTrigger] }); }); }); describe('Editing a trigger', () => { it('Edits a property of an existing trigger', () => { const component = mount( , ); expect(updatePipelineSpy).toHaveBeenCalledTimes(0); component.find('.enable-trigger-checkbox').simulate('change', { target: { checked: false } }); component.update(); expect(updatePipelineSpy).toHaveBeenCalledTimes(1); expect(updatePipelineSpy).toHaveBeenCalledWith({ triggers: [{ ...triggerA, enabled: false }] }); }); }); describe('Removing a trigger', () => { it('Removes the trigger from the pipeline', () => { const component = mount( , ); expect(updatePipelineSpy).toHaveBeenCalledTimes(0); component.find('.glyphicon-trash').at(0).simulate('click'); expect(updatePipelineSpy).toHaveBeenCalledTimes(1); expect(updatePipelineSpy).toHaveBeenCalledWith({ triggers: [triggerB] }); }); it('Removes expected artifacts if associated only with the removed trigger', () => { const component = mount( , ); expect(updatePipelineSpy).toHaveBeenCalledTimes(0); expect(removeReferencesFromStagesSpy).toHaveBeenCalledTimes(0); component.find('.glyphicon-trash').at(0).simulate('click'); expect(updatePipelineSpy).toHaveBeenCalledTimes(1); expect(removeReferencesFromStagesSpy).toHaveBeenCalledTimes(1); expect(updatePipelineSpy).toHaveBeenCalledWith({ triggers: [triggerB], expectedArtifacts: [expectedArtifactB] }); expect(removeReferencesFromStagesSpy).toHaveBeenCalledWith([expectedArtifactA.id], props.pipeline.stages); }); it('Does not remove expected artifacts if associated with multiple triggers', () => { const component = mount( , ); expect(updatePipelineSpy).toHaveBeenCalledTimes(0); component.find('.glyphicon-trash').at(0).simulate('click'); expect(updatePipelineSpy).toHaveBeenCalledTimes(1); expect(removeReferencesFromStagesSpy).toHaveBeenCalledTimes(0); expect(updatePipelineSpy).toHaveBeenCalledWith({ triggers: [{ ...triggerB, expectedArtifactIds: [expectedArtifactA.id] }], }); }); }); });