blob: 7b794fc24799fa531bfcccde0406f59b3438eb36 [file] [edit]
"use strict";
QUnit.module("generate");
function testGenerateFor(testCases, fn) {
while(testCases.length) {
var testCase = testCases.shift();
fn(testCase.name, testCase.file, testCase.streamFiles);
}
}
function testGenerate(assert, options) {
var done = assert.async();
var triggeredCallback = false;
new JSZip.external.Promise(function(resolve) {
resolve(options.prepare());
})
.then(function (zip) {
JSZipTestUtils.checkBasicStreamBehavior(assert, zip.generateInternalStream(options.options));
return zip;
})
.then(function(zip) {
var promise = zip.generateAsync(options.options);
zip.file("Hello.txt", "updating the zip file after the call won't change the result");
return promise;
})
.then(function(result) {
triggeredCallback = true;
options.assertions(null, result);
if (!options.skipReloadTest) {
JSZipTestUtils.checkGenerateStability(assert, result, options.options);
}
done();
}, function (err) {
triggeredCallback = true;
options.assertions(err, null);
done();
});
assert.ok(!triggeredCallback, "the async callback is async");
}
testGenerateFor([{
name : "no stream",
file : "ref/all.zip",
streamFiles : false
}, {
name : "with stream",
// zip -fd -0 -X -r all-stream.zip Hello.txt images/
file : "ref/all-stream.zip",
streamFiles : true
}], function(testName, file, streamFiles) {
JSZipTestUtils.testZipFile("generate : type:string. " + testName, file, function(assert, expected) {
testGenerate(assert, {
prepare : JSZipTestUtils.createZipAll,
options : {type:"binarystring",streamFiles:streamFiles},
assertions : function (err, result) {
assert.equal(err, null, "no error");
assert.ok(JSZipTestUtils.similar(result, expected, 3 * JSZipTestUtils.MAX_BYTES_DIFFERENCE_PER_ZIP_ENTRY) , "generated ZIP matches reference ZIP");
}
});
});
JSZipTestUtils.testZipFile("generate : type:base64. " + testName, file, function(assert) {
testGenerate(assert, {
prepare : function () {
// fix date to get a predictable output
var zip = new JSZip();
zip.file("Hello.txt", "Hello World\n", {date: new Date(1234567891011)});
zip.file("images", null, {dir:true, date: new Date(1234876591011)});
zip.file("images/smile.gif", "R0lGODdhBQAFAIACAAAAAP/eACwAAAAABQAFAAACCIwPkWerClIBADs=", {base64: true, date: new Date(1234123491011)});
return zip;
},
skipReloadTest : true,
options : {type:"base64",streamFiles:streamFiles},
assertions : function (err, result) {
assert.equal(err, null, "no error");
assert.equal(result, JSZipTestUtils.base64encode("all.zip.base64,stream=" + streamFiles), "generated ZIP matches reference ZIP");
}
});
});
JSZipTestUtils.testZipFile("generate : type:uint8array. " + testName, file, function(assert, expected) {
testGenerate(assert, {
prepare : JSZipTestUtils.createZipAll,
options : {type:"uint8array",streamFiles:streamFiles},
assertions : function (err, result) {
if (JSZip.support.uint8array) {
assert.equal(err, null, "no error");
assert.ok(result instanceof Uint8Array, "the result is a instance of Uint8Array");
// var actual = JSZipTestUtils.toString(result);
assert.ok(JSZipTestUtils.similar(result, expected, 3 * JSZipTestUtils.MAX_BYTES_DIFFERENCE_PER_ZIP_ENTRY) , "generated ZIP matches reference ZIP");
} else {
assert.equal(result, null, "no data");
assert.ok(err.message.match("not supported by this platform"), "the error message is useful");
}
}
});
});
JSZipTestUtils.testZipFile("generate : type:arraybuffer. " + testName, file, function(assert, expected) {
testGenerate(assert, {
prepare : JSZipTestUtils.createZipAll,
options : {type:"arraybuffer",streamFiles:streamFiles},
assertions : function (err, result) {
if (JSZip.support.arraybuffer) {
assert.equal(err, null, "no error");
assert.ok(result instanceof ArrayBuffer, "the result is a instance of ArrayBuffer");
assert.ok(JSZipTestUtils.similar(result, expected, 3 * JSZipTestUtils.MAX_BYTES_DIFFERENCE_PER_ZIP_ENTRY) , "generated ZIP matches reference ZIP");
} else {
assert.equal(result, null, "no data");
assert.ok(err.message.match("not supported by this platform"), "the error message is useful");
}
}
});
});
JSZipTestUtils.testZipFile("generate : type:nodebuffer. " + testName, file, function(assert, expected) {
testGenerate(assert, {
prepare : JSZipTestUtils.createZipAll,
options : {type:"nodebuffer",streamFiles:streamFiles},
assertions : function (err, result) {
if (JSZip.support.nodebuffer) {
assert.equal(err, null, "no error");
assert.ok(result instanceof Buffer, "the result is a instance of ArrayBuffer");
var actual = JSZipTestUtils.toString(result);
assert.ok(JSZipTestUtils.similar(actual, expected, 3 * JSZipTestUtils.MAX_BYTES_DIFFERENCE_PER_ZIP_ENTRY) , "generated ZIP matches reference ZIP");
} else {
assert.equal(result, null, "no data");
assert.ok(err.message.match("not supported by this platform"), "the error message is useful");
}
}
});
});
JSZipTestUtils.testZipFile("generate : type:blob. " + testName, file, function(assert, expected) {
testGenerate(assert, {
prepare : JSZipTestUtils.createZipAll,
options : {type:"blob",streamFiles:streamFiles},
skipReloadTest : true,
assertions : function (err, result) {
if (JSZip.support.blob) {
assert.equal(err, null, "no error");
assert.ok(result instanceof Blob, "the result is a instance of Blob");
assert.equal(result.type, "application/zip", "the result has the right mime type");
assert.equal(result.size, expected.length, "the result has the right length");
} else {
assert.equal(result, null, "no data");
assert.ok(err.message.match("not supported by this platform"), "the error message is useful");
}
}
});
});
JSZipTestUtils.testZipFile("generate : type:blob mimeType:application/ods. " + testName, file, function(assert, expected) {
testGenerate(assert, {
prepare : JSZipTestUtils.createZipAll,
options : {type:"blob",mimeType: "application/ods",streamFiles:streamFiles},
skipReloadTest : true,
assertions : function (err, result) {
if (JSZip.support.blob) {
assert.equal(err, null, "no error");
assert.ok(result instanceof Blob, "the result is a instance of Blob");
assert.equal(result.type, "application/ods", "the result has the right mime type");
assert.equal(result.size, expected.length, "the result has the right length");
} else {
assert.equal(result, null, "no data");
assert.ok(err.message.match("not supported by this platform"), "the error message is useful");
}
}
});
});
});
testGenerateFor([{
name : "no stream",
// zip -0 -X store.zip Hello.txt
file : "ref/store.zip",
streamFiles : false
}, {
name : "with stream",
// zip -0 -X -fd store-stream.zip Hello.txt
file : "ref/store-stream.zip",
streamFiles : true
}], function(testName, file, streamFiles) {
JSZipTestUtils.testZipFile("STORE doesn't compress, " + testName, file, function(assert, expected) {
testGenerate(assert, {
prepare : function () {
var zip = new JSZip();
zip.file("Hello.txt", "This a looong file : we need to see the difference between the different compression methods.\n");
return zip;
},
options : {type:"binarystring", compression:"STORE",streamFiles:streamFiles},
assertions : function (err, result) {
assert.equal(err, null, "no error");
assert.ok(JSZipTestUtils.similar(result, expected, JSZipTestUtils.MAX_BYTES_DIFFERENCE_PER_ZIP_ENTRY) , "generated ZIP matches reference ZIP");
}
});
});
});
testGenerateFor([{
name : "no stream",
// zip -6 -X deflate.zip Hello.txt
file : "ref/deflate.zip",
streamFiles : false
}, {
name : "with stream",
// zip -6 -X -fd deflate-stream.zip Hello.txt
file : "ref/deflate-stream.zip",
streamFiles : true
}], function(testName, file, streamFiles) {
JSZipTestUtils.testZipFile("DEFLATE compress, " + testName, file, function(assert, expected) {
testGenerate(assert, {
prepare : function () {
var zip = new JSZip();
zip.file("Hello.txt", "This a looong file : we need to see the difference between the different compression methods.\n");
return zip;
},
options : {type:"binarystring", compression:"DEFLATE",streamFiles:streamFiles},
assertions : function (err, result) {
assert.equal(err, null, "no error");
assert.ok(JSZipTestUtils.similar(result, expected, JSZipTestUtils.MAX_BYTES_DIFFERENCE_PER_ZIP_ENTRY) , "generated ZIP matches reference ZIP");
}
});
});
});
JSZipTestUtils.testZipFile("STORE is the default method", "ref/text.zip", function(assert, expected) {
var zip = new JSZip();
zip.file("Hello.txt", "Hello World\n");
var done = assert.async();
zip.generateAsync({type:"binarystring", compression:"STORE"}).then(function(content) {
// no difference with the "Zip text file" test.
assert.ok(JSZipTestUtils.similar(content, expected, JSZipTestUtils.MAX_BYTES_DIFFERENCE_PER_ZIP_ENTRY) , "Generated ZIP matches reference ZIP");
done();
})["catch"](JSZipTestUtils.assertNoError);
});
function testLazyDecompression(assert, from, to) {
var done = assert.async();
JSZipTestUtils.createZipAll().generateAsync({type:"binarystring", compression:from}).then(function(actual) {
done();
testGenerate(assert, {
prepare : function () {
// the zip object will contain compressed objects
return JSZip.loadAsync(actual);
},
skipReloadTest : true,
options : {type:"binarystring", compression:to},
assertions : function (err) {
assert.equal(err, null, from + " -> " + to + " : no error");
}
});
})["catch"](JSZipTestUtils.assertNoError);
}
QUnit.test("Lazy decompression works", function(assert) {
testLazyDecompression(assert, "STORE", "STORE");
testLazyDecompression(assert, "DEFLATE", "STORE");
testLazyDecompression(assert, "STORE", "DEFLATE");
testLazyDecompression(assert, "DEFLATE", "DEFLATE");
});
// zip -0 -X empty.zip plop && zip -d empty.zip plop
JSZipTestUtils.testZipFile("empty zip", "ref/empty.zip", function(assert, expected) {
testGenerate(assert, {
prepare : function () {
var zip = new JSZip();
return zip;
},
options : {type:"binarystring"},
assertions : function (err, result) {
assert.equal(err, null, "no error");
assert.ok(JSZipTestUtils.similar(result, expected, 0 * JSZipTestUtils.MAX_BYTES_DIFFERENCE_PER_ZIP_ENTRY) , "generated ZIP matches reference ZIP");
}
});
});
QUnit.test("unknown compression throws an exception", function (assert) {
testGenerate(assert, {
prepare : JSZipTestUtils.createZipAll,
options : {type:"string",compression:"MAYBE"},
assertions : function (err, result) {
assert.equal(result, null, "no data");
assert.ok(err.message.match("not a valid compression"), "the error message is useful");
}
});
});
QUnit.test("missing type throws an exception", function (assert) {
testGenerate(assert, {
prepare : JSZipTestUtils.createZipAll,
options : {},
assertions : function (err, result) {
assert.equal(result, null, "no data");
assert.ok(err.message.match("No output type specified."), "the error message is useful");
}
});
});
QUnit.test("generateAsync uses the current folder level", function (assert) {
var done = assert.async();
var zip = new JSZip();
zip.file("file1", "a");
zip.folder("root1");
zip.folder("root2").file("leaf1", "a");
zip.folder("root2")
.generateAsync({type:"string"})
.then(JSZip.loadAsync)
.then(function(zip) {
assert.ok(!zip.file("file1"), "root files are not present");
assert.ok(!zip.file("root1"), "root folders are not present");
assert.ok(!zip.file("root2"), "root folders are not present");
assert.ok(zip.file("leaf1"), "leaves are present");
done();
})["catch"](JSZipTestUtils.assertNoError);
});
QUnit.test("generateAsync keep the explicit / folder", function (assert) {
var done = assert.async();
var zip = new JSZip();
zip.file("/file1", "a");
zip.file("/root1/file2", "b");
zip.generateAsync({type:"string"})
.then(JSZip.loadAsync)
.then(function(zip) {
assert.ok(zip.file("/file1"), "root files are present");
assert.ok(zip.file("/root1/file2"), "root folders are present");
done();
})["catch"](JSZipTestUtils.assertNoError);
});
JSZipTestUtils.testZipFile("generate with promises as files", "ref/all.zip", function (assert, expected) {
var done = assert.async();
var zip = new JSZip();
zip.file("Hello.txt", new JSZip.external.Promise(function (resolve) {
setTimeout(function () {
resolve("Hello World\n");
}, 50);
}));
zip.folder("images").file("smile.gif", new JSZip.external.Promise(function (resolve) {
setTimeout(function () {
resolve("R0lGODdhBQAFAIACAAAAAP/eACwAAAAABQAFAAACCIwPkWerClIBADs=");
}, 100);
}), {base64: true});
zip.generateAsync({type:"string"})
.then(function (result) {
assert.ok(JSZipTestUtils.similar(result, expected, 3 * JSZipTestUtils.MAX_BYTES_DIFFERENCE_PER_ZIP_ENTRY) , "generated ZIP matches reference ZIP");
done();
})["catch"](JSZipTestUtils.assertNoError);
});