import React from 'react';
import { customRender, fireEvent } from 'test-utils';
import AppSwitcher from '.';
const renderDefault = (props = {}) =>
customRender();
describe('', () => {
describe('when not passing canSwitchTo', () => {
it('should not make the current product logo clickable', () => {
const { getByTestId, queryByTitle } = renderDefault({ currentProduct: 'ecom' });
const triggerBtn = getByTestId('current-project-btn');
fireEvent.click(triggerBtn);
expect(triggerBtn).not.toHaveAttribute('href');
expect(queryByTitle('retail-button')).toBeNull();
});
});
describe('when passing canSwitchTo and clicking on the current product', () => {
it('should show the product menu', () => {
const { getByTestId, getByTitle, queryByTitle } = renderDefault({
currentProduct: 'ecom',
canSwitchTo: [
{ name: 'retail', href: '/retail', title: 'retail-button' },
{ name: 'ecom', href: '/ecom', title: 'ecom-button' },
],
});
// No menu
expect(queryByTitle('retail-button')).toBeNull();
// Click on current product
fireEvent.click(getByTestId('current-project-btn'));
// Should have menu
const retailMenuItem = getByTitle('retail-button');
expect(retailMenuItem).toHaveAttribute('href', '/retail');
});
it('should always filter out the current product from the list', () => {
const { getByTestId, queryByTitle } = renderDefault({
currentProduct: 'ecom',
canSwitchTo: [
{ name: 'retail', href: '/retail', title: 'retail-button' },
{ name: 'ecom', href: '/ecom', title: 'ecom-button' },
],
});
fireEvent.click(getByTestId('current-project-btn'));
// eCom menu item should not be there
const eComMenuItem = queryByTitle('ecom-button');
expect(eComMenuItem).toBeNull();
});
it('should close the menu when clicking on a different app', () => {
const ecomOnClick = jest.fn();
const { getByTestId, queryByTitle } = renderDefault({
currentProduct: 'retail',
canSwitchTo: [
{ name: 'retail', href: '/retail', title: 'retail-button' },
{ name: 'ecom', href: '/ecom', title: 'ecom-button', onClick: ecomOnClick },
],
});
fireEvent.click(getByTestId('current-project-btn'));
expect(ecomOnClick).not.toHaveBeenCalled();
// Click on the ecom button
fireEvent.click(queryByTitle('ecom-button'));
// Menu should be closed and onClick should've been called
expect(queryByTitle('ecom-button')).toBeNull();
expect(ecomOnClick).toHaveBeenCalledTimes(1);
});
});
describe('when passing an appsConfig', () => {
const customProductImage =
Sick logo
;
it('should be able to use custom products as currentProduct', () => {
const appsConfig = { customProduct: customProductImage };
const { queryByText } = renderDefault({
appsConfig,
currentProduct: 'customProduct',
});
expect(queryByText('Sick logo')).not.toBeNull();
});
it('should be able to still use the default apps', () => {
const appsConfig = { customProduct: customProductImage };
const { getByTestId } = renderDefault({
appsConfig,
currentProduct: 'ecom',
});
const triggerBtn = getByTestId('current-project-btn');
expect(triggerBtn).not.toBeNull();
});
it('should be able to switch to this product', () => {
const appsConfig = { customProduct: customProductImage };
const { getByTestId, queryByTitle } = renderDefault({
appsConfig,
currentProduct: 'ecom',
canSwitchTo: [
{ name: 'retail', href: '/retail', title: 'retail-button' },
{ name: 'ecom', href: '/ecom', title: 'ecom-button' },
{ name: 'customProduct', href: '/ecom', title: 'custom-product-button' },
],
});
fireEvent.click(getByTestId('current-project-btn'));
// customProduct menu item should not be there
const customProductMenuItem = queryByTitle('custom-product-button');
expect(customProductMenuItem).not.toBeNull();
});
});
describe('when passing logoProps', () => {
it('should pass the props to the link around the logo', () => {
const { getByTitle } = renderDefault({
currentProduct: 'ecom',
logoProps: { title: 'lightspeed-logo', href: '/some-url' },
});
const logoLink = getByTitle('lightspeed-logo');
expect(logoLink).toHaveAttribute('href', '/some-url');
});
});
});