| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436 | 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 stuffif (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                         Yesfunction 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)
 |