spec/frontend/deployments/components/deployment_deploy_block_spec.js (124 lines of code) (raw):
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import { GlIcon, GlAlert, GlButton } from '@gitlab/ui';
import mockDeploymentFixture from 'test_fixtures/graphql/deployments/graphql/queries/deployment.query.graphql.json';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import { captureException } from '~/sentry/sentry_browser_wrapper';
import DeploymentDeployBlock from '~/deployments/components/deployment_deploy_block.vue';
import deployMutation from '~/deployments/graphql/mutations/deploy.mutation.graphql';
jest.mock('~/sentry/sentry_browser_wrapper');
const {
data: {
project: { deployment },
},
} = mockDeploymentFixture;
Vue.use(VueApollo);
describe('~/deployments/components/deployment_deploy_block.vue', () => {
let wrapper;
let mockDeploy;
const createComponent = ({ propsData = {} } = {}) => {
const apolloProvider = createMockApollo([[deployMutation, mockDeploy]]);
wrapper = shallowMountExtended(DeploymentDeployBlock, {
apolloProvider,
propsData: {
deployment,
...propsData,
},
});
};
const findIcon = () => wrapper.findComponent(GlIcon);
const findAlert = () => wrapper.findComponent(GlAlert);
beforeEach(() => {
mockDeploy = jest.fn();
});
describe('with manual job user can play', () => {
let button;
beforeEach(() => {
createComponent();
button = wrapper.findComponent(GlButton);
mockDeploy.mockResolvedValue({ data: { jobPlay: { errors: [] } } });
});
it('shows the block if the job is ready to play', () => {
expect(wrapper.find('div').exists()).toBe(true);
});
it('displays text and icon saying user can deploy', () => {
expect(findIcon().props('name')).toBe('check-circle-filled');
expect(wrapper.findByText('Ready to be deployed.').exists()).toBe(true);
});
it('displays a button that starts the job', () => {
button.vm.$emit('click');
expect(mockDeploy).toHaveBeenCalledWith({ input: { id: deployment.job.id } });
});
describe('with data error', () => {
let error;
beforeEach(() => {
error = 'oh no!';
mockDeploy.mockResolvedValue({ data: { jobPlay: { errors: [error] } } });
button.vm.$emit('click');
return waitForPromises();
});
it('shows an error message', () => {
expect(findAlert().text()).toBe(error);
});
});
describe('with generic error', () => {
let error;
beforeEach(() => {
error = new Error('oops!');
mockDeploy.mockRejectedValue(error);
button.vm.$emit('click');
return waitForPromises();
});
it('shows an error message', () => {
expect(findAlert().text()).toBe(
'Something went wrong starting the deployment. Please try again later.',
);
});
it('sends the error to sentry', () => {
expect(captureException).toHaveBeenCalledWith(error);
});
});
});
describe('with manual job user can not play', () => {
beforeEach(() => {
createComponent({
propsData: {
deployment: {
...deployment,
job: {
...deployment.job,
canPlayJob: false,
},
},
},
});
});
it('shows the block if the job is ready to play', () => {
expect(wrapper.find('div').exists()).toBe(true);
});
it('displays text and icon saying deploy is pending', () => {
expect(findIcon().props('name')).toBe('timer');
expect(wrapper.findByText('Waiting to be deployed.').exists()).toBe(true);
});
});
describe('with non-manual job', () => {
beforeEach(() => {
createComponent({
propsData: {
deployment: {
...deployment,
job: {
...deployment.job,
playable: false,
},
},
},
});
});
it('shows nothing', () => {
expect(wrapper.find('div').exists()).toBe(false);
});
});
});