blob: 1d36ff0ffc5729fa485fb45f09e6e0fd168b4bb3 [file] [edit]
"use strict";
QUnit.module("file", function () {
function str2blob (str) {
var u8 = new Uint8Array(str.length);
for(var i = 0; i < str.length; i++) {
u8[i] = str.charCodeAt(i);
}
try {
// don't use an Uint8Array, see the comment on utils.newBlob
return new Blob([u8.buffer], {type:"text/plain"});
} catch (e) {
var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
var builder = new Builder();
builder.append(u8.buffer);
return builder.getBlob("text/plain");
}
}
QUnit.module("add");
JSZipTestUtils.testZipFile("Zip text file !", "ref/text.zip", function(assert, expected) {
var done = assert.async();
var zip = new JSZip();
zip.file("Hello.txt", "Hello World\n");
JSZipTestUtils.checkBasicStreamBehavior(assert, zip.generateInternalStream({type:"binarystring"}));
zip.generateAsync({type:"binarystring"}).then(function (actual) {
assert.ok(JSZipTestUtils.similar(actual, expected, JSZipTestUtils.MAX_BYTES_DIFFERENCE_PER_ZIP_ENTRY) , "Generated ZIP matches reference ZIP");
JSZipTestUtils.checkGenerateStability(assert, actual);
done();
})["catch"](JSZipTestUtils.assertNoError);
});
JSZipTestUtils.testZipFile("Zip text, folder and image", "ref/all.zip", function(assert, expected) {
var zip = new JSZip();
zip.file("Hello.txt", "Hello World\n");
zip.folder("images").file("smile.gif", "R0lGODdhBQAFAIACAAAAAP/eACwAAAAABQAFAAACCIwPkWerClIBADs=", {base64: true});
var done = assert.async();
zip.generateAsync({type:"binarystring"}).then(function(actual) {
assert.ok(JSZipTestUtils.similar(actual, expected, 3 * JSZipTestUtils.MAX_BYTES_DIFFERENCE_PER_ZIP_ENTRY) , "Generated ZIP matches reference ZIP");
JSZipTestUtils.checkGenerateStability(assert, actual);
done();
})["catch"](JSZipTestUtils.assertNoError);
});
JSZipTestUtils.testZipFile("Add a file to overwrite", "ref/text.zip", function(assert, expected) {
var zip = new JSZip();
zip.file("Hello.txt", "hello ?");
zip.file("Hello.txt", "Hello World\n");
var done = assert.async();
zip.generateAsync({type:"binarystring"}).then(function (actual) {
assert.ok(JSZipTestUtils.similar(actual, expected, JSZipTestUtils.MAX_BYTES_DIFFERENCE_PER_ZIP_ENTRY) , "Generated ZIP matches reference ZIP");
JSZipTestUtils.checkGenerateStability(assert, actual);
done();
})["catch"](JSZipTestUtils.assertNoError);
});
JSZipTestUtils.testZipFile("Zip text file with date", "ref/text.zip", function(assert, expected) {
var zip = new JSZip();
zip.file("Hello.txt", "Hello World\n", {date : new Date("July 17, 2009 14:36:57")});
var done = assert.async();
zip.generateAsync({type:"binarystring"}).then(function(actual) {
/*
Expected differing bytes:
2 version number
4 central dir version numbers
4 external file attributes
10 Total
*/
assert.ok(JSZipTestUtils.similar(actual, expected, 10) , "Generated ZIP matches reference ZIP");
JSZipTestUtils.checkGenerateStability(assert, actual);
done();
})["catch"](JSZipTestUtils.assertNoError);
});
JSZipTestUtils.testZipFile("Zip image file", "ref/image.zip", function(assert, expected) {
var zip = new JSZip();
zip.file("smile.gif", "R0lGODdhBQAFAIACAAAAAP/eACwAAAAABQAFAAACCIwPkWerClIBADs=", {base64: true});
var done = assert.async();
zip.generateAsync({type:"binarystring"}).then(function(actual) {
assert.ok(JSZipTestUtils.similar(actual, expected, JSZipTestUtils.MAX_BYTES_DIFFERENCE_PER_ZIP_ENTRY) , "Generated ZIP matches reference ZIP");
JSZipTestUtils.checkGenerateStability(assert, actual);
done();
})["catch"](JSZipTestUtils.assertNoError);
});
JSZipTestUtils.testZipFile("add file: from XHR (with bytes > 255)", "ref/text.zip", function(assert, textZip) {
var zip = new JSZip();
zip.file("text.zip", textZip, {binary:true});
var done = assert.async();
zip.generateAsync({type:"binarystring"}).then(function(actual) {
// high-order byte is discarded and won't mess up the result
JSZipTestUtils.checkGenerateStability(assert, actual);
done();
})["catch"](JSZipTestUtils.assertNoError);
});
QUnit.test("add file: wrong string as base64", function(assert) {
var zip = new JSZip();
zip.file("text.txt", "a random string", {base64:true});
var done = assert.async();
zip.generateAsync({type:"binarystring"}).then(function() {
assert.ok(false, "generateAsync should fail");
done();
})["catch"](function (e) {
assert.equal(e.message, "Invalid base64 input, bad content length.", "triggers the correct error");
done();
});
});
QUnit.test("add file: data url instead of base64", function(assert) {
var zip = new JSZip();
zip.file("text.txt", "data:image/png;base64,YmFzZTY0", {base64:true});
var done = assert.async();
zip.generateAsync({type:"binarystring"}).then(function() {
assert.ok(false, "generateAsync should fail");
done();
})["catch"](function (e) {
assert.equal(e.message, "Invalid base64 input, it looks like a data url.", "triggers the correct error");
done();
});
});
function testFileDataGetters (assert, opts) {
if (typeof opts.rawData === "undefined") {
opts.rawData = opts.textData;
}
_actualTestFileDataGetters.testGetter(assert, opts, "string");
_actualTestFileDataGetters.testGetter(assert, opts, "text");
_actualTestFileDataGetters.testGetter(assert, opts, "base64");
_actualTestFileDataGetters.testGetter(assert, opts, "array");
_actualTestFileDataGetters.testGetter(assert, opts, "binarystring");
_actualTestFileDataGetters.testGetter(assert, opts, "arraybuffer");
_actualTestFileDataGetters.testGetter(assert, opts, "uint8array");
_actualTestFileDataGetters.testGetter(assert, opts, "nodebuffer");
_actualTestFileDataGetters.testGetter(assert, opts, "blob");
_actualTestFileDataGetters.testGetter(assert, opts, "unknown");
_actualTestFileDataGetters.testGetter(assert, opts, null);
var done = assert.async();
opts.zip.generateAsync({type:"binarystring"})
.then(JSZip.loadAsync)
.then(function(zip) {
var reloaded = {
name : "(reloaded) " + opts.name,
zip : zip,
textData : opts.textData,
rawData : opts.rawData
};
_actualTestFileDataGetters.testGetter(assert, reloaded, "string");
_actualTestFileDataGetters.testGetter(assert, reloaded, "text");
_actualTestFileDataGetters.testGetter(assert, reloaded, "base64");
_actualTestFileDataGetters.testGetter(assert, reloaded, "array");
_actualTestFileDataGetters.testGetter(assert, reloaded, "binarystring");
_actualTestFileDataGetters.testGetter(assert, reloaded, "arraybuffer");
_actualTestFileDataGetters.testGetter(assert, reloaded, "uint8array");
_actualTestFileDataGetters.testGetter(assert, reloaded, "nodebuffer");
_actualTestFileDataGetters.testGetter(assert, reloaded, "blob");
_actualTestFileDataGetters.testGetter(assert, reloaded, "unknown");
_actualTestFileDataGetters.testGetter(assert, reloaded, null);
opts.zip.file("file.txt", "changing the content after the call won't change the result");
done();
})["catch"](JSZipTestUtils.assertNoError);
opts.zip.file("file.txt", "changing the content after the call won't change the result");
}
var _actualTestFileDataGetters = {
testGetter : function (assert, opts, askedType) {
var asyncTestName = "[test = " + opts.name + "] [method = async(" + askedType + ")] ";
var stream = opts.zip.file("file.txt").internalStream(askedType);
JSZipTestUtils.checkBasicStreamBehavior(assert, stream, asyncTestName);
var done = assert.async();
opts.zip.file("file.txt").async(askedType).then(function(result) {
_actualTestFileDataGetters["assert_" + askedType](opts, null, result, asyncTestName);
done();
}, function (err) {
_actualTestFileDataGetters["assert_" + askedType](opts, err, null, asyncTestName);
done();
});
},
assert_string: function (opts, err, txt, testName) {
QUnit.assert.equal(err, null, testName + "no error");
QUnit.assert.equal(txt, opts.textData, testName + "content ok");
},
assert_text: function () {
this.assert_string.apply(this, arguments);
},
assert_base64: function (opts, err, bin, testName) {
QUnit.assert.equal(err, null, testName + "no error");
QUnit.assert.equal(bin, JSZipTestUtils.base64encode(opts.rawData), testName + "content ok");
},
assert_binarystring : function (opts, err, bin, testName) {
QUnit.assert.equal(err, null, testName + "no error");
QUnit.assert.equal(bin, opts.rawData, testName + "content ok");
},
assert_array : function (opts, err, array, testName) {
QUnit.assert.equal(err, null, testName + "no error");
QUnit.assert.ok(array instanceof Array, testName + "the result is a instance of Array");
var actual = JSZipTestUtils.toString(array);
QUnit.assert.equal(actual, opts.rawData, testName + "content ok");
},
assert_arraybuffer : function (opts, err, buffer, testName) {
if (JSZip.support.arraybuffer) {
QUnit.assert.equal(err, null, testName + "no error");
QUnit.assert.ok(buffer instanceof ArrayBuffer, testName + "the result is a instance of ArrayBuffer");
var actual = JSZipTestUtils.toString(buffer);
QUnit.assert.equal(actual, opts.rawData, testName + "content ok");
} else {
QUnit.assert.equal(buffer, null, testName + "no data");
QUnit.assert.ok(err.message.match("not supported by this platform"), testName + "the error message is useful");
}
},
assert_uint8array : function (opts, err, bufferView, testName) {
if (JSZip.support.uint8array) {
QUnit.assert.equal(err, null, testName + "no error");
QUnit.assert.ok(bufferView instanceof Uint8Array, testName+ "the result is a instance of Uint8Array");
var actual = JSZipTestUtils.toString(bufferView);
QUnit.assert.equal(actual, opts.rawData, testName + "content ok");
} else {
QUnit.assert.equal(bufferView, null, testName + "no data");
QUnit.assert.ok(err.message.match("not supported by this platform"), testName + "the error message is useful");
}
},
assert_nodebuffer : function (opts, err, buffer, testName) {
if (JSZip.support.nodebuffer) {
QUnit.assert.equal(err, null, testName + "no error");
QUnit.assert.ok(buffer instanceof Buffer, testName + "the result is a instance of Buffer");
var actual = JSZipTestUtils.toString(buffer);
QUnit.assert.equal(actual, opts.rawData, testName + "content ok");
} else {
QUnit.assert.equal(buffer, null, testName + "no data");
QUnit.assert.ok(err.message.match("not supported by this platform"), testName + "the error message is useful");
}
},
assert_blob : function (opts, err, blob, testName) {
if (JSZip.support.blob) {
QUnit.assert.equal(err, null, testName + "no error");
QUnit.assert.ok(blob instanceof Blob, testName + "the result is a instance of Blob");
QUnit.assert.equal(blob.type, "", testName + "the result has the right mime type");
QUnit.assert.equal(blob.size, opts.rawData.length, testName + "the result has the right length");
} else {
QUnit.assert.equal(blob, null, testName + "no data");
QUnit.assert.ok(err.message.match("not supported by this platform"), testName + "the error message is useful");
}
},
assert_unknown : function (opts, err, buffer, testName) {
QUnit.assert.equal(buffer, null, testName + "no data");
QUnit.assert.ok(err.message.match("not supported by this platform"), testName + "the error message is useful");
},
assert_null : function (opts, err, buffer, testName) {
QUnit.assert.equal(buffer, null, testName + "no data");
QUnit.assert.ok(err.message.match("No output type specified"), testName + "the error message is useful");
}
};
QUnit.test("add file: file(name, undefined)", function (assert) {
var zip = new JSZip(), undef;
zip.file("file.txt", undef);
testFileDataGetters(assert, {name : "undefined", zip : zip, textData : ""});
zip = new JSZip();
zip.file("file.txt", undef, {binary:true});
testFileDataGetters(assert, {name : "undefined as binary", zip : zip, textData : ""});
zip = new JSZip();
zip.file("file.txt", undef, {base64:true});
testFileDataGetters(assert, {name : "undefined as base64", zip : zip, textData : ""});
});
QUnit.test("add file: file(name, null)", function (assert) {
var zip = new JSZip();
zip.file("file.txt", null);
testFileDataGetters(assert, {name : "null", zip : zip, textData : ""});
zip = new JSZip();
zip.file("file.txt", null, {binary:true});
testFileDataGetters(assert, {name : "null as binary", zip : zip, textData : ""});
zip = new JSZip();
zip.file("file.txt", null, {base64:true});
testFileDataGetters(assert, {name : "null as base64", zip : zip, textData : ""});
});
QUnit.test("add file: file(name, stringAsText)", function (assert) {
var zip = new JSZip();
zip.file("file.txt", "€15\n", {binary:false});
testFileDataGetters(assert, {name : "utf8", zip : zip, textData : "€15\n", rawData : "\xE2\x82\xAC15\n"});
zip = new JSZip();
zip.file("file.txt", "test\r\ntest\r\n", {binary:false});
testFileDataGetters(assert, {name : "\\r\\n", zip : zip, textData : "test\r\ntest\r\n"});
});
QUnit.test("add file: file(name, stringAsBinary)", function (assert) {
var zip = new JSZip();
zip.file("file.txt", "\xE2\x82\xAC15\n", {binary:true});
testFileDataGetters(assert, {name : "utf8", zip : zip, textData : "€15\n", rawData : "\xE2\x82\xAC15\n"});
zip = new JSZip();
zip.file("file.txt", "test\r\ntest\r\n", {binary:true});
testFileDataGetters(assert, {name : "\\r\\n", zip : zip, textData : "test\r\ntest\r\n"});
});
QUnit.test("add file: file(name, array)", function (assert) {
var zip = new JSZip();
function toArray(str) {
var array = new Array(str.length);
for (var i = 0; i < str.length; i++) {
array[i] = str.charCodeAt(i);
}
return array;
}
zip.file("file.txt", toArray("\xE2\x82\xAC15\n"), {binary:true});
testFileDataGetters(assert, {name : "utf8", zip : zip, textData : "€15\n", rawData : "\xE2\x82\xAC15\n"});
zip = new JSZip();
zip.file("file.txt", toArray("test\r\ntest\r\n"), {binary:true});
testFileDataGetters(assert, {name : "\\r\\n", zip : zip, textData : "test\r\ntest\r\n"});
});
QUnit.test("add file: file(name, base64)", function (assert) {
var zip = new JSZip();
zip.file("file.txt", "4oKsMTUK", {base64:true});
testFileDataGetters(assert, {name : "utf8", zip : zip, textData : "€15\n", rawData : "\xE2\x82\xAC15\n"});
zip = new JSZip();
zip.file("file.txt", "dGVzdA0KdGVzdA0K", {base64:true});
testFileDataGetters(assert, {name : "\\r\\n", zip : zip, textData : "test\r\ntest\r\n"});
});
QUnit.test("add file: file(name, unsupported)", function (assert) {
var done = assert.async();
var zip = new JSZip();
zip.file("test.txt", new Date());
zip.file("test.txt")
.async("string")
// XXX zip.file(name, data) returns a ZipObject for chaining,
// we need to try to get the value to get the error
.then(function () {
assert.ok(false, "An unsupported object was added, but no exception thrown");
done();
}, function (e) {
assert.ok(e.message.match("Is it in a supported JavaScript type"), "the error message is useful");
done();
});
});
if (JSZip.support.uint8array) {
QUnit.test("add file: file(name, Uint8Array)", function (assert) {
var str2array = function (str) {
var array = new Uint8Array(str.length);
for(var i = 0; i < str.length; i++) {
array[i] = str.charCodeAt(i);
}
return array;
};
var zip = new JSZip();
zip.file("file.txt", str2array("\xE2\x82\xAC15\n"));
testFileDataGetters(assert, {name : "utf8", zip : zip, textData : "€15\n", rawData : "\xE2\x82\xAC15\n"});
zip = new JSZip();
zip.file("file.txt", str2array("test\r\ntest\r\n"));
testFileDataGetters(assert, {name : "\\r\\n", zip : zip, textData : "test\r\ntest\r\n"});
zip = new JSZip();
zip.file("file.txt", str2array(""));
testFileDataGetters(assert, {name : "empty content", zip : zip, textData : ""});
});
}
if (JSZip.support.arraybuffer) {
QUnit.test("add file: file(name, ArrayBuffer)", function (assert) {
var str2buffer = function (str) {
var array = new Uint8Array(str.length);
for(var i = 0; i < str.length; i++) {
array[i] = str.charCodeAt(i);
}
return array.buffer;
};
var zip = new JSZip();
zip.file("file.txt", str2buffer("\xE2\x82\xAC15\n"));
testFileDataGetters(assert, {name : "utf8", zip : zip, textData : "€15\n", rawData : "\xE2\x82\xAC15\n"});
zip = new JSZip();
zip.file("file.txt", str2buffer("test\r\ntest\r\n"));
testFileDataGetters(assert, {name : "\\r\\n", zip : zip, textData : "test\r\ntest\r\n"});
zip = new JSZip();
zip.file("file.txt", str2buffer(""));
testFileDataGetters(assert, {name : "empty content", zip : zip, textData : ""});
});
}
if (JSZip.support.blob) {
QUnit.test("add file: file(name, Blob)", function (assert) {
var zip = new JSZip();
zip.file("file.txt", str2blob("\xE2\x82\xAC15\n"));
testFileDataGetters(assert, {name : "utf8", zip : zip, textData : "€15\n", rawData : "\xE2\x82\xAC15\n"});
zip = new JSZip();
zip.file("file.txt", str2blob("test\r\ntest\r\n"));
testFileDataGetters(assert, {name : "\\r\\n", zip : zip, textData : "test\r\ntest\r\n"});
zip = new JSZip();
zip.file("file.txt", str2blob(""));
testFileDataGetters(assert, {name : "empty content", zip : zip, textData : ""});
});
}
if (typeof Promise !== "undefined") {
QUnit.test("add file: file(name, native Promise)", function (assert) {
var str2promise = function (str) {
return new Promise(function(resolve) {
setTimeout(function () {
resolve(str);
}, 10);
});
};
var zip = new JSZip();
zip.file("file.txt", str2promise("\xE2\x82\xAC15\n"));
testFileDataGetters(assert, {name : "utf8", zip : zip, textData : "€15\n", rawData : "\xE2\x82\xAC15\n"});
zip = new JSZip();
zip.file("file.txt", str2promise("test\r\ntest\r\n"));
testFileDataGetters(assert, {name : "\\r\\n", zip : zip, textData : "test\r\ntest\r\n"});
zip = new JSZip();
zip.file("file.txt", str2promise(""));
testFileDataGetters(assert, {name : "empty content", zip : zip, textData : ""});
});
}
QUnit.test("add file: file(name, polyfill Promise[string] as binary)", function (assert) {
var str2promise = function (str) {
return new JSZip.external.Promise(function(resolve) {
setTimeout(function () {
resolve(str);
}, 10);
});
};
var zip = new JSZip();
zip.file("file.txt", str2promise("\xE2\x82\xAC15\n"), {binary: true});
testFileDataGetters(assert, {name : "utf8", zip : zip, textData : "€15\n", rawData : "\xE2\x82\xAC15\n"});
});
QUnit.test("add file: file(name, polyfill Promise[string] force text)", function (assert) {
var str2promise = function (str) {
return new JSZip.external.Promise(function(resolve) {
setTimeout(function () {
resolve(str);
}, 10);
});
};
var zip = new JSZip();
zip.file("file.txt", str2promise("€15\n"), {binary: false});
testFileDataGetters(assert, {name : "utf8", zip : zip, textData : "€15\n", rawData : "\xE2\x82\xAC15\n"});
});
/*
* Fix #325 for this one
*
QUnit.test("add file: file(name, polyfill Promise[string] as text)", function (assert) {
var str2promise = function (str) {
return new JSZip.external.Promise(function(resolve, reject) {
setTimeout(function () {
resolve(str);
}, 10);
});
};
var zip = new JSZip();
zip.file("file.txt", str2promise("€15\n"));
testFileDataGetters(assert, {name : "utf8", zip : zip, textData : "€15\n", rawData : "\xE2\x82\xAC15\n"});
zip = new JSZip();
zip.file("file.txt", str2promise("test\r\ntest\r\n"));
testFileDataGetters(assert, {name : "\\r\\n", zip : zip, textData : "test\r\ntest\r\n"});
zip = new JSZip();
zip.file("file.txt", str2promise(""));
testFileDataGetters(assert, {name : "empty content", zip : zip, textData : ""});
});
*/
if (JSZip.support.blob) {
QUnit.test("add file: file(name, polyfill Promise[Blob])", function (assert) {
var str2promiseOfBlob = function (str) {
return new JSZip.external.Promise(function(resolve) {
setTimeout(function () {
resolve(str2blob(str));
}, 10);
});
};
var zip = new JSZip();
zip.file("file.txt", str2promiseOfBlob("\xE2\x82\xAC15\n"));
testFileDataGetters(assert, {name : "utf8", zip : zip, textData : "€15\n", rawData : "\xE2\x82\xAC15\n"});
zip = new JSZip();
zip.file("file.txt", str2promiseOfBlob("test\r\ntest\r\n"));
testFileDataGetters(assert, {name : "\\r\\n", zip : zip, textData : "test\r\ntest\r\n"});
zip = new JSZip();
zip.file("file.txt", str2promiseOfBlob(""));
testFileDataGetters(assert, {name : "empty content", zip : zip, textData : ""});
});
}
if (JSZip.support.nodebuffer) {
QUnit.test("add file: file(name, Buffer)", function (assert) {
var str2buffer = function (str) {
var array = new Buffer(str.length);
for(var i = 0; i < str.length; i++) {
array[i] = str.charCodeAt(i);
}
return array;
};
var zip = new JSZip();
zip.file("file.txt", str2buffer("\xE2\x82\xAC15\n"));
testFileDataGetters(assert, {name : "utf8", zip : zip, textData : "€15\n", rawData : "\xE2\x82\xAC15\n"});
zip = new JSZip();
zip.file("file.txt", str2buffer("test\r\ntest\r\n"));
testFileDataGetters(assert, {name : "\\r\\n", zip : zip, textData : "test\r\ntest\r\n"});
zip = new JSZip();
zip.file("file.txt", str2buffer(""));
testFileDataGetters(assert, {name : "empty content", zip : zip, textData : ""});
});
}
QUnit.module("about folders");
QUnit.test("Zip folder() shouldn't throw an exception", function (assert) {
var zip = new JSZip();
try {
zip.folder();
assert.ok(true, "no exception thrown");
} catch (e) {
assert.ok(false, e.message||e);
}
});
JSZipTestUtils.testZipFile("Zip empty folder", "ref/folder.zip", function(assert, expected) {
var zip = new JSZip();
zip.folder("folder");
var done = assert.async();
zip.generateAsync({type:"binarystring"}).then(function(actual) {
assert.ok(JSZipTestUtils.similar(actual, expected, JSZipTestUtils.MAX_BYTES_DIFFERENCE_PER_ZIP_ENTRY) , "Generated ZIP matches reference ZIP");
JSZipTestUtils.checkGenerateStability(assert, actual);
done();
})["catch"](JSZipTestUtils.assertNoError);
});
QUnit.test("file() creates a folder with dir:true", function (assert) {
var zip = new JSZip();
zip.file("folder", null, {
dir : true
});
assert.ok(zip.files["folder/"].dir, "the folder with options is marked as a folder");
});
QUnit.test("file() creates a folder with the right unix permissions", function (assert) {
var zip = new JSZip();
zip.file("folder", null, {
unixPermissions : parseInt("40500", 8)
});
assert.ok(zip.files["folder/"].dir, "the folder with options is marked as a folder");
});
QUnit.test("file() creates a folder with the right dos permissions", function (assert) {
var zip = new JSZip();
zip.file("folder", null, {
dosPermissions : parseInt("010000", 2)
});
assert.ok(zip.files["folder/"].dir, "the folder with options is marked as a folder");
});
QUnit.test("A folder stays a folder when created with file", function (assert) {
var referenceDate = new Date("July 17, 2009 14:36:56");
var referenceComment = "my comment";
var zip = new JSZip();
zip.file("folder", null, {
dir : true,
date : referenceDate,
comment : referenceComment,
unixPermissions : parseInt("40500", 8)
});
assert.ok(zip.files["folder/"].dir, "the folder with options is marked as a folder");
assert.equal(zip.files["folder/"].date.getTime(), referenceDate.getTime(), "the folder with options has the correct date");
assert.equal(zip.files["folder/"].comment, referenceComment, "the folder with options has the correct comment");
assert.equal(zip.files["folder/"].unixPermissions.toString(8), "40500", "the folder with options has the correct UNIX permissions");
var done = assert.async();
zip.generateAsync({type:"string", platform:"UNIX"})
.then(JSZip.loadAsync)
.then(function (reloaded) {
assert.ok(reloaded.files["folder/"].dir, "the folder with options is marked as a folder");
assert.ok(reloaded.files["folder/"].dir, "the folder with options is marked as a folder");
assert.equal(reloaded.files["folder/"].date.getTime(), referenceDate.getTime(), "the folder with options has the correct date");
assert.equal(reloaded.files["folder/"].comment, referenceComment, "the folder with options has the correct comment");
assert.equal(reloaded.files["folder/"].unixPermissions.toString(8), "40500", "the folder with options has the correct UNIX permissions");
done();
})["catch"](JSZipTestUtils.assertNoError);
});
QUnit.test("file() adds a slash for directories", function (assert) {
var zip = new JSZip();
zip.file("folder_without_slash", null, {
dir : true
});
zip.file("folder_with_slash/", null, {
dir : true
});
assert.ok(zip.files["folder_without_slash/"], "added a slash if not provided");
assert.ok(zip.files["folder_with_slash/"], "keep the existing slash");
});
QUnit.test("folder() doesn't overwrite existing entries", function (assert) {
var referenceComment = "my comment";
var zip = new JSZip();
zip.file("folder", null, {
dir : true,
comment : referenceComment,
unixPermissions : parseInt("40500", 8)
});
// calling folder() doesn't override it
zip.folder("folder");
assert.equal(zip.files["folder/"].comment, referenceComment, "the folder with options has the correct comment");
assert.equal(zip.files["folder/"].unixPermissions.toString(8), "40500", "the folder with options has the correct UNIX permissions");
});
QUnit.test("createFolders works on a file", function (assert) {
var zip = new JSZip();
zip.file("false/0/1/2/file", "content", {createFolders:false, unixPermissions:"644"});
zip.file("true/0/1/2/file", "content", {createFolders:true, unixPermissions:"644"});
assert.ok(!zip.files["false/"], "the false/ folder doesn't exist");
assert.ok(zip.files["true/"], "the true/ folder exists");
assert.equal(zip.files["true/"].unixPermissions, null, "the options are not propagated");
});
QUnit.test("createFolders works on a folder", function (assert) {
var zip = new JSZip();
zip.file("false/0/1/2/folder", null, {createFolders:false, unixPermissions:"777",dir:true});
zip.file("true/0/1/2/folder", null, {createFolders:true, unixPermissions:"777",dir:true});
assert.ok(!zip.files["false/"], "the false/ folder doesn't exist");
assert.ok(zip.files["true/"], "the true/ folder exists");
assert.equal(zip.files["true/"].unixPermissions, null, "the options are not propagated");
});
QUnit.test("folder follows the default createFolders settings", function (assert) {
var zip = new JSZip();
zip.folder("true/0/1/2/folder");
assert.ok(zip.files["true/"], "the true/ folder exists");
});
QUnit.test("A folder stays a folder", function (assert) {
var zip = new JSZip();
zip.folder("folder/");
assert.ok(zip.files["folder/"].dir, "the folder is marked as a folder");
var done = assert.async();
zip.generateAsync({type:"binarystring"})
.then(JSZip.loadAsync)
.then(function (reloaded) {
assert.ok(reloaded.files["folder/"].dir, "the folder is marked as a folder");
done();
})["catch"](JSZipTestUtils.assertNoError);
});
QUnit.test("Folders are created by default", function (assert) {
var zip = new JSZip();
zip.file("test/Readme", "Hello World!\n");
assert.ok(zip.files["test/Readme"], "the file exists");
assert.ok(zip.files["test/"], "the folder exists");
});
QUnit.test("Folders can be avoided with createFolders", function (assert) {
var zip = new JSZip();
zip.file("test/Readme", "Hello World!\n", {createFolders: false});
assert.ok(zip.files["test/Readme"], "the file exists");
assert.ok(!zip.files["test/"], "the folder doesn't exist");
});
QUnit.module("find entries");
QUnit.test("Finding a file", function(assert) {
var zip = new JSZip();
zip.file("Readme", "Hello World!\n");
zip.file("Readme.French", "Bonjour tout le monde!\n");
zip.file("Readme.Pirate", "Ahoy m'hearty!\n");
var done = assert.async();
zip.file("Readme.French").async("string").then(function (content) {
assert.equal(content, "Bonjour tout le monde!\n", "Exact match found");
done();
})["catch"](JSZipTestUtils.assertNoError);
assert.equal(zip.file("Readme.Deutsch"), null, "Match exactly nothing");
assert.equal(zip.file(/Readme\../).length, 2, "Match regex free text");
assert.equal(zip.file(/pirate/i).length, 1, "Match regex 1 result");
});
QUnit.test("Finding a file (text search) with a relative folder", function (assert) {
var zip = new JSZip();
zip.folder("files/default").file("Readme", "Hello World!\n");
zip.folder("files/translation").file("Readme.French", "Bonjour tout le monde!\n");
zip.folder("files").folder("translation").file("Readme.Pirate", "Ahoy m'hearty!\n");
var done = assert.async(3);
zip.file("files/translation/Readme.French").async("string").then(function (content) {
assert.equal(content, "Bonjour tout le monde!\n", "finding file with the full path");
done();
})["catch"](JSZipTestUtils.assertNoError);
zip.folder("files").file("translation/Readme.French").async("string").then(function (content) {
assert.equal(content, "Bonjour tout le monde!\n", "finding file with a relative path");
done();
})["catch"](JSZipTestUtils.assertNoError);
zip.folder("files/translation").file("Readme.French").async("string").then(function (content) {
assert.equal(content, "Bonjour tout le monde!\n", "finding file with a relative path");
done();
})["catch"](JSZipTestUtils.assertNoError);
});
QUnit.test("Finding files (regex) with a relative folder", function (assert) {
var zip = new JSZip();
zip.folder("files/default").file("Readme", "Hello World!\n");
zip.folder("files/translation").file("Readme.French", "Bonjour tout le monde!\n");
zip.folder("files").folder("translation").file("Readme.Pirate", "Ahoy m'hearty!\n");
assert.equal(zip.file(/Readme/).length, 3, "match files in subfolders");
assert.equal(zip.folder("files/translation").file(/Readme/).length, 2, "regex match only in subfolders");
assert.equal(zip.folder("files").folder("translation").file(/Readme/).length, 2, "regex match only in subfolders");
assert.equal(zip.folder("files/translation").file(/pirate/i).length, 1, "regex match only in subfolders");
assert.equal(zip.folder("files/translation").file(/^readme/i).length, 2, "regex match only with the relative path");
assert.equal(zip.folder("files/default").file(/pirate/i).length, 0, "regex match only in subfolders");
});
QUnit.test("Finding folders", function (assert) {
var zip = new JSZip();
zip.folder("root/").folder("sub1/");
zip.folder("root/sub2/subsub1");
assert.equal(zip.folder(/sub2\/$/).length, 1, "unique result");
assert.equal(zip.folder(/sub1/).length, 2, "multiple results");
assert.equal(zip.folder(/root/).length, 4, "match on whole path");
});
QUnit.test("Finding folders with relative path", function (assert) {
var zip = new JSZip();
zip.folder("root/").folder("sub1/");
zip.folder("root/sub2/subsub1");
var root = zip.folder("root/sub2");
assert.equal(root.folder(/sub2\/$/).length, 0, "current folder is not matched");
assert.equal(root.folder(/sub1/).length, 1, "sub folder is matched");
assert.equal(root.folder(/^subsub1/).length, 1, "relative folder path is used");
assert.equal(root.folder(/root/).length, 0, "parent folder is not matched");
});
function zipObjectsAssertions(assert, zipObject) {
var date = new Date("July 17, 2009 14:36:57");
assert.equal(zipObject.name, "Hello.txt", "ZipObject#name is here");
assert.equal(zipObject.comment, "my comment", "ZipObject#comment is here");
// the zip date has a 2s resolution
var delta = Math.abs(zipObject.date.getTime() - date.getTime());
assert.ok(delta < 2000/* ms */, date, "ZipObject#date is here");
}
QUnit.test("ZipObject attributes", function (assert) {
var date = new Date("July 17, 2009 14:36:57");
var zip = new JSZip();
zip.file("Hello.txt", "Hello World\n", {comment:"my comment", date:date});
zipObjectsAssertions(assert, zip.file("Hello.txt"));
zipObjectsAssertions(assert, zip.files["Hello.txt"]);
var done = assert.async();
zip.generateAsync({type:"binarystring"})
.then(JSZip.loadAsync)
.then(function(reloaded) {
zipObjectsAssertions(assert, reloaded.file("Hello.txt"));
zipObjectsAssertions(assert, reloaded.files["Hello.txt"]);
done();
})["catch"](JSZipTestUtils.assertNoError);
});
QUnit.test("generate uses updated ZipObject date attribute", function (assert) {
var date = new Date("July 17, 2009 14:36:57");
var zip = new JSZip();
zip.file("Hello.txt", "Hello World\n", {comment:"my comment"}); // date = now
zip.files["Hello.txt"].date = date;
var done = assert.async();
zip.generateAsync({type:"binarystring"})
.then(JSZip.loadAsync)
.then(function(reloaded) {
zipObjectsAssertions(assert, reloaded.file("Hello.txt"));
zipObjectsAssertions(assert, reloaded.files["Hello.txt"]);
done();
})["catch"](JSZipTestUtils.assertNoError);
});
});