2021-02-22 17:27:13 +05:30
|
|
|
import { mount, shallowMount, createLocalVue } from '@vue/test-utils';
|
2021-03-11 19:13:27 +05:30
|
|
|
import VueApollo from 'vue-apollo';
|
2021-03-08 18:12:59 +05:30
|
|
|
import createMockApollo from 'helpers/mock_apollo_helper';
|
|
|
|
import getPipelineDetails from 'shared_queries/pipelines/get_pipeline_details.query.graphql';
|
2021-03-11 19:13:27 +05:30
|
|
|
import { DOWNSTREAM, GRAPHQL, UPSTREAM } from '~/pipelines/components/graph/constants';
|
2021-02-22 17:27:13 +05:30
|
|
|
import PipelineGraph from '~/pipelines/components/graph/graph_component.vue';
|
2020-04-22 19:07:51 +05:30
|
|
|
import LinkedPipeline from '~/pipelines/components/graph/linked_pipeline.vue';
|
2021-03-11 19:13:27 +05:30
|
|
|
import LinkedPipelinesColumn from '~/pipelines/components/graph/linked_pipelines_column.vue';
|
2021-02-22 17:27:13 +05:30
|
|
|
import { LOAD_FAILURE } from '~/pipelines/constants';
|
|
|
|
import {
|
|
|
|
mockPipelineResponse,
|
|
|
|
pipelineWithUpstreamDownstream,
|
|
|
|
wrappedPipelineReturn,
|
|
|
|
} from './mock_data';
|
|
|
|
|
|
|
|
const processedPipeline = pipelineWithUpstreamDownstream(mockPipelineResponse);
|
2020-04-22 19:07:51 +05:30
|
|
|
|
|
|
|
describe('Linked Pipelines Column', () => {
|
2021-02-22 17:27:13 +05:30
|
|
|
const defaultProps = {
|
2021-03-11 19:13:27 +05:30
|
|
|
columnTitle: 'Downstream',
|
2021-02-22 17:27:13 +05:30
|
|
|
linkedPipelines: processedPipeline.downstream,
|
|
|
|
type: DOWNSTREAM,
|
2020-04-22 19:07:51 +05:30
|
|
|
};
|
2021-02-22 17:27:13 +05:30
|
|
|
|
2020-04-22 19:07:51 +05:30
|
|
|
let wrapper;
|
2021-02-22 17:27:13 +05:30
|
|
|
const findLinkedColumnTitle = () => wrapper.find('[data-testid="linked-column-title"]');
|
|
|
|
const findLinkedPipelineElements = () => wrapper.findAll(LinkedPipeline);
|
|
|
|
const findPipelineGraph = () => wrapper.find(PipelineGraph);
|
|
|
|
const findExpandButton = () => wrapper.find('[data-testid="expand-pipeline-button"]');
|
2020-04-22 19:07:51 +05:30
|
|
|
|
2021-02-22 17:27:13 +05:30
|
|
|
const localVue = createLocalVue();
|
|
|
|
localVue.use(VueApollo);
|
|
|
|
|
|
|
|
const createComponent = ({ apolloProvider, mountFn = shallowMount, props = {} } = {}) => {
|
|
|
|
wrapper = mountFn(LinkedPipelinesColumn, {
|
|
|
|
apolloProvider,
|
|
|
|
localVue,
|
|
|
|
propsData: {
|
|
|
|
...defaultProps,
|
|
|
|
...props,
|
|
|
|
},
|
|
|
|
provide: {
|
|
|
|
dataMethod: GRAPHQL,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2021-03-11 19:13:27 +05:30
|
|
|
const createComponentWithApollo = ({
|
2021-02-22 17:27:13 +05:30
|
|
|
mountFn = shallowMount,
|
|
|
|
getPipelineDetailsHandler = jest.fn().mockResolvedValue(wrappedPipelineReturn),
|
2021-03-11 19:13:27 +05:30
|
|
|
props = {},
|
|
|
|
} = {}) => {
|
2021-02-22 17:27:13 +05:30
|
|
|
const requestHandlers = [[getPipelineDetails, getPipelineDetailsHandler]];
|
|
|
|
|
|
|
|
const apolloProvider = createMockApollo(requestHandlers);
|
2021-03-11 19:13:27 +05:30
|
|
|
createComponent({ apolloProvider, mountFn, props });
|
2021-02-22 17:27:13 +05:30
|
|
|
};
|
2020-04-22 19:07:51 +05:30
|
|
|
|
|
|
|
afterEach(() => {
|
|
|
|
wrapper.destroy();
|
2021-02-22 17:27:13 +05:30
|
|
|
wrapper = null;
|
2020-04-22 19:07:51 +05:30
|
|
|
});
|
|
|
|
|
2021-02-22 17:27:13 +05:30
|
|
|
describe('it renders correctly', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
createComponent();
|
|
|
|
});
|
|
|
|
|
|
|
|
it('renders the pipeline title', () => {
|
|
|
|
expect(findLinkedColumnTitle().text()).toBe(defaultProps.columnTitle);
|
|
|
|
});
|
2020-04-22 19:07:51 +05:30
|
|
|
|
2021-02-22 17:27:13 +05:30
|
|
|
it('renders the correct number of linked pipelines', () => {
|
|
|
|
expect(findLinkedPipelineElements()).toHaveLength(defaultProps.linkedPipelines.length);
|
|
|
|
});
|
2020-04-22 19:07:51 +05:30
|
|
|
});
|
|
|
|
|
2021-02-22 17:27:13 +05:30
|
|
|
describe('click action', () => {
|
|
|
|
const clickExpandButton = async () => {
|
|
|
|
await findExpandButton().trigger('click');
|
|
|
|
await wrapper.vm.$nextTick();
|
|
|
|
};
|
2020-04-22 19:07:51 +05:30
|
|
|
|
2021-02-22 17:27:13 +05:30
|
|
|
const clickExpandButtonAndAwaitTimers = async () => {
|
|
|
|
await clickExpandButton();
|
|
|
|
jest.runOnlyPendingTimers();
|
|
|
|
await wrapper.vm.$nextTick();
|
|
|
|
};
|
|
|
|
|
2021-03-11 19:13:27 +05:30
|
|
|
describe('downstream', () => {
|
|
|
|
describe('when successful', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
createComponentWithApollo({ mountFn: mount });
|
|
|
|
});
|
|
|
|
|
|
|
|
it('toggles the pipeline visibility', async () => {
|
|
|
|
expect(findPipelineGraph().exists()).toBe(false);
|
|
|
|
await clickExpandButtonAndAwaitTimers();
|
|
|
|
expect(findPipelineGraph().exists()).toBe(true);
|
|
|
|
await clickExpandButton();
|
|
|
|
expect(findPipelineGraph().exists()).toBe(false);
|
|
|
|
});
|
2021-02-22 17:27:13 +05:30
|
|
|
});
|
|
|
|
|
2021-03-11 19:13:27 +05:30
|
|
|
describe('on error', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
createComponentWithApollo({
|
|
|
|
mountFn: mount,
|
|
|
|
getPipelineDetailsHandler: jest.fn().mockRejectedValue(new Error('GraphQL error')),
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('emits the error', async () => {
|
|
|
|
await clickExpandButton();
|
|
|
|
expect(wrapper.emitted().error).toEqual([[LOAD_FAILURE]]);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('does not show the pipeline', async () => {
|
|
|
|
expect(findPipelineGraph().exists()).toBe(false);
|
|
|
|
await clickExpandButtonAndAwaitTimers();
|
|
|
|
expect(findPipelineGraph().exists()).toBe(false);
|
|
|
|
});
|
2021-02-22 17:27:13 +05:30
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2021-03-11 19:13:27 +05:30
|
|
|
describe('upstream', () => {
|
|
|
|
const upstreamProps = {
|
|
|
|
columnTitle: 'Upstream',
|
|
|
|
/*
|
|
|
|
Because the IDs need to match to work, rather
|
|
|
|
than make new mock data, we are representing
|
|
|
|
the upstream pipeline with the downstream data.
|
|
|
|
*/
|
|
|
|
linkedPipelines: processedPipeline.downstream,
|
|
|
|
type: UPSTREAM,
|
|
|
|
};
|
|
|
|
|
|
|
|
describe('when successful', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
createComponentWithApollo({
|
|
|
|
mountFn: mount,
|
|
|
|
props: upstreamProps,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('toggles the pipeline visibility', async () => {
|
|
|
|
expect(findPipelineGraph().exists()).toBe(false);
|
|
|
|
await clickExpandButtonAndAwaitTimers();
|
|
|
|
expect(findPipelineGraph().exists()).toBe(true);
|
|
|
|
await clickExpandButton();
|
|
|
|
expect(findPipelineGraph().exists()).toBe(false);
|
|
|
|
});
|
2021-02-22 17:27:13 +05:30
|
|
|
});
|
2020-04-22 19:07:51 +05:30
|
|
|
|
2021-03-11 19:13:27 +05:30
|
|
|
describe('on error', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
createComponentWithApollo({
|
|
|
|
mountFn: mount,
|
|
|
|
getPipelineDetailsHandler: jest.fn().mockRejectedValue(new Error('GraphQL error')),
|
|
|
|
props: upstreamProps,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('emits the error', async () => {
|
|
|
|
await clickExpandButton();
|
|
|
|
expect(wrapper.emitted().error).toEqual([[LOAD_FAILURE]]);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('does not show the pipeline', async () => {
|
|
|
|
expect(findPipelineGraph().exists()).toBe(false);
|
|
|
|
await clickExpandButtonAndAwaitTimers();
|
|
|
|
expect(findPipelineGraph().exists()).toBe(false);
|
|
|
|
});
|
2021-02-22 17:27:13 +05:30
|
|
|
});
|
|
|
|
});
|
2020-04-22 19:07:51 +05:30
|
|
|
});
|
|
|
|
});
|