import { act, render, screen } from '@testing-library/react';
import '@testing-library/jest-dom';
import userEvent from '@testing-library/user-event';
import UserFeedbackComplete from './UserFeedbackComplete';
describe('UserFeedbackComplete', () => {
it('should render correctly', () => {
render();
expect(screen.getByText('Feedback submitted')).toBeTruthy();
screen.getByText(/We've received your response. Thank you for sharing your feedback!/i);
expect(screen.queryByRole('button', { name: /Close/i })).toBeFalsy();
});
it('should render different title correctly', () => {
render();
expect(screen.getByText('Thanks!')).toBeTruthy();
screen.getByText(/We've received your response. Thank you for sharing your feedback!/i);
});
it('should render different string body correctly', () => {
render();
expect(screen.getByText('Feedback submitted')).toBeTruthy();
expect(screen.getByText('Thanks!')).toBeTruthy();
});
it('should render different node body correctly', () => {
render(Thanks!} />);
expect(screen.getByText('Feedback submitted')).toBeTruthy();
expect(screen.getByText('Thanks!')).toBeTruthy();
});
it('should handle onClose correctly', async () => {
const spy = jest.fn();
render();
const closeButton = screen.getByRole('button', { name: 'Close feedback for message received at 12/12/12' });
expect(closeButton).toBeTruthy();
await userEvent.click(closeButton);
expect(spy).toHaveBeenCalledTimes(1);
});
it('should be able to change close button aria label', () => {
const spy = jest.fn();
render();
expect(screen.getByRole('button', { name: /Ima button/i })).toBeTruthy();
});
it('should handle className', async () => {
render();
expect(screen.getByTestId('card')).toHaveClass('test');
});
it('should apply id', async () => {
render();
expect(screen.getByTestId('card').parentElement).toHaveAttribute('id', 'test');
});
it('renders with no timeout by default', () => {
jest.useFakeTimers();
render();
act(() => {
jest.advanceTimersByTime(8000);
});
expect(screen.getByText('Feedback submitted')).toBeVisible();
jest.useRealTimers();
});
it('should handle timeout correctly after 8000ms when timeout = true', async () => {
jest.useFakeTimers();
render();
act(() => {
jest.advanceTimersByTime(7999);
});
expect(screen.getByText('Feedback submitted')).toBeVisible();
act(() => {
jest.advanceTimersByTime(1);
});
expect(screen.queryByText('Feedback submitted')).not.toBeInTheDocument();
jest.useRealTimers();
});
it('should handle timeout correctly when timeout = numeric value', async () => {
jest.useFakeTimers();
render();
act(() => {
jest.advanceTimersByTime(299);
});
expect(screen.getByText('Feedback submitted')).toBeVisible();
act(() => {
jest.advanceTimersByTime(1);
});
expect(screen.queryByText('Feedback submitted')).not.toBeInTheDocument();
jest.useRealTimers();
});
it('does not get removed on timeout if the user is focused on the card', async () => {
const user = userEvent.setup({
advanceTimers: (delay) => jest.advanceTimersByTime(delay)
});
jest.useFakeTimers();
render();
expect(screen.getByText('Feedback submitted')).toBeTruthy();
await user.click(screen.getByTestId('card'));
act(() => {
jest.advanceTimersByTime(8000);
});
expect(screen.getByText('Feedback submitted')).toBeTruthy();
jest.useRealTimers();
});
it('does not remove the card on timeout if the user is hovered over it', async () => {
const user = userEvent.setup({
advanceTimers: (delay) => jest.advanceTimersByTime(delay)
});
jest.useFakeTimers();
render();
const card = screen.getByTestId('card');
await user.hover(card);
act(() => {
jest.advanceTimersByTime(8000);
});
expect(card).toBeVisible();
jest.useRealTimers();
});
it('removes the card after the user removes focus from the card and 3000ms have passed', async () => {
const user = userEvent.setup({
advanceTimers: (delay) => jest.advanceTimersByTime(delay)
});
jest.useFakeTimers();
render(
);
const card = screen.getByTestId('card');
await user.click(card);
act(() => {
jest.advanceTimersByTime(8000);
});
await user.click(screen.getByRole('textbox'));
act(() => {
jest.advanceTimersByTime(3000);
});
expect(screen.queryByText('Feedback submitted')).not.toBeInTheDocument();
jest.useRealTimers();
});
it('removes the card after the user removes hover from the card and 3000ms have passed', async () => {
const user = userEvent.setup({
advanceTimers: (delay) => jest.advanceTimersByTime(delay)
});
jest.useFakeTimers();
render(
);
const card = screen.getByTestId('card');
await user.hover(card);
act(() => {
jest.advanceTimersByTime(8000);
});
await user.hover(screen.getByRole('textbox'));
act(() => {
jest.advanceTimersByTime(3000);
});
expect(screen.queryByText('Feedback submitted')).not.toBeInTheDocument();
jest.useRealTimers();
});
it('removes the card after the user removes hover from the card and timeoutAnimation time has passed', async () => {
const user = userEvent.setup({
advanceTimers: (delay) => jest.advanceTimersByTime(delay)
});
jest.useFakeTimers();
render(
);
const card = screen.getByTestId('card');
await user.hover(card);
act(() => {
jest.advanceTimersByTime(8000);
});
await user.hover(screen.getByRole('textbox'));
act(() => {
jest.advanceTimersByTime(1000);
});
expect(screen.queryByText('Feedback submitted')).not.toBeInTheDocument();
jest.useRealTimers();
});
it('does not call the onTimeout callback before the timeout period has expired', () => {
const spy = jest.fn();
jest.useFakeTimers();
render();
act(() => {
jest.advanceTimersByTime(7999);
});
expect(spy).not.toHaveBeenCalled();
jest.useRealTimers();
});
it('calls the onTimeout callback after the timeout period has expired', () => {
jest.useFakeTimers();
const spy = jest.fn();
render();
act(() => {
jest.advanceTimersByTime(8000);
});
expect(spy).toHaveBeenCalledTimes(1);
jest.useRealTimers();
});
it('renders without aria-live and aria-atomic attributes by default', () => {
render();
const card = screen.getByTestId('card').parentElement;
expect(card).not.toHaveAttribute('aria-live');
expect(card).not.toHaveAttribute('aria-atomic');
});
it('has an aria-live value of polite and aria-atomic value of false when isLiveRegion = true', () => {
render();
const card = screen.getByTestId('card').parentElement;
expect(card).toHaveAttribute('aria-live', 'polite');
expect(card).toHaveAttribute('aria-atomic', 'false');
});
it('calls onMouseEnter appropriately', async () => {
const spy = jest.fn();
const user = userEvent.setup();
render(
);
const card = screen.getByTestId('card');
expect(spy).toHaveBeenCalledTimes(0);
await user.hover(card);
expect(spy).toHaveBeenCalledTimes(1);
});
it('calls onMouseLeave appropriately', async () => {
const spy = jest.fn();
const user = userEvent.setup();
render(
);
const card = screen.getByTestId('card');
expect(spy).toHaveBeenCalledTimes(0);
await user.hover(card);
await user.hover(screen.getByRole('textbox'));
expect(spy).toHaveBeenCalledTimes(1);
});
it('should focus on load by default', () => {
render();
expect(screen.getByTestId('card').parentElement).toHaveFocus();
});
it('should not focus on load if focusOnLoad = false', () => {
render();
expect(screen.getByTestId('card').parentElement).not.toHaveFocus();
});
it('should handle isCompact', () => {
render();
expect(screen.getByTestId('card')).toHaveClass('pf-m-compact');
});
});