blob: 083565ada97af75245314b0295de9c2af3f18712 [file] [edit]
/* global QUnit,JSZip,JSZipTestUtils,Promise */
'use strict';
QUnit.module("external");
/**
* Creates a wrapper around an existing Promise implementation to count
* calls and detect custom implementations.
* @param {Promise} OriginalPromise the promise to wrap
* @return {Promise} the wrapped promise
*/
function createPromiseProxy(OriginalPromise) {
function MyShinyPromise (input) {
if (input.then) { // thenable, we wrap it
this._promise = input;
} else { // executor
this._promise = new OriginalPromise(input);
}
MyShinyPromise.calls++;
}
MyShinyPromise.calls = 0;
MyShinyPromise.prototype = {
then: function (onFulfilled, onRejected) {
return new MyShinyPromise(this._promise.then(onFulfilled, onRejected));
},
"catch": function (onRejected) {
return new MyShinyPromise(this._promise['catch'](onRejected));
},
isACustomImplementation: true
};
MyShinyPromise.resolve = function (value) {
return new MyShinyPromise(OriginalPromise.resolve(value));
};
MyShinyPromise.reject = function (value) {
return new MyShinyPromise(OriginalPromise.reject(value));
};
MyShinyPromise.all = function (value) {
return new MyShinyPromise(OriginalPromise.all(value));
};
return MyShinyPromise;
}
QUnit.test("JSZip.external.Promise", function (assert) {
assert.ok(JSZip.external.Promise, "JSZip.external.Promise is defined");
assert.ok(JSZip.external.Promise.resolve, "JSZip.external.Promise looks like a Promise");
assert.ok(JSZip.external.Promise.reject, "JSZip.external.Promise looks like a Promise");
});
QUnit.test("load JSZip doesn't override the global Promise", function (assert) {
if (typeof Promise !== "undefined"){
assert.equal(Promise, JSZipTestUtils.oldPromise, "the previous Promise didn't change");
assert.equal(Promise, JSZip.external.Promise, "JSZip.external.Promise reused the global Promise");
} else {
assert.ok(JSZip.external.Promise, "JSZip.external.Promise is defined even if the global Promise doesn't exist");
}
});
QUnit.test("external.Promise can be replaced in .async()", function (assert) {
var done = assert.async();
var OriginalPromise = JSZip.external.Promise;
var MyShinyPromise = createPromiseProxy(OriginalPromise);
JSZip.external.Promise = MyShinyPromise;
var promise = JSZipTestUtils.createZipAll().file("Hello.txt").async("string").then(function (result) {
assert.ok(MyShinyPromise.calls > 0, "at least 1 call of the new Promise");
JSZip.external.Promise = OriginalPromise;
done();
})['catch'](JSZipTestUtils.assertNoError);
assert.ok(promise.isACustomImplementation, "the custom implementation is used");
});
QUnit.test("external.Promise can be replaced in .generateAsync()", function (assert) {
var done = assert.async();
var OriginalPromise = JSZip.external.Promise;
var MyShinyPromise = createPromiseProxy(OriginalPromise);
JSZip.external.Promise = MyShinyPromise;
var promise = JSZipTestUtils.createZipAll().generateAsync({type:"string"}).then(function (result) {
assert.ok(MyShinyPromise.calls > 0, "at least 1 call of the new Promise");
JSZip.external.Promise = OriginalPromise;
done();
})['catch'](JSZipTestUtils.assertNoError);
assert.ok(promise.isACustomImplementation, "the custom implementation is used");
});
JSZipTestUtils.testZipFile("external.Promise can be replaced in .loadAsync()", "ref/all.zip", function (assert, all) {
var done = assert.async();
var OriginalPromise = JSZip.external.Promise;
var MyShinyPromise = createPromiseProxy(OriginalPromise);
JSZip.external.Promise = MyShinyPromise;
var promise = JSZip.loadAsync(all).then(function (result) {
assert.ok(MyShinyPromise.calls > 0, "at least 1 call of the new Promise");
JSZip.external.Promise = OriginalPromise;
done();
})['catch'](JSZipTestUtils.assertNoError);
assert.ok(promise.isACustomImplementation, "the custom implementation is used");
});