122 lines
2.9 KiB
JavaScript
122 lines
2.9 KiB
JavaScript
import { GlDropdown } from '@gitlab/ui';
|
|
import { shallowMount } from '@vue/test-utils';
|
|
import TopNavNewDropdown from '~/nav/components/top_nav_new_dropdown.vue';
|
|
|
|
const TEST_VIEW_MODEL = {
|
|
title: 'Dropdown',
|
|
menu_sections: [
|
|
{
|
|
title: 'Section 1',
|
|
menu_items: [
|
|
{ id: 'foo-1', title: 'Foo 1', href: '/foo/1' },
|
|
{ id: 'foo-2', title: 'Foo 2', href: '/foo/2' },
|
|
{ id: 'foo-3', title: 'Foo 3', href: '/foo/3' },
|
|
],
|
|
},
|
|
{
|
|
title: 'Section 2',
|
|
menu_items: [
|
|
{ id: 'bar-1', title: 'Bar 1', href: '/bar/1' },
|
|
{ id: 'bar-2', title: 'Bar 2', href: '/bar/2' },
|
|
],
|
|
},
|
|
],
|
|
};
|
|
|
|
describe('~/nav/components/top_nav_menu_sections.vue', () => {
|
|
let wrapper;
|
|
|
|
const createComponent = (props = {}) => {
|
|
wrapper = shallowMount(TopNavNewDropdown, {
|
|
propsData: {
|
|
viewModel: TEST_VIEW_MODEL,
|
|
...props,
|
|
},
|
|
});
|
|
};
|
|
|
|
const findDropdown = () => wrapper.findComponent(GlDropdown);
|
|
const findDropdownContents = () =>
|
|
findDropdown()
|
|
.findAll('[data-testid]')
|
|
.wrappers.map((child) => {
|
|
const type = child.attributes('data-testid');
|
|
|
|
if (type === 'divider') {
|
|
return { type };
|
|
} else if (type === 'header') {
|
|
return { type, text: child.text() };
|
|
}
|
|
|
|
return {
|
|
type,
|
|
text: child.text(),
|
|
href: child.attributes('href'),
|
|
};
|
|
});
|
|
|
|
afterEach(() => {
|
|
wrapper.destroy();
|
|
});
|
|
|
|
describe('default', () => {
|
|
beforeEach(() => {
|
|
createComponent();
|
|
});
|
|
|
|
it('renders dropdown parent', () => {
|
|
expect(findDropdown().props()).toMatchObject({
|
|
text: TEST_VIEW_MODEL.title,
|
|
textSrOnly: true,
|
|
icon: 'plus',
|
|
});
|
|
});
|
|
|
|
it('renders dropdown content', () => {
|
|
expect(findDropdownContents()).toEqual([
|
|
{
|
|
type: 'header',
|
|
text: TEST_VIEW_MODEL.menu_sections[0].title,
|
|
},
|
|
...TEST_VIEW_MODEL.menu_sections[0].menu_items.map(({ title, href }) => ({
|
|
type: 'item',
|
|
href,
|
|
text: title,
|
|
})),
|
|
{
|
|
type: 'divider',
|
|
},
|
|
{
|
|
type: 'header',
|
|
text: TEST_VIEW_MODEL.menu_sections[1].title,
|
|
},
|
|
...TEST_VIEW_MODEL.menu_sections[1].menu_items.map(({ title, href }) => ({
|
|
type: 'item',
|
|
href,
|
|
text: title,
|
|
})),
|
|
]);
|
|
});
|
|
});
|
|
|
|
describe('with only 1 section', () => {
|
|
beforeEach(() => {
|
|
createComponent({
|
|
viewModel: {
|
|
...TEST_VIEW_MODEL,
|
|
menu_sections: TEST_VIEW_MODEL.menu_sections.slice(0, 1),
|
|
},
|
|
});
|
|
});
|
|
|
|
it('renders dropdown content without headers and dividers', () => {
|
|
expect(findDropdownContents()).toEqual(
|
|
TEST_VIEW_MODEL.menu_sections[0].menu_items.map(({ title, href }) => ({
|
|
type: 'item',
|
|
href,
|
|
text: title,
|
|
})),
|
|
);
|
|
});
|
|
});
|
|
});
|