filestack-adaptive
Version:
HTML5 picture elements powered by Filestack
498 lines (472 loc) • 14.6 kB
text/typescript
import { makePictureTree } from './tree';
import * as assert from 'assert';
const handle = 'seW1thvcR1aQBfOCF8bX';
const apiKey = 'BBcu94EFL1STGYvkM6a8usz';
const baseURL = 'https://cdn.filestackcontent.com';
const result = (base: string, opts?: any) => {
if (opts) {
return `${base}/${opts}/${handle}`;
}
return `${base}/${handle}`;
};
describe('makePictureTree', () => {
it('should throw if handle is not a string', () => {
assert.throws(() => makePictureTree());
});
it('should not let a user use width descriptors without at least one size (numbers)', () => {
const options = {
resolutions: [320, 420],
};
assert.throws(() => makePictureTree(handle, options));
});
it('should not let a user use width descriptors without at least one size (strings)', () => {
const options = {
resolutions: ['320w', '420w'],
};
assert.throws(() => makePictureTree(handle, options));
});
it('should not let a user pass sizes with pixel densities', () => {
const options = {
sizes: {
'(min-width: 1080px)': '100vw',
fallback: '90vw',
},
resolutions: ['1x', '2x'],
};
assert.throws(() => makePictureTree(handle, options));
});
it('should not let a user specify resolutions if no width is set', () => {
const options = {
resolutions: ['1x', '2x'],
};
assert.throws(() => makePictureTree(handle, options));
});
it('should generate a picture object with no sources', () => {
const obj = makePictureTree(handle, { keys: false });
const url = result(baseURL);
const expected = {
img: {
src: url,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with no sources (no resolutions) with security', () => {
const obj = makePictureTree(handle, {
resolutions: [],
security: {
policy: 'abc',
signature: 'xyz',
},
keys: false,
});
const url = result(baseURL, `security=policy:abc,signature:xyz`);
const expected = {
img: {
src: url,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 1 source', () => {
const testSize1 = { '(min-width: 640px)': '50vw' };
const resolutions = [320, 640];
const obj = makePictureTree(handle, { sizes: testSize1, resolutions, keys: false });
const srcSet = `${result(baseURL, 'resize=width:320')} 320w, ${result(baseURL, 'resize=width:640')} 640w`;
const expected = {
sources: [
{
media: '(min-width: 640px)',
sizes: '50vw',
srcSet,
},
],
img: {
src: result(baseURL),
srcSet,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 1 source and img fallback size', () => {
const testSize1 = {
'(min-width: 640px)': '50vw',
fallback: '300px',
};
const resolutions = [320, 640];
const obj = makePictureTree(handle, { sizes: testSize1, resolutions, keys: false });
const srcSet = `${result(baseURL, 'resize=width:320')} 320w, ${result(baseURL, 'resize=width:640')} 640w`;
const expected = {
sources: [
{
media: '(min-width: 640px)',
sizes: '50vw',
srcSet,
},
],
img: {
sizes: '300px',
src: result(baseURL, 'resize=width:300'),
srcSet,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 1 source with security', () => {
const testSize1 = { '(min-width: 640px)': '50vw' };
const resolutions = [320, 640];
const obj = makePictureTree(handle, {
sizes: testSize1,
resolutions,
security: {
policy: 'abc',
signature: 'xyz',
},
keys: false,
});
const srcSet = `${result(baseURL, 'security=policy:abc,signature:xyz/resize=width:320')} 320w, ${result(baseURL, 'security=policy:abc,signature:xyz/resize=width:640')} 640w`;
const expected = {
sources: [
{
media: '(min-width: 640px)',
sizes: '50vw',
srcSet,
},
],
img: {
src: result(baseURL, 'security=policy:abc,signature:xyz'),
srcSet,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 1 source and 1 format', () => {
const testSize1 = { '(min-width: 640px)': '50vw' };
const resolutions = [320, 640];
const obj = makePictureTree(handle, {
sizes: testSize1,
resolutions,
formats: ['webp'],
keys: false,
});
const imgSrcset = `${result(baseURL, 'resize=width:320')} 320w, ${result(baseURL, 'resize=width:640')} 640w`;
const url = `${result(baseURL, 'output=format:webp/resize=width:320')} 320w, ${result(baseURL, 'output=format:webp/resize=width:640')} 640w`;
const expected = {
sources: [
{
media: '(min-width: 640px)',
sizes: '50vw',
srcSet: url,
type: 'image/webp',
},
],
img: {
src: result(baseURL),
srcSet: imgSrcset,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 1 format', () => {
const obj = makePictureTree(handle, { formats: ['webp'], keys: false });
const url = result(baseURL, 'output=format:webp');
const expected = {
sources: [
{
srcSet: url,
type: 'image/webp',
},
],
img: {
src: result(baseURL),
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 2 formats and 1 size with fallback size', () => {
const obj = makePictureTree(handle, {
formats: ['webp', 'jpg'],
resolutions: [640],
sizes: {
'(min-width: 640px)': '90vw',
fallback: '80vw',
},
keys: false,
});
const expected = {
sources: [
{
media: '(min-width: 640px)',
sizes: '90vw',
srcSet: `${result(baseURL, 'output=format:webp/resize=width:640')} 640w`,
type: 'image/webp',
},
{
media: '(min-width: 640px)',
sizes: '90vw',
srcSet: `${result(baseURL, 'output=format:jpg/resize=width:640')} 640w`,
type: 'image/jpg',
},
{
sizes: '80vw',
srcSet: `${result(baseURL, 'output=format:webp/resize=width:640')} 640w`,
type: 'image/webp',
},
{
sizes: '80vw',
srcSet: `${result(baseURL, 'output=format:jpg/resize=width:640')} 640w`,
type: 'image/jpg',
},
],
img: {
sizes: '80vw',
src: result(baseURL),
srcSet: `${result(baseURL, 'resize=width:640')} 640w`,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 1 format with fallback size', () => {
const obj = makePictureTree(handle, {
formats: ['webp'],
resolutions: [640],
sizes: {
fallback: '700px',
},
keys: false,
});
const expected = {
sources: [
{
sizes: '700px',
srcSet: `${result(baseURL, 'output=format:webp/resize=width:640')} 640w`,
type: 'image/webp',
},
],
img: {
sizes: '700px',
src: result(baseURL, 'resize=width:700'),
srcSet: `${result(baseURL, 'resize=width:640')} 640w`,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 2 sources and 2 formats in order', () => {
const testSize1 = {
'(min-width: 640px)': '50vw',
'(min-width: 340px)': '33vw',
};
const resolutions = ['320w', '640w'];
const obj = makePictureTree(handle, {
sizes: testSize1,
formats: ['jpg', 'webp'],
resolutions,
keys: false,
});
const imgSrcset = `${result(baseURL, 'resize=width:320')} 320w, ${result(baseURL, 'resize=width:640')} 640w`;
const srcSet1 = `${result(baseURL, 'output=format:jpg/resize=width:320')} 320w, ${result(baseURL, 'output=format:jpg/resize=width:640')} 640w`;
const srcSet2 = `${result(baseURL, 'output=format:webp/resize=width:320')} 320w, ${result(baseURL, 'output=format:webp/resize=width:640')} 640w`;
const srcSet3 = `${result(baseURL, 'output=format:jpg/resize=width:320')} 320w, ${result(baseURL, 'output=format:jpg/resize=width:640')} 640w`;
const srcSet4 = `${result(baseURL, 'output=format:webp/resize=width:320')} 320w, ${result(baseURL, 'output=format:webp/resize=width:640')} 640w`;
const expected = {
sources: [
{
media: '(min-width: 640px)',
sizes: '50vw',
srcSet: srcSet3,
type: 'image/jpg',
},
{
media: '(min-width: 640px)',
sizes: '50vw',
srcSet: srcSet4,
type: 'image/webp',
},
{
media: '(min-width: 340px)',
sizes: '33vw',
srcSet: srcSet1,
type: 'image/jpg',
},
{
media: '(min-width: 340px)',
sizes: '33vw',
srcSet: srcSet2,
type: 'image/webp',
},
],
img: {
src: result(baseURL),
srcSet: imgSrcset,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with a fallback size (no resolutions)', () => {
const options = {
sizes: {
fallback: '100vw',
},
resolutions: [],
keys: false,
};
const tree = makePictureTree(handle, options);
const expected = {
img: {
src: result(baseURL),
sizes: '100vw',
},
};
assert.deepStrictEqual(tree, expected);
});
it('should generate a picture object with a fallback size (resolutions)', () => {
const options = {
sizes: {
fallback: '100vw',
},
resolutions: [320, 640],
keys: false,
};
const srcSet = `${result(baseURL, 'resize=width:320')} 320w, ${result(baseURL, 'resize=width:640')} 640w`;
const tree = makePictureTree(handle, options);
const expected = {
img: {
src: result(baseURL),
sizes: '100vw',
srcSet,
},
};
assert.deepStrictEqual(tree, expected);
});
it('should generate a picture object with a fallback img and 1 source (1 resolution)', () => {
const options = {
sizes: {
'(min-width: 1080px)': '100vw',
fallback: '300px',
},
resolutions: [320, 640],
keys: false,
};
const srcSet = `${result(baseURL, 'resize=width:320')} 320w, ${result(baseURL, 'resize=width:640')} 640w`;
const tree = makePictureTree(handle, options);
const expected = {
img: {
src: result(baseURL, 'resize=width:300'),
sizes: '300px',
srcSet,
},
sources: [
{
media: '(min-width: 1080px)',
sizes: '100vw',
srcSet,
},
],
};
assert.deepStrictEqual(tree, expected);
});
it('should generate a single img element using width and pixel densities', () => {
const options = {
width: '768px',
keys: false,
};
const srcSet = `${result(baseURL, 'resize=width:768')} 1x, ${result(baseURL, 'resize=width:1536')} 2x`;
const expected = {
img: {
width: 768,
src: result(baseURL, 'resize=width:768'),
srcSet,
},
};
const tree = makePictureTree(handle, options);
assert.deepStrictEqual(tree, expected);
});
it('should generate a single img element using storage alias handle', () => {
const storageAliasHandle = {
srcHandle: handle,
apiKey,
};
const options = {
width: '768px',
keys: false,
transforms: {
quality: {
value: 5,
},
},
};
const expected = {
img: {
src: 'https://cdn.filestackcontent.com/BBcu94EFL1STGYvkM6a8usz/quality=value:5/resize=width:768/seW1thvcR1aQBfOCF8bX',
srcSet: 'https://cdn.filestackcontent.com/BBcu94EFL1STGYvkM6a8usz/quality=value:5/resize=width:768/seW1thvcR1aQBfOCF8bX 1x, https://cdn.filestackcontent.com/BBcu94EFL1STGYvkM6a8usz/quality=value:5/resize=width:1536/seW1thvcR1aQBfOCF8bX 2x',
width: 768,
},
};
const tree = makePictureTree(storageAliasHandle, options);
assert.deepStrictEqual(tree, expected);
});
it('should be able to disable a transformation validator', () => {
const storageAliasHandle = {
srcHandle: handle,
apiKey,
};
const options = {
width: '768px',
keys: false,
transforms: {
quality: {
value: 5,
},
},
useValidator: false,
};
const expected = {
img: {
src: 'https://cdn.filestackcontent.com/BBcu94EFL1STGYvkM6a8usz/quality=value:5/resize=width:768/seW1thvcR1aQBfOCF8bX',
srcSet: 'https://cdn.filestackcontent.com/BBcu94EFL1STGYvkM6a8usz/quality=value:5/resize=width:768/seW1thvcR1aQBfOCF8bX 1x, https://cdn.filestackcontent.com/BBcu94EFL1STGYvkM6a8usz/quality=value:5/resize=width:1536/seW1thvcR1aQBfOCF8bX 2x',
width: 768,
},
};
const tree = makePictureTree(storageAliasHandle, options);
assert.deepStrictEqual(tree, expected);
});
it('should move output task always as the first in the filelink', () => {
const options = {
transforms: {
quality: {
value: 5,
},
output: {
format: 'webp',
},
sepia: {
tone: 70,
},
},
};
const expected = {
img: {
src: 'https://cdn.filestackcontent.com/output=format:webp/quality=value:5/sepia=tone:70/seW1thvcR1aQBfOCF8bX',
},
};
const tree = makePictureTree(handle, options);
assert.deepStrictEqual(tree, expected);
});
it('should return filelinks with custom cname', () => {
const options = {
cname: 'fs.test123.com',
width: '768px',
keys: false,
};
const srcSet = `${result(`https://cdn.${options.cname}`, 'resize=width:768')} 1x, ${result(`https://cdn.${options.cname}`, 'resize=width:1536')} 2x`;
const expected = {
img: {
width: 768,
src: result(`https://cdn.${options.cname}`, 'resize=width:768'),
srcSet,
},
};
const tree = makePictureTree(handle, options);
assert.deepStrictEqual(tree, expected);
});
});