import React from 'react';
import { fireEvent, render, waitFor } from '@testing-library/react';
import { OneOf } from '@leafygreen-ui/lib';
import MongoNav from '../MongoNav';
import { NavElement } from '../types';
const defaultElements: Array<
{ navElement: NavElement; shouldNavigate?: boolean } & OneOf<
{ testId: string },
{ text: string }
>
> = [
{ navElement: NavElement.OrgNavLeaf, testId: 'org-nav-leaf' },
{ navElement: NavElement.OrgNavOrgSettings, testId: 'org-trigger-settings' },
{
navElement: NavElement.OrgNavAccessManagerDropdown,
testId: 'org-nav-access-manager-dropdown',
shouldNavigate: false,
},
{
navElement: NavElement.OrgNavDropdownGetHelp,
testId: 'org-nav-dropdown-get-help',
shouldNavigate: false,
},
{ navElement: NavElement.OrgNavBilling, testId: 'org-nav-billing' },
{ navElement: NavElement.OrgNavAllClusters, text: 'All Clusters' },
{
navElement: NavElement.ProjectNavProjectDropdown,
testId: 'project-nav-project-menu',
shouldNavigate: false,
},
{ navElement: NavElement.ProjectNavInvite, testId: 'project-nav-invite' },
{
navElement: NavElement.ProjectNavActivityFeed,
testId: 'project-nav-activity-feed',
},
{ navElement: NavElement.ProjectNavAlerts, testId: 'project-nav-alerts' },
{
navElement: NavElement.UserMenuTrigger,
testId: 'user-menu-trigger',
shouldNavigate: false,
},
];
const navigationElements = [
{
navElement: NavElement.ProjectNavCloud,
testId: 'project-nav-data-services',
},
{
navElement: NavElement.ProjectNavRealm,
testId: 'project-nav-app-services',
},
{
navElement: NavElement.ProjectNavCharts,
testId: 'project-nav-charts',
},
];
const onElementClick = jest.fn();
beforeEach(() => {
onElementClick.mockReset();
});
function renderMongoNav() {
const utils = render(
,
);
return utils;
}
function testNavigationElements({
navElement,
testId,
}: {
navElement: string;
testId: string;
}) {
test(`the onElementClick value is successfully passed to the "${testId}" element`, async () => {
const { getAllByTestId } = renderMongoNav();
const el = getAllByTestId(testId)[0];
fireEvent.click(el.closest('a') as HTMLAnchorElement);
expect(onElementClick).toHaveBeenCalled();
expect(onElementClick).toHaveBeenCalledWith(navElement, expect.anything());
});
}
function testForCallback({
navElement,
text,
testId,
trigger,
}: {
navElement: string;
/**
* The testid of the trigger element
*/
trigger?: string;
shouldNavigate?: boolean;
} & OneOf<{ text: string }, { testId: string }>) {
test(`the onElementClick value is successfully passed to the "${
text ?? testId
}" element`, async () => {
const { getByTestId, findByTestId, findByText } = renderMongoNav();
if (trigger) {
fireEvent.click(getByTestId(trigger));
}
const link = text
? (await findByText(text)).closest('a, button')
: await findByTestId(testId!);
await waitFor(() => {
expect(link).toBeVisible();
});
fireEvent.click(link!);
expect(onElementClick).toHaveBeenCalled();
expect(onElementClick).toHaveBeenCalledWith(navElement, expect.anything());
});
}
describe('packages/mongo-nav/on-element-click-provider', () => {
describe('by default', () => {
defaultElements.forEach(element => {
testForCallback(element);
});
});
describe('project nav', () => {
navigationElements.forEach(element => {
testNavigationElements(element);
});
});
describe('when the OrgNav Access Manager dropdown is open', () => {
testForCallback({
navElement: NavElement.OrgNavDropdownOrgAccessManager,
testId: 'org-nav-dropdown-org-access-manager',
trigger: 'org-nav-access-manager-dropdown',
});
testForCallback({
navElement: NavElement.OrgNavDropdownProjectAccessManager,
testId: 'org-nav-dropdown-project-access-manager',
trigger: 'org-nav-access-manager-dropdown',
});
});
describe('when the OrgNav Get Help dropdown is open', () => {
testForCallback({
navElement: NavElement.OrgNavDocs,
testId: 'org-nav-docs-link',
trigger: 'org-nav-dropdown-get-help',
});
testForCallback({
navElement: NavElement.OrgNavNewCase,
testId: 'org-nav-new-case-link',
trigger: 'org-nav-dropdown-get-help',
});
testForCallback({
navElement: NavElement.OrgNavSupport,
testId: 'org-nav-support-link',
trigger: 'org-nav-dropdown-get-help',
});
});
describe('when the ProjectNav dropdown is open', () => {
testForCallback({
navElement: NavElement.ProjectNavProjectSettings,
testId: 'project-nav-settings',
trigger: 'project-nav-project-menu',
});
testForCallback({
navElement: NavElement.ProjectNavProjectSupport,
testId: 'project-nav-support',
trigger: 'project-nav-project-menu',
});
testForCallback({
navElement: NavElement.ProjectNavProjectIntegrations,
testId: 'project-nav-integrations',
trigger: 'project-nav-project-menu',
});
});
describe('when the UserMenu is open', () => {
testForCallback({
navElement: NavElement.UserMenuCloud,
testId: 'user-submenu-cloud',
trigger: 'user-menu-trigger',
shouldNavigate: false,
});
testForCallback({
navElement: NavElement.UserMenuFeedback,
testId: 'user-menuitem-feedback',
trigger: 'user-menu-trigger',
shouldNavigate: false,
});
testForCallback({
navElement: NavElement.UserMenuCloudMFA,
testId: 'user-menuitem-cloud-mfa',
trigger: 'user-menu-trigger',
});
testForCallback({
navElement: NavElement.UserMenuCloudInvitations,
testId: 'user-menuitem-cloud-invitations',
trigger: 'user-menu-trigger',
});
testForCallback({
navElement: NavElement.UserMenuCloudOrganizations,
testId: 'user-menuitem-cloud-organizations',
trigger: 'user-menu-trigger',
});
testForCallback({
navElement: NavElement.UserMenuCloudUserPreferences,
testId: 'user-menuitem-cloud-user-preferences',
trigger: 'user-menu-trigger',
});
testForCallback({
navElement: NavElement.UserMenuUniversity,
testId: 'user-submenu-university',
trigger: 'user-menu-trigger',
shouldNavigate: false,
});
testForCallback({
navElement: NavElement.UserMenuForums,
testId: 'user-submenu-forums',
trigger: 'user-menu-trigger',
shouldNavigate: false,
});
testForCallback({
navElement: NavElement.UserMenuDevHub,
testId: 'user-menuitem-devhub',
trigger: 'user-menu-trigger',
shouldNavigate: false,
});
testForCallback({
navElement: NavElement.UserMenuDocs,
testId: 'user-menuitem-docs',
trigger: 'user-menu-trigger',
shouldNavigate: false,
});
testForCallback({
navElement: NavElement.UserMenuSupport,
testId: 'user-submenu-support',
trigger: 'user-menu-trigger',
shouldNavigate: false,
});
testForCallback({
navElement: NavElement.UserMenuFeedback,
testId: 'user-menuitem-feedback',
trigger: 'user-menu-trigger',
shouldNavigate: false,
});
testForCallback({
navElement: NavElement.Logout,
testId: 'user-menuitem-logout',
trigger: 'user-menu-trigger',
});
});
});
describe('NavElement', () => {
function checkDupes(array: Array) {
const checkArr: Array = [];
array.forEach(val => {
if (checkArr.includes(val)) {
return true;
}
checkArr.push(val);
});
return false;
}
test('NavElement const only contains unique values', () => {
expect(checkDupes(Object.values(NavElement))).toBe(false);
});
});