diff --git a/bundles.json b/bundles.json index 31aedf69bb..1f411aae70 100644 --- a/bundles.json +++ b/bundles.json @@ -14,6 +14,7 @@ "platform/forms", "platform/persistence/cache", "platform/persistence/couch", + "platform/policy", "example/generator" ] diff --git a/platform/policy/src/PolicyActionDecorator.js b/platform/policy/src/PolicyActionDecorator.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/platform/policy/test/PolicyActionDecoratorSpec.js b/platform/policy/test/PolicyActionDecoratorSpec.js new file mode 100644 index 0000000000..d372a1a110 --- /dev/null +++ b/platform/policy/test/PolicyActionDecoratorSpec.js @@ -0,0 +1,79 @@ +/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/ + +define( + ["../src/PolicyActionDecorator"], + function (PolicyActionDecorator) { + "use strict"; + + describe("The policy action decorator", function () { + var mockPolicyService, + mockActionService, + testContext, + testActions, + decorator; + + beforeEach(function () { + mockPolicyService = jasmine.createSpyObj( + 'policyService', + ['allow'] + ); + mockActionService = jasmine.createSpyObj( + 'actionService', + ['getActions'] + ); + + // Content of actions should be irrelevant to this + // decorator, so just give it some objects to pass + // around. + testActions = [ + { someKey: "a" }, + { someKey: "b" }, + { someKey: "c" } + ]; + testContext = { someKey: "some value" }; + + mockActionService.getActions.andReturn(testActions); + mockPolicyService.allow.andReturn(true); + + decorator = new PolicyActionDecorator( + mockPolicyService, + mockActionService + ); + }); + + it("delegates to its decorated action service", function () { + decorator.getActions(testContext); + expect(mockActionService.getActions) + .toHaveBeenCalledWith(testContext); + }); + + it("provides actions from its decorated action service", function () { + // Mock policy service allows everything by default, + // so everything should be returned + expect(decorator.getActions(testContext)) + .toEqual(testActions); + }); + + it("consults the policy service for each candidate action", function () { + decorator.getActions(testContext); + testActions.forEach(function (testAction) { + expect(mockPolicyService.allow).toHaveBeenCalledWith( + 'action', + testAction, + testContext + ); + }); + }); + + it("filters out policy-disallowed actions", function () { + // Disallow the second action + mockPolicyService.allow.andCallFake(function (cat, candidate, ctxt) { + return candidate.someKey !== 'b'; + }); + expect(decorator.getActions(testContext)) + .toEqual([ testActions[0], testActions[2] ]); + }); + + }); + } +); \ No newline at end of file diff --git a/platform/policy/test/suite.json b/platform/policy/test/suite.json index b670210e62..8706198dc6 100644 --- a/platform/policy/test/suite.json +++ b/platform/policy/test/suite.json @@ -1,3 +1,4 @@ [ + "PolicyActionDecorator", "PolicyProvider" ] \ No newline at end of file