diff --git a/lib/models/api.js b/lib/models/api.js index 2cf8763..ff50b85 100644 --- a/lib/models/api.js +++ b/lib/models/api.js @@ -251,25 +251,25 @@ api._getTargetHostElasticReferer = function (logData, naviEntry, req, next) { var refererUserMappedInstanceId = (naviEntry.refererNaviEntry.userMappings) ? naviEntry.refererNaviEntry.userMappings[req.session.userId] : null; var refererNaviEntryInstance; - if (!refererUserMappedInstanceId) { - // no user-mapping for current user and referer instance, use master + if (refererUserMappedInstanceId) { refererNaviEntryInstance = - mongo.constructor.findMasterPodBranch(naviEntry.refererNaviEntry); + naviEntry.refererNaviEntry.directUrls[refererUserMappedInstanceId]; log.trace(put({ refererUserMappedInstanceId: refererUserMappedInstanceId, refererNaviEntryInstance: refererNaviEntryInstance }, logData), '_getTargetHostElasticReferer redis.lrange mongo.fetchNaviEntry isBrowser '+ - '!refererNaviEntryInstance'); + 'refererNaviEntryInstance'); } else { + // no user-mapping for current user and referer instance, use master refererNaviEntryInstance = - naviEntry.refererNaviEntry.directUrls[refererUserMappedInstanceId]; + mongo.constructor.findMasterPodBranch(naviEntry.refererNaviEntry); log.trace(put({ refererUserMappedInstanceId: refererUserMappedInstanceId, refererNaviEntryInstance: refererNaviEntryInstance }, logData), '_getTargetHostElasticReferer redis.lrange mongo.fetchNaviEntry isBrowser '+ - 'refererNaviEntryInstance'); + '!refererNaviEntryInstance'); } if (!refererNaviEntryInstance) { log.error(logData, @@ -281,14 +281,21 @@ api._getTargetHostElasticReferer = function (logData, naviEntry, req, next) { var instanceShortHash = mongo.constructor.findAssociationShortHashByElasticUrl( refererNaviEntryInstance.dependencies, parsedReqUrl.hostname); - if (!instanceShortHash) { - // error because this shouldn't happen - log.error( - logData, - '_getTargetHostElasticReferer redis.lrange mongo.fetchNaviEntry isBrowser !instanceShortHash'); - return next(ErrorCat.create(404, 'Not Found')); + if (instanceShortHash) { + log.trace(logData, + 'getTargetHost redis.lrange mongo.fetchNaviEntry isBrowser instanceShortHash'); + targetNaviEntryInstance = naviEntry.directUrls[instanceShortHash]; + } else { + log.trace(logData, + 'getTargetHost redis.lrange mongo.fetchNaviEntry isBrowser !instanceShortHash'); + + /** + * Referer url is a valid runnable elasticUrl however there might be no defined DNS mappings. + * Proxy to the masterPod instance if so. + */ + targetNaviEntryInstance = mongo.constructor.findMasterPodBranch(naviEntry); } - targetNaviEntryInstance = naviEntry.directUrls[instanceShortHash]; + if (!targetNaviEntryInstance) { // instance that referer naviEntry document was associated with isn't present, // use master of requestUrl naviEntry masterPod instance diff --git a/lib/models/mongo.js b/lib/models/mongo.js index 8eec403..85fa7c6 100644 --- a/lib/models/mongo.js +++ b/lib/models/mongo.js @@ -124,6 +124,7 @@ Mongo.prototype.setUserMapping = function (elasticUrl, userId, instanceShortHash /** * Find nested directUrl object on a naviEntry document that is a masterPod branch * @param {String} branchName + * @return {Object|undefined} */ Mongo.findMasterPodBranch = function (naviEntry) { var logData = { @@ -139,7 +140,6 @@ Mongo.findMasterPodBranch = function (naviEntry) { } } log.warn(logData, 'findMasterPodBranch !match'); - return null; }; /** diff --git a/test/unit/api.js b/test/unit/api.js index b0e6418..247d1c2 100644 --- a/test/unit/api.js +++ b/test/unit/api.js @@ -368,6 +368,7 @@ describe('api.js unit test', function () { describe('referer', function () { var base = 'api-staging-codenow.runnableapp.com'; var req; + beforeEach(function (done) { req = { method: 'get', @@ -391,16 +392,29 @@ describe('api.js unit test', function () { sinon.stub(mongo, 'fetchNaviEntry', function (reqUrl, refererUrl, cb) { cb(null, naviEntriesFixtures); }); + + sinon.stub(api, '_processTargetInstance').yields(); + sinon.stub(mongo.constructor, 'findAssociationShortHashByElasticUrl').returns(null); + done(); }); + afterEach(function (done) { api._getUrlFromRequest.restore(); redis.lrange.restore(); mongo.fetchNaviEntry.restore(); + if (api._processTargetInstance.restore) { + api._processTargetInstance.restore(); + } + if (mongo.constructor.findAssociationShortHashByElasticUrl.restore) { + mongo.constructor.findAssociationShortHashByElasticUrl.restore(); + } done(); }); it('should should ignore referer if same as requestUrl', function (done) { + api._processTargetInstance.restore(); + mongo.constructor.findAssociationShortHashByElasticUrl.restore(); req.headers.origin = 'http://'+base; api.getTargetHost(req, {}, function (err) { expect(err).to.be.undefined(); @@ -410,8 +424,9 @@ describe('api.js unit test', function () { }); }); - it('should proxy to instance mapped by referer naviEntry association', function (done) { + api._processTargetInstance.restore(); + mongo.constructor.findAssociationShortHashByElasticUrl.restore(); api.getTargetHost(req, {}, function (err) { expect(err).to.be.undefined(); // feature-branch1 of API @@ -421,6 +436,8 @@ describe('api.js unit test', function () { }); it('should handle navientires document with no user-mappings', function (done) { + api._processTargetInstance.restore(); + mongo.constructor.findAssociationShortHashByElasticUrl.restore(); var restore = put({}, naviEntriesFixtures.refererNaviEntry); delete naviEntriesFixtures.refererNaviEntry.userMappings; api.getTargetHost(req, {}, function (err) { @@ -433,6 +450,8 @@ describe('api.js unit test', function () { it('should next with error if navientries document with no user-mappings and no '+ 'masterpod', function (done) { + api._processTargetInstance.restore(); + mongo.constructor.findAssociationShortHashByElasticUrl.restore(); var restore = put({}, naviEntriesFixtures.refererNaviEntry); delete naviEntriesFixtures.refererNaviEntry.userMappings; naviEntriesFixtures.refererNaviEntry.directUrls.aaaaa1.masterPod = false; @@ -444,31 +463,37 @@ describe('api.js unit test', function () { }); }); - it('should next with error if !instanceShortHash', function (done) { - sinon.stub(mongo.constructor, 'findAssociationShortHashByElasticUrl', function () { - return null; + it('should default to masterPod if !instanceShortHash', function (done) { + var mockNaviEntry = {}; + sinon.stub(mongo.constructor, 'findMasterPodBranch', function () { + return mockNaviEntry; }); + api.getTargetHost(req, {}, function (err) { - expect(err.message).to.equal('Not Found'); + expect(err).to.be.undefined(); + sinon.assert.calledWith(api._processTargetInstance, mockNaviEntry); expect(mongo.constructor.findAssociationShortHashByElasticUrl.callCount).to.equal(1); - mongo.constructor.findAssociationShortHashByElasticUrl.restore(); + mongo.constructor.findMasterPodBranch.restore(); done(); }); }); - it('should default to masterPod instance if assocation not in requestUrl directUrls', - function (done) { - sinon.stub(mongo.constructor, 'findAssociationShortHashByElasticUrl', function () { - return 'FFFFF'; //This is an instance not defined in requestUrl directUrls - }); - sinon.stub(api, '_processTargetInstance', - function (targetNaviEntryInstance, reqUrl, req, next) { - expect(targetNaviEntryInstance.masterPod).to.equal(true); - mongo.constructor.findAssociationShortHashByElasticUrl.restore(); - api._processTargetInstance.restore(); - next(); + it('should default to masterPod instance if no associations/dns-mappings defined', + function (done) { + + sinon.stub(mongo.constructor, 'findMasterPodBranch'); + mongo.constructor.findMasterPodBranch.onFirstCall().returns({}); + mongo.constructor.findMasterPodBranch.onSecondCall().returns(undefined); + mongo.constructor.findMasterPodBranch.onThirdCall().returns({ + masterPod: true }); + api.getTargetHost(req, {}, function () { + sinon.assert.calledWith(api._processTargetInstance, sinon.match({ + masterPod: true + })); + sinon.assert.calledWith(api._processTargetInstance) + mongo.constructor.findMasterPodBranch.restore(); done(); }); }); diff --git a/test/unit/mongo.js b/test/unit/mongo.js index 9b198e6..f9cf092 100644 --- a/test/unit/mongo.js +++ b/test/unit/mongo.js @@ -242,7 +242,7 @@ describe('lib/models/mongodb', function () { var copy = put({}, naviEntryFixtures); copy.directUrls = {}; var masterPod = mongo.constructor.findMasterPodBranch(copy); - expect(masterPod).to.equal(null); + expect(masterPod).to.be.undefined(); done(); }); });