filestack-js
Version:
Official JavaScript library for Filestack
157 lines (155 loc) • 16.6 kB
JavaScript
import { __awaiter, __generator } from "tslib";
/*
* 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 { getFile } from './file_tools';
import * as utils from './../../utils';
var createFile = function (size, name, type) {
if (size === void 0) { size = 44320; }
if (name === void 0) { name = 'test.png'; }
if (type === void 0) { type = 'image/png'; }
return new File([new ArrayBuffer(size)], name, { type: type });
};
var sanitizeOptions = jest.fn().mockName('sanitizeOptions');
var base64Svg = 'PHN2ZyBoZWlnaHQ9IjEwMCIgd2lkdGg9IjEwMCI+CiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgcj0iNDAiIHN0cm9rZT0iYmxhY2siIHN0cm9rZS13aWR0aD0iMyIgZmlsbD0icmVkIiAvPgogIFNvcnJ5LCB5b3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBpbmxpbmUgU1ZHLiAgCjwvc3ZnPiA=';
var base64Png = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==';
var base64Gif = 'R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==';
describe('Api/Upload/FileTools', function () {
beforeAll(function () {
jest.spyOn(utils, 'sanitizeName').mockImplementation(function (val, opts) {
sanitizeOptions(opts);
return val;
});
});
describe('getFileBrowser', function () {
it('Should handle base64 encoded string (svg)', function () { return __awaiter(void 0, void 0, void 0, function () {
var _a;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
_a = expect;
return [4 /*yield*/, getFile({
file: base64Svg,
name: 'test.svg',
})];
case 1: return [2 /*return*/, _a.apply(void 0, [(_b.sent()).mimetype]).toEqual('image/svg+xml')];
}
});
}); });
it('Should handle base64 encoded string (png)', function () { return __awaiter(void 0, void 0, void 0, function () {
var _a;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
_a = expect;
return [4 /*yield*/, getFile(base64Png)];
case 1: return [2 /*return*/, _a.apply(void 0, [(_b.sent()).mimetype]).toEqual('image/png')];
}
});
}); });
it('Should handle base64 encoded string (gif)', function () { return __awaiter(void 0, void 0, void 0, function () {
var _a;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
_a = expect;
return [4 /*yield*/, getFile(base64Gif)];
case 1: return [2 /*return*/, _a.apply(void 0, [(_b.sent()).mimetype]).toEqual('image/gif')];
}
});
}); });
it('Should handle base64 encoded string with b64 prefix (gif)', function () { return __awaiter(void 0, void 0, void 0, function () {
var _a;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
_a = expect;
return [4 /*yield*/, getFile("data:image/gif;base64,".concat(base64Gif))];
case 1: return [2 /*return*/, _a.apply(void 0, [(_b.sent()).mimetype]).toEqual('image/gif')];
}
});
}); });
it('Should pass sanitize options to file instance', function () { return __awaiter(void 0, void 0, void 0, function () {
var soptions, fileRes;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
soptions = {
replacement: '=',
};
return [4 /*yield*/, getFile({
file: base64Png,
name: 'test<.jpg',
}, soptions)];
case 1:
fileRes = _a.sent();
expect(sanitizeOptions).toHaveBeenCalledWith(soptions);
return [2 /*return*/];
}
});
}); });
it('Should throw error when random string is provided', function () {
return expect(getFile('asdasdfasdf')).rejects.toEqual(new Error('Unsupported input file type'));
});
it('Should handle base64 named file (gif)', function () { return __awaiter(void 0, void 0, void 0, function () {
var file;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, getFile({
file: base64Gif,
name: 'test.gif',
})];
case 1:
file = _a.sent();
expect(file.mimetype).toEqual('image/gif');
expect(file.name).toEqual('test.gif');
return [2 /*return*/];
}
});
}); });
it('Should handle File input type', function () { return __awaiter(void 0, void 0, void 0, function () {
var file;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, getFile(createFile())];
case 1:
file = _a.sent();
expect(file.mimetype).toEqual('image/png');
expect(file.name).toEqual('test.png');
expect(file.size).toEqual(44320);
return [2 /*return*/];
}
});
}); });
it('Should handle blob input type', function () { return __awaiter(void 0, void 0, void 0, function () {
var file;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, getFile(new Blob([new ArrayBuffer(100)], {
type: 'image/jpg',
}))];
case 1:
file = _a.sent();
expect(file.mimetype).toEqual('image/jpg');
expect(file.name).toEqual(undefined);
expect(file.size).toEqual(100);
return [2 /*return*/];
}
});
}); });
});
});
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXBpL3VwbG9hZC9maWxlX3Rvb2xzLnNwZWMuYnJvd3Nlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEtBQUssS0FBSyxNQUFNLGVBQWUsQ0FBQztBQUV2QyxJQUFNLFVBQVUsR0FBRyxVQUFDLElBQVksRUFBRSxJQUFpQixFQUFFLElBQWtCO0lBQW5ELHFCQUFBLEVBQUEsWUFBWTtJQUFFLHFCQUFBLEVBQUEsaUJBQWlCO0lBQUUscUJBQUEsRUFBQSxrQkFBa0I7SUFBSyxPQUFBLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFBeEQsQ0FBd0QsQ0FBQztBQUVySSxJQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFOUQsSUFBTSxTQUFTLEdBQUcsc09BQXNPLENBQUM7QUFDelAsSUFBTSxTQUFTLEdBQUcsa0dBQWtHLENBQUM7QUFDckgsSUFBTSxTQUFTLEdBQUcsOERBQThELENBQUM7QUFFakYsUUFBUSxDQUFDLHNCQUFzQixFQUFFO0lBQy9CLFNBQVMsQ0FBQztRQUNSLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFVBQUMsR0FBRyxFQUFFLElBQUk7WUFDN0QsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RCLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtRQUV6QixFQUFFLENBQUMsMkNBQTJDLEVBQUU7Ozs7O3dCQUN2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QUM7UUFFSCxFQUFFLENBQUMsK0JBQStCLEVBQUU7Ozs7NEJBQ3JCLHFCQUFNLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7NEJBQzFELElBQUksRUFBRSxXQUFXO3lCQUNsQixDQUFDLENBQUMsRUFBQTs7d0JBRkcsSUFBSSxHQUFHLFNBRVY7d0JBRUgsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7d0JBQzNDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQzs7OzthQUNoQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwiZmlsZSI6ImxpYi9hcGkvdXBsb2FkL2ZpbGVfdG9vbHMuc3BlYy5icm93c2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOSBieSBGaWxlc3RhY2suXG4gKiBTb21lIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJ0xpY2Vuc2UnKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgZ2V0RmlsZSB9IGZyb20gJy4vZmlsZV90b29scyc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuLy4uLy4uL3V0aWxzJztcblxuY29uc3QgY3JlYXRlRmlsZSA9IChzaXplID0gNDQzMjAsIG5hbWUgPSAndGVzdC5wbmcnLCB0eXBlID0gJ2ltYWdlL3BuZycpID0+IG5ldyBGaWxlKFtuZXcgQXJyYXlCdWZmZXIoc2l6ZSldLCBuYW1lICwgeyB0eXBlOiB0eXBlIH0pO1xuXG5jb25zdCBzYW5pdGl6ZU9wdGlvbnMgPSBqZXN0LmZuKCkubW9ja05hbWUoJ3Nhbml0aXplT3B0aW9ucycpO1xuXG5jb25zdCBiYXNlNjRTdmcgPSAnUEhOMlp5Qm9aV2xuYUhROUlqRXdNQ0lnZDJsa2RHZzlJakV3TUNJK0NpQWdQR05wY21Oc1pTQmplRDBpTlRBaUlHTjVQU0kxTUNJZ2NqMGlOREFpSUhOMGNtOXJaVDBpWW14aFkyc2lJSE4wY205clpTMTNhV1IwYUQwaU15SWdabWxzYkQwaWNtVmtJaUF2UGdvZ0lGTnZjbko1TENCNWIzVnlJR0p5YjNkelpYSWdaRzlsY3lCdWIzUWdjM1Z3Y0c5eWRDQnBibXhwYm1VZ1UxWkhMaUFnQ2p3dmMzWm5QaUE9JztcbmNvbnN0IGJhc2U2NFBuZyA9ICdpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUVBQUFBQkNBWUFBQUFmRmNTSkFBQUFEVWxFUVZSNDJtTmsrTTlRRHdBRGhnR0FXalI5YXdBQUFBQkpSVTVFcmtKZ2dnPT0nO1xuY29uc3QgYmFzZTY0R2lmID0gJ1IwbEdPRGxoQVFBQkFJQUFBUC8vL3dBQUFDSDVCQUVBQUFBQUxBQUFBQUFCQUFFQUFBSUNSQUVBT3c9PSc7XG5cbmRlc2NyaWJlKCdBcGkvVXBsb2FkL0ZpbGVUb29scycsICgpID0+IHtcbiAgYmVmb3JlQWxsKCgpID0+IHtcbiAgICBqZXN0LnNweU9uKHV0aWxzLCAnc2FuaXRpemVOYW1lJykubW9ja0ltcGxlbWVudGF0aW9uKCh2YWwsIG9wdHMpID0+IHtcbiAgICAgIHNhbml0aXplT3B0aW9ucyhvcHRzKTtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRGaWxlQnJvd3NlcicsICgpID0+IHtcblxuICAgIGl0KCdTaG91bGQgaGFuZGxlIGJhc2U2NCBlbmNvZGVkIHN0cmluZyAoc3ZnKScsIGFzeW5jICgpID0+IHtcbiAgICAgIHJldHVybiBleHBlY3QoKGF3YWl0IGdldEZpbGUoe1xuICAgICAgICBmaWxlOiBiYXNlNjRTdmcsXG4gICAgICAgIG5hbWU6ICd0ZXN0LnN2ZycsXG4gICAgICB9KSkubWltZXR5cGUpLnRvRXF1YWwoJ2ltYWdlL3N2Zyt4bWwnKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgaGFuZGxlIGJhc2U2NCBlbmNvZGVkIHN0cmluZyAocG5nKScsIGFzeW5jICgpID0+IHtcbiAgICAgIHJldHVybiBleHBlY3QoKGF3YWl0IGdldEZpbGUoYmFzZTY0UG5nKSkubWltZXR5cGUpLnRvRXF1YWwoJ2ltYWdlL3BuZycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBoYW5kbGUgYmFzZTY0IGVuY29kZWQgc3RyaW5nIChnaWYpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgcmV0dXJuIGV4cGVjdCgoYXdhaXQgZ2V0RmlsZShiYXNlNjRHaWYpKS5taW1ldHlwZSkudG9FcXVhbCgnaW1hZ2UvZ2lmJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGhhbmRsZSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgd2l0aCBiNjQgcHJlZml4IChnaWYpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgcmV0dXJuIGV4cGVjdCgoYXdhaXQgZ2V0RmlsZShgZGF0YTppbWFnZS9naWY7YmFzZTY0LCR7YmFzZTY0R2lmfWApKS5taW1ldHlwZSkudG9FcXVhbCgnaW1hZ2UvZ2lmJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHBhc3Mgc2FuaXRpemUgb3B0aW9ucyB0byBmaWxlIGluc3RhbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc29wdGlvbnMgPSB7XG4gICAgICAgIHJlcGxhY2VtZW50OiAnPScsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaWxlUmVzID0gYXdhaXQgZ2V0RmlsZSh7XG4gICAgICAgIGZpbGU6IGJhc2U2NFBuZyxcbiAgICAgICAgbmFtZTogJ3Rlc3Q8LmpwZycsXG4gICAgICB9LCBzb3B0aW9ucyk7XG5cbiAgICAgIGV4cGVjdChzYW5pdGl6ZU9wdGlvbnMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHNvcHRpb25zKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgdGhyb3cgZXJyb3Igd2hlbiByYW5kb20gc3RyaW5nIGlzIHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgcmV0dXJuIGV4cGVjdChnZXRGaWxlKCdhc2Rhc2RmYXNkZicpKS5yZWplY3RzLnRvRXF1YWwobmV3IEVycm9yKCdVbnN1cHBvcnRlZCBpbnB1dCBmaWxlIHR5cGUnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGhhbmRsZSBiYXNlNjQgbmFtZWQgZmlsZSAoZ2lmKScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBnZXRGaWxlKHtcbiAgICAgICAgZmlsZTogYmFzZTY0R2lmLFxuICAgICAgICBuYW1lOiAndGVzdC5naWYnLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoZmlsZS5taW1ldHlwZSkudG9FcXVhbCgnaW1hZ2UvZ2lmJyk7XG4gICAgICBleHBlY3QoZmlsZS5uYW1lKS50b0VxdWFsKCd0ZXN0LmdpZicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBoYW5kbGUgRmlsZSBpbnB1dCB0eXBlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IGdldEZpbGUoY3JlYXRlRmlsZSgpKTtcbiAgICAgIGV4cGVjdChmaWxlLm1pbWV0eXBlKS50b0VxdWFsKCdpbWFnZS9wbmcnKTtcbiAgICAgIGV4cGVjdChmaWxlLm5hbWUpLnRvRXF1YWwoJ3Rlc3QucG5nJyk7XG4gICAgICBleHBlY3QoZmlsZS5zaXplKS50b0VxdWFsKDQ0MzIwKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgaGFuZGxlIGJsb2IgaW5wdXQgdHlwZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBnZXRGaWxlKG5ldyBCbG9iKFtuZXcgQXJyYXlCdWZmZXIoMTAwKV0sIHtcbiAgICAgICAgdHlwZTogJ2ltYWdlL2pwZycsXG4gICAgICB9KSk7XG5cbiAgICAgIGV4cGVjdChmaWxlLm1pbWV0eXBlKS50b0VxdWFsKCdpbWFnZS9qcGcnKTtcbiAgICAgIGV4cGVjdChmaWxlLm5hbWUpLnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgICAgIGV4cGVjdChmaWxlLnNpemUpLnRvRXF1YWwoMTAwKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==