diff --git a/example/app-cloud.js b/example/app-cloud.js index e5a6463..3e8c7b1 100644 --- a/example/app-cloud.js +++ b/example/app-cloud.js @@ -2,26 +2,26 @@ var StorageService = require('../').StorageService; var path = require('path'); var rs = StorageService({ - provider: 'rackspace', - username: 'strongloop', - apiKey: 'your-rackspace-api-key' + provider: 'rackspace', + username: 'strongloop', + apiKey: 'your-rackspace-api-key' }); // Container rs.getContainers(function (err, containers) { - if (err) { - console.error(err); - return; - } - containers.forEach(function (c) { - console.log('rackspace: ', c.name); - c.getFiles(function (err, files) { - files.forEach(function (f) { - console.log('....', f.name); - }); - }); + if (err) { + console.error(err); + return; + } + containers.forEach(function (c) { + console.log('rackspace: ', c.name); + c.getFiles(function (err, files) { + files.forEach(function (f) { + console.log('....', f.name); + }); }); + }); }); /* @@ -38,54 +38,51 @@ rs.getContainers(function (err, containers) { client.removeFile(container, file, function (err) { }); */ - var s3 = StorageService({ - provider: 'amazon', - key: 'your-amazon-key', - keyId: 'your-amazon-key-id' + provider: 'amazon', + key: 'your-amazon-key', + keyId: 'your-amazon-key-id' }); s3.getContainers(function (err, containers) { - if (err) { - console.error(err); - return; - } - containers.forEach(function (c) { - console.log('amazon: ', c.name); - c.getFiles(function (err, files) { - files.forEach(function (f) { - console.log('....', f.name); - }); - }); + if (err) { + console.error(err); + return; + } + containers.forEach(function (c) { + console.log('amazon: ', c.name); + c.getFiles(function (err, files) { + files.forEach(function (f) { + console.log('....', f.name); + }); }); + }); }); - var fs = require('fs'); var path = require('path'); -var stream = s3.uploadStream('con1','test.jpg'); +var stream = s3.uploadStream('con1', 'test.jpg'); var input = fs.createReadStream(path.join(__dirname, 'test.jpg')).pipe(stream); - var local = StorageService({ - provider: 'filesystem', - root: path.join(__dirname, 'storage') + provider: 'filesystem', + root: path.join(__dirname, 'storage') }); // Container local.getContainers(function (err, containers) { - if (err) { - console.error(err); - return; - } - containers.forEach(function (c) { - console.log('filesystem: ', c.name); - c.getFiles(function (err, files) { - files.forEach(function (f) { - console.log('....', f.name); - }); - }); + if (err) { + console.error(err); + return; + } + containers.forEach(function (c) { + console.log('filesystem: ', c.name); + c.getFiles(function (err, files) { + files.forEach(function (f) { + console.log('....', f.name); + }); }); + }); }); diff --git a/example/app.js b/example/app.js index 339b367..56c91df 100644 --- a/example/app.js +++ b/example/app.js @@ -1,5 +1,5 @@ var loopback = require('loopback') - , app = module.exports = loopback(); + , app = module.exports = loopback(); var path = require('path'); @@ -9,13 +9,13 @@ app.use(app.router); app.use(loopback.rest()); app.configure(function () { - app.set('port', process.env.PORT || 3000); + app.set('port', process.env.PORT || 3000); }); var ds = loopback.createDataSource({ - connector: require('../index'), - provider: 'filesystem', - root: path.join(__dirname, 'storage') + connector: require('../index'), + provider: 'filesystem', + root: path.join(__dirname, 'storage') }); var container = ds.createModel('container'); @@ -23,17 +23,17 @@ var container = ds.createModel('container'); app.model(container); app.get('/', function (req, res, next) { - res.setHeader('Content-Type', 'text/html'); - var form = "

Storage Service Demo

" + - "List all containers

" + - "Upload to container c1:

