filestack-js
Version:
Official JavaScript library for Filestack
247 lines (209 loc) • 8 kB
text/typescript
/*
* Copyright (c) 2019 by Filestack.
* Some rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { resolveCdnUrl, resolveHost, removeEmpty, uniqueTime, uniqueId, md5, extensionToMime, sanitizeName, filterObject, b64, getVersion, cleanUpCallbacks } from './index';
import { config } from '../../config';
const v = require('../../../../package.json').version;
describe('utils:index', () => {
describe('resolveCdnUrl', () => {
const session = {
apikey: 'TEST_API_KEY',
cname: 'example.com',
urls: config.urls,
};
it('should properly resolve cdn url with hashed handle', () => {
const handle = '5aYkEQJSQCmYShsoCnZN';
const result = resolveCdnUrl(session, handle);
expect(result).toEqual('https://cdn.filestackcontent.com');
});
it('should properly resolve cdn url with src handle', () => {
const handle = 'src://test123/test.jpg';
const result = resolveCdnUrl(session, handle);
expect(result).toEqual('https://cdn.filestackcontent.com/TEST_API_KEY');
});
it('should properly resolve cdn url with hashed handle', () => {
const handle = 'https://static1.squarespace.com/static/544eb3cce4b0ef091773611f/t/59ba7ce1bd10f00dcdc80a5f/1505394087367/DSC_0527.jpg';
const result = resolveCdnUrl(session, handle);
expect(result).toEqual('https://cdn.filestackcontent.com/TEST_API_KEY');
});
it('should throw an error when using src handle or url without apikey', () => {
const handle = 'src://test123/test.jpg';
session.apikey = '';
expect(() => { resolveCdnUrl(session, handle); }).toThrow('Api key is required when storage alias is provided');
});
});
describe('resolveHost', () => {
const hosts = config.urls;
const checkHosts = (hosts, expected) => {
Object.keys(hosts).forEach((k) => {
expect(hosts[k].indexOf(expected) > -1).toBeTruthy();
});
};
it('should return proper host', () => {
const cname = 'example.com';
const result = resolveHost(hosts, cname);
checkHosts(result, cname);
});
it('should return hosts when cname is an empty string', () => {
const cname = '';
const result = resolveHost(hosts, cname);
checkHosts(result, cname);
});
it('should be idempotent', () => {
const cname = 'stage.filestackapi.com';
const firstResult = resolveHost(hosts, cname);
const copiedResult = JSON.parse(JSON.stringify(firstResult));
const secondResult = resolveHost(copiedResult, cname);
expect(JSON.stringify(firstResult)).toEqual(JSON.stringify(secondResult));
});
});
describe('removeEmpty', () => {
it('should remove empty options from an object', () => {
const testOb = { test1: true, test2: undefined, test3: false };
expect(removeEmpty(testOb)).toEqual({ test1: true, test3: false });
});
});
describe('uniqueTime', () => {
it('should return unique times', () => {
expect(uniqueTime()).not.toEqual(uniqueTime());
});
});
describe('uniqueId', () => {
it('should get different ids each time', () => {
expect(uniqueId()).not.toEqual(uniqueId());
});
it('should return id with given length', () => {
expect(uniqueId(12).length).toEqual(12);
expect(uniqueId(4).length).toEqual(4);
});
});
describe('md5', () => {
it('should return correct md5 value', () => {
expect(md5(Buffer.from('test'))).toEqual('CY9rzUYh03PK3k6DJie09g==');
});
});
describe('getVersion', () => {
it('should return correct version from package json', () => {
expect(getVersion()).toEqual(`JS-${v}`);
});
});
describe('b64', () => {
it('should return correct b65 value', () => {
expect(b64('testtext')).toEqual('dGVzdHRleHQ=');
});
it('should escape chars to make b64 url safe string - char "/"', () => {
expect(b64('*0eijATh#"I$PR)s<uTa}{t>E"LC:L', true)).toEqual('KjBlaWpBVGgjIkkkUFIpczx1VGF9e3Q-RSJMQzpM');
});
it('should escape chars to make b64 url safe string - char ""', () => {
expect(b64('W{wpB@ckYD0O@&?!||9PS)7^+F*H8N', true)).toEqual('V3t3cEJAY2tZRDBPQCY_IXx8OVBTKTdeK0YqSDhO');
});
});
describe('sanitizeName', () => {
it('should sanitize file name with extension', () => {
expect(sanitizeName('a\\{%`"~[]#|^<>1.jpg')).toEqual('a-------------1.jpg');
});
it('should sanitize file name without extension', () => {
expect(sanitizeName('123qwe')).toEqual('123qwe');
});
it('should return undefined on empty string', () => {
expect(sanitizeName('')).toEqual('undefined');
});
it('should respect sanitize options as boolean', () => {
expect(sanitizeName('[]#|.jpg', false)).toEqual('[]#|.jpg');
});
it('should not change dots in filename', () => {
expect(sanitizeName('[]#some.tar.gz', false)).toEqual('[]#some.tar.gz');
});
it('should respect sanitize options with provided options', () => {
expect(sanitizeName('[]#|.jpg', {
exclude: ['[', ']'],
replacement: '_',
})).toEqual('__#|.jpg');
});
});
describe('filterObject', () => {
it('should filter object', () => {
expect(filterObject({
test: 1,
test2: 2,
test3: 3,
}, ['test', 'test2'])).toEqual({
test: 1,
test2: 2,
});
});
it('should result the same object on empty requirements', () => {
expect(filterObject({
test: 1,
test2: 2,
test3: 3,
}, [])).toEqual({
test: 1,
test2: 2,
test3: 3,
});
});
it('should not throw on empty filtered object', () => {
expect(filterObject({}, ['test'])).toEqual({});
});
});
describe('extensionToMime', () => {
it('should return mimetype if mime is passed', () => {
expect(extensionToMime('')).toEqual(undefined);
});
it('should return same mime is passed', () => {
expect(extensionToMime('image/png')).toEqual('image/png');
expect(extensionToMime('image/jpg')).toEqual('image/jpg');
expect(extensionToMime('application/pdf')).toEqual('application/pdf');
});
it('it should return correct mimes for ext', () => {
expect(extensionToMime('.png')).toEqual('image/png');
expect(extensionToMime('.jpg')).toEqual('image/jpeg');
expect(extensionToMime('.pdf')).toEqual('application/pdf');
expect(extensionToMime('.key')).toEqual('application/vnd.apple.keynote');
expect(extensionToMime('.zip')).toEqual('application/zip');
expect(extensionToMime('.numbers')).toEqual('application/vnd.apple.numbers');
});
it('it should extract extensions form filename or ext with dot', () => {
expect(extensionToMime('test.png')).toEqual('image/png');
expect(extensionToMime('test.jpg')).toEqual('image/jpeg');
expect(extensionToMime('test.pdf')).toEqual('application/pdf');
});
});
describe('CleanupCallbacks', () => {
it('should set callbacks as undefined and return untouched object', () => {
const testObj = {
fn: () => 1,
test: {
fn2: () => 2,
},
testN: 123,
tests: 'string',
testObj: {
tst: 123,
},
};
expect(cleanUpCallbacks(testObj)).toEqual({
test: {},
testN: 123,
tests: 'string',
testObj: {
tst: 123,
},
});
});
});
});