202 lines
4.4 KiB
JavaScript
202 lines
4.4 KiB
JavaScript
|
import $ from 'jquery';
|
||
|
import Vue from 'vue';
|
||
|
import { createStore } from '~/ide/stores';
|
||
|
import Dropdown from '~/ide/components/file_templates/dropdown.vue';
|
||
|
import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
|
||
|
import { resetStore } from '../../helpers';
|
||
|
|
||
|
describe('IDE file templates dropdown component', () => {
|
||
|
let Component;
|
||
|
let vm;
|
||
|
|
||
|
beforeAll(() => {
|
||
|
Component = Vue.extend(Dropdown);
|
||
|
});
|
||
|
|
||
|
beforeEach(() => {
|
||
|
const store = createStore();
|
||
|
|
||
|
vm = createComponentWithStore(Component, store, {
|
||
|
label: 'Test',
|
||
|
}).$mount();
|
||
|
});
|
||
|
|
||
|
afterEach(() => {
|
||
|
vm.$destroy();
|
||
|
resetStore(vm.$store);
|
||
|
});
|
||
|
|
||
|
describe('async', () => {
|
||
|
beforeEach(() => {
|
||
|
vm.isAsyncData = true;
|
||
|
});
|
||
|
|
||
|
it('calls async store method on Bootstrap dropdown event', () => {
|
||
|
spyOn(vm, 'fetchTemplateTypes').and.stub();
|
||
|
|
||
|
$(vm.$el).trigger('show.bs.dropdown');
|
||
|
|
||
|
expect(vm.fetchTemplateTypes).toHaveBeenCalled();
|
||
|
});
|
||
|
|
||
|
it('renders templates when async', done => {
|
||
|
vm.$store.state.fileTemplates.templates = [
|
||
|
{
|
||
|
name: 'test',
|
||
|
},
|
||
|
];
|
||
|
|
||
|
vm.$nextTick(() => {
|
||
|
expect(vm.$el.querySelector('.dropdown-content').textContent).toContain('test');
|
||
|
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('renders loading icon when isLoading is true', done => {
|
||
|
vm.$store.state.fileTemplates.isLoading = true;
|
||
|
|
||
|
vm.$nextTick(() => {
|
||
|
expect(vm.$el.querySelector('.loading-container')).not.toBe(null);
|
||
|
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('searches template data', () => {
|
||
|
vm.$store.state.fileTemplates.templates = [
|
||
|
{
|
||
|
name: 'test',
|
||
|
},
|
||
|
];
|
||
|
vm.searchable = true;
|
||
|
vm.search = 'hello';
|
||
|
|
||
|
expect(vm.outputData).toEqual([]);
|
||
|
});
|
||
|
|
||
|
it('does not filter data is searchable is false', () => {
|
||
|
vm.$store.state.fileTemplates.templates = [
|
||
|
{
|
||
|
name: 'test',
|
||
|
},
|
||
|
];
|
||
|
vm.search = 'hello';
|
||
|
|
||
|
expect(vm.outputData).toEqual([
|
||
|
{
|
||
|
name: 'test',
|
||
|
},
|
||
|
]);
|
||
|
});
|
||
|
|
||
|
it('calls clickItem on click', done => {
|
||
|
spyOn(vm, 'clickItem').and.stub();
|
||
|
|
||
|
vm.$store.state.fileTemplates.templates = [
|
||
|
{
|
||
|
name: 'test',
|
||
|
},
|
||
|
];
|
||
|
|
||
|
vm.$nextTick(() => {
|
||
|
vm.$el.querySelector('.dropdown-content button').click();
|
||
|
|
||
|
expect(vm.clickItem).toHaveBeenCalledWith({
|
||
|
name: 'test',
|
||
|
});
|
||
|
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('renders input when searchable is true', done => {
|
||
|
vm.searchable = true;
|
||
|
|
||
|
vm.$nextTick(() => {
|
||
|
expect(vm.$el.querySelector('.dropdown-input')).not.toBe(null);
|
||
|
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('does not render input when searchable is true & showLoading is true', done => {
|
||
|
vm.searchable = true;
|
||
|
vm.$store.state.fileTemplates.isLoading = true;
|
||
|
|
||
|
vm.$nextTick(() => {
|
||
|
expect(vm.$el.querySelector('.dropdown-input')).toBe(null);
|
||
|
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('sync', () => {
|
||
|
beforeEach(done => {
|
||
|
vm.data = [
|
||
|
{
|
||
|
name: 'test sync',
|
||
|
},
|
||
|
];
|
||
|
|
||
|
vm.$nextTick(done);
|
||
|
});
|
||
|
|
||
|
it('renders props data', () => {
|
||
|
expect(vm.$el.querySelector('.dropdown-content').textContent).toContain('test sync');
|
||
|
});
|
||
|
|
||
|
it('renders input when searchable is true', done => {
|
||
|
vm.searchable = true;
|
||
|
|
||
|
vm.$nextTick(() => {
|
||
|
expect(vm.$el.querySelector('.dropdown-input')).not.toBe(null);
|
||
|
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('calls clickItem on click', done => {
|
||
|
spyOn(vm, 'clickItem').and.stub();
|
||
|
|
||
|
vm.$nextTick(() => {
|
||
|
vm.$el.querySelector('.dropdown-content button').click();
|
||
|
|
||
|
expect(vm.clickItem).toHaveBeenCalledWith({
|
||
|
name: 'test sync',
|
||
|
});
|
||
|
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('searches template data', () => {
|
||
|
vm.searchable = true;
|
||
|
vm.search = 'hello';
|
||
|
|
||
|
expect(vm.outputData).toEqual([]);
|
||
|
});
|
||
|
|
||
|
it('does not filter data is searchable is false', () => {
|
||
|
vm.search = 'hello';
|
||
|
|
||
|
expect(vm.outputData).toEqual([
|
||
|
{
|
||
|
name: 'test sync',
|
||
|
},
|
||
|
]);
|
||
|
});
|
||
|
|
||
|
it('renders dropdown title', done => {
|
||
|
vm.title = 'Test title';
|
||
|
|
||
|
vm.$nextTick(() => {
|
||
|
expect(vm.$el.querySelector('.dropdown-title').textContent).toContain('Test title');
|
||
|
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|