diff --git a/lib/errors/MaxRetryExceededError.js b/lib/errors/MaxRetryExceededError.js index b20aeefb..43f5b960 100644 --- a/lib/errors/MaxRetryExceededError.js +++ b/lib/errors/MaxRetryExceededError.js @@ -5,8 +5,9 @@ var NAME = "MaxRetryExceededError"; * * @private */ -function MaxRetryExceededError() { +function MaxRetryExceededError(missingPaths) { this.message = "The allowed number of retries have been exceeded."; + this.missingPaths = missingPaths || []; this.stack = (new Error()).stack; } diff --git a/lib/response/get/getRequestCycle.js b/lib/response/get/getRequestCycle.js index 29499e6e..225a9d53 100644 --- a/lib/response/get/getRequestCycle.js +++ b/lib/response/get/getRequestCycle.js @@ -23,7 +23,7 @@ module.exports = function getRequestCycle(getResponse, model, results, observer, errors, count) { // we have exceeded the maximum retry limit. if (count === model._maxRetries) { - observer.onError(new MaxRetryExceededError()); + observer.onError(new MaxRetryExceededError(results.requestedMissingPaths)); return { dispose: function() {} }; diff --git a/lib/response/set/setRequestCycle.js b/lib/response/set/setRequestCycle.js index 93df6c53..9926d61f 100644 --- a/lib/response/set/setRequestCycle.js +++ b/lib/response/set/setRequestCycle.js @@ -12,17 +12,18 @@ var MaxRetryExceededError = require("./../../errors/MaxRetryExceededError"); */ module.exports = function setRequestCycle(model, observer, groups, isJSONGraph, isProgressive, count) { + var requestedAndOptimizedPaths = setGroupsIntoCache(model, groups); + var optimizedPaths = requestedAndOptimizedPaths.optimizedPaths; + var requestedPaths = requestedAndOptimizedPaths.requestedPaths; + // we have exceeded the maximum retry limit. if (count === model._maxRetries) { - observer.onError(new MaxRetryExceededError()); + observer.onError(new MaxRetryExceededError(requestedPaths)); return { dispose: function() {} }; } - var requestedAndOptimizedPaths = setGroupsIntoCache(model, groups); - var optimizedPaths = requestedAndOptimizedPaths.optimizedPaths; - var requestedPaths = requestedAndOptimizedPaths.requestedPaths; var isMaster = model._source === undefined; // Local set only. We perform a follow up get. If performance is ever diff --git a/package.json b/package.json index 7fb2586e..50d2f26f 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "license": "Apache-2.0", "scripts": { "test": "gulp test-coverage", + "test:only": "mocha test/index.js", "dist": "gulp all", "doc": "gulp doc", "perf": "gulp perf-run", diff --git a/test/falcor/get/get.dataSource-only.spec.js b/test/falcor/get/get.dataSource-only.spec.js index 7eec9708..ba569aee 100644 --- a/test/falcor/get/get.dataSource-only.spec.js +++ b/test/falcor/get/get.dataSource-only.spec.js @@ -341,8 +341,24 @@ describe('DataSource Only', function() { return done(); }, done.bind('should not complete')); }); + + it('should return missing paths with MaxRetryExceededError', function(done) { + var model = new Model({ source: asyncifyDataSource(new LocalDataSource({})) }); + toObservable(model. + get(['videos', 0, 'title'], 'hall[0].ween')). + doAction(noOp, function(e) { + expect(MaxRetryExceededError.is(e), 'MaxRetryExceededError expected.').to.be.ok; + expect(e.missingPaths).to.deep.equals([['videos', 0, 'title'], ['hall', 0, 'ween']]); + }). + subscribe(noOp, function(e) { + if (isAssertionError(e)) { + return done(e); + } + return done(); + }, done.bind('should not complete')); + }); }); function isAssertionError(e) { return e.hasOwnProperty('expected') && e.hasOwnProperty('actual'); -} \ No newline at end of file +}