[Copy] #338 added CreationPolicy and appropriate tests, amended CreateActionProvider, and updated existing tests

This commit is contained in:
Henry
2015-12-02 11:28:49 -08:00
parent c8d77bc2db
commit fe600de0f7
6 changed files with 136 additions and 5 deletions

View File

@ -102,6 +102,12 @@
"implementation": "navigation/NavigationService.js" "implementation": "navigation/NavigationService.js"
} }
], ],
"policies": [
{
"implementation": "CreationPolicy.js",
"category": "creation"
}
],
"actions": [ "actions": [
{ {
"key": "navigate", "key": "navigate",

View File

@ -69,7 +69,7 @@ define(
// Introduce one create action per type // Introduce one create action per type
return this.typeService.listTypes().filter(function (type) { return this.typeService.listTypes().filter(function (type) {
return type.hasFeature("creation"); return self.policyService.allow("creation", type);
}).map(function (type) { }).map(function (type) {
return new CreateAction( return new CreateAction(
type, type,

View File

@ -0,0 +1,49 @@
/*****************************************************************************
* Open MCT Web, Copyright (c) 2014-2015, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT Web includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define*/
define(
[],
function () {
"use strict";
/**
* A policy for determining whether objects of a certain type can be
* created.
* @returns {{allow: Function}}
* @constructor
*/
function CreationPolicy() {
return {
/**
* Only allow creation of object types that have the
* Creation capability
*/
allow: function (action, type) {
return type.hasFeature("creation");
}
};
}
return CreationPolicy;
}
);

View File

@ -33,6 +33,9 @@ define(
var mockTypeService, var mockTypeService,
mockDialogService, mockDialogService,
mockCreationService, mockCreationService,
mockPolicyService,
mockCreationPolicy,
mockPolicyMap = {},
mockTypes, mockTypes,
provider; provider;
@ -67,14 +70,32 @@ define(
"creationService", "creationService",
[ "createObject" ] [ "createObject" ]
); );
mockPolicyService = jasmine.createSpyObj(
"policyService",
[ "allow" ]
);
mockTypes = [ "A", "B", "C" ].map(createMockType); mockTypes = [ "A", "B", "C" ].map(createMockType);
mockTypes.forEach(function(type){
mockPolicyMap[type.getName()] = true;
});
mockCreationPolicy = function(type){
return mockPolicyMap[type.getName()];
};
mockPolicyService.allow.andCallFake(function(category, type){
return category === "creation" && mockCreationPolicy(type) ? true : false;
});
mockTypeService.listTypes.andReturn(mockTypes); mockTypeService.listTypes.andReturn(mockTypes);
provider = new CreateActionProvider( provider = new CreateActionProvider(
mockTypeService, mockTypeService,
mockDialogService, mockDialogService,
mockCreationService mockCreationService,
mockPolicyService
); );
}); });
@ -94,15 +115,15 @@ define(
it("does not expose non-creatable types", function () { it("does not expose non-creatable types", function () {
// One of the types won't have the creation feature... // One of the types won't have the creation feature...
mockTypes[1].hasFeature.andReturn(false); mockPolicyMap[mockTypes[0].getName()] = false;
// ...so it should have been filtered out. // ...so it should have been filtered out.
expect(provider.getActions({ expect(provider.getActions({
key: "create", key: "create",
domainObject: {} domainObject: {}
}).length).toEqual(2); }).length).toEqual(2);
// Make sure it was creation which was used to check // Make sure it was creation which was used to check
expect(mockTypes[1].hasFeature) expect(mockPolicyService.allow)
.toHaveBeenCalledWith("creation"); .toHaveBeenCalledWith("creation", mockTypes[0]);
}); });
}); });
} }

View File

@ -0,0 +1,54 @@
/*****************************************************************************
* Open MCT Web, Copyright (c) 2014-2015, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT Web includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
/*global define,describe,it,expect,beforeEach,jasmine*/
define(
["../../src/creation/CreationPolicy"],
function (CreationPolicy) {
"use strict";
describe("The creation policy", function () {
var mockDomainObject,
mockType,
policy;
beforeEach(function () {
mockType = jasmine.createSpyObj(
'type',
['hasFeature']
);
policy = new CreationPolicy();
});
it("allows creation of types with the creation feature", function () {
mockType.hasFeature.andReturn(true);
expect(policy.allow({}, mockType)).toBeTruthy();
});
it("disallows creation of types without the creation feature", function () {
mockType.hasFeature.andReturn(false);
expect(policy.allow({}, mockType)).toBeFalsy();
});
});
}
);

View File

@ -8,6 +8,7 @@
"creation/CreateMenuController", "creation/CreateMenuController",
"creation/CreateWizard", "creation/CreateWizard",
"creation/CreationService", "creation/CreationService",
"creation/CreationPolicy",
"creation/LocatorController", "creation/LocatorController",
"navigation/NavigateAction", "navigation/NavigateAction",
"navigation/NavigationService", "navigation/NavigationService",