diff --git a/app/package/js/angular-multimocks.js b/app/package/js/angular-multimocks.js index 025a9bd..72c661d 100644 --- a/app/package/js/angular-multimocks.js +++ b/app/package/js/angular-multimocks.js @@ -1,7 +1,7 @@ -/* global angular, _, console */ +/* global angular, _ */ angular - .module('scenario', ['ui.router']) + .module('scenario', ['ui.router', 'ngMockE2E', 'multimocks.responseDelay']) .provider('multimocksData', function () { var mockData = {}, @@ -46,7 +46,8 @@ angular '$http', '$httpBackend', 'multimocksData', - function ($q, $http, $httpBackend, multimocksData) { + 'scenarioMocks', + function ($q, $http, $httpBackend, multimocksData, scenarioMocks) { var setupHttpBackendForMockResource = function (deferred, mock) { var mockHeaders = multimocksData.getHeaders(), uriRegExp = new RegExp('^' + mock.uri + '$'); @@ -89,23 +90,14 @@ angular return { setup: function (scenarioName) { - var deferred = $q.defer(), - actualScenarioName = scenarioName || - multimocksData.getDefaultScenario(), - mockData = multimocksData.getMockData(); + var deferred = $q.defer(); - if (_.has(mockData, actualScenarioName)) { - var scenario = mockData[actualScenarioName]; - - // Set mock for each item. - _.forOwn(scenario, function (mock) { + // Set mock for each item. + _.forOwn(scenarioMocks.getMocks(scenarioName), + function (mock) { setupHttpBackendForMockResource(deferred, mock); - }); - } - else if (scenarioName) { - // only write to console if scenario actively specified - console.log('Mocks not found for: ' + scenarioName); - } + } + ); return deferred.promise; } @@ -113,36 +105,14 @@ angular } ]) - .config([ - '$stateProvider', - function ($stateProvider) { - $stateProvider.state('scenario', { - url: '/scenario/:state/:mock', - controller: 'scenarioController' - }); - } - ]) - - .controller('scenarioController', [ - '$state', - '$stateParams', - 'multimocks', - function ($state, $stateParams, multimocks) { - if (!_.isUndefined($stateParams.mock)) { - multimocks.setup($stateParams.mock).then(function () { - if (!_.isUndefined($stateParams.state)) { - $state.transitionTo($stateParams.state); - } - }); - } - } - ]) + .factory('currentScenario', [ + '$window', + 'multimocksData', + function ($window, multimocksData) { - .factory('scenarioName', function () { - return { - extract: function (search) { - if (search.indexOf('scenario') !== -1) { - var scenarioParams = search + function getScenarioFromPath (path) { + if (path.indexOf('scenario') !== -1) { + var scenarioParams = path .slice(1) .split('&') .map(function (s) { return s.split('='); }) @@ -153,16 +123,98 @@ angular return undefined; } } - }; - }) + + return { + getName: function() { + var scenarioFromURL = getScenarioFromPath($window.location.search); + if (_.isUndefined(scenarioFromURL)) { + return multimocksData.getDefaultScenario(); + } + return scenarioFromURL; + } + }; + } + ]) + + .factory('scenarioMocks', [ + '$log', + 'multimocksData', + 'currentScenario', + function ($log, multimocksData, currentScenario) { + var mockData = multimocksData.getMockData(); + + function urlMatchesRegex(url, regex){ + var pattern = new RegExp(regex); + return pattern.test(url); + } + + var scenarioMocks = { + getMocks: function (scenarioToLoad) { + if (_.has(mockData, scenarioToLoad)) { + return mockData[scenarioToLoad]; + } + + if (scenarioToLoad) { + $log.log('Mocks not found for scenario: ' + scenarioToLoad); + } + }, + getMocksForCurrentScenario: function () { + return scenarioMocks.getMocks(currentScenario.getName()); + }, + getDelayForResponse: function (response) { + var availableMocks = scenarioMocks.getMocksForCurrentScenario(); + var matchedMockIndex = _.findIndex(availableMocks, function(mock) { + var sameURL = urlMatchesRegex(response.config.url, mock.uri); + var sameMethod = (mock.httpMethod === response.config.method); + return sameMethod && sameURL; + }); + if (matchedMockIndex < 0) { + return 0; + } + return availableMocks[matchedMockIndex].responseDelay || 0; + } + }; + return scenarioMocks; + } + ]) .run([ - '$window', 'multimocks', - 'scenarioName', - function ($window, multimocks, scenarioName) { + 'currentScenario', + function (multimocks, currentScenario) { // load a scenario based on URL string, // e.g. http://example.com/?scenario=scenario1 - multimocks.setup(scenarioName.extract($window.location.search)); + multimocks.setup(currentScenario.getName()); + } + ]); + +/* global angular */ + +angular + .module('multimocks.responseDelay', []) + + .factory('responseDelay', [ + '$q', + '$timeout', + 'scenarioMocks', + function ($q, $timeout, scenarioMocks) { + return { + response: function (response) { + var delayedResponse = $q.defer(); + + $timeout(function () { + delayedResponse.resolve(response); + }, scenarioMocks.getDelayForResponse(response)); + + return delayedResponse.promise; + } + }; + } + ]) + + .config([ + '$httpProvider', + function ($httpProvider) { + $httpProvider.interceptors.push('responseDelay'); } ]); diff --git a/app/package/js/angular-multimocks.min.js b/app/package/js/angular-multimocks.min.js index 4a27585..f3c404a 100644 --- a/app/package/js/angular-multimocks.min.js +++ b/app/package/js/angular-multimocks.min.js @@ -1 +1 @@ -angular.module("scenario",["ui.router"]).provider("multimocksData",function(){var a={},b={"Content-type":"application/json"},c="_default";this.setHeaders=function(a){b=a},this.setMockData=function(b){a=b},this.addMockData=function(b,c){a[b]=c},this.setDefaultScenario=function(a){c=a},this.$get=function(){return{getMockData:function(){return a},getDefaultScenario:function(){return c},getHeaders:function(){return b}}}}).factory("multimocks",["$q","$http","$httpBackend","multimocksData",function(a,b,c,d){var e=function(a,e){var f=d.getHeaders(),g=new RegExp("^"+e.uri+"$");if(e.poll){var h=0,i=_.has(e,"pollCount")?e.pollCount:2;c.when(e.httpMethod,g,e.requestData).respond(function(){return i>h?(h++,[204,{},f]):[200,e.response,f]})}else c.when(e.httpMethod,g,e.requestData).respond(e.statusCode,e.response,f);if(e.callInSetup){var j={method:e.httpMethod,url:e.uri};b(j).success(function(){a.resolve()})}else a.resolve()};return{setup:function(b){var c=a.defer(),f=b||d.getDefaultScenario(),g=d.getMockData();if(_.has(g,f)){var h=g[f];_.forOwn(h,function(a){e(c,a)})}else b&&console.log("Mocks not found for: "+b);return c.promise}}}]).config(["$stateProvider",function(a){a.state("scenario",{url:"/scenario/:state/:mock",controller:"scenarioController"})}]).controller("scenarioController",["$state","$stateParams","multimocks",function(a,b,c){_.isUndefined(b.mock)||c.setup(b.mock).then(function(){_.isUndefined(b.state)||a.transitionTo(b.state)})}]).factory("scenarioName",function(){return{extract:function(a){if(-1!==a.indexOf("scenario")){var b=a.slice(1).split("&").map(function(a){return a.split("=")}).filter(function(a){return"scenario"===a[0]});return b[0][1]}return void 0}}}).run(["$window","multimocks","scenarioName",function(a,b,c){b.setup(c.extract(a.location.search))}]); \ No newline at end of file +angular.module("scenario",["ui.router","ngMockE2E","multimocks.responseDelay"]).provider("multimocksData",function(){var a={},b={"Content-type":"application/json"},c="_default";this.setHeaders=function(a){b=a},this.setMockData=function(b){a=b},this.addMockData=function(b,c){a[b]=c},this.setDefaultScenario=function(a){c=a},this.$get=function(){return{getMockData:function(){return a},getDefaultScenario:function(){return c},getHeaders:function(){return b}}}}).factory("multimocks",["$q","$http","$httpBackend","multimocksData","scenarioMocks",function(a,b,c,d,e){var f=function(a,e){var f=d.getHeaders(),g=new RegExp("^"+e.uri+"$");if(e.poll){var h=0,i=_.has(e,"pollCount")?e.pollCount:2;c.when(e.httpMethod,g,e.requestData).respond(function(){return i>h?(h++,[204,{},f]):[200,e.response,f]})}else c.when(e.httpMethod,g,e.requestData).respond(e.statusCode,e.response,f);if(e.callInSetup){var j={method:e.httpMethod,url:e.uri};b(j).success(function(b){a.resolve()})}else a.resolve()};return{setup:function(b){var c=a.defer();return _.forOwn(e.getMocks(b),function(a){f(c,a)}),c.promise}}}]).factory("currentScenario",["$window","multimocksData",function(a,b){function c(a){if(-1!==a.indexOf("scenario")){var b=a.slice(1).split("&").map(function(a){return a.split("=")}).filter(function(a){return"scenario"===a[0]});return b[0][1]}return void 0}return{getName:function(){var d=c(a.location.search);return _.isUndefined(d)?b.getDefaultScenario():d}}}]).factory("scenarioMocks",["$log","multimocksData","currentScenario",function(a,b,c){function d(a,b){var c=new RegExp(b);return c.test(a)}var e=b.getMockData(),f={getMocks:function(b){return _.has(e,b)?e[b]:void(b&&a.log("Mocks not found for scenario: "+b))},getMocksForCurrentScenario:function(){return f.getMocks(c.getName())},getDelayForResponse:function(a){var b=f.getMocksForCurrentScenario(),c=_.findIndex(b,function(b){var c=d(a.config.url,b.uri),e=b.httpMethod===a.config.method;return e&&c});return 0>c?0:b[c].responseDelay||0}};return f}]).run(["multimocks","currentScenario",function(a,b){a.setup(b.getName())}]),angular.module("multimocks.responseDelay",[]).factory("responseDelay",["$q","$timeout","scenarioMocks",function(a,b,c){return{response:function(d){var e=a.defer();return b(function(){e.resolve(d)},c.getDelayForResponse(d)),e.promise}}}]).config(["$httpProvider",function(a){a.interceptors.push("responseDelay")}]); \ No newline at end of file diff --git a/bower.json b/bower.json index 6bc0938..61c1fc6 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "angular-multimocks", - "version": "0.5.2", + "version": "0.5.3", "authors": [ { "name": "Ben Godfrey",