Add option to view/download test lists
On the guideline page when viewing DefCore capabilities, users might want to get the test list containing only required or advisory tests. This patch provides a way for a user to get that test list to use with RefStack client. The phantomjs version was updated to allow testing with Blobs. Change-Id: I9243f5781cb8a688ca3e64645302db5bc4527c37
This commit is contained in:
parent
d6124e0117
commit
64f1efe961
@ -16,7 +16,7 @@
|
|||||||
"karma-firefox-launcher": "^0.1.3",
|
"karma-firefox-launcher": "^0.1.3",
|
||||||
"karma-jasmine": "^0.2.2",
|
"karma-jasmine": "^0.2.2",
|
||||||
"karma-phantomjs-launcher": "0.2.0",
|
"karma-phantomjs-launcher": "0.2.0",
|
||||||
"phantomjs": "1.9.17",
|
"phantomjs": "2.1.1",
|
||||||
"protractor": "~1.0.0"
|
"protractor": "~1.0.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
@ -192,3 +192,11 @@ h1, h2, h3, h4, h5, h6 {
|
|||||||
a.glyphicon {
|
a.glyphicon {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.test-list-dl {
|
||||||
|
word-spacing: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.test-list-dl:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
@ -53,6 +53,12 @@
|
|||||||
<input type="checkbox" ng-model="ctrl.status.removed">
|
<input type="checkbox" ng-model="ctrl.status.removed">
|
||||||
<span class="removed">Removed</span>
|
<span class="removed">Removed</span>
|
||||||
</label>
|
</label>
|
||||||
|
<a class="test-list-dl pull-right"
|
||||||
|
title="Get a test list for capabilities matching selected statuses."
|
||||||
|
ng-click="ctrl.openTestListModal()">
|
||||||
|
|
||||||
|
Test List <span class="glyphicon glyphicon-file"></span>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<!-- End Capability Filters -->
|
<!-- End Capability Filters -->
|
||||||
|
|
||||||
|
@ -19,14 +19,14 @@
|
|||||||
.module('refstackApp')
|
.module('refstackApp')
|
||||||
.controller('CapabilitiesController', CapabilitiesController);
|
.controller('CapabilitiesController', CapabilitiesController);
|
||||||
|
|
||||||
CapabilitiesController.$inject = ['$http', 'refstackApiUrl'];
|
CapabilitiesController.$inject = ['$http', '$uibModal', 'refstackApiUrl'];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RefStack Capabilities Controller
|
* RefStack Capabilities Controller
|
||||||
* This controller is for the '/capabilities' page where a user can browse
|
* This controller is for the '/capabilities' page where a user can browse
|
||||||
* through tests belonging to DefCore-defined capabilities.
|
* through tests belonging to DefCore-defined capabilities.
|
||||||
*/
|
*/
|
||||||
function CapabilitiesController($http, refstackApiUrl) {
|
function CapabilitiesController($http, $uibModal, refstackApiUrl) {
|
||||||
var ctrl = this;
|
var ctrl = this;
|
||||||
|
|
||||||
ctrl.getVersionList = getVersionList;
|
ctrl.getVersionList = getVersionList;
|
||||||
@ -34,6 +34,8 @@
|
|||||||
ctrl.updateTargetCapabilities = updateTargetCapabilities;
|
ctrl.updateTargetCapabilities = updateTargetCapabilities;
|
||||||
ctrl.filterStatus = filterStatus;
|
ctrl.filterStatus = filterStatus;
|
||||||
ctrl.getObjectLength = getObjectLength;
|
ctrl.getObjectLength = getObjectLength;
|
||||||
|
ctrl.getTestList = getTestList;
|
||||||
|
ctrl.openTestListModal = openTestListModal;
|
||||||
|
|
||||||
/** The target OpenStack marketing program to show capabilities for. */
|
/** The target OpenStack marketing program to show capabilities for. */
|
||||||
ctrl.target = 'platform';
|
ctrl.target = 'platform';
|
||||||
@ -182,6 +184,118 @@
|
|||||||
return Object.keys(object).length;
|
return Object.keys(object).length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This will give a list of tests belonging to capabilities with
|
||||||
|
* the selected status(es).
|
||||||
|
*/
|
||||||
|
function getTestList() {
|
||||||
|
var caps = ctrl.capabilities.capabilities;
|
||||||
|
var tests = [];
|
||||||
|
angular.forEach(ctrl.targetCapabilities,
|
||||||
|
function (status, cap) {
|
||||||
|
if (ctrl.status[status]) {
|
||||||
|
if (ctrl.capabilities.schema === '1.2') {
|
||||||
|
tests.push.apply(tests, caps[cap].tests);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
angular.forEach(caps[cap].tests,
|
||||||
|
function(info, test) {
|
||||||
|
tests.push(test);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return tests;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This will open the modal that will show a list of all tests
|
||||||
|
* belonging to capabilities with the selected status(es).
|
||||||
|
*/
|
||||||
|
function openTestListModal() {
|
||||||
|
$uibModal.open({
|
||||||
|
templateUrl: '/components/capabilities/partials' +
|
||||||
|
'/testListModal.html',
|
||||||
|
backdrop: true,
|
||||||
|
windowClass: 'modal',
|
||||||
|
animation: true,
|
||||||
|
controller: 'TestListModalController as modal',
|
||||||
|
size: 'lg',
|
||||||
|
resolve: {
|
||||||
|
tests: function () {
|
||||||
|
return ctrl.getTestList();
|
||||||
|
},
|
||||||
|
version: function () {
|
||||||
|
return ctrl.version.slice(0, -5);
|
||||||
|
},
|
||||||
|
status: function () {
|
||||||
|
return ctrl.status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
ctrl.getVersionList();
|
ctrl.getVersionList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
angular
|
||||||
|
.module('refstackApp')
|
||||||
|
.controller('TestListModalController', TestListModalController);
|
||||||
|
|
||||||
|
TestListModalController.$inject = [
|
||||||
|
'$uibModalInstance', '$window', 'tests', 'version', 'status'
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test List Modal Controller
|
||||||
|
* This controller is for the modal that appears if a user wants to see the
|
||||||
|
* ftest list corresponding to DefCore capabilities with the selected
|
||||||
|
* statuses.
|
||||||
|
*/
|
||||||
|
function TestListModalController($uibModalInstance, $window, tests,
|
||||||
|
version, status) {
|
||||||
|
|
||||||
|
var ctrl = this;
|
||||||
|
|
||||||
|
ctrl.tests = tests;
|
||||||
|
ctrl.version = version;
|
||||||
|
ctrl.status = status;
|
||||||
|
ctrl.close = close;
|
||||||
|
ctrl.getTestListString = getTestListString;
|
||||||
|
ctrl.downloadTestList = downloadTestList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function will close/dismiss the modal.
|
||||||
|
*/
|
||||||
|
function close() {
|
||||||
|
$uibModalInstance.dismiss('exit');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function will return a string representing the sorted
|
||||||
|
* tests list separated by newlines.
|
||||||
|
*/
|
||||||
|
function getTestListString() {
|
||||||
|
return ctrl.tests.sort().join('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serve the test list as a downloadable file.
|
||||||
|
*/
|
||||||
|
function downloadTestList() {
|
||||||
|
var blob = new Blob([ctrl.getTestListString()], {type: 'text/csv'});
|
||||||
|
var filename = ctrl.version + '-test-list.txt';
|
||||||
|
if ($window.navigator.msSaveOrOpenBlob) {
|
||||||
|
$window.navigator.msSaveBlob(blob, filename);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var a = $window.document.createElement('a');
|
||||||
|
a.href = $window.URL.createObjectURL(blob);
|
||||||
|
a.download = filename;
|
||||||
|
$window.document.body.appendChild(a);
|
||||||
|
a.click();
|
||||||
|
$window.document.body.removeChild(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
})();
|
})();
|
||||||
|
@ -10,7 +10,7 @@ variable 'capabilities'.
|
|||||||
<em>{{capability.description}}</em><br />
|
<em>{{capability.description}}</em><br />
|
||||||
Status: <span class="{{ctrl.targetCapabilities[capability.id]}}">{{ctrl.targetCapabilities[capability.id]}}</span><br />
|
Status: <span class="{{ctrl.targetCapabilities[capability.id]}}">{{ctrl.targetCapabilities[capability.id]}}</span><br />
|
||||||
<span ng-if="capability.project">Project: {{capability.project | capitalize}}<br /></span>
|
<span ng-if="capability.project">Project: {{capability.project | capitalize}}<br /></span>
|
||||||
<a ng-click="showAchievements = !hshowAchievements">Achievements ({{capability.achievements.length}})</a><br />
|
<a ng-click="showAchievements = !showAchievements">Achievements ({{capability.achievements.length}})</a><br />
|
||||||
<ol uib-collapse="!showAchievements" class="list-inline">
|
<ol uib-collapse="!showAchievements" class="list-inline">
|
||||||
<li ng-repeat="achievement in capability.achievements">
|
<li ng-repeat="achievement in capability.achievements">
|
||||||
{{achievement}}
|
{{achievement}}
|
||||||
|
@ -0,0 +1,24 @@
|
|||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" aria-hidden="true" ng-click="modal.close()">×</button>
|
||||||
|
<h4>Test List ({{modal.tests.length}})</h4>
|
||||||
|
<p>Use this test list with <a title="refstack-client" target="_blank"href="https://github.com/openstack/refstack-client">refstack-client</a>
|
||||||
|
to run only tests in the {{modal.version}} DefCore guideline from capabilities with the following statuses:
|
||||||
|
</p>
|
||||||
|
<ul class="list-inline">
|
||||||
|
<li class="required" ng-if="modal.status.required"> Required</li>
|
||||||
|
<li class="advisory" ng-if="modal.status.advisory"> Advisory</li>
|
||||||
|
<li class="deprecated" ng-if="modal.status.deprecated"> Deprecated</li>
|
||||||
|
<li class="removed" ng-if="modal.status.removed"> Removed</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body tests-modal-content">
|
||||||
|
<div class="form-group">
|
||||||
|
<textarea class="form-control" rows="20" id="tests" wrap="off">{{modal.getTestListString()}}</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button class="btn btn-primary" type="button" ng-click="modal.downloadTestList()">Download</button>
|
||||||
|
<button class="btn btn-primary" type="button" ng-click="modal.close()">Close</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -152,6 +152,110 @@ describe('Refstack controllers', function () {
|
|||||||
};
|
};
|
||||||
expect(ctrl.getObjectLength(testObject)).toBe(2);
|
expect(ctrl.getObjectLength(testObject)).toBe(2);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should have a function to get a list of tests belonging to ' +
|
||||||
|
'capabilities with the selected statuses',
|
||||||
|
function () {
|
||||||
|
ctrl.targetCapabilities = {'cap-1': 'required',
|
||||||
|
'cap-2': 'advisory'};
|
||||||
|
ctrl.capabilities = {
|
||||||
|
'schema': 1.4,
|
||||||
|
'capabilities' : {
|
||||||
|
'cap-1': {
|
||||||
|
'tests': {
|
||||||
|
'test_1': {'idempotent_id': 'id-1234'},
|
||||||
|
'test_2': {'idempotent_id': 'id-5678'}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'cap-2': {
|
||||||
|
'tests': {
|
||||||
|
'test_3': {'idempotent_id': 'id-1233'}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
expect(ctrl.getTestList()).toEqual(['test_1', 'test_2']);
|
||||||
|
ctrl.capabilities = {
|
||||||
|
'schema': 1.2,
|
||||||
|
'capabilities' : {
|
||||||
|
'cap-1': {
|
||||||
|
'tests': ['test_1', 'test_2']
|
||||||
|
},
|
||||||
|
'cap-2': {
|
||||||
|
'tests': ['test_3']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have a method to open a modal for the relevant test list',
|
||||||
|
function () {
|
||||||
|
var modal;
|
||||||
|
inject(function ($uibModal) {
|
||||||
|
modal = $uibModal;
|
||||||
|
});
|
||||||
|
spyOn(modal, 'open');
|
||||||
|
ctrl.openTestListModal();
|
||||||
|
expect(modal.open).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('TestListModalController', function () {
|
||||||
|
var modalInstance, ctrl, $window;
|
||||||
|
|
||||||
|
beforeEach(inject(function ($controller, _$window_) {
|
||||||
|
modalInstance = {
|
||||||
|
dismiss: jasmine.createSpy('modalInstance.dismiss')
|
||||||
|
};
|
||||||
|
$window = _$window_;
|
||||||
|
ctrl = $controller('TestListModalController',
|
||||||
|
{$uibModalInstance: modalInstance,
|
||||||
|
tests: ['t1', 't2'],
|
||||||
|
version: '2016.01',
|
||||||
|
status: {required: true, advisory: false}}
|
||||||
|
);
|
||||||
|
}));
|
||||||
|
|
||||||
|
it('should assign inputs to variables', function () {
|
||||||
|
expect(ctrl.tests).toEqual(['t1', 't2']);
|
||||||
|
expect(ctrl.version).toEqual('2016.01');
|
||||||
|
expect(ctrl.status).toEqual({required: true, advisory: false});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have a method to close the modal',
|
||||||
|
function () {
|
||||||
|
ctrl.close();
|
||||||
|
expect(modalInstance.dismiss).toHaveBeenCalledWith('exit');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have a method to convert the tests to a string',
|
||||||
|
function () {
|
||||||
|
ctrl.tests = ['t2', 't1', 't3'];
|
||||||
|
var expectedString = 't1\nt2\nt3';
|
||||||
|
expect(ctrl.getTestListString()).toEqual(expectedString);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have a method to download a test list',
|
||||||
|
function () {
|
||||||
|
var fakeElement = $window.document.createElement('a');
|
||||||
|
spyOn($window.document, 'createElement').and.callFake(
|
||||||
|
function() {
|
||||||
|
return fakeElement;
|
||||||
|
});
|
||||||
|
spyOn($window.document.body, 'appendChild').and.callFake(
|
||||||
|
function() {
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
spyOn($window.document.body, 'removeChild').and.callFake(
|
||||||
|
function() {
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
ctrl.downloadTestList();
|
||||||
|
var doc = $window.document;
|
||||||
|
expect(doc.createElement).toHaveBeenCalledWith('a');
|
||||||
|
expect(doc.body.appendChild).toHaveBeenCalled();
|
||||||
|
expect(doc.body.removeChild).toHaveBeenCalled();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('resultsController', function () {
|
describe('resultsController', function () {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user