|
13 | 13 | *
|
14 | 14 | */
|
15 | 15 |
|
16 |
| -package org.eclipse.edc.connector.controlplane.contract.offer; |
| 16 | +package org.eclipse.edc.connector.controlplane.catalog; |
17 | 17 |
|
18 | 18 | import org.eclipse.edc.connector.controlplane.contract.spi.offer.store.ContractDefinitionStore;
|
19 | 19 | import org.eclipse.edc.connector.controlplane.contract.spi.types.offer.ContractDefinition;
|
|
23 | 23 | import org.eclipse.edc.policy.engine.spi.PolicyEngine;
|
24 | 24 | import org.eclipse.edc.policy.model.Policy;
|
25 | 25 | import org.eclipse.edc.spi.agent.ParticipantAgent;
|
26 |
| -import org.eclipse.edc.spi.monitor.Monitor; |
27 | 26 | import org.eclipse.edc.spi.query.QuerySpec;
|
28 | 27 | import org.eclipse.edc.spi.result.Result;
|
29 |
| -import org.junit.jupiter.api.BeforeEach; |
30 | 28 | import org.junit.jupiter.api.Test;
|
31 | 29 |
|
32 |
| -import java.util.Map; |
33 | 30 | import java.util.stream.Stream;
|
34 | 31 |
|
| 32 | +import static java.util.Collections.emptyMap; |
35 | 33 | import static org.assertj.core.api.Assertions.assertThat;
|
36 |
| -import static org.eclipse.edc.connector.controlplane.contract.spi.offer.ContractDefinitionResolver.CATALOGING_SCOPE; |
| 34 | +import static org.assertj.core.api.Assertions.entry; |
| 35 | +import static org.eclipse.edc.connector.controlplane.catalog.CatalogCoreExtension.CATALOG_SCOPE; |
37 | 36 | import static org.mockito.AdditionalMatchers.and;
|
38 | 37 | import static org.mockito.ArgumentMatchers.any;
|
39 | 38 | import static org.mockito.ArgumentMatchers.argThat;
|
40 | 39 | import static org.mockito.ArgumentMatchers.eq;
|
41 | 40 | import static org.mockito.ArgumentMatchers.isA;
|
42 | 41 | import static org.mockito.Mockito.atLeastOnce;
|
43 | 42 | import static org.mockito.Mockito.mock;
|
| 43 | +import static org.mockito.Mockito.only; |
44 | 44 | import static org.mockito.Mockito.verify;
|
45 | 45 | import static org.mockito.Mockito.verifyNoInteractions;
|
46 | 46 | import static org.mockito.Mockito.when;
|
47 | 47 |
|
48 | 48 | class ContractDefinitionResolverImplTest {
|
49 | 49 |
|
50 |
| - private final PolicyEngine policyEngine = mock(PolicyEngine.class); |
51 |
| - private final PolicyDefinitionStore policyStore = mock(PolicyDefinitionStore.class); |
52 |
| - private final ContractDefinitionStore definitionStore = mock(ContractDefinitionStore.class); |
| 50 | + private final PolicyEngine policyEngine = mock(); |
| 51 | + private final PolicyDefinitionStore policyStore = mock(); |
| 52 | + private final ContractDefinitionStore definitionStore = mock(); |
53 | 53 |
|
54 |
| - private ContractDefinitionResolverImpl definitionService; |
55 |
| - |
56 |
| - @BeforeEach |
57 |
| - void setUp() { |
58 |
| - definitionService = new ContractDefinitionResolverImpl(mock(Monitor.class), definitionStore, policyEngine, policyStore); |
59 |
| - } |
| 54 | + private final ContractDefinitionResolverImpl resolver = new ContractDefinitionResolverImpl(definitionStore, |
| 55 | + policyEngine, policyStore); |
60 | 56 |
|
61 | 57 | @Test
|
62 |
| - void definitionsFor_verifySatisfiesPolicies() { |
63 |
| - var agent = new ParticipantAgent(Map.of(), Map.of()); |
| 58 | + void shouldReturnDefinition_whenAccessPolicySatisfied() { |
| 59 | + var agent = new ParticipantAgent(emptyMap(), emptyMap()); |
64 | 60 | var def = PolicyDefinition.Builder.newInstance().policy(Policy.Builder.newInstance().build()).build();
|
65 | 61 | when(policyStore.findById(any())).thenReturn(def);
|
66 | 62 | when(policyEngine.evaluate(any(), any(), isA(PolicyContext.class))).thenReturn(Result.success());
|
67 | 63 | when(definitionStore.findAll(any())).thenReturn(Stream.of(createContractDefinition()));
|
68 | 64 |
|
69 |
| - var definitions = definitionService.definitionsFor(agent); |
| 65 | + var result = resolver.resolveFor(agent); |
70 | 66 |
|
71 |
| - assertThat(definitions).hasSize(1); |
| 67 | + assertThat(result.contractDefinitions()).hasSize(1); |
| 68 | + assertThat(result.policies()).hasSize(1); |
72 | 69 | verify(policyEngine, atLeastOnce()).evaluate(
|
73 |
| - eq(CATALOGING_SCOPE), |
| 70 | + eq(CATALOG_SCOPE), |
74 | 71 | eq(def.getPolicy()),
|
75 | 72 | and(isA(PolicyContext.class), argThat(c -> c.getContextData(ParticipantAgent.class).equals(agent)))
|
76 | 73 | );
|
77 | 74 | verify(definitionStore).findAll(any());
|
78 | 75 | }
|
79 | 76 |
|
80 | 77 | @Test
|
81 |
| - void definitionsFor_verifyDoesNotSatisfyAccessPolicy() { |
82 |
| - var agent = new ParticipantAgent(Map.of(), Map.of()); |
| 78 | + void shouldNotReturnDefinition_whenAccessPolicyNotSatisfied() { |
| 79 | + var agent = new ParticipantAgent(emptyMap(), emptyMap()); |
83 | 80 | var definition = PolicyDefinition.Builder.newInstance().policy(Policy.Builder.newInstance().build()).id("access").build();
|
84 | 81 | when(policyStore.findById(any())).thenReturn(definition);
|
85 | 82 | var contractDefinition = createContractDefinition();
|
86 | 83 | when(policyEngine.evaluate(any(), any(), isA(PolicyContext.class))).thenReturn(Result.failure("invalid"));
|
87 | 84 | when(definitionStore.findAll(any())).thenReturn(Stream.of(contractDefinition));
|
88 | 85 |
|
89 |
| - var result = definitionService.definitionsFor(agent); |
| 86 | + var result = resolver.resolveFor(agent); |
90 | 87 |
|
91 |
| - assertThat(result).isEmpty(); |
| 88 | + assertThat(result.contractDefinitions()).isEmpty(); |
| 89 | + assertThat(result.policies()).hasSize(1); |
92 | 90 | verify(definitionStore).findAll(any());
|
93 | 91 | }
|
94 | 92 |
|
95 | 93 | @Test
|
96 |
| - void definitionsFor_verifyPoliciesNotFound() { |
97 |
| - var agent = new ParticipantAgent(Map.of(), Map.of()); |
| 94 | + void shouldNotReturnDefinition_whenAccessPolicyDoesNotExist() { |
| 95 | + var agent = new ParticipantAgent(emptyMap(), emptyMap()); |
98 | 96 | when(policyStore.findById(any())).thenReturn(null);
|
99 | 97 | when(policyEngine.evaluate(any(), any(), isA(PolicyContext.class))).thenReturn(Result.success());
|
100 | 98 | when(definitionStore.findAll(QuerySpec.max())).thenReturn(Stream.of(createContractDefinition()));
|
101 | 99 |
|
102 |
| - var definitions = definitionService.definitionsFor(agent); |
| 100 | + var result = resolver.resolveFor(agent); |
103 | 101 |
|
104 |
| - assertThat(definitions).isEmpty(); |
| 102 | + assertThat(result.contractDefinitions()).isEmpty(); |
| 103 | + assertThat(result.policies()).isEmpty(); |
105 | 104 | verifyNoInteractions(policyEngine);
|
106 | 105 | }
|
107 | 106 |
|
108 | 107 | @Test
|
109 |
| - void definitionFor_found() { |
110 |
| - var agent = new ParticipantAgent(Map.of(), Map.of()); |
111 |
| - var definition = PolicyDefinition.Builder.newInstance().policy(Policy.Builder.newInstance().build()).build(); |
112 |
| - var contractDefinition = createContractDefinition(); |
113 |
| - when(policyStore.findById(any())).thenReturn(definition); |
| 108 | + void shouldQueryPolicyOnce_whenDifferentDefinitionsHaveSamePolicy() { |
| 109 | + var contractDefinition1 = contractDefinitionBuilder().accessPolicyId("accessPolicyId").build(); |
| 110 | + var contractDefinition2 = contractDefinitionBuilder().accessPolicyId("accessPolicyId").build(); |
| 111 | + var policy = Policy.Builder.newInstance().build(); |
| 112 | + var policyDefinition = PolicyDefinition.Builder.newInstance().policy(policy).build(); |
| 113 | + when(policyStore.findById(any())).thenReturn(policyDefinition); |
114 | 114 | when(policyEngine.evaluate(any(), any(), isA(PolicyContext.class))).thenReturn(Result.success());
|
115 |
| - when(definitionStore.findById("1")).thenReturn(contractDefinition); |
| 115 | + when(definitionStore.findAll(any())).thenReturn(Stream.of(contractDefinition1, contractDefinition2)); |
116 | 116 |
|
117 |
| - var result = definitionService.definitionFor(agent, "1"); |
| 117 | + var result = resolver.resolveFor(new ParticipantAgent(emptyMap(), emptyMap())); |
118 | 118 |
|
119 |
| - assertThat(result).isNotNull(); |
120 |
| - verify(policyEngine, atLeastOnce()).evaluate( |
121 |
| - eq(CATALOGING_SCOPE), |
122 |
| - eq(definition.getPolicy()), |
123 |
| - and(isA(PolicyContext.class), argThat(c -> c.getContextData(ParticipantAgent.class).equals(agent))) |
124 |
| - ); |
| 119 | + assertThat(result.contractDefinitions()).hasSize(2); |
| 120 | + assertThat(result.policies()).hasSize(1).containsOnly(entry("accessPolicyId", policy)); |
| 121 | + verify(policyStore, only()).findById("accessPolicyId"); |
125 | 122 | }
|
126 | 123 |
|
127 |
| - @Test |
128 |
| - void definitionFor_notFound() { |
129 |
| - var agent = new ParticipantAgent(Map.of(), Map.of()); |
130 |
| - when(definitionStore.findById(any())).thenReturn(null); |
131 |
| - |
132 |
| - var result = definitionService.definitionFor(agent, "nodefinition"); |
133 |
| - |
134 |
| - assertThat(result).isNull(); |
135 |
| - verifyNoInteractions(policyEngine); |
| 124 | + private ContractDefinition createContractDefinition() { |
| 125 | + return contractDefinitionBuilder() |
| 126 | + .build(); |
136 | 127 | }
|
137 | 128 |
|
138 |
| - private ContractDefinition createContractDefinition() { |
| 129 | + private ContractDefinition.Builder contractDefinitionBuilder() { |
139 | 130 | return ContractDefinition.Builder.newInstance()
|
140 | 131 | .id("1")
|
141 | 132 | .accessPolicyId("access")
|
142 |
| - .contractPolicyId("contract") |
143 |
| - .build(); |
| 133 | + .contractPolicyId("contract"); |
144 | 134 | }
|
145 | 135 | }
|
0 commit comments