Added entity.downloadAsset() +tests, cleanup of some circular dependencies
diff --git a/helpers/build.js b/helpers/build.js
index 0991638..88656a1 100644
--- a/helpers/build.js
+++ b/helpers/build.js
@@ -106,10 +106,11 @@
].filter(_.isString)) : ""
)
},
- headers: function(client) {
+ headers: function(client, options) {
var headers = {
'User-Agent': util.format("usergrid-nodejs/v%s", version)
}
+ _.assign(headers, options.headers)
var token
if (ok(client).getIfExists('tempAuth') === UsergridAuth.NO_AUTH) {
client.tempAuth = undefined
diff --git a/lib/asset.js b/lib/asset.js
index d5f25b2..5d9799a 100644
--- a/lib/asset.js
+++ b/lib/asset.js
@@ -1,7 +1,6 @@
'use strict'
var Usergrid = require('../usergrid'),
- validator = require('validator'),
readChunk = require('read-chunk'),
fileType = require('file-type'),
helpers = require('../helpers'),
@@ -18,17 +17,18 @@
var __binaryData = []
if (args.length === 0) {
- throw new Error('A UsergridAsset object was initialized using an empty argument')
+ throw new Error('A UsergridAsset object cannot be initialized without passing one or more arguments')
}
- if (_.isObject(args[0])) {
+ if (_.isPlainObject(args[0])) {
_.assign(self, args[0])
} else {
self.filename = _.isString(args[0]) ? args[0] : undefined
- self.data = validator.isBase64(args[1]) || Buffer.isBuffer(args[1]) ? args[1] : []
+ self.data = _.first(args.filter(Buffer.isBuffer)) || []
self.originalLocation = _.first([args[2], args[1]].filter(function(property) {
- return (_.isString(property) && !validator.isBase64(property))
+ return _.isString(property)
}))
+
self.contentType = _.isString(args[3]) ? args[3] : undefined
stream.PassThrough.call(self)
@@ -52,7 +52,7 @@
if (__contentType) {
return __contentType
} else if (Buffer.isBuffer(self.data)) {
- __contentType = fileType(self.data).mime
+ __contentType = fileType(self.data) != null ? fileType(self.data).mime : undefined
return __contentType
}
},
@@ -60,7 +60,7 @@
if (contentType) {
__contentType = contentType
} else if (Buffer.isBuffer(self.data)) {
- __contentType = fileType(self.data).mime
+ __contentType = fileType(self.data) != null ? fileType(self.data).mime : undefined
}
}
})
diff --git a/lib/auth.js b/lib/auth.js
index fd8e0fa..2422d30 100644
--- a/lib/auth.js
+++ b/lib/auth.js
@@ -46,6 +46,16 @@
}
module.exports = UsergridAuth
-module.exports.AUTH_FALLBACK_APP = 'APP'
-module.exports.AUTH_FALLBACK_NONE = 'NONE'
-module.exports.NO_AUTH = 'NO_AUTH'
\ No newline at end of file
+
+Object.defineProperty(module.exports, 'AUTH_FALLBACK_APP', {
+ enumerable: false,
+ get: function() { return "APP" }
+})
+Object.defineProperty(module.exports, 'AUTH_FALLBACK_NONE', {
+ enumerable: false,
+ get: function() { return "NONE" }
+})
+Object.defineProperty(module.exports, 'NO_AUTH', {
+ enumerable: false,
+ get: function() { return "NO_AUTH" }
+})
\ No newline at end of file
diff --git a/lib/client.js b/lib/client.js
index 532c9d9..c337484 100644
--- a/lib/client.js
+++ b/lib/client.js
@@ -125,7 +125,17 @@
}
module.exports = UsergridClient
-module.exports.Connections = {
- DIRECTION_IN: "IN",
- DIRECTION_OUT: "OUT"
-}
\ No newline at end of file
+Object.defineProperty(module.exports, 'Connections', {
+ enumerable: false,
+ writable: true,
+ configurable: true
+})
+module.exports.Connections = {}
+Object.defineProperty(module.exports.Connections, 'DIRECTION_IN', {
+ enumerable: false,
+ get: function() { return "IN" }
+})
+Object.defineProperty(module.exports.Connections, 'DIRECTION_OUT', {
+ enumerable: false,
+ get: function() { return "OUT" }
+})
\ No newline at end of file
diff --git a/lib/entity.js b/lib/entity.js
index 4d7a100..fe35d58 100644
--- a/lib/entity.js
+++ b/lib/entity.js
@@ -1,6 +1,8 @@
'use strict'
var Usergrid = require('../usergrid'),
+ UsergridRequest = require('./request'),
+ UsergridAsset = require('./asset'),
helpers = require('../helpers'),
ok = require('objectkit'),
_ = require('lodash')
@@ -16,16 +18,16 @@
var args = helpers.args(arguments)
if (args.length === 0) {
- throw new Error('A UsergridEntity object was initialized using an empty argument')
+ throw new Error('A UsergridEntity object cannot be initialized without passing one or more arguments')
}
- if (_.isObject(args[0])) {
+ if (_.isPlainObject(args[0])) {
_.assign(self, args[0])
} else {
self.type = _.isString(args[0]) ? args[0] : undefined
self.name = _.isString(args[1]) ? args[1] : undefined
}
-
+
if (!_.isString(self.type)) {
throw new Error('"type" (or "collection") parameter is required when initializing a UsergridEntity object')
}
@@ -134,10 +136,40 @@
var callback = helpers.cb(args)
client.POST(this, this.asset, function(error, usergridResponse) {
updateEntityFromRemote.call(this, usergridResponse)
- callback(error, usergridResponse, this)
+ callback(error, usergridResponse, this)
}.bind(this))
},
- downloadAsset: function() {},
+ downloadAsset: function() {
+ var args = helpers.args(arguments)
+ var client = helpers.client.validate(args)
+ var callback = helpers.cb(args)
+ var self = this
+
+ if (ok(self).has('asset.contentType')) {
+ var options = {
+ client: client,
+ entity: self,
+ type: this.type,
+ method: 'GET',
+ encoding: null,
+ headers: {
+ "Accept": self.asset.contentType || _.first(args.filter(_.isString))
+ }
+ }
+ options.uri = helpers.build.uri(client, options)
+ return new UsergridRequest(options, function(error, usergridResponse) {
+ if (usergridResponse.ok) {
+ self.attachAsset(new UsergridAsset(new Buffer(usergridResponse.body)))
+ }
+ callback(error, usergridResponse, self)
+ })
+ } else {
+ callback({
+ name: "asset_not_found",
+ description: "The specified entity does not have a valid asset attached"
+ })
+ }
+ },
connect: function() {
var args = helpers.args(arguments)
var client = helpers.client.validate(args)
diff --git a/lib/request.js b/lib/request.js
index 28e549e..3a4b1c3 100644
--- a/lib/request.js
+++ b/lib/request.js
@@ -26,8 +26,9 @@
var body = ((formData !== undefined) ? undefined : options.body)
var req = request(uri, {
- headers: helpers.build.headers(client),
+ headers: helpers.build.headers(client, options),
body: body,
+ encoding: options.encoding || null,
json: true,
method: options.method,
qs: helpers.build.qs(options),
diff --git a/lib/user.js b/lib/user.js
index 0bd36e9..6743575 100644
--- a/lib/user.js
+++ b/lib/user.js
@@ -21,7 +21,8 @@
var self = this
self.type = "user"
- _.assign(self, UsergridEntity.call(self, obj))
+ _.assign(self, obj, UsergridEntity)
+ UsergridEntity.call(self, self)
helpers.setWritable(self, 'name')
return self
diff --git a/tests/lib/client.auth.test.js b/tests/lib/client.auth.test.js
index 33ac711..c7f6bad 100644
--- a/tests/lib/client.auth.test.js
+++ b/tests/lib/client.auth.test.js
@@ -242,10 +242,10 @@
var newClient = new UsergridClient()
var ttlInMilliseconds = 500000
var userAuth = new UsergridUserAuth(config.test.username, config.test.password, ttlInMilliseconds)
- client.authenticateUser(userAuth, function(err, response, token) {
- response.ok.should.be.true()
+ client.authenticateUser(userAuth, function(err, usergridResponse, token) {
+ usergridResponse.ok.should.be.true()
client.currentUser.auth.token.should.equal(token)
- response.body.expires_in.should.equal(ttlInMilliseconds / 1000)
+ usergridResponse.body.expires_in.should.equal(ttlInMilliseconds / 1000)
done()
})
})
diff --git a/tests/lib/client.rest.test.js b/tests/lib/client.rest.test.js
index 7cf7074..e67cfef 100644
--- a/tests/lib/client.rest.test.js
+++ b/tests/lib/client.rest.test.js
@@ -333,7 +333,7 @@
it('should support updating a set of entities by passing an UsergridQuery object', function(done) {
this.slow(_slow + 1000)
- this.timeout(_timeout + 6000)
+ this.timeout(_timeout + 10000)
var query = new UsergridQuery(config.test.collection).eq('cuisine', 'pizza').limit(2)
var body = {
diff --git a/tests/lib/entity.test.js b/tests/lib/entity.test.js
index f4c7c1d..86fc63d 100644
--- a/tests/lib/entity.test.js
+++ b/tests/lib/entity.test.js
@@ -16,7 +16,11 @@
filename = 'old_man',
file = __dirname + '/image.jpg',
testFile = __dirname + '/image_test.jpg',
- expectedContentLength = 109055
+ expectedContentLength = 109055,
+ assetEntity = new UsergridEntity({
+ type: config.test.collection,
+ info: "assetTestEntity"
+ })
describe('putProperty()', function() {
it('should set the value for a given key if the key does not exist', function() {
@@ -348,7 +352,7 @@
})
describe('attachAsset()', function(done) {
-
+
var asset = new UsergridAsset(filename, file),
entity = new UsergridEntity({
type: config.test.collection,
@@ -373,11 +377,7 @@
this.slow(_slow)
this.timeout(_timeout)
- var asset = new UsergridAsset(filename, file),
- entity = new UsergridEntity({
- type: config.test.collection,
- info: "attachAssetTest"
- })
+ var asset = new UsergridAsset(filename, file)
before(function(done) {
fs.readFile(file, function(err, data) {
asset.data = data
@@ -385,10 +385,11 @@
})
})
- it('should attach a UsergridAsset to the entity', function(done) {
+ it('should upload an image asset to the remote entity', function(done) {
var client = new UsergridClient(config)
- entity.attachAsset(asset)
- entity.uploadAsset(client, function(err, usergridResponse, entity) {
+ assetEntity.attachAsset(asset)
+ assetEntity.uploadAsset(client, function(err, usergridResponse, entity) {
+ assetEntity = entity
entity.should.have.property('file-metadata')
entity['file-metadata'].should.have.property('content-length').equal(expectedContentLength)
entity['file-metadata'].should.have.property('content-type').equal('image/jpeg')
@@ -397,6 +398,24 @@
})
})
+describe('downloadAsset()', function(done) {
+
+ this.slow(_slow)
+ this.timeout(_timeout)
+
+ it('should download a an image from the remote entity', function(done) {
+ var client = new UsergridClient(config)
+ assetEntity.downloadAsset(client, 'image/jpeg', function(err, usergridResponse, entityWithAsset) {
+ entityWithAsset.should.have.property('asset').which.is.an.instanceof(UsergridAsset)
+ entityWithAsset.asset.should.have.property('contentType').equal(assetEntity['file-metadata']['content-type'])
+ entityWithAsset.asset.should.have.property('contentLength').equal(assetEntity['file-metadata']['content-length'])
+ // clean up the now un-needed asset entity
+ entityWithAsset.remove(client)
+ done()
+ })
+ })
+})
+
describe('connect()', function() {
this.slow(_slow)
diff --git a/tests/main.test.js b/tests/main.test.js
index 947b807..581411e 100644
--- a/tests/main.test.js
+++ b/tests/main.test.js
@@ -23,43 +23,43 @@
// end module config
-describe.skip('Usergrid initialization', function() {
+describe('Usergrid initialization', function() {
return require('./lib/usergrid.init.test')
})
-describe.skip('Usergrid singleton', function() {
+describe('Usergrid singleton', function() {
return require('./lib/usergrid.singleton.test')
})
-describe.skip('Usergrid teardown', function() {
+describe('Usergrid teardown', function() {
return require('./lib/usergrid.teardown.test')
})
-describe.skip('UsergridClient initialization', function() {
+describe('UsergridClient initialization', function() {
return require('./lib/client.init.test')
})
-describe.skip('UsergridClient REST operations', function() {
+describe('UsergridClient REST operations', function() {
return require('./lib/client.rest.test')
})
-describe.skip('UsergridClient connections', function() {
+describe('UsergridClient connections', function() {
return require('./lib/client.connections.test')
})
-describe.skip('UsergridClient authentication', function() {
+describe('UsergridClient authentication', function() {
return require('./lib/client.auth.test')
})
-describe.skip('UsergridQuery', function() {
+describe('UsergridQuery', function() {
return require('./lib/query.test')
})
-describe.skip('UsergridResponse', function() {
+describe('UsergridResponse', function() {
return require('./lib/response.test')
})
-describe.skip('UsergridResponseError', function() {
+describe('UsergridResponseError', function() {
return require('./lib/responseError.test')
})
@@ -67,10 +67,10 @@
return require('./lib/entity.test')
})
-describe.skip('UsergridUser', function() {
+describe('UsergridUser', function() {
return require('./lib/user.test')
})
-describe.skip('UsergridAsset', function() {
+describe('UsergridAsset', function() {
return require('./lib/asset.test')
})
\ No newline at end of file