Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@doodle/components / src / components / structure / CreatePollMenuDropdown / CreatePollMenuDropdown.spec.js
Size: Mime:
import React from 'react';
import { render, screen, fireEvent, cleanup } from '@testing-library/react';
import CreatePollMenuDropdown from './CreatePollMenuDropdown';

const windowLocationBackup = window.location;

const userData = {
  data: {
    name: 'Rebecca Black',
    email: 'rebecca.black@friday.com',
    avatarSmallUrl:
      'https://i.auto-bild.de/ir_img/2/4/6/9/0/2/3/FRIDAY-Kfz-Versicherung-Logo-474x316-505dbcedca2fd865.jpg',
    accessToken: 'abc123',
    premium: {
      active: {
        domain: 'myCustomDomain',
      },
    },
  },
  loading: false,
  isEligibleForFreeTrial: true,
};

describe('CreatePollMenuDropdown', () => {
  const onClickCreatePoll = jest.fn();
  const onClickCreateOneOnOne = jest.fn();
  const onClickCreateSurvey = jest.fn();
  const onClickCreateBookableCalendar = jest.fn();
  const trackingClient = { track: jest.fn() };

  afterEach(cleanup);

  beforeAll(() => {
    delete window.location;
    window.location = {
      assign: jest.fn(),
    };
  });

  beforeEach(() => {
    jest.resetAllMocks();
    window.location.assign.mockReset();
    trackingClient.track.mockReset();
  });

  afterAll(() => {
    window.location = windowLocationBackup;
  });

  it('should only render a create button (no dropdown menu) if the user is not logged in', () => {
    render(<CreatePollMenuDropdown user={null} />);

    const anchor = screen.getByTestId('navigation-menu-create-date-poll');
    expect(anchor.href).toContain('/create');
  });

  it('should call onClickCreatePoll', () => {
    render(<CreatePollMenuDropdown onClickCreatePoll={onClickCreatePoll} user={userData} />);

    fireEvent.click(screen.getByRole('button'));
    fireEvent.click(screen.getByTestId('navigation-menu-create-date-poll'));
    expect(onClickCreatePoll).toHaveBeenCalledTimes(1);
  });

  it('should call onClickCreateOneOnOne', () => {
    render(<CreatePollMenuDropdown onClickCreateOneOnOne={onClickCreateOneOnOne} user={userData} />);

    fireEvent.click(screen.getByRole('button'));
    fireEvent.click(screen.getByTestId('navigation-menu-create-d11'));
    expect(onClickCreateOneOnOne).toHaveBeenCalledTimes(1);
  });

  it('should call onClickCreateSurvey', () => {
    render(<CreatePollMenuDropdown onClickCreateSurvey={onClickCreateSurvey} user={userData} />);

    fireEvent.click(screen.getByRole('button'));
    fireEvent.click(screen.getByTestId('navigation-menu-create-text-poll'));
    expect(onClickCreateSurvey).toHaveBeenCalledTimes(1);
  });

  it('should call onClickCreateBookableCalendar', () => {
    render(<CreatePollMenuDropdown onClickCreateBookableCalendar={onClickCreateBookableCalendar} user={userData} />);

    fireEvent.click(screen.getByRole('button'));
    fireEvent.click(screen.getByTestId('navigation-menu-create-bookable-calendar'));
    expect(onClickCreateBookableCalendar).toHaveBeenCalledTimes(1);
  });

  it('should use target _blank when an absolute url is supplied as baseUrl', () => {
    render(<CreatePollMenuDropdown user={userData} baseUrl="https://staging.doodle-test.com" />);
    fireEvent.click(screen.getByRole('button'));

    expect(screen.getByTestId('navigation-menu-create-date-poll').target).toBe('_blank');
    expect(screen.getByTestId('navigation-menu-create-d11').target).toBe('_blank');
    expect(screen.getByTestId('navigation-menu-create-text-poll').target).toBe('_blank');
    expect(screen.getByTestId('navigation-menu-create-bookable-calendar').target).toBe('_blank');
  });

  it('should not use target _blank when there is an empty baseUrl (allowing relative navigation)', () => {
    render(<CreatePollMenuDropdown user={userData} baseUrl="" />);
    fireEvent.click(screen.getByRole('button'));

    expect(screen.getByTestId('navigation-menu-create-date-poll').target).toBeFalsy();
    expect(screen.getByTestId('navigation-menu-create-d11').target).toBeFalsy();
    expect(screen.getByTestId('navigation-menu-create-text-poll').target).toBeFalsy();
    expect(screen.getByTestId('navigation-menu-create-bookable-calendar').target).toBeFalsy();
  });

  it('should call trackingClient.track on BC click', () => {
    render(
      <CreatePollMenuDropdown
        user={userData}
        trackingClient={trackingClient}
        onClickCreatePoll={onClickCreatePoll}
        onClickCreateOneOnOne={onClickCreateOneOnOne}
        onClickCreateSurvey={onClickCreateSurvey}
        onClickCreateBookableCalendar={onClickCreateBookableCalendar}
      />
    );

    fireEvent.click(screen.getByRole('button'));
    fireEvent.click(screen.getByTestId('navigation-menu-create-bookable-calendar'));
    expect(trackingClient.track).toHaveBeenCalledWith({
      trackingIntent: {
        track: {
          event: 'Click Create Bookable Calendar',
          properties: { category: 'Global Header' },
          type: 'user Interaction',
        },
      },
    });
  });

  it('should call trackingClient.track on 1:1 click', () => {
    render(
      <CreatePollMenuDropdown
        user={userData}
        trackingClient={trackingClient}
        onClickCreatePoll={onClickCreatePoll}
        onClickCreateOneOnOne={onClickCreateOneOnOne}
        onClickCreateSurvey={onClickCreateSurvey}
        onClickCreateBookableCalendar={onClickCreateBookableCalendar}
      />
    );

    fireEvent.click(screen.getByRole('button'));
    fireEvent.click(screen.getByTestId('navigation-menu-create-d11'));
    expect(trackingClient.track).toHaveBeenCalledWith({
      trackingIntent: {
        track: {
          event: 'Click Create D11',
          properties: { category: 'Global Header' },
          type: 'user Interaction',
        },
      },
    });
  });

  it('should call trackingClient.track on survey click', () => {
    render(
      <CreatePollMenuDropdown
        user={userData}
        trackingClient={trackingClient}
        onClickCreatePoll={onClickCreatePoll}
        onClickCreateOneOnOne={onClickCreateOneOnOne}
        onClickCreateSurvey={onClickCreateSurvey}
        onClickCreateBookableCalendar={onClickCreateBookableCalendar}
      />
    );

    fireEvent.click(screen.getByRole('button'));
    fireEvent.click(screen.getByTestId('navigation-menu-create-text-poll'));
    expect(trackingClient.track).toHaveBeenCalledWith({
      trackingIntent: {
        track: {
          event: 'Click Create Text Poll',
          properties: { category: 'Global Header' },
          type: 'user Interaction',
        },
      },
    });
  });

  it('should call trackingClient.track on date click', () => {
    render(
      <CreatePollMenuDropdown
        user={userData}
        trackingClient={trackingClient}
        onClickCreatePoll={onClickCreatePoll}
        onClickCreateOneOnOne={onClickCreateOneOnOne}
        onClickCreateSurvey={onClickCreateSurvey}
        onClickCreateBookableCalendar={onClickCreateBookableCalendar}
      />
    );

    fireEvent.click(screen.getByRole('button'));
    fireEvent.click(screen.getByTestId('navigation-menu-create-date-poll'));
    expect(trackingClient.track).toHaveBeenCalledWith({
      trackingIntent: {
        track: {
          event: 'Click Create Date Poll',
          properties: { category: 'Global Header' },
          type: 'user Interaction',
        },
      },
    });
  });
});