From fe600de0f711fa17920384335f19ca405c3d97b5 Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 2 Dec 2015 11:28:49 -0800 Subject: [PATCH] [Copy] #338 added CreationPolicy and appropriate tests, amended CreateActionProvider, and updated existing tests --- platform/commonUI/browse/bundle.json | 6 +++ .../src/creation/CreateActionProvider.js | 2 +- .../browse/src/creation/CreationPolicy.js | 49 +++++++++++++++++ .../test/creation/CreateActionProviderSpec.js | 29 ++++++++-- .../test/creation/CreationPolicySpec.js | 54 +++++++++++++++++++ platform/commonUI/browse/test/suite.json | 1 + 6 files changed, 136 insertions(+), 5 deletions(-) create mode 100644 platform/commonUI/browse/src/creation/CreationPolicy.js create mode 100644 platform/commonUI/browse/test/creation/CreationPolicySpec.js diff --git a/platform/commonUI/browse/bundle.json b/platform/commonUI/browse/bundle.json index 0d4c1eedd6..6954bba12c 100644 --- a/platform/commonUI/browse/bundle.json +++ b/platform/commonUI/browse/bundle.json @@ -102,6 +102,12 @@ "implementation": "navigation/NavigationService.js" } ], + "policies": [ + { + "implementation": "CreationPolicy.js", + "category": "creation" + } + ], "actions": [ { "key": "navigate", diff --git a/platform/commonUI/browse/src/creation/CreateActionProvider.js b/platform/commonUI/browse/src/creation/CreateActionProvider.js index 4ca2bce59f..4152d9a27f 100644 --- a/platform/commonUI/browse/src/creation/CreateActionProvider.js +++ b/platform/commonUI/browse/src/creation/CreateActionProvider.js @@ -69,7 +69,7 @@ define( // Introduce one create action per type return this.typeService.listTypes().filter(function (type) { - return type.hasFeature("creation"); + return self.policyService.allow("creation", type); }).map(function (type) { return new CreateAction( type, diff --git a/platform/commonUI/browse/src/creation/CreationPolicy.js b/platform/commonUI/browse/src/creation/CreationPolicy.js new file mode 100644 index 0000000000..a30a78ab8b --- /dev/null +++ b/platform/commonUI/browse/src/creation/CreationPolicy.js @@ -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; + } +); \ No newline at end of file diff --git a/platform/commonUI/browse/test/creation/CreateActionProviderSpec.js b/platform/commonUI/browse/test/creation/CreateActionProviderSpec.js index 431f6101c2..fdba091623 100644 --- a/platform/commonUI/browse/test/creation/CreateActionProviderSpec.js +++ b/platform/commonUI/browse/test/creation/CreateActionProviderSpec.js @@ -33,6 +33,9 @@ define( var mockTypeService, mockDialogService, mockCreationService, + mockPolicyService, + mockCreationPolicy, + mockPolicyMap = {}, mockTypes, provider; @@ -67,14 +70,32 @@ define( "creationService", [ "createObject" ] ); + mockPolicyService = jasmine.createSpyObj( + "policyService", + [ "allow" ] + ); + 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); provider = new CreateActionProvider( mockTypeService, mockDialogService, - mockCreationService + mockCreationService, + mockPolicyService ); }); @@ -94,15 +115,15 @@ define( it("does not expose non-creatable types", function () { // 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. expect(provider.getActions({ key: "create", domainObject: {} }).length).toEqual(2); // Make sure it was creation which was used to check - expect(mockTypes[1].hasFeature) - .toHaveBeenCalledWith("creation"); + expect(mockPolicyService.allow) + .toHaveBeenCalledWith("creation", mockTypes[0]); }); }); } diff --git a/platform/commonUI/browse/test/creation/CreationPolicySpec.js b/platform/commonUI/browse/test/creation/CreationPolicySpec.js new file mode 100644 index 0000000000..41afee0875 --- /dev/null +++ b/platform/commonUI/browse/test/creation/CreationPolicySpec.js @@ -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(); + }); + }); + } +); \ No newline at end of file diff --git a/platform/commonUI/browse/test/suite.json b/platform/commonUI/browse/test/suite.json index b9292b6ef1..70e62bcfa6 100644 --- a/platform/commonUI/browse/test/suite.json +++ b/platform/commonUI/browse/test/suite.json @@ -8,6 +8,7 @@ "creation/CreateMenuController", "creation/CreateWizard", "creation/CreationService", + "creation/CreationPolicy", "creation/LocatorController", "navigation/NavigateAction", "navigation/NavigationService",