Commit 39bef72c authored by Payton Burdette's avatar Payton Burdette Committed by Natalia Tepluhina

Migrate pipelines actions spec

Migrate pipelines actions spec
from karma to jest. And use vue
test utils now.
parent 718a986d
import Vue from 'vue';
import { shallowMount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
import mountComponent from 'spec/helpers/vue_mount_component_helper';
import { TEST_HOST } from 'spec/test_constants';
import axios from '~/lib/utils/axios_utils';
import PipelinesActions from '~/pipelines/components/pipelines_actions.vue';
import { GlDeprecatedButton } from '@gitlab/ui';
import GlCountdown from '~/vue_shared/components/gl_countdown.vue';
import waitForPromises from 'helpers/wait_for_promises';
describe('Pipelines Actions dropdown', () => {
const Component = Vue.extend(PipelinesActions);
let vm;
let wrapper;
let mock;
afterEach(() => {
vm.$destroy();
mock.restore();
const createComponent = (actions = []) => {
wrapper = shallowMount(PipelinesActions, {
propsData: {
actions,
},
});
};
const findAllDropdownItems = () => wrapper.findAll(GlDeprecatedButton);
const findAllCountdowns = () => wrapper.findAll(GlCountdown);
beforeEach(() => {
mock = new MockAdapter(axios);
});
afterEach(() => {
wrapper.destroy();
wrapper = null;
mock.restore();
});
describe('manual actions', () => {
const actions = [
const mockActions = [
{
name: 'stop_review',
path: `${TEST_HOST}/root/review-app/builds/1893/play`,
......@@ -33,33 +47,31 @@ describe('Pipelines Actions dropdown', () => {
];
beforeEach(() => {
vm = mountComponent(Component, { actions });
createComponent(mockActions);
});
it('renders a dropdown with the provided actions', () => {
const dropdownItems = vm.$el.querySelectorAll('.dropdown-menu li');
expect(dropdownItems.length).toEqual(actions.length);
expect(findAllDropdownItems()).toHaveLength(mockActions.length);
});
it("renders a disabled action when it's not playable", () => {
const dropdownItem = vm.$el.querySelector('.dropdown-menu li:last-child button');
expect(dropdownItem).toBeDisabled();
expect(
findAllDropdownItems()
.at(1)
.attributes('disabled'),
).toBe('true');
});
describe('on click', () => {
it('makes a request and toggles the loading state', done => {
mock.onPost(actions.path).reply(200);
vm.$el.querySelector('.dropdown-menu li button').click();
it('makes a request and toggles the loading state', () => {
mock.onPost(mockActions.path).reply(200);
expect(vm.isLoading).toEqual(true);
wrapper.find(GlDeprecatedButton).vm.$emit('click');
setTimeout(() => {
expect(vm.isLoading).toEqual(false);
expect(wrapper.vm.isLoading).toBe(true);
done();
return waitForPromises().then(() => {
expect(wrapper.vm.isLoading).toBe(false);
});
});
});
......@@ -78,51 +90,53 @@ describe('Pipelines Actions dropdown', () => {
playable: true,
scheduled_at: '2018-10-05T08:23:00Z',
};
const findDropdownItem = action => {
const buttons = vm.$el.querySelectorAll('.dropdown-menu li button');
return Array.prototype.find.call(buttons, element =>
element.innerText.trim().startsWith(action.name),
);
};
beforeEach(done => {
spyOn(Date, 'now').and.callFake(() => new Date('2063-04-04T00:42:00Z').getTime());
vm = mountComponent(Component, { actions: [scheduledJobAction, expiredJobAction] });
Vue.nextTick()
.then(done)
.catch(done.fail);
beforeEach(() => {
jest.spyOn(Date, 'now').mockImplementation(() => new Date('2063-04-04T00:42:00Z').getTime());
createComponent([scheduledJobAction, expiredJobAction]);
});
it('makes post request after confirming', done => {
it('makes post request after confirming', () => {
mock.onPost(scheduledJobAction.path).reply(200);
spyOn(window, 'confirm').and.callFake(() => true);
jest.spyOn(window, 'confirm').mockReturnValue(true);
findDropdownItem(scheduledJobAction).click();
findAllDropdownItems()
.at(0)
.vm.$emit('click');
expect(window.confirm).toHaveBeenCalled();
setTimeout(() => {
return waitForPromises().then(() => {
expect(mock.history.post.length).toBe(1);
done();
});
});
it('does not make post request if confirmation is cancelled', () => {
mock.onPost(scheduledJobAction.path).reply(200);
spyOn(window, 'confirm').and.callFake(() => false);
jest.spyOn(window, 'confirm').mockReturnValue(false);
findDropdownItem(scheduledJobAction).click();
findAllDropdownItems()
.at(0)
.vm.$emit('click');
expect(window.confirm).toHaveBeenCalled();
expect(mock.history.post.length).toBe(0);
});
it('displays the remaining time in the dropdown', () => {
expect(findDropdownItem(scheduledJobAction)).toContainText('24:00:00');
expect(
findAllCountdowns()
.at(0)
.props('endDateString'),
).toBe(scheduledJobAction.scheduled_at);
});
it('displays 00:00:00 for expired jobs in the dropdown', () => {
expect(findDropdownItem(expiredJobAction)).toContainText('00:00:00');
expect(
findAllCountdowns()
.at(1)
.props('endDateString'),
).toBe(expiredJobAction.scheduled_at);
});
});
});
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment