/* global Image:true */
import * as ImageAssets from '../ImageAssets';
describe('isImageType', () => {
it(`recognizes popular web image types`, () => {
expect(ImageAssets.isImageType('jpeg')).toBe(true);
expect(ImageAssets.isImageType('png')).toBe(true);
expect(ImageAssets.isImageType('gif')).toBe(true);
expect(ImageAssets.isImageType('webp')).toBe(true);
});
it(`doesn't recognize non-image types`, () => {
expect(ImageAssets.isImageType('')).toBe(false);
expect(ImageAssets.isImageType('js')).toBe(false);
expect(ImageAssets.isImageType('txt')).toBe(false);
});
});
describe('getImageInfoAsync', () => {
let originalImage: any;
beforeAll(() => {
// @ts-ignore
originalImage = global.Image;
Image = jest.fn();
});
afterAll(() => {
Image = originalImage;
});
it(`fetches images by setting the "src" property`, () => {
ImageAssets.getImageInfoAsync('https://example.com/example.png');
expect((Image as jest.Mock<HTMLImageElement>).mock.instances.length).toBe(1);
let mockImage = (Image as jest.Mock<HTMLImageElement>).mock.instances[0];
expect(mockImage.src).toBe('https://example.com/example.png');
});
it(`resolves the promise when the image loads`, async () => {
let infoPromise = ImageAssets.getImageInfoAsync('https://example.com/example.png');
let mockImage = (Image as jest.Mock<HTMLImageElement>).mock.instances[0];
expect(mockImage.onload).toBeDefined();
// @ts-ignore: naturalWidth is declared as read-only
mockImage.naturalWidth = 300;
// @ts-ignore: naturalHeight is declared as read-only
mockImage.naturalHeight = 400;
let mockLoadEvent = { type: 'load' } as any;
mockImage.onload!(mockLoadEvent);
await expect(infoPromise).resolves.toEqual({
name: 'example.png',
width: 300,
height: 400,
});
});
it(`rejects the promise when the image fails to load`, async () => {
let infoPromise = ImageAssets.getImageInfoAsync('https://example.com/example.png');
let mockImage = (Image as jest.Mock<HTMLImageElement>).mock.instances[0];
expect(mockImage.onerror).toBeDefined();
let mockErrorEvent = { type: 'error' } as any;
mockImage.onerror!(mockErrorEvent);
// TODO: change this to a proper Error
await expect(infoPromise).rejects.toBe(mockErrorEvent);
});
});