import * as useHasIntersectedUtils from '../common/hooks/useHasIntersected/useHasIntersected';
import { render, fireEvent, screen } from '../test-utils';
import { ImageProps } from './Image';
import Image from '.';
const props: ImageProps = {
id: 'id',
src: 'https://www.a-valid-src.png/',
alt: 'test',
className: 'className',
loading: 'lazy',
onLoad: jest.fn(),
onError: jest.fn(),
shrink: false,
stretch: false,
};
describe('Image', () => {
describe('when lazy loading is not enabled', () => {
it(`renders image`, () => {
render();
const image: HTMLImageElement = screen.getByRole('img');
expect(image).toBeInTheDocument();
expect(image.src).toStrictEqual(props.src);
expect(image.id).toStrictEqual(props.id);
expect(image.alt).toStrictEqual(props.alt);
});
});
describe('when lazy loading is enabled', () => {
it('renders the image with actual src even if element is not visible', () => {
jest.spyOn(useHasIntersectedUtils, 'useHasIntersected').mockReturnValue([false]);
render();
const image: HTMLImageElement = screen.getByRole('img');
expect(image).toBeInTheDocument();
expect(image.src).toStrictEqual(props.src);
});
it('renders the image with src if element is visible', () => {
jest.spyOn(useHasIntersectedUtils, 'useHasIntersected').mockReturnValue([true]);
render();
const image: HTMLImageElement = screen.getByRole('img');
expect(image).toBeInTheDocument();
expect(image.src).toStrictEqual(props.src);
});
it(`calls onload only if image has intersected`, () => {
jest.spyOn(useHasIntersectedUtils, 'useHasIntersected').mockReturnValue([false]);
const { rerender } = render();
const image = screen.getByRole('img');
fireEvent.load(image);
expect(props.onLoad).not.toHaveBeenCalled();
jest.spyOn(useHasIntersectedUtils, 'useHasIntersected').mockReturnValue([true]);
rerender();
fireEvent.load(image);
expect(props.onLoad).toHaveBeenCalledTimes(1);
});
});
it(`when shrink is true it has shrink class`, () => {
const { rerender } = render();
const image = screen.getByRole('img');
expect(image).not.toHaveClass('tw-image__shrink');
rerender();
expect(image).toHaveClass('tw-image__shrink');
});
it(`when stretch is true it has stretch class`, () => {
const { rerender } = render();
const image = screen.getByRole('img');
expect(image).not.toHaveClass('tw-image__stretch');
rerender();
expect(image).toHaveClass('tw-image__stretch');
});
});