Use component selectors in serverless frontend tests

This commit is contained in:
Winnie Hellmann 2019-05-19 19:55:04 +00:00 committed by Tim Zallmann
parent 5fb7ef1729
commit 2aa024af61
4 changed files with 37 additions and 24 deletions

View file

@ -1,27 +1,32 @@
import functionRowComponent from '~/serverless/components/function_row.vue';
import { shallowMount } from '@vue/test-utils';
import Timeago from '~/vue_shared/components/time_ago_tooltip.vue';
import { mockServerlessFunction } from '../mock_data';
const createComponent = func =>
shallowMount(functionRowComponent, { propsData: { func }, sync: false }).vm;
describe('functionRowComponent', () => {
let wrapper;
const createComponent = func => {
wrapper = shallowMount(functionRowComponent, { propsData: { func }, sync: false });
};
afterEach(() => {
wrapper.destroy();
});
it('Parses the function details correctly', () => {
const vm = createComponent(mockServerlessFunction);
createComponent(mockServerlessFunction);
expect(vm.$el.querySelector('b').innerHTML).toEqual(mockServerlessFunction.name);
expect(vm.$el.querySelector('span').innerHTML).toEqual(mockServerlessFunction.image);
expect(vm.$el.querySelector('timeago-stub').getAttribute('time')).not.toBe(null);
vm.$destroy();
expect(wrapper.find('b').text()).toBe(mockServerlessFunction.name);
expect(wrapper.find('span').text()).toBe(mockServerlessFunction.image);
expect(wrapper.find(Timeago).attributes('time')).not.toBe(null);
});
it('handles clicks correctly', () => {
const vm = createComponent(mockServerlessFunction);
createComponent(mockServerlessFunction);
const { vm } = wrapper;
expect(vm.checkClass(vm.$el.querySelector('p'))).toBe(true); // check somewhere inside the row
vm.$destroy();
});
});

View file

@ -1,9 +1,12 @@
import Vuex from 'vuex';
import { GlLoadingIcon } from '@gitlab/ui';
import AxiosMockAdapter from 'axios-mock-adapter';
import axios from '~/lib/utils/axios_utils';
import functionsComponent from '~/serverless/components/functions.vue';
import { createLocalVue, shallowMount } from '@vue/test-utils';
import { createStore } from '~/serverless/store';
import EmptyState from '~/serverless/components/empty_state.vue';
import EnvironmentRow from '~/serverless/components/environment_row.vue';
import { TEST_HOST } from 'helpers/test_constants';
import { mockServerlessFunctions } from '../mock_data';
@ -43,7 +46,7 @@ describe('functionsComponent', () => {
sync: false,
});
expect(component.vm.$el.querySelector('emptystate-stub')).not.toBe(null);
expect(component.find(EmptyState).exists()).toBe(true);
});
it('should render a loading component', () => {
@ -60,7 +63,7 @@ describe('functionsComponent', () => {
sync: false,
});
expect(component.vm.$el.querySelector('glloadingicon-stub')).not.toBe(null);
expect(component.find(GlLoadingIcon).exists()).toBe(true);
});
it('should render empty state when there is no function data', () => {
@ -104,7 +107,7 @@ describe('functionsComponent', () => {
component.vm.$store.dispatch('receiveFunctionsSuccess', mockServerlessFunctions);
return component.vm.$nextTick().then(() => {
expect(component.vm.$el.querySelector('environmentrow-stub')).not.toBe(null);
expect(component.find(EnvironmentRow).exists()).toBe(true);
});
});
});

View file

@ -1,3 +1,4 @@
import { GlButton } from '@gitlab/ui';
import missingPrometheusComponent from '~/serverless/components/missing_prometheus.vue';
import { shallowMount } from '@vue/test-utils';
@ -9,27 +10,29 @@ const createComponent = missingData =>
missingData,
},
sync: false,
}).vm;
});
describe('missingPrometheusComponent', () => {
let vm;
let wrapper;
afterEach(() => {
vm.$destroy();
wrapper.destroy();
});
it('should render missing prometheus message', () => {
vm = createComponent(false);
wrapper = createComponent(false);
const { vm } = wrapper;
expect(vm.$el.querySelector('.state-description').innerHTML.trim()).toContain(
'Function invocation metrics require Prometheus to be installed first.',
);
expect(vm.$el.querySelector('glbutton-stub').getAttribute('variant')).toEqual('success');
expect(wrapper.find(GlButton).attributes('variant')).toBe('success');
});
it('should render no prometheus data message', () => {
vm = createComponent(true);
wrapper = createComponent(true);
const { vm } = wrapper;
expect(vm.$el.querySelector('.state-description').innerHTML.trim()).toContain(
'Invocation metrics loading or not available at this time.',

View file

@ -1,6 +1,7 @@
import Vue from 'vue';
import urlComponent from '~/serverless/components/url.vue';
import { shallowMount } from '@vue/test-utils';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
const createComponent = uri =>
shallowMount(Vue.extend(urlComponent), {
@ -8,15 +9,16 @@ const createComponent = uri =>
uri,
},
sync: false,
}).vm;
});
describe('urlComponent', () => {
it('should render correctly', () => {
const uri = 'http://testfunc.apps.example.com';
const vm = createComponent(uri);
const wrapper = createComponent(uri);
const { vm } = wrapper;
expect(vm.$el.classList.contains('clipboard-group')).toBe(true);
expect(vm.$el.querySelector('clipboardbutton-stub').getAttribute('text')).toEqual(uri);
expect(wrapper.find(ClipboardButton).attributes('text')).toEqual(uri);
expect(vm.$el.querySelector('.url-text-field').innerHTML).toEqual(uri);