" + - "

" - + "File to upload:
" - + "Notes about the file:
" - + "
" + - ""; - res.send(form); - res.end(); + res.setHeader('Content-Type', 'text/html'); + var form = "

Storage Service Demo

" + + "List all containers

" + + "Upload to container c1:

" + + "

" + + "File to upload:
" + + "Notes about the file:
" + + "
" + + ""; + res.send(form); + res.end(); }); app.listen(app.get('port')); diff --git a/example/upload-amazon.js b/example/upload-amazon.js index 7e60997..5122acd 100644 --- a/example/upload-amazon.js +++ b/example/upload-amazon.js @@ -4,75 +4,75 @@ var express = require('express'); var app = express(); app.configure(function () { - app.set('port', process.env.PORT || 3001); - app.set('views', __dirname + '/views'); - app.set('view engine', 'ejs'); - app.use(express.favicon()); - // app.use(express.logger('dev')); - app.use(express.methodOverride()); - app.use(app.router); + app.set('port', process.env.PORT || 3001); + app.set('views', __dirname + '/views'); + app.set('view engine', 'ejs'); + app.use(express.favicon()); + // app.use(express.logger('dev')); + app.use(express.methodOverride()); + app.use(app.router); }); var handler = new StorageService( -{ + { provider: 'amazon', key: 'your-amazon-key', keyId: 'your-amazon-key-id' -}); + }); app.get('/', function (req, res, next) { - res.setHeader('Content-Type', 'text/html'); - var form = "

Storage Service Demo

" + - "List all containers

" + - "Upload to container con1:

" + - "

" - + "File to upload:
" - + "Notes about the file:
" - + "
" + - ""; - res.send(form); - res.end(); + res.setHeader('Content-Type', 'text/html'); + var form = "

Storage Service Demo

" + + "List all containers

" + + "Upload to container con1:

" + + "

" + + "File to upload:
" + + "Notes about the file:
" + + "
" + + ""; + res.send(form); + res.end(); }); app.post('/upload/:container', function (req, res, next) { - handler.upload(req, res, function (err, result) { - if (!err) { - res.setHeader('Content-Type', 'application/json'); - res.send(200, result); - } else { - res.send(500, err); - } - }); + handler.upload(req, res, function (err, result) { + if (!err) { + res.setHeader('Content-Type', 'application/json'); + res.send(200, result); + } else { + res.send(500, err); + } + }); }); app.get('/download', function (req, res, next) { - handler.getContainers(function (err, containers) { - var html = "

Containers

Home

"; - res.send(200, html); + handler.getContainers(function (err, containers) { + var html = "

Containers

Home

"; + res.send(200, html); + }); }); app.get('/download/:container', function (req, res, next) { - handler.getFiles(req.params.container, function (err, files) { - var html = "

Files in container " + req.params.container + "

Home

"; - res.send(200, html); + handler.getFiles(req.params.container, function (err, files) { + var html = "

Files in container " + req.params.container + "

Home

"; + res.send(200, html); + }); }); app.get('/download/:container/:file', function (req, res, next) { - handler.download(req, res, function (err, result) { - if (err) { - res.send(500, err); - } - }); + handler.download(req, res, function (err, result) { + if (err) { + res.send(500, err); + } + }); }); app.listen(app.get('port')); diff --git a/example/upload.js b/example/upload.js index efb28cf..105c038 100644 --- a/example/upload.js +++ b/example/upload.js @@ -4,13 +4,13 @@ var express = require('express'); var app = express(); app.configure(function () { - app.set('port', process.env.PORT || 3001); - app.set('views', __dirname + '/views'); - app.set('view engine', 'ejs'); - app.use(express.favicon()); - // app.use(express.logger('dev')); - app.use(express.methodOverride()); - app.use(app.router); + app.set('port', process.env.PORT || 3001); + app.set('views', __dirname + '/views'); + app.set('view engine', 'ejs'); + app.use(express.favicon()); + // app.use(express.logger('dev')); + app.use(express.methodOverride()); + app.use(app.router); }); // Create the container @@ -20,58 +20,58 @@ mkdirp.sync('/tmp/storage/con1'); var handler = new StorageService({provider: 'filesystem', root: '/tmp/storage'}); app.get('/', function (req, res, next) { - res.setHeader('Content-Type', 'text/html'); - var form = "

