zotero/test/tests/fileTest.js
Dan Stillman 383eac4657 Use same directory for OS.File.moveAtomic() temp file
Using the main temp directory was causing writes to fail when storage
was on another filesystem.
2017-02-22 19:53:48 -05:00

165 lines
5.6 KiB
JavaScript

describe("Zotero.File", function () {
describe("#getContentsAsync()", function () {
it("should handle an empty file", function* () {
var path = OS.Path.join(getTestDataDirectory().path, "empty");
assert.equal((yield Zotero.File.getContentsAsync(path)), "");
})
it("should handle an extended character", function* () {
var contents = yield Zotero.File.getContentsAsync(
OS.Path.join(getTestDataDirectory().path, "charsets", "utf8.txt")
);
assert.lengthOf(contents, 3);
assert.equal(contents, "A\u72acB");
})
it("should handle an extended Windows-1252 character", function* () {
var contents = yield Zotero.File.getContentsAsync(
OS.Path.join(getTestDataDirectory().path, "charsets", "windows1252.txt"),
"windows-1252"
);
assert.lengthOf(contents, 1);
assert.equal(contents, "\u00E9");
})
it("should handle a GBK character", function* () {
var contents = yield Zotero.File.getContentsAsync(
OS.Path.join(getTestDataDirectory().path, "charsets", "gbk.txt"),
"gbk"
);
assert.lengthOf(contents, 1);
assert.equal(contents, "\u4e02");
})
it("should handle an invalid character", function* () {
var contents = yield Zotero.File.getContentsAsync(
OS.Path.join(getTestDataDirectory().path, "charsets", "invalid.txt")
);
assert.lengthOf(contents, 3);
assert.equal(contents, "A\uFFFDB");
})
it("should respect maxLength", function* () {
var contents = yield Zotero.File.getContentsAsync(
OS.Path.join(getTestDataDirectory().path, "test.txt"),
false,
6
);
assert.lengthOf(contents, 6);
assert.equal(contents, "Zotero");
});
it("should get a file from a file: URI", function* () {
var contents = yield Zotero.File.getContentsAsync(
OS.Path.toFileURI(OS.Path.join(getTestDataDirectory().path, "test.txt"))
);
assert.isTrue(contents.startsWith('Zotero'));
});
})
describe("#getBinaryContentsAsync()", function () {
var magicPNG = ["89", "50", "4e", "47", "0d", "0a", "1a", "0a"].map(x => parseInt(x, 16));
it("should return a binary string", function* () {
var contents = yield Zotero.File.getBinaryContentsAsync(
OS.Path.join(getTestDataDirectory().path, "test.png")
);
assert.isAbove(contents.length, magicPNG.length);
for (let i = 0; i < magicPNG.length; i++) {
assert.equal(magicPNG[i], contents.charCodeAt(i));
}
});
it("should respect maxLength", function* () {
var contents = yield Zotero.File.getBinaryContentsAsync(
OS.Path.join(getTestDataDirectory().path, "test.png"),
magicPNG.length
);
assert.lengthOf(contents, magicPNG.length)
for (let i = 0; i < contents.length; i++) {
assert.equal(magicPNG[i], contents.charCodeAt(i));
}
});
});
describe("#putContentsAsync()", function () {
it("should save via .tmp file", function* () {
var tmpDir = yield getTempDirectory();
var destFile = OS.Path.join(tmpDir, 'test.txt')
var tmpFile = destFile + ".tmp";
yield Zotero.File.putContentsAsync(tmpFile, 'A');
assert.isTrue(yield OS.File.exists(tmpFile));
yield Zotero.File.putContentsAsync(destFile, 'B');
assert.isFalse(yield OS.File.exists(tmpFile));
// Make sure .tmp file created when creating temp file was deleted too
assert.isFalse(yield OS.File.exists(tmpFile + '.tmp'));
});
});
describe("#copyDirectory()", function () {
it("should copy all files within a directory", function* () {
var tmpDir = Zotero.getTempDirectory().path;
var tmpCopyDir = OS.Path.join(tmpDir, "copyDirectory")
var source = OS.Path.join(tmpCopyDir, "1");
var target = OS.Path.join(tmpCopyDir, "2");
yield OS.File.makeDir(source, {
from: tmpDir
});
yield Zotero.File.putContentsAsync(OS.Path.join(source, "A"), "Test 1");
yield Zotero.File.putContentsAsync(OS.Path.join(source, "B"), "Test 2");
yield OS.File.removeDir(target, {
ignoreAbsent: true
});
yield Zotero.File.copyDirectory(source, target);
assert.equal(
(yield Zotero.File.getContentsAsync(OS.Path.join(target, "A"))),
"Test 1"
);
assert.equal(
(yield Zotero.File.getContentsAsync(OS.Path.join(target, "B"))),
"Test 2"
);
})
})
describe("#zipDirectory()", function () {
it("should compress a directory recursively", function* () {
var tmpPath = Zotero.getTempDirectory().path;
var path = OS.Path.join(tmpPath, Zotero.Utilities.randomString());
yield OS.File.makeDir(path, { unixMode: 0o755 });
yield Zotero.File.putContentsAsync(OS.Path.join(path, '.zotero-ft-cache'), '');
yield Zotero.File.putContentsAsync(OS.Path.join(path, 'a.txt'), 'A');
// Create subdirectory
var subPath = OS.Path.join(path, 'sub');
yield OS.File.makeDir(subPath, { unixMode: 0o755 });
yield Zotero.File.putContentsAsync(OS.Path.join(subPath, 'b.txt'), 'B');
var zipFile = OS.Path.join(tmpPath, 'test.zip');
yield Zotero.File.zipDirectory(path, zipFile);
var zr = Components.classes["@mozilla.org/libjar/zip-reader;1"]
.createInstance(Components.interfaces.nsIZipReader);
zr.open(Zotero.File.pathToFile(zipFile));
var entries = zr.findEntries('*');
var files = {};
var is = Components.classes['@mozilla.org/scriptableinputstream;1']
.createInstance(Components.interfaces.nsIScriptableInputStream);
while (entries.hasMore()) {
let entryPointer = entries.getNext();
let entry = zr.getEntry(entryPointer);
let inputStream = zr.getInputStream(entryPointer);
is.init(inputStream);
files[entryPointer] = is.read(entry.realSize);
}
zr.close();
assert.notProperty(files, '.zotero-ft-cache');
assert.propertyVal(files, 'a.txt', 'A');
assert.propertyVal(files, 'sub/b.txt', 'B');
});
});
})