diff --git a/library/src/main/java/com/avioconsulting/mule/deployment/dsl/policies/ClientEnforcementPolicyCustomContext.groovy b/library/src/main/java/com/avioconsulting/mule/deployment/dsl/policies/ClientEnforcementPolicyCustomContext.groovy new file mode 100644 index 00000000..64a2ef66 --- /dev/null +++ b/library/src/main/java/com/avioconsulting/mule/deployment/dsl/policies/ClientEnforcementPolicyCustomContext.groovy @@ -0,0 +1,35 @@ +package com.avioconsulting.mule.deployment.dsl.policies + +import com.avioconsulting.mule.deployment.api.models.policies.ClientEnforcementPolicyCustom +import com.avioconsulting.mule.deployment.dsl.BaseContext + +class ClientEnforcementPolicyCustomContext extends BaseContext { + String version + private PathsContext paths = new PathsContext() + private boolean pathsCalled = false + String clientIdExpression + String clientSecretExpression + + ClientEnforcementPolicyCustom createPolicyModel() { + def pathListing = paths.createModel() + if (pathsCalled && !pathListing.any()) { + throw new Exception("You specified 'paths' but did not supply any 'path' declarations inside it. Either remove the paths declaration (policy applies to all resources) or declare one.") + } + new ClientEnforcementPolicyCustom( pathListing, + this.clientIdExpression, this.clientSecretExpression, + this.version) + } + + def invokeMethod(String name, def args) { + if (name == 'paths') { + pathsCalled = true + } + super.invokeMethod(name, + args) + } + + @Override + List findOptionalProperties() { + return null + } +} diff --git a/library/src/main/java/com/avioconsulting/mule/deployment/dsl/policies/PolicyListContext.groovy b/library/src/main/java/com/avioconsulting/mule/deployment/dsl/policies/PolicyListContext.groovy index 9ce53df1..ef3cc849 100644 --- a/library/src/main/java/com/avioconsulting/mule/deployment/dsl/policies/PolicyListContext.groovy +++ b/library/src/main/java/com/avioconsulting/mule/deployment/dsl/policies/PolicyListContext.groovy @@ -25,6 +25,14 @@ class PolicyListContext { policies << policyContext.createPolicyModel() } + def clientEnforcementPolicyCustom(Closure closure = {}) { + def policyContext = new ClientEnforcementPolicyCustomContext() + closure.delegate = policyContext + closure.resolveStrategy = Closure.DELEGATE_FIRST + closure.call() + policies << policyContext.createPolicyModel() + } + def mulesoftPolicy(Closure closure) { def policyContext = new PolicyContext(Policy.getMulesoftGroupId()) closure.delegate = policyContext diff --git a/library/src/test/java/com/avioconsulting/mule/deployment/dsl/policies/PolicyContextTest.groovy b/library/src/test/java/com/avioconsulting/mule/deployment/dsl/policies/PolicyContextTest.groovy index 17c30438..d9f0c77e 100644 --- a/library/src/test/java/com/avioconsulting/mule/deployment/dsl/policies/PolicyContextTest.groovy +++ b/library/src/test/java/com/avioconsulting/mule/deployment/dsl/policies/PolicyContextTest.groovy @@ -542,4 +542,55 @@ class PolicyContextTest { ], '1.4.1'))) } + + @Test + void client_enforcement_client_Id_secret_minimum() { + // arrange + def context = new ClientEnforcementPolicyCustomContext() + def closure = { + clientSecretExpression "#[attributes.headers['client_secret']]" + } + closure.delegate = context + closure.call() + + // act + def request = context.createPolicyModel() + // assert + assertThat request, + is(equalTo(new ClientEnforcementPolicyCustom())) + } + + @Test + void client_enforcement_client_Id_secret_full() { + // arrange + def context = new ClientEnforcementPolicyCustomContext() + println(context) + def closure = { + version '1.4.1' + paths { + path { + method HttpMethod().put + regex '.*bar' + } + } + clientIdExpression "#[attributes.headers['client_id']]" + clientSecretExpression "#[attributes.headers['client_secret']]" + + } + closure.delegate = context + closure.call() + + // act + def request = context.createPolicyModel() + + // assert + assertThat request, + is(equalTo(new ClientEnforcementPolicyCustom([ + new PolicyPathApplication([HttpMethod.PUT], + '.*bar') + ], + "#[attributes.headers['client_id']]", + "#[attributes.headers['client_secret']]", + '1.4.1'))) + } } diff --git a/library/src/test/java/com/avioconsulting/mule/deployment/dsl/policies/PolicyListContextTest.groovy b/library/src/test/java/com/avioconsulting/mule/deployment/dsl/policies/PolicyListContextTest.groovy index 8ed9f0a3..7fef9947 100644 --- a/library/src/test/java/com/avioconsulting/mule/deployment/dsl/policies/PolicyListContextTest.groovy +++ b/library/src/test/java/com/avioconsulting/mule/deployment/dsl/policies/PolicyListContextTest.groovy @@ -88,6 +88,35 @@ class PolicyListContextTest { is(instanceOf(ClientEnforcementPolicyBasicAuth)) } + @Test + void clientEnforcementPolicyCustom_with_details() { + // arrange + def context = new PolicyListContext() + def closure = { + policy { + assetId 'the-asset-id' + version '1.2.1' + config hello: 'there' + } + clientEnforcementPolicyCustom { + clientSecretExpression "#[attributes.headers['client_secret']]" + } + } + closure.delegate = context + closure.call() + + // act + def result = context.createPolicyList() + + // assert + assertThat result.size(), + is(equalTo(2)) + assertThat result[0], + is(instanceOf(Policy)) + assertThat result[1], + is(instanceOf(ClientEnforcementPolicyCustom)) + } + @Test void no_policies_on_purpose() { // arrange