Storage Service Demo

" + - "List all containers

" + - "Upload to container con1:

" + - "

" - + "File to upload:
" - + "Notes about the file:
" - + "
" + - ""; - res.send(form); - res.end(); + res.setHeader('Content-Type', 'text/html'); + var form = "

Storage Service Demo

" + + "List all containers

" + + "Upload to container con1:

" + + "

" + + "File to upload:
" + + "Notes about the file:
" + + "
" + + ""; + res.send(form); + res.end(); }); app.post('/upload/:container', function (req, res, next) { - handler.upload(req, res, function (err, result) { - if (!err) { - res.setHeader('Content-Type', 'application/json'); - res.send(200, result); - } else { - res.send(500, err); - } - }); + handler.upload(req, res, function (err, result) { + if (!err) { + res.setHeader('Content-Type', 'application/json'); + res.send(200, result); + } else { + res.send(500, err); + } + }); }); app.get('/download', function (req, res, next) { - handler.getContainers(function (err, containers) { - var html = "

Containers

Home

"; - res.send(200, html); + handler.getContainers(function (err, containers) { + var html = "

Containers

Home

"; + res.send(200, html); + }); }); app.get('/download/:container', function (req, res, next) { - handler.getFiles(req.params.container, function (err, files) { - var html = "

Files in container " + req.params.container + "

Home

"; - res.send(200, html); + handler.getFiles(req.params.container, function (err, files) { + var html = "

Files in container " + req.params.container + "

Home

