From 6375f9a43d623be844ef37b5d16a65b890dacdcf Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Wed, 25 Sep 2024 10:16:16 +0200 Subject: [PATCH 1/2] fix: only return dataset with valid offers --- .../catalog/DatasetResolverImpl.java | 9 +++++ .../catalog/DatasetResolverImplTest.java | 33 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/core/control-plane/control-plane-catalog/src/main/java/org/eclipse/edc/connector/controlplane/catalog/DatasetResolverImpl.java b/core/control-plane/control-plane-catalog/src/main/java/org/eclipse/edc/connector/controlplane/catalog/DatasetResolverImpl.java index 45378cff31f..847fd3544b8 100644 --- a/core/control-plane/control-plane-catalog/src/main/java/org/eclipse/edc/connector/controlplane/catalog/DatasetResolverImpl.java +++ b/core/control-plane/control-plane-catalog/src/main/java/org/eclipse/edc/connector/controlplane/catalog/DatasetResolverImpl.java @@ -62,6 +62,10 @@ public DatasetResolverImpl(ContractDefinitionResolver contractDefinitionResolver @NotNull public Stream query(ParticipantAgent agent, QuerySpec querySpec) { var contractDefinitions = contractDefinitionResolver.definitionsFor(agent).toList(); + if (contractDefinitions.isEmpty()) { + return Stream.empty(); + } + var assetsQuery = QuerySpec.Builder.newInstance().offset(0).limit(MAX_VALUE).filter(querySpec.getFilterExpression()).build(); return assetIndex.queryAssets(assetsQuery) .map(asset -> toDataset(contractDefinitions, asset)) @@ -73,9 +77,14 @@ public Stream query(ParticipantAgent agent, QuerySpec querySpec) { @Override public Dataset getById(ParticipantAgent agent, String id) { var contractDefinitions = contractDefinitionResolver.definitionsFor(agent).toList(); + if (contractDefinitions.isEmpty()) { + return null; + } + return Optional.of(id) .map(assetIndex::findById) .map(asset -> toDataset(contractDefinitions, asset)) + .filter(Dataset::hasOffers) .orElse(null); } diff --git a/core/control-plane/control-plane-catalog/src/test/java/org/eclipse/edc/connector/controlplane/catalog/DatasetResolverImplTest.java b/core/control-plane/control-plane-catalog/src/test/java/org/eclipse/edc/connector/controlplane/catalog/DatasetResolverImplTest.java index ab3f5e7d128..64832efdc2e 100644 --- a/core/control-plane/control-plane-catalog/src/test/java/org/eclipse/edc/connector/controlplane/catalog/DatasetResolverImplTest.java +++ b/core/control-plane/control-plane-catalog/src/test/java/org/eclipse/edc/connector/controlplane/catalog/DatasetResolverImplTest.java @@ -295,6 +295,39 @@ void getById_shouldReturnNull_whenAssetNotFound() { assertThat(dataset).isNull(); } + + @Test + void getById_shouldReturnNull_whenNoValidContractDefinition() { + var participantAgent = createParticipantAgent(); + + when(contractDefinitionResolver.definitionsFor(any())).thenReturn(Stream.empty()); + when(assetIndex.findById(any())).thenReturn(createAsset("datasetId").build()); + + var dataset = datasetResolver.getById(participantAgent, "datasetId"); + + assertThat(dataset).isNull(); + } + + @Test + void getById_shouldReturnNull_whenNoValidContractDefinitionForAsset() { + var assetId = "assetId"; + var participantAgent = createParticipantAgent(); + + when(contractDefinitionResolver.definitionsFor(any())).thenReturn(Stream.of( + contractDefinitionBuilder("definition") + .assetsSelectorCriterion(Criterion.Builder.newInstance() + .operandRight(EDC_NAMESPACE + "id") + .operator("=") + .operandLeft("a-different-asset") + .build()) + .build() + )); + when(assetIndex.findById(any())).thenReturn(createAsset(assetId).build()); + + var dataset = datasetResolver.getById(participantAgent, assetId); + + assertThat(dataset).isNull(); + } private ContractDefinition.Builder contractDefinitionBuilder(String id) { return ContractDefinition.Builder.newInstance() From 97e64cc0ddd2d96fb0eec7faf64545ad1495bae0 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Wed, 25 Sep 2024 10:49:10 +0200 Subject: [PATCH 2/2] test: add additional test --- .../catalog/DatasetResolverImplTest.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/core/control-plane/control-plane-catalog/src/test/java/org/eclipse/edc/connector/controlplane/catalog/DatasetResolverImplTest.java b/core/control-plane/control-plane-catalog/src/test/java/org/eclipse/edc/connector/controlplane/catalog/DatasetResolverImplTest.java index 64832efdc2e..9eba1ddc6df 100644 --- a/core/control-plane/control-plane-catalog/src/test/java/org/eclipse/edc/connector/controlplane/catalog/DatasetResolverImplTest.java +++ b/core/control-plane/control-plane-catalog/src/test/java/org/eclipse/edc/connector/controlplane/catalog/DatasetResolverImplTest.java @@ -56,6 +56,7 @@ import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.isA; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -98,6 +99,16 @@ void search_shouldReturnOneDatasetPerAsset() { assertThat(dataset.getProperties()).contains(entry("key", "value")); }); } + + @Test + void query_shouldNotQueryAssets_whenNoValidContractDefinition() { + when(contractDefinitionResolver.definitionsFor(any())).thenReturn(Stream.empty()); + + var datasets = datasetResolver.query(createParticipantAgent(), QuerySpec.none()); + + assertThat(datasets).isNotNull().isEmpty(); + verify(assetIndex, never()).queryAssets(any()); + } @Test void query_shouldReturnNoDataset_whenPolicyNotFound() { @@ -301,11 +312,11 @@ void getById_shouldReturnNull_whenNoValidContractDefinition() { var participantAgent = createParticipantAgent(); when(contractDefinitionResolver.definitionsFor(any())).thenReturn(Stream.empty()); - when(assetIndex.findById(any())).thenReturn(createAsset("datasetId").build()); var dataset = datasetResolver.getById(participantAgent, "datasetId"); assertThat(dataset).isNull(); + verify(assetIndex, never()).findById(any()); } @Test