mirror of
https://github.com/wekan/wekan.git
synced 2025-04-24 22:17:16 -04:00
436 lines
11 KiB
JavaScript
436 lines
11 KiB
JavaScript
function bin2str(bufView) {
|
|
var length = bufView.length;
|
|
var result = '';
|
|
for (var i = 0; i<length; i+=65535) {
|
|
var addition = 65535;
|
|
if(i + 65535 > length) {
|
|
addition = length - i;
|
|
}
|
|
try {
|
|
// this fails on phantomjs due to old webkit bug; hence the try/catch
|
|
result += String.fromCharCode.apply(null, bufView.subarray(i,i+addition));
|
|
} catch (e) {
|
|
var dataArray = [];
|
|
for (var j = i; j < i+addition; j++) {
|
|
dataArray.push(bufView[j]);
|
|
}
|
|
result += String.fromCharCode.apply(null, dataArray);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
//function ab2str(buffer) {
|
|
// return bin2str(new Uint8Array(buffer));
|
|
//}
|
|
|
|
function str2ab(str) {
|
|
var buf = new ArrayBuffer(str.length);
|
|
var bufView = new Uint8Array(buf);
|
|
for (var i=0, strLen=str.length; i<strLen; i++) {
|
|
bufView[i] = str.charCodeAt(i);
|
|
}
|
|
return buf;
|
|
}
|
|
|
|
var fileCollection = new FS.Collection('files', {
|
|
stores: [
|
|
new FS.Store.GridFS('files')
|
|
],
|
|
uploader: null
|
|
});
|
|
|
|
// Set up server stuff
|
|
if (Meteor.isServer) {
|
|
var fs = Npm.require('fs');
|
|
var temp = Npm.require('temp');
|
|
var path = Npm.require('path');
|
|
|
|
// Automatically track and cleanup files at exit
|
|
temp.track();
|
|
|
|
// Set up HTTP method URL used by client tests
|
|
var conf = {
|
|
get: function () {
|
|
var buf = new Buffer('Hello World');
|
|
this.setContentType('text/plain');
|
|
return buf;
|
|
},
|
|
head: function () {
|
|
var buf = new Buffer('Hello World');
|
|
this.setContentType('text/plain');
|
|
this.addHeader('Content-Length', buf.length);
|
|
buf = null;
|
|
}
|
|
};
|
|
HTTP.methods({
|
|
'test': conf,
|
|
'test.txt': conf
|
|
});
|
|
|
|
// Save temp file for testing with
|
|
function openTempFile(name, callback) {
|
|
return temp.open(name, callback);
|
|
}
|
|
var openTempFileSync = Meteor.wrapAsync(openTempFile);
|
|
|
|
var info = openTempFileSync({suffix: '.txt'});
|
|
var tempFilePath = info.path;
|
|
var tempFileName = path.basename(tempFilePath);
|
|
fs.writeSync(info.fd, 'Hello World');
|
|
fs.closeSync(info.fd);
|
|
|
|
fileCollection.allow({
|
|
insert: function () {
|
|
return true;
|
|
},
|
|
update: function () {
|
|
return true;
|
|
},
|
|
remove: function () {
|
|
return true;
|
|
}
|
|
});
|
|
|
|
Meteor.publish("files", function () {
|
|
return fileCollection.find();
|
|
});
|
|
}
|
|
|
|
if (Meteor.isClient) {
|
|
Meteor.subscribe("files");
|
|
}
|
|
|
|
Tinytest.add('cfs-file - test environment', function(test) {
|
|
test.isTrue(typeof FS.Collection !== 'undefined', 'test environment not initialized FS.Collection');
|
|
test.isTrue(typeof FS.File !== 'undefined', 'test environment not initialized FS.File');
|
|
});
|
|
|
|
Tinytest.add('cfs-file - construction', function(test) {
|
|
// Normal object provided will extend the fileObj
|
|
var f = new FS.File({foo: "bar"});
|
|
test.equal(f.foo, "bar");
|
|
|
|
// If passed another FS.File instance, we clone it
|
|
var f2 = new FS.File(f);
|
|
test.equal(f2.foo, "bar");
|
|
});
|
|
|
|
// Types of data and how we support attaching:
|
|
//
|
|
// Type C/S Constructor attachData w/ callback attachData w/o callback
|
|
// ----------------------------------------------------------------------------------------------
|
|
// Buffer Server No Yes Yes
|
|
// ArrayBuffer Both No Yes Yes
|
|
// Binary Both No Yes Yes
|
|
// Data URI Both Yes Yes Yes
|
|
// URL Both Yes on Server Yes Yes on Server
|
|
// Filepath Server Yes Yes Yes
|
|
// File Client Yes Yes Yes
|
|
// Blob Client Yes Yes Yes
|
|
|
|
function doAttachDataConstructorTest(data, name, test) {
|
|
var f = new FS.File(data);
|
|
if (!name) {
|
|
test.isUndefined(f.name());
|
|
} else {
|
|
test.equal(f.name(), name);
|
|
}
|
|
test.equal(f.type(), "text/plain");
|
|
test.equal(f.size(), 11);
|
|
}
|
|
|
|
function doAttachDataSyncTest(data, opts, name, test) {
|
|
var f = new FS.File();
|
|
f.attachData(data, opts);
|
|
if (!name) {
|
|
test.isUndefined(f.name());
|
|
} else {
|
|
test.equal(f.name(), name);
|
|
}
|
|
test.equal(f.type(), "text/plain");
|
|
test.equal(f.size(), 11);
|
|
}
|
|
|
|
function doAttachDataAsyncTest(data, opts, name, test, next) {
|
|
var f = new FS.File();
|
|
f.attachData(data, opts, function (error) {
|
|
test.isFalse(!!error);
|
|
if (!name) {
|
|
test.isUndefined(f.name());
|
|
} else {
|
|
test.equal(f.name(), name);
|
|
}
|
|
test.equal(f.type(), "text/plain");
|
|
test.equal(f.size(), 11);
|
|
next();
|
|
});
|
|
}
|
|
|
|
/*
|
|
* BUFFER
|
|
*/
|
|
if (Meteor.isServer) {
|
|
Tinytest.add('cfs-file - attachData sync - Buffer', function(test) {
|
|
doAttachDataSyncTest(new Buffer('Hello World'), {type: "text/plain"}, null, test);
|
|
});
|
|
|
|
Tinytest.addAsync('cfs-file - attachData async - Buffer', function(test, next) {
|
|
doAttachDataAsyncTest(new Buffer('Hello World'), {type: "text/plain"}, null, test, next);
|
|
});
|
|
}
|
|
|
|
/*
|
|
* ARRAYBUFFER
|
|
*/
|
|
Tinytest.add('cfs-file - attachData sync - ArrayBuffer', function(test) {
|
|
doAttachDataSyncTest(str2ab('Hello World'), {type: "text/plain"}, null, test);
|
|
});
|
|
|
|
Tinytest.addAsync('cfs-file - attachData async - ArrayBuffer', function(test, next) {
|
|
doAttachDataAsyncTest(str2ab('Hello World'), {type: "text/plain"}, null, test, next);
|
|
});
|
|
|
|
/*
|
|
* Binary
|
|
*/
|
|
Tinytest.add('cfs-file - attachData sync - Binary', function(test) {
|
|
doAttachDataSyncTest(new Uint8Array(str2ab('Hello World')), {type: "text/plain"}, null, test);
|
|
});
|
|
|
|
Tinytest.addAsync('cfs-file - attachData async - Binary', function(test, next) {
|
|
doAttachDataAsyncTest(new Uint8Array(str2ab('Hello World')), {type: "text/plain"}, null, test, next);
|
|
});
|
|
|
|
/*
|
|
* Data URI
|
|
*/
|
|
var dataUri = 'data:text/plain;base64,SGVsbG8gV29ybGQ='; //'Hello World'
|
|
Tinytest.add('cfs-file - attachData sync - Data URI', function(test) {
|
|
doAttachDataSyncTest(dataUri, null, null, test);
|
|
});
|
|
|
|
Tinytest.addAsync('cfs-file - attachData async - Data URI', function(test, next) {
|
|
doAttachDataAsyncTest(dataUri, null, null, test, next);
|
|
});
|
|
|
|
Tinytest.add('cfs-file - attachData from constructor - Data URI', function(test) {
|
|
doAttachDataConstructorTest(dataUri, null, test);
|
|
});
|
|
|
|
/*
|
|
* URL
|
|
*/
|
|
var url = Meteor.absoluteUrl('test');
|
|
var url2 = Meteor.absoluteUrl('test.txt');
|
|
|
|
if (Meteor.isServer) {
|
|
Tinytest.add('cfs-file - attachData sync - URL', function(test) {
|
|
doAttachDataSyncTest(url, null, null, test);
|
|
doAttachDataSyncTest(url2, null, 'test.txt', test);
|
|
});
|
|
|
|
Tinytest.add('cfs-file - attachData from constructor - URL', function(test) {
|
|
doAttachDataConstructorTest(url, null, test);
|
|
doAttachDataConstructorTest(url2, 'test.txt', test);
|
|
});
|
|
}
|
|
|
|
Tinytest.addAsync('cfs-file - attachData async - URL', function(test, next) {
|
|
doAttachDataAsyncTest(url, null, null, test, function () {
|
|
doAttachDataAsyncTest(url2, null, 'test.txt', test, next);
|
|
});
|
|
});
|
|
|
|
/*
|
|
* Filepath
|
|
*/
|
|
if (Meteor.isServer) {
|
|
Tinytest.add('cfs-file - attachData sync - Filepath', function(test) {
|
|
doAttachDataSyncTest(tempFilePath, null, tempFileName, test);
|
|
});
|
|
|
|
Tinytest.addAsync('cfs-file - attachData async - Filepath', function(test, next) {
|
|
doAttachDataAsyncTest(tempFilePath, null, tempFileName, test, next);
|
|
});
|
|
|
|
Tinytest.add('cfs-file - attachData from constructor - Filepath', function(test) {
|
|
doAttachDataConstructorTest(tempFilePath, tempFileName, test);
|
|
});
|
|
}
|
|
|
|
/*
|
|
* Blob
|
|
*/
|
|
if (Meteor.isClient) {
|
|
var blob = new Blob(['Hello World'], {type : 'text/plain'});
|
|
Tinytest.add('cfs-file - attachData sync - Blob', function(test) {
|
|
doAttachDataSyncTest(blob, null, null, test);
|
|
});
|
|
|
|
Tinytest.addAsync('cfs-file - attachData async - Blob', function(test, next) {
|
|
doAttachDataAsyncTest(blob, null, null, test, next);
|
|
});
|
|
|
|
Tinytest.add('cfs-file - attachData from constructor - Blob', function(test) {
|
|
doAttachDataConstructorTest(blob, null, test);
|
|
});
|
|
}
|
|
|
|
/*
|
|
* Collection Mounting
|
|
*/
|
|
Tinytest.add('cfs-file - isMounted', function(test) {
|
|
var f = new FS.File();
|
|
test.isFalse(!!f.isMounted());
|
|
f.collectionName = "files";
|
|
test.isTrue(!!f.isMounted());
|
|
});
|
|
|
|
/*
|
|
* name/extension
|
|
*/
|
|
Tinytest.add('cfs-file - name/extension', function(test) {
|
|
var f = new FS.File();
|
|
// Set names
|
|
f.name("foo.pdf");
|
|
f.name("bar.txt", {store: "files"});
|
|
// Get names
|
|
test.equal(f.name(), "foo.pdf");
|
|
test.equal(f.name({store: "files"}), "bar.txt");
|
|
// Get extensions
|
|
test.equal(f.extension(), "pdf");
|
|
test.equal(f.extension({store: "files"}), "txt");
|
|
// Now change extensions
|
|
f.extension("txt");
|
|
f.extension("pdf", {store: "files"});
|
|
// Get changed extensions
|
|
test.equal(f.extension(), "txt");
|
|
test.equal(f.extension({store: "files"}), "pdf");
|
|
});
|
|
|
|
/*
|
|
* size
|
|
*/
|
|
Tinytest.add('cfs-file - size', function(test) {
|
|
var f = new FS.File();
|
|
// Set size
|
|
f.size(1);
|
|
f.size(2, {store: "files"});
|
|
// Get size
|
|
test.equal(f.size(), 1);
|
|
test.equal(f.size({store: "files"}), 2);
|
|
});
|
|
|
|
/*
|
|
* type
|
|
*/
|
|
Tinytest.add('cfs-file - type', function(test) {
|
|
var f = new FS.File();
|
|
// Set type
|
|
f.type("image/png");
|
|
f.type("image/jpg", {store: "files"});
|
|
// Get type
|
|
test.equal(f.type(), "image/png");
|
|
test.equal(f.type({store: "files"}), "image/jpg");
|
|
});
|
|
|
|
/*
|
|
* updatedAt
|
|
*/
|
|
Tinytest.add('cfs-file - updatedAt', function(test) {
|
|
var f = new FS.File();
|
|
var d1 = new Date("2014-01-01");
|
|
var d2 = new Date("2014-02-01");
|
|
// Set updatedAt
|
|
f.updatedAt(d1);
|
|
f.updatedAt(d2, {store: "files"});
|
|
// Get updatedAt
|
|
test.equal(f.updatedAt().getTime(), d1.getTime());
|
|
test.equal(f.updatedAt({store: "files"}).getTime(), d2.getTime());
|
|
});
|
|
|
|
/*
|
|
* update, uploadProgress, and isUploaded
|
|
*/
|
|
Tinytest.addAsync('cfs-file - update, uploadProgress, and isUploaded', function(test, next) {
|
|
// Progress is based on chunkCount/chunkSum
|
|
var f = new FS.File('data:text/plain;base64,SGVsbG8gV29ybGQ=');
|
|
fileCollection.insert(f, function () {
|
|
f.update({$set: {chunkSum: 2, chunkCount: 1}}, function (error, result) {
|
|
test.isFalse(!!error);
|
|
test.equal(f.uploadProgress(), 50);
|
|
test.isFalse(f.isUploaded());
|
|
// But if uploadedAt is set, we should always get 100
|
|
f.update({$set: {uploadedAt: new Date}}, function (error, result) {
|
|
test.isFalse(!!error);
|
|
test.equal(f.uploadProgress(), 100);
|
|
test.isTrue(f.isUploaded());
|
|
next();
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
/*
|
|
* remove
|
|
*/
|
|
Tinytest.addAsync('cfs-file - remove', function(test, next) {
|
|
var f = new FS.File('data:text/plain;base64,SGVsbG8gV29ybGQ=');
|
|
var newId;
|
|
fileCollection.insert(f, function (error, fileObj) {
|
|
test.isFalse(!!error);
|
|
test.instanceOf(fileObj, FS.File);
|
|
newId = fileObj._id;
|
|
test.isTrue(!!fileCollection.findOne(newId));
|
|
// Wait 5 seconds to remove; otherwise we could
|
|
// cause errors with the tempstore or SA trying
|
|
// to save.
|
|
Meteor.setTimeout(function () {
|
|
fileObj.remove(function (error, result) {
|
|
test.isFalse(!!error);
|
|
test.equal(result, 1);
|
|
test.isFalse(!!fileCollection.findOne(newId));
|
|
next();
|
|
});
|
|
}, 5000);
|
|
});
|
|
});
|
|
|
|
if (Meteor.isServer) {
|
|
/*
|
|
* createWriteStream
|
|
*/
|
|
Tinytest.add('cfs-file - createWriteStream', function(test) {
|
|
//TODO
|
|
test.isTrue(true);
|
|
});
|
|
|
|
/*
|
|
* createReadStream
|
|
*/
|
|
Tinytest.add('cfs-file - createReadStream', function(test) {
|
|
//TODO
|
|
test.isTrue(true);
|
|
});
|
|
}
|
|
|
|
//Test API:
|
|
//test.isFalse(v, msg)
|
|
//test.isTrue(v, msg)
|
|
//test.equalactual, expected, message, not
|
|
//test.length(obj, len)
|
|
//test.include(s, v)
|
|
//test.isNaN(v, msg)
|
|
//test.isUndefined(v, msg)
|
|
//test.isNotNull
|
|
//test.isNull
|
|
//test.throws(func)
|
|
//test.instanceOf(obj, klass)
|
|
//test.notEqual(actual, expected, message)
|
|
//test.runId()
|
|
//test.exception(exception)
|
|
//test.expect_fail()
|
|
//test.ok(doc)
|
|
//test.fail(doc)
|
|
//test.equal(a, b, msg)
|