"; + res.send(200, html); + }); }); app.get('/download/:container/:file', function (req, res, next) { - handler.download(req, res, function (err, result) { - if (err) { - res.send(500, err); - } - }); + handler.download(req, res, function (err, result) { + if (err) { + res.send(500, err); + } + }); }); app.listen(app.get('port')); diff --git a/lib/factory.js b/lib/factory.js index f59de4f..dcea329 100644 --- a/lib/factory.js +++ b/lib/factory.js @@ -4,19 +4,19 @@ * @returns {*} */ function createClient(options) { - options = options || {}; - var provider = options.provider || 'filesystem'; - var handler; + options = options || {}; + var provider = options.provider || 'filesystem'; + var handler; - try { - // Try to load the provider from providers folder - handler = require('./providers/' + provider); - } catch (err) { - // Fall back to pkgcloud - handler = require('pkgcloud').storage; - } - - return handler.createClient(options); + try { + // Try to load the provider from providers folder + handler = require('./providers/' + provider); + } catch (err) { + // Fall back to pkgcloud + handler = require('pkgcloud').storage; + } + + return handler.createClient(options); } /** @@ -25,13 +25,13 @@ function createClient(options) { * @returns {*} */ function getProvider(provider) { - try { - // Try to load the provider from providers folder - return require('./providers/' + provider); - } catch (err) { - // Fall back to pkgcloud - return require('pkgcloud').providers[provider]; - } + try { + // Try to load the provider from providers folder + return require('./providers/' + provider); + } catch (err) { + // Fall back to pkgcloud + return require('pkgcloud').providers[provider]; + } } module.exports.createClient = createClient; diff --git a/lib/storage-connector.js b/lib/storage-connector.js index f72dc65..8894d0d 100644 --- a/lib/storage-connector.js +++ b/lib/storage-connector.js @@ -5,22 +5,24 @@ var StorageService = require('./storage-service'); * @param callback */ exports.initialize = function (dataSource, callback) { - var settings = dataSource.settings || {}; + var settings = dataSource.settings || {}; - var connector = new StorageService(settings); - dataSource.connector = connector; - dataSource.connector.dataSource = dataSource; + var connector = new StorageService(settings); + dataSource.connector = connector; + dataSource.connector.dataSource = dataSource; - connector.DataAccessObject = function() {}; - for (var m in StorageService.prototype) { - var method = StorageService.prototype[m]; - if ('function' === typeof method) { - connector.DataAccessObject[m] = method.bind(connector); - for(var k in method) { - connector.DataAccessObject[m][k] = method[k]; - } - } + connector.DataAccessObject = function () { + }; + for (var m in StorageService.prototype) { + var method = StorageService.prototype[m]; + if ('function' === typeof method) { + connector.DataAccessObject[m] = method.bind(connector); + for (var k in method) { + connector.DataAccessObject[m][k] = method[k]; + } } + } - connector.define = function(model, properties, settings) {}; + connector.define = function (model, properties, settings) { + }; }; diff --git a/lib/storage-handler.js b/lib/storage-handler.js index 2c48030..2cb9118 100644 --- a/lib/storage-handler.js +++ b/lib/storage-handler.js @@ -10,96 +10,96 @@ var StringDecoder = require('string_decoder').StringDecoder; * @param {Function} cb The callback */ exports.upload = function (provider, req, res, container, cb) { - var form = new IncomingForm(this.options); - container = container || req.params.container; - var fields = {}, files = {}; - form.handlePart = function (part) { - var self = this; + var form = new IncomingForm(this.options); + container = container || req.params.container; + var fields = {}, files = {}; + form.handlePart = function (part) { + var self = this; - if (part.filename === undefined) { - var value = '' - , decoder = new StringDecoder(this.encoding); + if (part.filename === undefined) { + var value = '' + , decoder = new StringDecoder(this.encoding); - part.on('data', function (buffer) { - self._fieldsSize += buffer.length; - if (self._fieldsSize > self.maxFieldsSize) { - self._error(new Error('maxFieldsSize exceeded, received ' + self._fieldsSize + ' bytes of field data')); - return; - } - value += decoder.write(buffer); - }); - - part.on('end', function () { - var values = fields[part.name]; - if(values === undefined) { - values = [value]; - fields[part.name] = values; - } else { - values.push(value); - } - self.emit('field', part.name, value); - }); - return; + part.on('data', function (buffer) { + self._fieldsSize += buffer.length; + if (self._fieldsSize > self.maxFieldsSize) { + self._error(new Error('maxFieldsSize exceeded, received ' + self._fieldsSize + ' bytes of field data')); + return; } + value += decoder.write(buffer); + }); - this._flushing++; - - var file = { - container: container, - name: part.filename, - type: part.mime - }; - - self.emit('fileBegin', part.name, file); - - var headers = {}; - if('content-type' in part.headers) { - headers['content-type'] = part.headers['content-type']; + part.on('end', function () { + var values = fields[part.name]; + if (values === undefined) { + values = [value]; + fields[part.name] = values; + } else { + values.push(value); } - var writer = provider.upload({container: container, remote: part.filename}); + self.emit('field', part.name, value); + }); + return; + } - var endFunc = function () { - self._flushing--; - var values = files[part.name]; - if(values === undefined) { - values = [file]; - files[part.name] = values; - } else { - values.push(file); - } - self.emit('file', part.name, file); - self._maybeEnd(); - }; + this._flushing++; - /* - part.on('data', function (buffer) { - self.pause(); - writer.write(buffer, function () { - // pkgcloud stream doesn't make callbacks - }); - self.resume(); - }); - - part.on('end', function () { - - writer.end(); // pkgcloud stream doesn't make callbacks - endFunc(); - }); - */ - - part.pipe(writer, { end: false }); - part.on("end", function() { - writer.end(); - endFunc(); - }); + var file = { + container: container, + name: part.filename, + type: part.mime }; - form.parse(req, function (err, _fields, _files) { - if(err) { - console.error(err); - } - cb && cb(err, {files: files, fields: fields}); + self.emit('fileBegin', part.name, file); + + var headers = {}; + if ('content-type' in part.headers) { + headers['content-type'] = part.headers['content-type']; + } + var writer = provider.upload({container: container, remote: part.filename}); + + var endFunc = function () { + self._flushing--; + var values = files[part.name]; + if (values === undefined) { + values = [file]; + files[part.name] = values; + } else { + values.push(file); + } + self.emit('file', part.name, file); + self._maybeEnd(); + }; + + /* + part.on('data', function (buffer) { + self.pause(); + writer.write(buffer, function () { + // pkgcloud stream doesn't make callbacks + }); + self.resume(); + }); + + part.on('end', function () { + + writer.end(); // pkgcloud stream doesn't make callbacks + endFunc(); + }); + */ + + part.pipe(writer, { end: false }); + part.on("end", function () { + writer.end(); + endFunc(); }); + }; + + form.parse(req, function (err, _fields, _files) { + if (err) { + console.error(err); + } + cb && cb(err, {files: files, fields: fields}); + }); } /** @@ -111,15 +111,15 @@ exports.upload = function (provider, req, res, container, cb) { * @param {String} file The file name * @param {Function} cb The callback */ -exports.download = function(provider, req, res, container, file, cb) { - var reader = provider.download({ - container: container || req && req.params.container, - remote: file || req && req.params.file - }); - reader.pipe(res); - reader.on('error', function(err) { - res.send(500, { error: err }); - }); +exports.download = function (provider, req, res, container, file, cb) { + var reader = provider.download({ + container: container || req && req.params.container, + remote: file || req && req.params.file + }); + reader.pipe(res); + reader.on('error', function (err) { + res.send(500, { error: err }); + }); } diff --git a/lib/storage-service.js b/lib/storage-service.js index ff30886..fa83d6f 100644 --- a/lib/storage-service.js +++ b/lib/storage-service.js @@ -24,22 +24,22 @@ function StorageService(options) { function map(obj) { return obj; /* - if (!obj || typeof obj !== 'object') { - return obj; - } - var data = {}; - for (var i in obj) { - if (obj.hasOwnProperty(i) && typeof obj[i] !== 'function' - && typeof obj[i] !== 'object') { - if (i === 'newListener' || i === 'delimiter' || i === 'wildcard') { - // Skip properties from the base class - continue; - } - data[i] = obj[i]; - } - } - return data; - */ + if (!obj || typeof obj !== 'object') { + return obj; + } + var data = {}; + for (var i in obj) { + if (obj.hasOwnProperty(i) && typeof obj[i] !== 'function' + && typeof obj[i] !== 'object') { + if (i === 'newListener' || i === 'delimiter' || i === 'wildcard') { + // Skip properties from the base class + continue; + } + data[i] = obj[i]; + } + } + return data; + */ } StorageService.prototype.getContainers = function (cb) { diff --git a/test/fs.test.js b/test/fs.test.js index 2ea5a47..27f19f3 100644 --- a/test/fs.test.js +++ b/test/fs.test.js @@ -5,143 +5,143 @@ var path = require('path'); describe('FileSystem based storage provider', function () { - describe('container apis', function () { - var client = null; - it('should require an existing directory as the root', function (done) { - client = new FileSystemProvider({root: path.join(__dirname, 'storage')}); - process.nextTick(done); - }); - - it('should complain if the root directory doesn\'t exist', function (done) { - try { - client = new FileSystemProvider({root: path.join(__dirname, '_storage')}); - process.nextTick(done.bind(null, 'Error')); - } catch (err) { - // Should be here - process.nextTick(done); - } - }); - - it('should return an empty list of containers', function (done) { - client.getContainers(function (err, containers) { - assert(!err); - assert.equal(0, containers.length); - done(err, containers); - }); - }); - - it('should create a new container', function (done) { - client.createContainer({name: 'c1'}, function (err, container) { - assert(!err); - done(err, container); - }); - }); - - it('should get a container c1', function (done) { - client.getContainer('c1', function (err, container) { - assert(!err); - done(err, container); - }); - }); - - it('should not get a container c2', function (done) { - client.getContainer('c2', function (err, container) { - assert(err); - done(null, container); - }); - }); - - it('should return one container', function (done) { - client.getContainers(function (err, containers) { - assert(!err); - assert.equal(1, containers.length); - done(err, containers); - }); - }); - - it('should destroy a container c1', function (done) { - client.destroyContainer('c1', function (err, container) { - assert(!err); - done(err, container); - }); - }); - - it('should not get a container c1 after destroy', function (done) { - client.getContainer('c1', function (err, container) { - assert(err); - done(null, container); - }); - }); + describe('container apis', function () { + var client = null; + it('should require an existing directory as the root', function (done) { + client = new FileSystemProvider({root: path.join(__dirname, 'storage')}); + process.nextTick(done); }); - describe('file apis', function () { - var fs = require('fs'); - var client = new FileSystemProvider({root: path.join(__dirname, 'storage')}); - - it('should create a new container', function (done) { - client.createContainer({name: 'c1'}, function (err, container) { - assert(!err); - done(err, container); - }); - }); - - it('should upload a file', function (done) { - var writer = client.upload({container: 'c1', remote: 'f1.txt'}); - fs.createReadStream(path.join(__dirname, 'files/f1.txt')).pipe(writer); - writer.on('finish', done); - writer.on('error', done); - }); - - it('should download a file', function (done) { - var reader = client.download({ - container: 'c1', - remote: 'f1.txt' - }); - reader.pipe(fs.createWriteStream(path.join(__dirname, 'files/f1_downloaded.txt'))); - reader.on('end', done); - reader.on('error', done); - }); - - it('should get files for a container', function (done) { - client.getFiles('c1', function (err, files) { - assert(!err); - assert.equal(1, files.length); - done(err, files); - }); - }); - - it('should get a file', function (done) { - client.getFile('c1', 'f1.txt', function (err, f) { - assert(!err); - assert.ok(f); - done(err, f); - }); - }); - - it('should remove a file', function (done) { - client.removeFile('c1', 'f1.txt', function (err) { - assert(!err); - done(err); - }); - }); - - it('should get no files from a container', function (done) { - client.getFiles('c1', function (err, files) { - assert(!err); - assert.equal(0, files.length); - done(err, files); - }); - }); - - it('should destroy a container c1', function (done) { - client.destroyContainer('c1', function (err, container) { - // console.error(err); - assert(!err); - done(err, container); - }); - }); - + it('should complain if the root directory doesn\'t exist', function (done) { + try { + client = new FileSystemProvider({root: path.join(__dirname, '_storage')}); + process.nextTick(done.bind(null, 'Error')); + } catch (err) { + // Should be here + process.nextTick(done); + } }); + + it('should return an empty list of containers', function (done) { + client.getContainers(function (err, containers) { + assert(!err); + assert.equal(0, containers.length); + done(err, containers); + }); + }); + + it('should create a new container', function (done) { + client.createContainer({name: 'c1'}, function (err, container) { + assert(!err); + done(err, container); + }); + }); + + it('should get a container c1', function (done) { + client.getContainer('c1', function (err, container) { + assert(!err); + done(err, container); + }); + }); + + it('should not get a container c2', function (done) { + client.getContainer('c2', function (err, container) { + assert(err); + done(null, container); + }); + }); + + it('should return one container', function (done) { + client.getContainers(function (err, containers) { + assert(!err); + assert.equal(1, containers.length); + done(err, containers); + }); + }); + + it('should destroy a container c1', function (done) { + client.destroyContainer('c1', function (err, container) { + assert(!err); + done(err, container); + }); + }); + + it('should not get a container c1 after destroy', function (done) { + client.getContainer('c1', function (err, container) { + assert(err); + done(null, container); + }); + }); + }); + + describe('file apis', function () { + var fs = require('fs'); + var client = new FileSystemProvider({root: path.join(__dirname, 'storage')}); + + it('should create a new container', function (done) { + client.createContainer({name: 'c1'}, function (err, container) { + assert(!err); + done(err, container); + }); + }); + + it('should upload a file', function (done) { + var writer = client.upload({container: 'c1', remote: 'f1.txt'}); + fs.createReadStream(path.join(__dirname, 'files/f1.txt')).pipe(writer); + writer.on('finish', done); + writer.on('error', done); + }); + + it('should download a file', function (done) { + var reader = client.download({ + container: 'c1', + remote: 'f1.txt' + }); + reader.pipe(fs.createWriteStream(path.join(__dirname, 'files/f1_downloaded.txt'))); + reader.on('end', done); + reader.on('error', done); + }); + + it('should get files for a container', function (done) { + client.getFiles('c1', function (err, files) { + assert(!err); + assert.equal(1, files.length); + done(err, files); + }); + }); + + it('should get a file', function (done) { + client.getFile('c1', 'f1.txt', function (err, f) { + assert(!err); + assert.ok(f); + done(err, f); + }); + }); + + it('should remove a file', function (done) { + client.removeFile('c1', 'f1.txt', function (err) { + assert(!err); + done(err); + }); + }); + + it('should get no files from a container', function (done) { + client.getFiles('c1', function (err, files) { + assert(!err); + assert.equal(0, files.length); + done(err, files); + }); + }); + + it('should destroy a container c1', function (done) { + client.destroyContainer('c1', function (err, container) { + // console.error(err); + assert(!err); + done(err, container); + }); + }); + + }); }); diff --git a/test/storage-service.test.js b/test/storage-service.test.js index 1d756de..f2ea79b 100644 --- a/test/storage-service.test.js +++ b/test/storage-service.test.js @@ -7,124 +7,124 @@ var storageService = new StorageService({root: path.join(__dirname, 'storage'), describe('Storage service', function () { - describe('container apis', function () { + describe('container apis', function () { - it('should return an empty list of containers', function (done) { - storageService.getContainers(function (err, containers) { - assert(!err); - assert.equal(0, containers.length); - done(err, containers); - }); - }); - - it('should create a new container', function (done) { - storageService.createContainer({name: 'c1'}, function (err, container) { - assert(!err); - done(err, container); - }); - }); - - it('should get a container c1', function (done) { - storageService.getContainer('c1', function (err, container) { - assert(!err); - done(err, container); - }); - }); - - it('should not get a container c2', function (done) { - storageService.getContainer('c2', function (err, container) { - assert(err); - done(null, container); - }); - }); - - it('should return one container', function (done) { - storageService.getContainers(function (err, containers) { - assert(!err); - assert.equal(1, containers.length); - done(err, containers); - }); - }); - - it('should destroy a container c1', function (done) { - storageService.destroyContainer('c1', function (err, container) { - assert(!err); - done(err, container); - }); - }); - - it('should not get a container c1 after destroy', function (done) { - storageService.getContainer('c1', function (err, container) { - assert(err); - done(null, container); - }); - }); + it('should return an empty list of containers', function (done) { + storageService.getContainers(function (err, containers) { + assert(!err); + assert.equal(0, containers.length); + done(err, containers); + }); }); - describe('file apis', function () { - var fs = require('fs'); - - it('should create a new container', function (done) { - storageService.createContainer({name: 'c1'}, function (err, container) { - assert(!err); - done(err, container); - }); - }); - - it('should upload a file', function (done) { - var writer = storageService.uploadStream('c1', 'f1.txt'); - fs.createReadStream(path.join(__dirname, 'files/f1.txt')).pipe(writer); - writer.on('finish', done); - writer.on('error', done); - }); - - it('should download a file', function (done) { - var reader = storageService.downloadStream('c1','f1.txt'); - reader.pipe(fs.createWriteStream(path.join(__dirname, 'files/f1_downloaded.txt'))); - reader.on('end', done); - reader.on('error', done); - }); - - it('should get files for a container', function (done) { - storageService.getFiles('c1', function (err, files) { - assert(!err); - assert.equal(1, files.length); - done(err, files); - }); - }); - - it('should get a file', function (done) { - storageService.getFile('c1', 'f1.txt', function (err, f) { - assert(!err); - assert.ok(f); - done(err, f); - }); - }); - - it('should remove a file', function (done) { - storageService.removeFile('c1', 'f1.txt', function (err) { - assert(!err); - done(err); - }); - }); - - it('should get no files from a container', function (done) { - storageService.getFiles('c1', function (err, files) { - assert(!err); - assert.equal(0, files.length); - done(err, files); - }); - }); - - it('should destroy a container c1', function (done) { - storageService.destroyContainer('c1', function (err, container) { - // console.error(err); - assert(!err); - done(err, container); - }); - }); - + it('should create a new container', function (done) { + storageService.createContainer({name: 'c1'}, function (err, container) { + assert(!err); + done(err, container); + }); }); + + it('should get a container c1', function (done) { + storageService.getContainer('c1', function (err, container) { + assert(!err); + done(err, container); + }); + }); + + it('should not get a container c2', function (done) { + storageService.getContainer('c2', function (err, container) { + assert(err); + done(null, container); + }); + }); + + it('should return one container', function (done) { + storageService.getContainers(function (err, containers) { + assert(!err); + assert.equal(1, containers.length); + done(err, containers); + }); + }); + + it('should destroy a container c1', function (done) { + storageService.destroyContainer('c1', function (err, container) { + assert(!err); + done(err, container); + }); + }); + + it('should not get a container c1 after destroy', function (done) { + storageService.getContainer('c1', function (err, container) { + assert(err); + done(null, container); + }); + }); + }); + + describe('file apis', function () { + var fs = require('fs'); + + it('should create a new container', function (done) { + storageService.createContainer({name: 'c1'}, function (err, container) { + assert(!err); + done(err, container); + }); + }); + + it('should upload a file', function (done) { + var writer = storageService.uploadStream('c1', 'f1.txt'); + fs.createReadStream(path.join(__dirname, 'files/f1.txt')).pipe(writer); + writer.on('finish', done); + writer.on('error', done); + }); + + it('should download a file', function (done) { + var reader = storageService.downloadStream('c1', 'f1.txt'); + reader.pipe(fs.createWriteStream(path.join(__dirname, 'files/f1_downloaded.txt'))); + reader.on('end', done); + reader.on('error', done); + }); + + it('should get files for a container', function (done) { + storageService.getFiles('c1', function (err, files) { + assert(!err); + assert.equal(1, files.length); + done(err, files); + }); + }); + + it('should get a file', function (done) { + storageService.getFile('c1', 'f1.txt', function (err, f) { + assert(!err); + assert.ok(f); + done(err, f); + }); + }); + + it('should remove a file', function (done) { + storageService.removeFile('c1', 'f1.txt', function (err) { + assert(!err); + done(err); + }); + }); + + it('should get no files from a container', function (done) { + storageService.getFiles('c1', function (err, files) { + assert(!err); + assert.equal(0, files.length); + done(err, files); + }); + }); + + it('should destroy a container c1', function (done) { + storageService.destroyContainer('c1', function (err, container) { + // console.error(err); + assert(!err); + done(err, container); + }); + }); + + }); });