diff --git a/packages/common/src/grpc-service-object.js b/packages/common/src/grpc-service-object.js index 5c2992e3e27..ca7c2b1a414 100644 --- a/packages/common/src/grpc-service-object.js +++ b/packages/common/src/grpc-service-object.js @@ -73,10 +73,21 @@ GrpcServiceObject.prototype.delete = function(callback) { * @param {object} callback.metadata - The metadata for this object. */ GrpcServiceObject.prototype.getMetadata = function(callback) { + var self = this; + var protoOpts = this.methods.getMetadata.protoOpts; var reqOpts = this.methods.getMetadata.reqOpts; - this.request(protoOpts, reqOpts, callback); + this.request(protoOpts, reqOpts, function(err, resp) { + if (err) { + callback(err, null, resp); + return; + } + + self.metadata = resp; + + callback(null, self.metadata, resp); + }); }; /** diff --git a/packages/common/test/grpc-service-object.js b/packages/common/test/grpc-service-object.js index 36557768152..07f42ab3851 100644 --- a/packages/common/test/grpc-service-object.js +++ b/packages/common/test/grpc-service-object.js @@ -99,6 +99,54 @@ describe('GrpcServiceObject', function() { grpcServiceObject.getMetadata(done); }); + + describe('error', function() { + var error = new Error('Error.'); + var apiResponse = {}; + + beforeEach(function() { + grpcServiceObject.request = function(protoOpts, reqOpts, callback) { + callback(error, apiResponse); + }; + }); + + it('should execute callback with error & API response', function(done) { + grpcServiceObject.getMetadata(function(err, metadata, apiResponse_) { + assert.strictEqual(err, error); + assert.strictEqual(metadata, null); + assert.strictEqual(apiResponse_, apiResponse); + done(); + }); + }); + }); + + describe('success', function() { + var error = new Error('Error.'); + var apiResponse = {}; + + beforeEach(function() { + grpcServiceObject.request = function(protoOpts, reqOpts, callback) { + callback(null, apiResponse); + }; + }); + + it('should exec callback with metadata & API response', function(done) { + grpcServiceObject.getMetadata(function(err, metadata, apiResponse_) { + assert.ifError(err); + assert.strictEqual(metadata, apiResponse); + assert.strictEqual(apiResponse_, apiResponse); + done(); + }); + }); + + it('should update the metadata on the instance', function(done) { + grpcServiceObject.getMetadata(function(err, metadata, apiResponse_) { + assert.ifError(err); + assert.strictEqual(grpcServiceObject.metadata, apiResponse); + done(); + }); + }); + }); }); describe('setMetadata', function() {