From adb7dd311f929db2f5615f166b4286aaa8425f65 Mon Sep 17 00:00:00 2001 From: Matthew Treinish Date: Mon, 5 Oct 2015 21:42:44 -0400 Subject: [PATCH] Add test detail page This adds a new page for a single test's details. It displays a runtime graph and a stacked area graph of test statuses for the specified individual test across all runs over the past 30 days. Change-Id: Ib1f5aaaaf49315e2b00d38407e07702922f3d96f --- app/js/controllers/test.js | 130 ++++ app/js/controllers/tests.js | 8 +- app/js/directives/chart-stack-area.js | 66 ++ app/js/on_config.js | 14 + app/js/services/health-api.js | 8 + app/js/services/test.js | 22 + app/views/job.html | 2 +- app/views/test.html | 39 ++ app/views/tests.html | 3 +- test/e2e/mocks/test_project.js | 862 ++++++++++++++++++++++++++ test/e2e/routes_spec.js | 16 +- 11 files changed, 1161 insertions(+), 9 deletions(-) create mode 100644 app/js/controllers/test.js create mode 100644 app/js/directives/chart-stack-area.js create mode 100644 app/js/services/test.js create mode 100644 app/views/test.html create mode 100644 test/e2e/mocks/test_project.js diff --git a/app/js/controllers/test.js b/app/js/controllers/test.js new file mode 100644 index 00000000..0d0ce1f9 --- /dev/null +++ b/app/js/controllers/test.js @@ -0,0 +1,130 @@ +'use strict'; + +var controllersModule = require('./_index'); + +/** + * @ngInject + */ +function TestController(healthService, testService, startDate, testId) { + + // ViewModel + var vm = this; + vm.testName = testId; + vm.testShortName = testService.getShortName(testId); + + vm.processData = function(data) { + var dates = {}; + var passEntries = []; + var failEntries = []; + var skipEntries = []; + var runTimeEntries = []; + var avgRunTimeEntries = []; + var dateString, dateTimeString; + + for (dateString in data.data) { + if (data.data.hasOwnProperty(dateString)) { + var date = dateString; + var test = data.data[dateString]; + + // parse dates and create data series + var date = new Date(date); + var date = new Date(date.getFullYear(), date.getMonth(), + date.getDate()).getTime(); + if (!dates[date]) { + if (test.status == 'success' || test.status == 'xfail') { + var count = { + passes: 1, + fails: 0, + skips: 0 + }; + } + else if (test.status == 'fail' || test.status == 'unxsucess') { + var count = { + passes: 0, + fails: 1, + skips: 0 + }; + } + else if (test.status == 'skip') { + var count = { + passes: 0, + fails: 0, + skips: 1 + }; + } + dates[date] = count; + } + else { + if (test.status == 'success' || test.status == 'xfail') { + dates[date].passes += 1; + } + else if (test.status == 'fail' || test.status == 'unxsucess') { + dates[date].fails += 1; + } + else if (test.status == 'skip') { + dates[date].skips += 1; + } + } + } + } + for (date in dates) { + if (dates.hasOwnProperty(date)) { + passEntries.push({ + x: date, + y: dates[date].passes + }); + failEntries.push({ + x: date, + y: dates[date].fails + }); + skipEntries.push({ + x: date, + y: dates[date].skips + }); + } + } + vm.statusData = [ + { key: 'Passes', values: passEntries, color: "blue" }, + { key: 'Failures', values: failEntries, color: "red" }, + { key: 'Skips', values: skipEntries, color: "violet" } + ]; + + for (dateTimeString in data.numeric) { + if (data.numeric.hasOwnProperty(dateTimeString)) { + var date = dateTimeString; + var test = data.numeric[dateTimeString]; + + // parse dates and create data series + var date = new Date(date).getTime(); + + runTimeEntries.push({ + x: date, + y: parseFloat(test.run_time.toFixed(2)) + }); + avgRunTimeEntries.push({ + x: date, + y: parseFloat(test.avg_run_time.toFixed(2)) + }); + } + } + vm.timeData = [ + {key: 'Run Time (sec.)', values: runTimeEntries, color: "blue"}, + {key: 'Avg. Run Time (sec.)', values: avgRunTimeEntries, color: "black"} + ]; + }; + + vm.loadData = function() { + var beginDate = new Date(startDate); + var stopDate = new Date(startDate); + beginDate.setDate(startDate.getDate() - 30); + healthService.getTestRunList(vm.testName, { + start_date: beginDate, + stop_date: stopDate + }).then(function(response) { + vm.processData(response.data); + }); + }; + + vm.loadData(); +} +controllersModule.controller('TestController', TestController); diff --git a/app/js/controllers/tests.js b/app/js/controllers/tests.js index b2c900ef..7d4ef417 100644 --- a/app/js/controllers/tests.js +++ b/app/js/controllers/tests.js @@ -6,7 +6,7 @@ var _ = require('underscore'); /** * @ngInject */ -function TestsController(healthService) { +function TestsController(healthService, testService) { // ViewModel var vm = this; @@ -15,12 +15,8 @@ function TestsController(healthService) { vm.processData = function(data) { vm.chartData = {}; - var removeIdNoise = function(testId) { - return testId.replace('setUpClass (', '').replace('tearDownClass (', '').replace(' )', ''); - }; - var testsByHierarchy = _.groupBy(data.tests, function(test) { - var testId = removeIdNoise(test.test_id); + var testId = testService.removeIdNoise(test.test_id); var keyMatcher = /^(\w*\.\w*\.\w*)\./g; var matches = keyMatcher.exec(testId); diff --git a/app/js/directives/chart-stack-area.js b/app/js/directives/chart-stack-area.js new file mode 100644 index 00000000..8432a557 --- /dev/null +++ b/app/js/directives/chart-stack-area.js @@ -0,0 +1,66 @@ +'use strict'; + +var directivesModule = require('./_index.js'); + +var d3 = require('d3'); +var nv = require('nvd3'); + +/** + * @ngInject + */ +function chartStackArea() { + var link = function(scope, el, attrs) { + scope.$on("loading-started", function() { + el.css({"display" : "none"}); + }); + + scope.$on("loading-complete", function() { + el.css({"display" : "block"}); + }); + + var chart = null; + + var svg = d3.select(el[0]).append('svg') + .attr('width', attrs.width) + .attr('height', attrs.height); + + var update = function(data) { + if (typeof data === "undefined") { + return; + } + chart = nv.models.stackedAreaChart() + .margin({right: 100}) + .x(function(d) { return d.x; }) + .y(function(d) { return d.y; }) + .useInteractiveGuideline(true) + .rightAlignYAxis(true) + .showControls(true) + .clipEdge(true); + + chart.xAxis.tickFormat(function(d) { return d3.time.format("%x")(new Date(d)); }); + + chart.yAxis.tickFormat(d3.format(',.2f')); + svg.datum(data).call(chart); + }; + + scope.$on('windowResize', function() { + if (chart !== null) { + chart.update(); + } + }); + + scope.$watch('data', update); + }; + + return { + restrict: 'EA', + scope: { + 'data': '=', + 'width': '@', + 'height': '@' + }, + link: link + }; +} + +directivesModule.directive('chartStackArea', chartStackArea); diff --git a/app/js/on_config.js b/app/js/on_config.js index 0e80fba7..59df28d2 100644 --- a/app/js/on_config.js +++ b/app/js/on_config.js @@ -52,6 +52,20 @@ function OnConfig($stateProvider, $locationProvider, $urlRouterProvider) { return new Date(); } } + }) + .state('test', { + url: '/test/:testId', + controller: 'TestController as testCtrl', + templateUrl: 'test.html', + title: 'Test', + resolve: /*@ngInject*/ { + 'testId': function($stateParams) { + return $stateParams.testId; + }, + 'startDate': function() { + return new Date(); + } + } }); $urlRouterProvider.otherwise('/'); diff --git a/app/js/services/health-api.js b/app/js/services/health-api.js index d6fee4ef..eedd4545 100644 --- a/app/js/services/health-api.js +++ b/app/js/services/health-api.js @@ -107,6 +107,14 @@ function HealthService($http, config) { }); }; + service.getTestRunList = function(testId, options) { + return config.get().then(function(config) { + return $http.jsonp(config.apiRoot + '/test_runs/' + testId, { + params: angular.extend(options, { callback: 'JSON_CALLBACK' }) + }); + }); + }; + return service; } diff --git a/app/js/services/test.js b/app/js/services/test.js new file mode 100644 index 00000000..ed447da2 --- /dev/null +++ b/app/js/services/test.js @@ -0,0 +1,22 @@ +'use strict'; + +var angular = require('angular'); + +var servicesModule = require('./_index.js'); + +function TestService() { + var service = {}; + + service.removeIdNoise = function(testId) { + return testId.replace('setUpClass (', '').replace('tearDownClass (', '').replace(')', ''); + }; + + service.getShortName = function(testId) { + var denoisedTestName = service.removeIdNoise(testId); + return denoisedTestName.split('.').slice(-2).join('.'); + }; + + return service; +} + +servicesModule.service('testService', TestService); diff --git a/app/views/job.html b/app/views/job.html index 0dccf4ae..b1e66484 100644 --- a/app/views/job.html +++ b/app/views/job.html @@ -61,7 +61,7 @@ - {{ test.name|limitTo:110 }} + {{ test.name|limitTo:110 }} {{ test.passes|number }} {{ test.failures|number }} {{ test.failuresRate|number:2 }} diff --git a/app/views/test.html b/app/views/test.html new file mode 100644 index 00000000..9bf66459 --- /dev/null +++ b/app/views/test.html @@ -0,0 +1,39 @@ +
+
+

{{ testCtrl.testShortName }}

+ +
  • Test: {{testCtrl.testShortName }}
  • +
    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    +
    +

    Run Time

    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +

    Success and Failures

    +
    +
    + +
    +
    +
    +
    diff --git a/app/views/tests.html b/app/views/tests.html index 748669be..b60593a0 100644 --- a/app/views/tests.html +++ b/app/views/tests.html @@ -52,7 +52,7 @@ - {{ test.test_id | limitTo: 110 }} + {{test.test_id | limitTo: 110}} {{ test.success | number }} {{ test.failure | number:2 }} @@ -67,3 +67,4 @@
    + diff --git a/test/e2e/mocks/test_project.js b/test/e2e/mocks/test_project.js new file mode 100644 index 00000000..b58553ca --- /dev/null +++ b/test/e2e/mocks/test_project.js @@ -0,0 +1,862 @@ +module.exports = { + request: { + method: 'JSONP', + path: '/test_runs/tempest.api.volume.test_qos.QosSpecsV2TestJSON.test_get_qos' + }, + response: { + data: { + "test_runs": { + "2015-11-01T08:08:49.035211": { + "run_id": 76869, + "run_time": 0.015618, + "status": "success" + }, + "2015-11-01T08:09:17.964174": { + "run_id": 78112, + "run_time": 0.016056, + "status": "success" + }, + "2015-11-01T09:22:04.044210": { + "run_id": 132687, + "run_time": 0.018179, + "status": "success" + }, + "2015-11-01T16:00:43.051799": { + "run_id": 203520, + "run_time": 0.020488, + "status": "success" + }, + "2015-11-01T16:07:03.632876": { + "run_id": 144316, + "run_time": 0.024086, + "status": "success" + }, + "2015-11-01T16:11:31.619705": { + "run_id": 87896, + "run_time": 0.014398, + "status": "success" + }, + "2015-11-01T16:14:49.484077": { + "run_id": 1482, + "run_time": 0.020054, + "status": "success" + }, + "2015-11-01T23:43:17.962117": { + "run_id": 123440, + "run_time": 0.019932, + "status": "success" + }, + "2015-11-01T23:46:37.713662": { + "run_id": 188360, + "run_time": 0.021598, + "status": "success" + }, + "2015-11-02T02:11:34.550398": { + "run_id": 71866, + "run_time": 0.013558, + "status": "success" + }, + "2015-11-02T02:16:03.049329": { + "run_id": 191693, + "run_time": 0.022511, + "status": "success" + }, + "2015-11-02T02:22:51.152276": { + "run_id": 8469, + "run_time": 0.018899, + "status": "success" + }, + "2015-11-02T02:23:12.421702": { + "run_id": 162675, + "run_time": 0.026132, + "status": "success" + }, + "2015-11-02T02:49:38.573835": { + "run_id": 64377, + "run_time": 0.020959, + "status": "success" + }, + "2015-11-02T02:49:48.999416": { + "run_id": 105940, + "run_time": 0.020126, + "status": "success" + }, + "2015-11-02T02:51:34.005085": { + "run_id": 133181, + "run_time": 0.016826, + "status": "success" + }, + "2015-11-02T03:07:01.015165": { + "run_id": 196930, + "run_time": 0.014044, + "status": "success" + }, + "2015-11-02T04:07:25.133249": { + "run_id": 164716, + "run_time": 0.026805, + "status": "success" + }, + "2015-11-02T04:33:10.887952": { + "run_id": 181261, + "run_time": 0.013324, + "status": "success" + }, + "2015-11-02T06:33:21.559052": { + "run_id": 101005, + "run_time": 0.024039, + "status": "success" + }, + "2015-11-02T06:42:37.663809": { + "run_id": 34069, + "run_time": 0.017489, + "status": "success" + }, + "2015-11-02T06:58:57.690055": { + "run_id": 141251, + "run_time": 0.026118, + "status": "success" + }, + "2015-11-02T07:14:28.678193": { + "run_id": 149783, + "run_time": 0.016628, + "status": "success" + }, + "2015-11-02T07:14:50.473016": { + "run_id": 83621, + "run_time": 0.019381, + "status": "success" + }, + "2015-11-02T07:20:28.572440": { + "run_id": 7546, + "run_time": 0.016645, + "status": "success" + }, + "2015-11-02T07:21:50.046523": { + "run_id": 117516, + "run_time": 0.016203, + "status": "success" + }, + "2015-11-02T07:26:59.190658": { + "run_id": 2131, + "run_time": 0.054914, + "status": "success" + }, + "2015-11-02T07:30:15.723823": { + "run_id": 124955, + "run_time": 0.018861, + "status": "success" + }, + "2015-11-02T07:30:57.415524": { + "run_id": 171082, + "run_time": 0.015379, + "status": "success" + }, + "2015-11-02T07:36:40.430840": { + "run_id": 43305, + "run_time": 0.027897, + "status": "success" + }, + "2015-11-02T07:36:47.141898": { + "run_id": 189929, + "run_time": 0.015209, + "status": "success" + }, + "2015-11-02T08:03:26.020152": { + "run_id": 108006, + "run_time": 0.020233, + "status": "success" + }, + "2015-11-02T08:04:27.573191": { + "run_id": 195803, + "run_time": 0.02616, + "status": "success" + }, + "2015-11-02T08:11:32.325353": { + "run_id": 178463, + "run_time": 0.02221, + "status": "success" + }, + "2015-11-02T08:26:07.771437": { + "run_id": 143509, + "run_time": 0.02139, + "status": "success" + }, + "2015-11-02T08:41:25.735202": { + "run_id": 159036, + "run_time": 0.016715, + "status": "success" + }, + "2015-11-02T09:12:00.830422": { + "run_id": 25060, + "run_time": 0.023631, + "status": "success" + }, + "2015-11-02T09:16:15.520333": { + "run_id": 130322, + "run_time": 0.03652, + "status": "success" + }, + "2015-11-02T09:17:31.963035": { + "run_id": 119297, + "run_time": 0.022164, + "status": "success" + }, + "2015-11-02T09:17:33.937683": { + "run_id": 141525, + "run_time": 0.014269, + "status": "success" + }, + "2015-11-02T09:23:01.514370": { + "run_id": 171309, + "run_time": 0.01259, + "status": "success" + }, + "2015-11-02T09:27:54.976154": { + "run_id": 119126, + "run_time": 0.013371, + "status": "success" + }, + "2015-11-02T09:29:54.559126": { + "run_id": 125059, + "run_time": 0.013762, + "status": "success" + }, + "2015-11-02T09:31:09.726305": { + "run_id": 71722, + "run_time": 0.012565, + "status": "success" + }, + "2015-11-02T09:34:44.596509": { + "run_id": 29348, + "run_time": 0.015015, + "status": "success" + }, + "2015-11-02T09:35:12.602743": { + "run_id": 177325, + "run_time": 0.018385, + "status": "success" + }, + "2015-11-02T09:41:02.845800": { + "run_id": 99987, + "run_time": 0.013543, + "status": "success" + }, + "2015-11-02T10:34:37.987872": { + "run_id": 99042, + "run_time": 0.019691, + "status": "success" + }, + "2015-11-02T10:48:26.901560": { + "run_id": 207320, + "run_time": 0.021985, + "status": "success" + }, + "2015-11-02T10:58:53.273128": { + "run_id": 85317, + "run_time": 0.015492, + "status": "success" + }, + "2015-11-02T11:05:19.596522": { + "run_id": 108927, + "run_time": 0.017494, + "status": "success" + }, + "2015-11-02T11:56:04.948180": { + "run_id": 156119, + "run_time": 0.015302, + "status": "success" + }, + "2015-11-02T13:23:35.614099": { + "run_id": 106178, + "run_time": 0.017887, + "status": "success" + }, + "2015-11-02T13:23:39.718837": { + "run_id": 86633, + "run_time": 0.02081, + "status": "success" + }, + "2015-11-02T13:32:04.369087": { + "run_id": 16276, + "run_time": 0.021102, + "status": "success" + }, + "2015-11-02T13:34:13.661198": { + "run_id": 57460, + "run_time": 0.022075, + "status": "success" + }, + "2015-11-02T13:38:25.946878": { + "run_id": 92566, + "run_time": 0.019312, + "status": "success" + }, + "2015-11-02T13:43:58.228929": { + "run_id": 115237, + "run_time": 0.058536, + "status": "success" + }, + "2015-11-02T13:49:10.836496": { + "run_id": 118108, + "run_time": 0.069969, + "status": "success" + }, + "2015-11-02T14:06:18.625258": { + "run_id": 158346, + "run_time": 0.012928, + "status": "success" + }, + "2015-11-02T14:14:58.097067": { + "run_id": 59975, + "run_time": 0.013438, + "status": "success" + }, + "2015-11-02T14:17:49.449379": { + "run_id": 55506, + "run_time": 0.013609, + "status": "success" + }, + "2015-11-02T14:22:05.712563": { + "run_id": 46554, + "run_time": 0.023182, + "status": "success" + }, + "2015-11-02T14:33:30.487910": { + "run_id": 599, + "run_time": 0.018991, + "status": "success" + }, + "2015-11-02T14:43:25.502026": { + "run_id": 12514, + "run_time": 0.031398, + "status": "success" + }, + "2015-11-02T14:44:22.676896": { + "run_id": 161001, + "run_time": 0.116917, + "status": "success" + }, + "2015-11-02T15:46:11.449058": { + "run_id": 71330, + "run_time": 0.017796, + "status": "success" + }, + "2015-11-02T16:42:01.962719": { + "run_id": 80307, + "run_time": 0.016806, + "status": "success" + }, + "2015-11-02T16:45:53.780516": { + "run_id": 63984, + "run_time": 0.016583, + "status": "success" + }, + "2015-11-02T16:53:48.431066": { + "run_id": 31018, + "run_time": 0.015082, + "status": "success" + }, + "2015-11-02T16:53:55.290351": { + "run_id": 162963, + "run_time": 0.015735, + "status": "success" + }, + "2015-11-02T16:55:14.979653": { + "run_id": 14083, + "run_time": 0.032282, + "status": "success" + }, + "2015-11-02T17:01:01.282831": { + "run_id": 106601, + "run_time": 0.013443, + "status": "success" + }, + "2015-11-02T17:08:40.703509": { + "run_id": 92504, + "run_time": 0.018598, + "status": "success" + }, + "2015-11-02T17:38:11.036868": { + "run_id": 121501, + "run_time": 0.034067, + "status": "success" + }, + "2015-11-02T18:33:42.123968": { + "run_id": 154149, + "run_time": 0.017088, + "status": "success" + }, + "2015-11-02T18:38:08.406395": { + "run_id": 122021, + "run_time": 0.021967, + "status": "success" + }, + "2015-11-02T18:38:43.469517": { + "run_id": 155118, + "run_time": 0.042394, + "status": "success" + }, + "2015-11-02T18:39:24.415214": { + "run_id": 61434, + "run_time": 0.015306, + "status": "success" + }, + "2015-11-02T19:31:07.663173": { + "run_id": 72665, + "run_time": 0.01735, + "status": "success" + }, + "2015-11-02T19:41:15.503530": { + "run_id": 192883, + "run_time": 0.014081, + "status": "success" + }, + "2015-11-02T20:04:03.725369": { + "run_id": 22034, + "run_time": 0.016241, + "status": "success" + }, + "2015-11-02T20:10:44.169290": { + "run_id": 85666, + "run_time": 0.020533, + "status": "success" + }, + "2015-11-02T20:11:32.451023": { + "run_id": 34396, + "run_time": 0.015341, + "status": "success" + }, + "2015-11-02T20:18:37.400257": { + "run_id": 131621, + "run_time": 0.014312, + "status": "success" + }, + "2015-11-02T20:19:59.759422": { + "run_id": 97553, + "run_time": 0.023146, + "status": "success" + }, + "2015-11-02T20:22:31.440839": { + "run_id": 162355, + "run_time": 0.01791, + "status": "success" + }, + "2015-11-02T20:23:02.124251": { + "run_id": 83893, + "run_time": 0.01618, + "status": "success" + }, + "2015-11-02T20:26:16.035012": { + "run_id": 23575, + "run_time": 0.045818, + "status": "success" + }, + "2015-11-02T21:26:54.656497": { + "run_id": 41077, + "run_time": 0.023523, + "status": "success" + }, + "2015-11-02T21:54:10.596232": { + "run_id": 38493, + "run_time": 0.014847, + "status": "success" + }, + "2015-11-02T21:57:45.216474": { + "run_id": 120429, + "run_time": 0.015238, + "status": "success" + }, + "2015-11-02T22:01:51.437871": { + "run_id": 199434, + "run_time": 0.0177, + "status": "success" + }, + "2015-11-02T23:14:11.106709": { + "run_id": 172444, + "run_time": 0.021441, + "status": "success" + }, + "2015-11-03T01:55:28.506993": { + "run_id": 129762, + "run_time": 0.020201, + "status": "success" + }, + "2015-11-03T03:39:36.589137": { + "run_id": 95749, + "run_time": 0.018903, + "status": "success" + }, + "2015-11-03T03:41:12.563281": { + "run_id": 103042, + "run_time": 0.020127, + "status": "success" + }, + "2015-11-03T03:51:56.225424": { + "run_id": 131119, + "run_time": 0.014433, + "status": "success" + }, + "2015-11-03T03:54:39.499312": { + "run_id": 181899, + "run_time": 0.014116, + "status": "success" + }, + "2015-11-03T03:55:17.861858": { + "run_id": 10998, + "run_time": 0.025004, + "status": "success" + }, + "2015-11-03T04:03:55.526098": { + "run_id": 182062, + "run_time": 0.028803, + "status": "success" + }, + "2015-11-03T04:05:58.315794": { + "run_id": 168321, + "run_time": 0.015644, + "status": "success" + }, + "2015-11-03T04:08:58.127949": { + "run_id": 91538, + "run_time": 0.014831, + "status": "success" + }, + "2015-11-03T04:25:19.767468": { + "run_id": 15448, + "run_time": 0.017014, + "status": "success" + }, + "2015-11-03T04:30:33.181113": { + "run_id": 36184, + "run_time": 0.022527, + "status": "success" + }, + "2015-11-03T04:31:31.477353": { + "run_id": 39357, + "run_time": 0.025355, + "status": "success" + }, + "2015-11-03T04:32:00.665192": { + "run_id": 97960, + "run_time": 0.057353, + "status": "success" + }, + "2015-11-03T05:50:08.163248": { + "run_id": 107759, + "run_time": 0.019159, + "status": "success" + }, + "2015-11-03T05:54:24.671860": { + "run_id": 52817, + "run_time": 0.019954, + "status": "success" + }, + "2015-11-03T05:56:32.810519": { + "run_id": 102524, + "run_time": 0.020218, + "status": "success" + }, + "2015-11-03T06:04:45.906773": { + "run_id": 195744, + "run_time": 0.018326, + "status": "success" + }, + "2015-11-03T06:09:37.574811": { + "run_id": 23657, + "run_time": 0.013177, + "status": "success" + }, + "2015-11-03T06:12:13.747453": { + "run_id": 118887, + "run_time": 0.018813, + "status": "success" + }, + "2015-11-03T06:15:47.237307": { + "run_id": 181329, + "run_time": 0.016679, + "status": "success" + }, + "2015-11-03T07:29:10.025522": { + "run_id": 201291, + "run_time": 0.021449, + "status": "success" + }, + "2015-11-03T07:35:34.205409": { + "run_id": 132286, + "run_time": 0.017252, + "status": "success" + }, + "2015-11-03T07:42:53.707987": { + "run_id": 69496, + "run_time": 0.013556, + "status": "success" + }, + "2015-11-03T07:46:46.336541": { + "run_id": 180341, + "run_time": 0.054122, + "status": "success" + }, + "2015-11-03T08:10:24.634094": { + "run_id": 16412, + "run_time": 0.019053, + "status": "success" + }, + "2015-11-03T08:34:50.675936": { + "run_id": 101477, + "run_time": 0.013883, + "status": "success" + }, + "2015-11-03T09:00:31.808132": { + "run_id": 148665, + "run_time": 0.018268, + "status": "success" + }, + "2015-11-03T09:18:43.394218": { + "run_id": 185587, + "run_time": 0.059416, + "status": "success" + }, + "2015-11-03T09:22:28.400289": { + "run_id": 76945, + "run_time": 0.025145, + "status": "success" + }, + "2015-11-03T09:27:15.679960": { + "run_id": 97261, + "run_time": 0.014526, + "status": "success" + }, + "2015-11-03T09:35:02.628764": { + "run_id": 67952, + "run_time": 0.020944, + "status": "success" + }, + "2015-11-03T09:57:34.905081": { + "run_id": 78685, + "run_time": 0.012768, + "status": "success" + }, + "2015-11-03T10:00:32.490034": { + "run_id": 28595, + "run_time": 0.014158, + "status": "success" + }, + "2015-11-03T10:01:26.971477": { + "run_id": 140094, + "run_time": 0.016267, + "status": "success" + }, + "2015-11-03T10:04:35.688114": { + "run_id": 139786, + "run_time": 0.038287, + "status": "success" + }, + "2015-11-03T10:11:49.791995": { + "run_id": 193717, + "run_time": 0.018484, + "status": "success" + }, + "2015-11-03T10:15:05.760876": { + "run_id": 83089, + "run_time": 0.020801, + "status": "success" + }, + "2015-11-03T10:15:21.956085": { + "run_id": 62546, + "run_time": 0.01775, + "status": "success" + }, + "2015-11-03T10:57:01.512602": { + "run_id": 194498, + "run_time": 0.016412, + "status": "success" + }, + "2015-11-03T10:57:48.425003": { + "run_id": 110810, + "run_time": 0.024954, + "status": "success" + }, + "2015-11-03T11:01:29.137476": { + "run_id": 87102, + "run_time": 0.012801, + "status": "success" + }, + "2015-11-03T11:04:37.643810": { + "run_id": 60972, + "run_time": 0.019069, + "status": "success" + }, + "2015-11-03T12:34:30.897672": { + "run_id": 165405, + "run_time": 0.016476, + "status": "success" + }, + "2015-11-03T12:39:21.374857": { + "run_id": 10530, + "run_time": 0.016794, + "status": "success" + }, + "2015-11-03T12:41:12.916698": { + "run_id": 110916, + "run_time": 0.02208, + "status": "success" + }, + "2015-11-03T12:42:46.857261": { + "run_id": 81160, + "run_time": 0.018877, + "status": "success" + }, + "2015-11-03T12:43:12.507827": { + "run_id": 11804, + "run_time": 0.014681, + "status": "success" + }, + "2015-11-03T14:43:30.019390": { + "run_id": 63952, + "run_time": 0.02087, + "status": "success" + }, + "2015-11-03T14:43:48.540687": { + "run_id": 13796, + "run_time": 0.016039, + "status": "success" + }, + "2015-11-03T14:45:06.369415": { + "run_id": 11275, + "run_time": 0.022614, + "status": "success" + }, + "2015-11-03T14:46:43.896246": { + "run_id": 52460, + "run_time": 0.021359, + "status": "success" + }, + "2015-11-03T14:50:28.101158": { + "run_id": 93685, + "run_time": 0.01493, + "status": "success" + }, + "2015-11-03T14:55:55.947335": { + "run_id": 57133, + "run_time": 0.01425, + "status": "success" + }, + "2015-11-03T15:05:24.164350": { + "run_id": 18078, + "run_time": 0.01625, + "status": "success" + }, + "2015-11-03T15:07:08.534488": { + "run_id": 59372, + "run_time": 0.027877, + "status": "success" + }, + "2015-11-03T15:09:22.890091": { + "run_id": 23359, + "run_time": 0.017697, + "status": "success" + }, + "2015-11-03T15:10:29.480401": { + "run_id": 63121, + "run_time": 0.016415, + "status": "success" + }, + "2015-11-03T15:16:05.852811": { + "run_id": 202160, + "run_time": 0.05509, + "status": "success" + }, + "2015-11-03T15:21:50.985273": { + "run_id": 141944, + "run_time": 0.014155, + "status": "success" + }, + "2015-11-03T15:22:29.186902": { + "run_id": 139688, + "run_time": 0.019822, + "status": "success" + }, + "2015-11-03T15:22:37.539778": { + "run_id": 9571, + "run_time": 0.016629, + "status": "success" + }, + "2015-11-03T15:23:53.595471": { + "run_id": 190988, + "run_time": 0.048468, + "status": "success" + }, + "2015-11-03T15:24:04.019090": { + "run_id": 124183, + "run_time": 0.029403, + "status": "success" + }, + "2015-11-03T15:27:15.516271": { + "run_id": 174303, + "run_time": 0.018184, + "status": "success" + }, + "2015-11-03T15:27:43.282353": { + "run_id": 154442, + "run_time": 0.0218, + "status": "success" + }, + "2015-11-03T15:29:51.005086": { + "run_id": 47251, + "run_time": 0.038698, + "status": "success" + }, + "2015-11-03T15:30:12.128262": { + "run_id": 80943, + "run_time": 0.016783, + "status": "success" + }, + "2015-11-03T15:31:01.689603": { + "run_id": 71316, + "run_time": 0.016032, + "status": "success" + }, + "2015-11-03T15:31:34.008205": { + "run_id": 161033, + "run_time": 0.020854, + "status": "success" + }, + "2015-11-03T15:32:16.297289": { + "run_id": 102911, + "run_time": 0.01468, + "status": "success" + }, + "2015-11-03T15:32:51.302916": { + "run_id": 203616, + "run_time": 0.017706, + "status": "success" + }, + "2015-11-03T15:39:38.353772": { + "run_id": 200742, + "run_time": 0.068364, + "status": "success" + }, + "2015-11-03T15:41:06.705236": { + "run_id": 148320, + "run_time": 0.020857, + "status": "success" + }, + "2015-11-03T15:42:04.599467": { + "run_id": 9951, + "run_time": 0.018137, + "status": "success" + }, + "2015-11-03T15:45:51.002130": { + "run_id": 2153, + "run_time": 0.020568, + "status": "success" + }, + "2015-11-03T15:50:54.137488": { + "run_id": 127138, + "run_time": 0.023681, + "status": "success" + } + } + } + } +}; diff --git a/test/e2e/routes_spec.js b/test/e2e/routes_spec.js index f6720838..0ea8927d 100644 --- a/test/e2e/routes_spec.js +++ b/test/e2e/routes_spec.js @@ -49,8 +49,22 @@ describe('E2E: Routes', function() { expect(element(by.css(selector)).isPresent()).toBe(true); }); + it('should have a single test route', function() { + mock(['config', 'test_project']); + + browser.get('#/test/tempest.api.volume.test_qos.QosSpecsV2TestJSON.test_get_qos'); + + // route should be defined (will redirect to / if not) + expect(browser.getLocationAbsUrl()).toMatch('/test/tempest.api.volume.' + + 'test_qos.QosSpecsV2TestJSON.test_get_qos'); + // data should actually be requested (no request if error) + expect(mock.requestsMade()).toContain(jasmine.objectContaining({ + url: 'http://localhost:5000/test_runs/tempest.api.volume.test_qos.' + + 'QosSpecsV2TestJSON.test_get_qos', + method: 'JSONP' + })); + }); afterEach(function() { mock.teardown(); }); - });