import React, { RefObject } from 'react';
import { fireEvent, render, screen } from '@testing-library/react';
import { BackToTop } from '../BackToTop';
import userEvent from '@testing-library/user-event';
jest.mock('../../Button');
test('Renders BackToTop', () => {
render(
);
expect(screen.getByTestId('backtotop').firstChild).toBeTruthy();
});
test('Renders with the default class', () => {
render();
expect(screen.getByRole(`button`).parentElement).toHaveClass('pf-v5-c-back-to-top');
});
test('BackToTop is not yet visible', () => {
render();
expect(screen.getByRole(`button`).parentElement).toHaveClass('pf-m-hidden');
});
test('BackToTop is visible after scrolling', () => {
render();
fireEvent.scroll(window, { target: { scrollY: 401 } });
expect(screen.getByRole(`button`).parentElement).not.toHaveClass('pf-m-hidden');
});
test('ScrollTo event is fired after clicking BackToTop', async () => {
render();
const user = userEvent.setup();
fireEvent.scroll(window, { target: { scrollY: 401 } });
global.scrollTo = jest.fn();
await user.click(screen.getByRole(`button`).parentElement as Element);
expect(global.scrollTo).toHaveBeenCalledWith({ top: 0, behavior: 'smooth' });
});
test('BackToTop gets hidden again after user scrolls back up', () => {
render();
fireEvent.scroll(window, { target: { scrollY: 401 } });
fireEvent.scroll(window, { target: { scrollY: 0 } });
expect(screen.getByRole(`button`).parentElement).toHaveClass('pf-m-hidden');
});
test('Renders BackToTop when isAlwaysVisible prop is set', () => {
render();
expect(screen.getByRole(`button`).parentElement).not.toHaveClass('pf-m-hidden');
});
test('Renders with custom className prop passed', () => {
render();
expect(screen.getByRole(`button`).parentElement).toHaveClass('test-class');
});
test('Renders with custom title prop passed', () => {
render();
expect(screen.getByRole(`button`).parentElement).toHaveTextContent('Back to the Future');
});
test('Renders with passed aria-label', () => {
render();
expect(screen.getByRole(`button`).parentElement).toHaveAccessibleName('Back to top test');
});
test('BackToTop can be accessed via passed innerRef', () => {
const testRef: RefObject = React.createRef();
render();
global.scrollTo = jest.fn();
testRef.current?.click();
expect(global.scrollTo).toBeCalledTimes(1);
});
test('BackToTop reacts to scrolling inside element passed via scrollableSelector', () => {
render(
);
const wrapper = document.getElementById('backToTopWrapper');
fireEvent.scroll(wrapper as HTMLElement, { target: { scrollY: 401 } });
expect(screen.getByRole(`button`).parentElement).not.toHaveClass('pf-m-hidden');
});
test('BackToTop does not react to scrolling inside window when scrollableSelector passed', () => {
render(
);
fireEvent.scroll(window, { target: { scrollY: 401 } });
expect(screen.getByRole(`button`).parentElement).toHaveClass('pf-m-hidden');
});
test('Clicking backToTop scrolls back to top of the element passed via scrollableSelector', async () => {
render(
);
const user = userEvent.setup();
const wrapper = document.getElementById('backToTopWrapper');
fireEvent.scroll(wrapper as HTMLElement, { target: { scrollY: 401 } });
wrapper!.scrollTo = jest.fn();
await user.click(screen.getByRole(`button`).parentElement as Element);
expect(wrapper?.scrollTo).toBeCalledTimes(1);
});
test('Passes correct text content to button child component', () => {
render();
expect(screen.getByText('Back to the future')).toBeVisible();
});
test('Passes correct variant to button child component', () => {
render();
expect(screen.getByText('variant: primary')).toBeVisible();
});
test('Passes correct iconPosition to button child component', () => {
render();
expect(screen.getByText('iconPosition: right')).toBeVisible();
});
test('Passes correct icon to button child component', () => {
render();
expect(screen.getByTestId('icon').firstChild).toBeTruthy();
});
test('Matches the snapshot', () => {
const { asFragment } = render();
expect(asFragment()).toMatchSnapshot();
});