Files
immich/web/src/lib/components/Image.spec.ts
2026-02-23 11:56:20 -05:00

88 lines
2.9 KiB
TypeScript

import Image from '$lib/components/Image.svelte';
import { cancelImageUrl } from '$lib/utils/sw-messaging';
import { fireEvent, render } from '@testing-library/svelte';
vi.mock('$lib/utils/sw-messaging', () => ({
cancelImageUrl: vi.fn(),
}));
describe('Image component', () => {
beforeEach(() => {
vi.clearAllMocks();
});
it('renders an img element when src is provided', () => {
const { baseElement } = render(Image, { src: '/test.jpg', alt: 'test' });
const img = baseElement.querySelector('img');
expect(img).not.toBeNull();
expect(img!.getAttribute('src')).toBe('/test.jpg');
});
it('does not render an img element when src is undefined', () => {
const { baseElement } = render(Image, { src: undefined });
const img = baseElement.querySelector('img');
expect(img).toBeNull();
});
it('calls onStart when src is set', () => {
const onStart = vi.fn();
render(Image, { src: '/test.jpg', onStart });
expect(onStart).toHaveBeenCalledOnce();
});
it('calls onLoad when image loads', async () => {
const onLoad = vi.fn();
const { baseElement } = render(Image, { src: '/test.jpg', onLoad });
const img = baseElement.querySelector('img')!;
await fireEvent.load(img);
expect(onLoad).toHaveBeenCalledOnce();
});
it('calls onError when image fails to load', async () => {
const onError = vi.fn();
const { baseElement } = render(Image, { src: '/test.jpg', onError });
const img = baseElement.querySelector('img')!;
await fireEvent.error(img);
expect(onError).toHaveBeenCalledOnce();
expect(onError).toHaveBeenCalledWith(expect.any(Error));
expect(onError.mock.calls[0][0].message).toBe('Failed to load image: /test.jpg');
});
it('calls cancelImageUrl on unmount', () => {
const { unmount } = render(Image, { src: '/test.jpg' });
expect(cancelImageUrl).not.toHaveBeenCalled();
unmount();
expect(cancelImageUrl).toHaveBeenCalledWith('/test.jpg');
});
it('does not call onLoad after unmount', async () => {
const onLoad = vi.fn();
const { baseElement, unmount } = render(Image, { src: '/test.jpg', onLoad });
const img = baseElement.querySelector('img')!;
unmount();
await fireEvent.load(img);
expect(onLoad).not.toHaveBeenCalled();
});
it('does not call onError after unmount', async () => {
const onError = vi.fn();
const { baseElement, unmount } = render(Image, { src: '/test.jpg', onError });
const img = baseElement.querySelector('img')!;
unmount();
await fireEvent.error(img);
expect(onError).not.toHaveBeenCalled();
});
it('passes through additional HTML attributes', () => {
const { baseElement } = render(Image, {
src: '/test.jpg',
alt: 'test alt',
class: 'my-class',
draggable: false,
});
const img = baseElement.querySelector('img')!;
expect(img.getAttribute('alt')).toBe('test alt');
expect(img.getAttribute('draggable')).toBe('false');
});
});