Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/frontend/nav/components/top_nav_container_view_spec.js')
-rw-r--r--spec/frontend/nav/components/top_nav_container_view_spec.js114
1 files changed, 114 insertions, 0 deletions
diff --git a/spec/frontend/nav/components/top_nav_container_view_spec.js b/spec/frontend/nav/components/top_nav_container_view_spec.js
new file mode 100644
index 00000000000..b08d75f36ce
--- /dev/null
+++ b/spec/frontend/nav/components/top_nav_container_view_spec.js
@@ -0,0 +1,114 @@
+import { shallowMount } from '@vue/test-utils';
+import { nextTick } from 'vue';
+import FrequentItemsApp from '~/frequent_items/components/app.vue';
+import { FREQUENT_ITEMS_PROJECTS } from '~/frequent_items/constants';
+import eventHub from '~/frequent_items/event_hub';
+import TopNavContainerView from '~/nav/components/top_nav_container_view.vue';
+import TopNavMenuItem from '~/nav/components/top_nav_menu_item.vue';
+import VuexModuleProvider from '~/vue_shared/components/vuex_module_provider.vue';
+import { TEST_NAV_DATA } from '../mock_data';
+
+const DEFAULT_PROPS = {
+ frequentItemsDropdownType: FREQUENT_ITEMS_PROJECTS.namespace,
+ frequentItemsVuexModule: FREQUENT_ITEMS_PROJECTS.vuexModule,
+ linksPrimary: TEST_NAV_DATA.primary,
+ linksSecondary: TEST_NAV_DATA.secondary,
+};
+const TEST_OTHER_PROPS = {
+ namespace: 'projects',
+ currentUserName: '',
+ currentItem: {},
+};
+
+describe('~/nav/components/top_nav_container_view.vue', () => {
+ let wrapper;
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMount(TopNavContainerView, {
+ propsData: {
+ ...DEFAULT_PROPS,
+ ...TEST_OTHER_PROPS,
+ ...props,
+ },
+ });
+ };
+
+ const findMenuItems = (parent = wrapper) => parent.findAll(TopNavMenuItem);
+ const findMenuItemsModel = (parent = wrapper) =>
+ findMenuItems(parent).wrappers.map((x) => x.props());
+ const findMenuItemGroups = () => wrapper.findAll('[data-testid="menu-item-group"]');
+ const findMenuItemGroupsModel = () => findMenuItemGroups().wrappers.map(findMenuItemsModel);
+ const findFrequentItemsApp = () => {
+ const parent = wrapper.findComponent(VuexModuleProvider);
+
+ return {
+ vuexModule: parent.props('vuexModule'),
+ props: parent.findComponent(FrequentItemsApp).props(),
+ };
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it.each(['projects', 'groups'])(
+ 'emits frequent items event to event hub (%s)',
+ async (frequentItemsDropdownType) => {
+ const listener = jest.fn();
+ eventHub.$on(`${frequentItemsDropdownType}-dropdownOpen`, listener);
+ createComponent({ frequentItemsDropdownType });
+
+ expect(listener).not.toHaveBeenCalled();
+
+ await nextTick();
+
+ expect(listener).toHaveBeenCalled();
+ },
+ );
+
+ describe('default', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders frequent items app', () => {
+ expect(findFrequentItemsApp()).toEqual({
+ vuexModule: DEFAULT_PROPS.frequentItemsVuexModule,
+ props: TEST_OTHER_PROPS,
+ });
+ });
+
+ it('renders menu item groups', () => {
+ expect(findMenuItemGroupsModel()).toEqual([
+ TEST_NAV_DATA.primary.map((menuItem) => ({ menuItem })),
+ TEST_NAV_DATA.secondary.map((menuItem) => ({ menuItem })),
+ ]);
+ });
+
+ it('only the first group does not have margin top', () => {
+ expect(findMenuItemGroups().wrappers.map((x) => x.classes('gl-mt-3'))).toEqual([false, true]);
+ });
+
+ it('only the first menu item does not have margin top', () => {
+ const actual = findMenuItems(findMenuItemGroups().at(1)).wrappers.map((x) =>
+ x.classes('gl-mt-1'),
+ );
+
+ expect(actual).toEqual([false, ...TEST_NAV_DATA.secondary.slice(1).fill(true)]);
+ });
+ });
+
+ describe('without secondary links', () => {
+ beforeEach(() => {
+ createComponent({
+ linksSecondary: [],
+ });
+ });
+
+ it('renders one menu item group', () => {
+ expect(findMenuItemGroupsModel()).toEqual([
+ TEST_NAV_DATA.primary.map((menuItem) => ({ menuItem })),
+ ]);
+ });
+ });
+});