add tests for resuable dropdown components
This commit is contained in:
parent
aa7e55f274
commit
37cfca2cc9
4 changed files with 169 additions and 0 deletions
|
@ -0,0 +1,69 @@
|
|||
import Vue from 'vue';
|
||||
|
||||
import dropdownButtonComponent from '~/vue_shared/components/dropdown/dropdown_button.vue';
|
||||
|
||||
import mountComponent from 'spec/helpers/vue_mount_component_helper';
|
||||
|
||||
const defaultLabel = 'Select';
|
||||
const customLabel = 'Select project';
|
||||
|
||||
const createComponent = config => {
|
||||
const Component = Vue.extend(dropdownButtonComponent);
|
||||
|
||||
return mountComponent(Component, config);
|
||||
};
|
||||
|
||||
describe('DropdownButtonComponent', () => {
|
||||
let vm;
|
||||
|
||||
beforeEach(() => {
|
||||
vm = createComponent();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
vm.$destroy();
|
||||
});
|
||||
|
||||
describe('computed', () => {
|
||||
describe('dropdownToggleText', () => {
|
||||
it('returns default toggle text', () => {
|
||||
expect(vm.toggleText).toBe(defaultLabel);
|
||||
});
|
||||
|
||||
it('returns custom toggle text when provided via props', () => {
|
||||
const vmEmptyLabels = createComponent({ toggleText: customLabel });
|
||||
|
||||
expect(vmEmptyLabels.toggleText).toBe(customLabel);
|
||||
vmEmptyLabels.$destroy();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('template', () => {
|
||||
it('renders component container element of type `button`', () => {
|
||||
expect(vm.$el.nodeName).toBe('BUTTON');
|
||||
});
|
||||
|
||||
it('renders component container element with required data attributes', () => {
|
||||
expect(vm.$el.dataset.abilityName).toBe(vm.abilityName);
|
||||
expect(vm.$el.dataset.fieldName).toBe(vm.fieldName);
|
||||
expect(vm.$el.dataset.issueUpdate).toBe(vm.updatePath);
|
||||
expect(vm.$el.dataset.labels).toBe(vm.labelsPath);
|
||||
expect(vm.$el.dataset.namespacePath).toBe(vm.namespace);
|
||||
expect(vm.$el.dataset.showAny).not.toBeDefined();
|
||||
});
|
||||
|
||||
it('renders dropdown toggle text element', () => {
|
||||
const dropdownToggleTextEl = vm.$el.querySelector('.dropdown-toggle-text');
|
||||
expect(dropdownToggleTextEl).not.toBeNull();
|
||||
expect(dropdownToggleTextEl.innerText.trim()).toBe(defaultLabel);
|
||||
});
|
||||
|
||||
it('renders dropdown button icon', () => {
|
||||
const dropdownIconEl = vm.$el.querySelector('.dropdown-toggle-icon i.fa');
|
||||
|
||||
expect(dropdownIconEl).not.toBeNull();
|
||||
expect(dropdownIconEl.classList.contains('fa-chevron-down')).toBe(true);
|
||||
});
|
||||
});
|
||||
});
|
|
@ -0,0 +1,37 @@
|
|||
import Vue from 'vue';
|
||||
|
||||
import dropdownHiddenInputComponent from '~/vue_shared/components/dropdown/dropdown_hidden_input.vue';
|
||||
|
||||
import mountComponent from 'spec/helpers/vue_mount_component_helper';
|
||||
|
||||
import { mockLabels } from './mock_data';
|
||||
|
||||
const createComponent = (name = 'label_id[]', value = mockLabels[0].id) => {
|
||||
const Component = Vue.extend(dropdownHiddenInputComponent);
|
||||
|
||||
return mountComponent(Component, {
|
||||
name,
|
||||
value,
|
||||
});
|
||||
};
|
||||
|
||||
describe('DropdownHiddenInputComponent', () => {
|
||||
let vm;
|
||||
|
||||
beforeEach(() => {
|
||||
vm = createComponent();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
vm.$destroy();
|
||||
});
|
||||
|
||||
describe('template', () => {
|
||||
it('renders input element of type `hidden`', () => {
|
||||
expect(vm.$el.nodeName).toBe('INPUT');
|
||||
expect(vm.$el.getAttribute('type')).toBe('hidden');
|
||||
expect(vm.$el.getAttribute('name')).toBe(vm.name);
|
||||
expect(vm.$el.getAttribute('value')).toBe(`${vm.value}`);
|
||||
});
|
||||
});
|
||||
});
|
|
@ -0,0 +1,52 @@
|
|||
import Vue from 'vue';
|
||||
|
||||
import dropdownSearchInputComponent from '~/vue_shared/components/dropdown/dropdown_search_input.vue';
|
||||
|
||||
import mountComponent from 'spec/helpers/vue_mount_component_helper';
|
||||
|
||||
const componentConfig = {
|
||||
placeholderText: 'Search something',
|
||||
};
|
||||
|
||||
const createComponent = (config = componentConfig) => {
|
||||
const Component = Vue.extend(dropdownSearchInputComponent);
|
||||
|
||||
return mountComponent(Component, config);
|
||||
};
|
||||
|
||||
describe('DropdownSearchInputComponent', () => {
|
||||
let vm;
|
||||
|
||||
beforeEach(() => {
|
||||
vm = createComponent();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
vm.$destroy();
|
||||
});
|
||||
|
||||
describe('template', () => {
|
||||
it('renders input element with type `search`', () => {
|
||||
const inputEl = vm.$el.querySelector('input.dropdown-input-field');
|
||||
|
||||
expect(inputEl).not.toBeNull();
|
||||
expect(inputEl.getAttribute('type')).toBe('search');
|
||||
});
|
||||
|
||||
it('renders search icon element', () => {
|
||||
expect(vm.$el.querySelector('.fa-search.dropdown-input-search')).not.toBeNull();
|
||||
});
|
||||
|
||||
it('renders clear search icon element', () => {
|
||||
expect(
|
||||
vm.$el.querySelector('.fa-times.dropdown-input-clear.js-dropdown-input-clear'),
|
||||
).not.toBeNull();
|
||||
});
|
||||
|
||||
it('displays custom placeholder text', () => {
|
||||
const inputEl = vm.$el.querySelector('input.dropdown-input-field');
|
||||
|
||||
expect(inputEl.getAttribute('placeholder')).toBe(componentConfig.placeholderText);
|
||||
});
|
||||
});
|
||||
});
|
11
spec/javascripts/vue_shared/components/dropdown/mock_data.js
Normal file
11
spec/javascripts/vue_shared/components/dropdown/mock_data.js
Normal file
|
@ -0,0 +1,11 @@
|
|||
export const mockLabels = [
|
||||
{
|
||||
id: 26,
|
||||
title: 'Foo Label',
|
||||
description: 'Foobar',
|
||||
color: '#BADA55',
|
||||
text_color: '#FFFFFF',
|
||||
},
|
||||
];
|
||||
|
||||
export default mockLabels;
|
Loading…
Reference in a new issue