Merge "Add Project Service"
This commit is contained in:
commit
cc48a54167
60
app/js/services/projects.js
Normal file
60
app/js/services/projects.js
Normal file
@ -0,0 +1,60 @@
|
||||
'use strict';
|
||||
|
||||
var angular = require('angular');
|
||||
var servicesModule = require('./_index.js');
|
||||
|
||||
/**
|
||||
* @ngInject
|
||||
*/
|
||||
var projectService = function(projectFactory, metricsService) {
|
||||
var service = {};
|
||||
|
||||
var findOrCreate = function(index, storage, key, createFunction) {
|
||||
var obj = index[key] || createFunction(key);
|
||||
if (!index[key]) {
|
||||
index[key] = obj;
|
||||
storage.push(obj);
|
||||
}
|
||||
return obj;
|
||||
};
|
||||
|
||||
var byDate = function(stats1, stats2) {
|
||||
return stats1.date - stats2.date;
|
||||
};
|
||||
|
||||
var createDateStats = function(date) {
|
||||
return { date: date, metrics: metricsService.getNewMetrics() };
|
||||
};
|
||||
|
||||
service.createProjects = function(runsJson) {
|
||||
var projects = [];
|
||||
var index = {};
|
||||
|
||||
angular.forEach(runsJson, function(projectsJson, dateString) {
|
||||
angular.forEach(projectsJson, function(runEntries, name) {
|
||||
var project = findOrCreate(index, projects, name, projectFactory.create);
|
||||
project.addRuns(dateString, runEntries);
|
||||
});
|
||||
});
|
||||
|
||||
return projects;
|
||||
};
|
||||
|
||||
service.getStatsByDate = function(projects) {
|
||||
var index = {};
|
||||
var dateStats = [];
|
||||
|
||||
angular.forEach(projects, function(project) {
|
||||
angular.forEach(project.runs, function(run) {
|
||||
var stats = findOrCreate(index, dateStats, run.date, createDateStats);
|
||||
stats.metrics = metricsService.addMetrics(stats.metrics, run.metrics);
|
||||
});
|
||||
});
|
||||
|
||||
return dateStats.sort(byDate);
|
||||
};
|
||||
|
||||
return service;
|
||||
};
|
||||
|
||||
servicesModule.service('projectService', projectService);
|
84
test/unit/services/projects_spec.js
Normal file
84
test/unit/services/projects_spec.js
Normal file
@ -0,0 +1,84 @@
|
||||
describe('ProjectService', function() {
|
||||
var projectService;
|
||||
|
||||
beforeEach(function() {
|
||||
module('app.services');
|
||||
|
||||
var mockProjectFactory = {
|
||||
create: function(name) {
|
||||
return {addRuns: function() {}};
|
||||
}
|
||||
};
|
||||
var mockMetricsService = {
|
||||
getFailRate: function() { return 0.5; },
|
||||
getNewMetrics: function() { return {}; },
|
||||
addMetrics: function() { return 'updated'; }
|
||||
};
|
||||
|
||||
module(function($provide) {
|
||||
$provide.value('projectFactory', mockProjectFactory);
|
||||
$provide.value('metricsService', mockMetricsService);
|
||||
});
|
||||
|
||||
inject(function($injector) {
|
||||
projectService = $injector.get('projectService');
|
||||
});
|
||||
});
|
||||
|
||||
it('should create projects from runs per datetime', function() {
|
||||
var runs = {
|
||||
'2015-10-10T20:00:00': {
|
||||
'openstack/heat': [{ fail: 1, pass: 0, skip: 0 }],
|
||||
'openstack/keystone': [{ fail: 0, pass: 1, skip: 0 }],
|
||||
'openstack/tempest': [{ fail: 0, pass: 0, skip: 1 }]
|
||||
}
|
||||
};
|
||||
|
||||
var projects = projectService.createProjects(runs);
|
||||
|
||||
expect(projects.length).toEqual(3);
|
||||
});
|
||||
|
||||
it('should update projects from different datetimes', function() {
|
||||
var runs = {
|
||||
'2015-10-10t20:00:00': {
|
||||
'openstack/tempest': [{ fail: 0, pass: 0, skip: 1 }]
|
||||
},
|
||||
'2015-11-11t20:00:00': {
|
||||
'openstack/heat': [{ fail: 1, pass: 0, skip: 0 }],
|
||||
'openstack/tempest': [{ fail: 0, pass: 0, skip: 1 }]
|
||||
}
|
||||
};
|
||||
|
||||
var projects = projectService.createProjects(runs);
|
||||
|
||||
expect(projects.length).toEqual(2);
|
||||
});
|
||||
|
||||
it('should aggregate project stats by date', function() {
|
||||
var generateProject = function(name, date, passes, failures, skips) {
|
||||
return {
|
||||
name: name,
|
||||
runs: [{ date: date, passes: passes, failures: failures, skips: skips }]
|
||||
};
|
||||
};
|
||||
var date1 = new Date('2015-10-10T20:00:00');
|
||||
var date2 = new Date('2015-11-11T20:00:00');
|
||||
var projects = [
|
||||
generateProject('p1', date1, 1, 2, 3),
|
||||
generateProject('p2', date1, 4, 5, 6),
|
||||
generateProject('p3', date2, 7, 8, 9),
|
||||
generateProject('p4', date2, 0, 1, 2)
|
||||
];
|
||||
|
||||
var stats = projectService.getStatsByDate(projects);
|
||||
|
||||
expect(stats.length).toEqual(2);
|
||||
|
||||
expect(stats[0].date).toEqual(date1);
|
||||
expect(stats[0].metrics).toEqual('updated');
|
||||
|
||||
expect(stats[1].date).toEqual(date2);
|
||||
expect(stats[1].metrics).toEqual('updated');
|
||||
});
|
||||
});
|
Loading…
Reference in New Issue
Block a user