156 lines
3.9 KiB
JavaScript
156 lines
3.9 KiB
JavaScript
import { mountComponentWithRender } from 'spec/helpers/vue_mount_component_helper';
|
|
import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate.vue';
|
|
|
|
const TEST_TITLE = 'lorem-ipsum-dolar-sit-amit-consectur-adipiscing-elit-sed-do';
|
|
const CLASS_SHOW_TOOLTIP = 'js-show-tooltip';
|
|
const STYLE_TRUNCATED = {
|
|
display: 'inline-block',
|
|
'max-width': '20px',
|
|
};
|
|
const STYLE_NORMAL = {
|
|
display: 'inline-block',
|
|
'max-width': '1000px',
|
|
};
|
|
|
|
function mountTooltipOnTruncate(options, createChildren) {
|
|
return mountComponentWithRender(h => h(TooltipOnTruncate, options, createChildren(h)), '#app');
|
|
}
|
|
|
|
describe('TooltipOnTruncate component', () => {
|
|
let vm;
|
|
|
|
beforeEach(() => {
|
|
const el = document.createElement('div');
|
|
el.id = 'app';
|
|
document.body.appendChild(el);
|
|
});
|
|
|
|
afterEach(() => {
|
|
vm.$destroy();
|
|
});
|
|
|
|
describe('with default target', () => {
|
|
it('renders tooltip if truncated', done => {
|
|
const options = {
|
|
style: STYLE_TRUNCATED,
|
|
props: {
|
|
title: TEST_TITLE,
|
|
},
|
|
};
|
|
|
|
vm = mountTooltipOnTruncate(options, () => [TEST_TITLE]);
|
|
|
|
vm.$nextTick()
|
|
.then(() => {
|
|
expect(vm.$el).toHaveClass(CLASS_SHOW_TOOLTIP);
|
|
expect(vm.$el).toHaveData('original-title', TEST_TITLE);
|
|
expect(vm.$el).toHaveData('placement', 'top');
|
|
})
|
|
.then(done)
|
|
.catch(done.fail);
|
|
});
|
|
|
|
it('does not render tooltip if normal', done => {
|
|
const options = {
|
|
style: STYLE_NORMAL,
|
|
props: {
|
|
title: TEST_TITLE,
|
|
},
|
|
};
|
|
|
|
vm = mountTooltipOnTruncate(options, () => [TEST_TITLE]);
|
|
|
|
vm.$nextTick()
|
|
.then(() => {
|
|
expect(vm.$el).not.toHaveClass(CLASS_SHOW_TOOLTIP);
|
|
})
|
|
.then(done)
|
|
.catch(done.fail);
|
|
});
|
|
});
|
|
|
|
describe('with child target', () => {
|
|
it('renders tooltip if truncated', done => {
|
|
const options = {
|
|
style: STYLE_NORMAL,
|
|
props: {
|
|
title: TEST_TITLE,
|
|
truncateTarget: 'child',
|
|
},
|
|
};
|
|
|
|
vm = mountTooltipOnTruncate(options, h => [h('a', { style: STYLE_TRUNCATED }, TEST_TITLE)]);
|
|
|
|
vm.$nextTick()
|
|
.then(() => {
|
|
expect(vm.$el).toHaveClass(CLASS_SHOW_TOOLTIP);
|
|
})
|
|
.then(done)
|
|
.catch(done.fail);
|
|
});
|
|
|
|
it('does not render tooltip if normal', done => {
|
|
const options = {
|
|
props: {
|
|
title: TEST_TITLE,
|
|
truncateTarget: 'child',
|
|
},
|
|
};
|
|
|
|
vm = mountTooltipOnTruncate(options, h => [h('a', { style: STYLE_NORMAL }, TEST_TITLE)]);
|
|
|
|
vm.$nextTick()
|
|
.then(() => {
|
|
expect(vm.$el).not.toHaveClass(CLASS_SHOW_TOOLTIP);
|
|
})
|
|
.then(done)
|
|
.catch(done.fail);
|
|
});
|
|
});
|
|
|
|
describe('with fn target', () => {
|
|
it('renders tooltip if truncated', done => {
|
|
const options = {
|
|
style: STYLE_NORMAL,
|
|
props: {
|
|
title: TEST_TITLE,
|
|
truncateTarget: el => el.childNodes[1],
|
|
},
|
|
};
|
|
|
|
vm = mountTooltipOnTruncate(options, h => [
|
|
h('a', { style: STYLE_NORMAL }, TEST_TITLE),
|
|
h('span', { style: STYLE_TRUNCATED }, TEST_TITLE),
|
|
]);
|
|
|
|
vm.$nextTick()
|
|
.then(() => {
|
|
expect(vm.$el).toHaveClass(CLASS_SHOW_TOOLTIP);
|
|
})
|
|
.then(done)
|
|
.catch(done.fail);
|
|
});
|
|
});
|
|
|
|
describe('placement', () => {
|
|
it('sets data-placement when tooltip is rendered', done => {
|
|
const options = {
|
|
props: {
|
|
title: TEST_TITLE,
|
|
truncateTarget: 'child',
|
|
placement: 'bottom',
|
|
},
|
|
};
|
|
|
|
vm = mountTooltipOnTruncate(options, h => [h('a', { style: STYLE_TRUNCATED }, TEST_TITLE)]);
|
|
|
|
vm.$nextTick()
|
|
.then(() => {
|
|
expect(vm.$el).toHaveClass(CLASS_SHOW_TOOLTIP);
|
|
expect(vm.$el).toHaveData('placement', options.props.placement);
|
|
})
|
|
.then(done)
|
|
.catch(done.fail);
|
|
});
|
|
});
|
|
});
|