From f90ced20dff4c93e2d74c0ed64e5b82415850260 Mon Sep 17 00:00:00 2001 From: Avgustin Marinov Date: Thu, 17 Oct 2024 13:50:41 +0300 Subject: [PATCH] Add not found DS test & improve EntityNotFoundException (#1896) Signed-off-by: Marinov Avgustin --- .../exception/EntityNotFoundException.java | 71 +++++++++---------- .../DistributionSetTagManagementTest.java | 41 ++++++++++- .../management/TargetTagManagementTest.java | 9 ++- 3 files changed, 80 insertions(+), 41 deletions(-) diff --git a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/exception/EntityNotFoundException.java b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/exception/EntityNotFoundException.java index 9b0da68f3..b52d50078 100644 --- a/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/exception/EntityNotFoundException.java +++ b/hawkbit-repository/hawkbit-repository-api/src/main/java/org/eclipse/hawkbit/repository/exception/EntityNotFoundException.java @@ -13,15 +13,16 @@ import java.io.Serial; import java.util.Collection; import java.util.stream.Collectors; +import lombok.Getter; import org.eclipse.hawkbit.exception.AbstractServerRtException; import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.repository.model.BaseEntity; import org.eclipse.hawkbit.repository.model.MetaData; /** - * the {@link EntityNotFoundException} is thrown when a entity queried but not - * found. + * the {@link EntityNotFoundException} is thrown when a entity queried but not found. */ +@Getter public class EntityNotFoundException extends AbstractServerRtException { @Serial @@ -29,6 +30,10 @@ public class EntityNotFoundException extends AbstractServerRtException { private static final SpServerError THIS_ERROR = SpServerError.SP_REPO_ENTITY_NOT_EXISTS; + private Class type; + private Object entityId; + private String key; + /** * Default constructor. */ @@ -39,8 +44,7 @@ public class EntityNotFoundException extends AbstractServerRtException { /** * Parameterized constructor. * - * @param cause - * of the exception + * @param cause of the exception */ public EntityNotFoundException(final Throwable cause) { super(THIS_ERROR, cause); @@ -49,10 +53,8 @@ public class EntityNotFoundException extends AbstractServerRtException { /** * Parameterized constructor. * - * @param message - * of the exception - * @param cause - * of the exception + * @param message of the exception + * @param cause of the exception */ public EntityNotFoundException(final String message, final Throwable cause) { super(message, THIS_ERROR, cause); @@ -61,8 +63,7 @@ public class EntityNotFoundException extends AbstractServerRtException { /** * Parameterized constructor. * - * @param message - * of the exception + * @param message of the exception */ protected EntityNotFoundException(final String message) { super(message, THIS_ERROR); @@ -71,59 +72,55 @@ public class EntityNotFoundException extends AbstractServerRtException { /** * Parameterized constructor for {@link BaseEntity} not found. * - * @param type - * of the entity that was not found - * - * @param entityId - * of the {@link BaseEntity} + * @param type of the entity that was not found + * @param entityId of the {@link BaseEntity} */ public EntityNotFoundException(final Class type, final Object entityId) { - this(type.getSimpleName() + " with given identifier {" + entityId + "} does not exist."); + super(type.getSimpleName() + " with given identifier {" + entityId + "} does not exist.", THIS_ERROR); + this.type = type; + this.entityId = entityId; } /** * Parameterized constructor for {@link MetaData} not found. * - * @param type - * of the entity that was not found - * @param entityId - * of the {@link BaseEntity} the {@link MetaData} was for - * @param key - * for the {@link MetaData} entry + * @param type of the entity that was not found + * @param entityId of the {@link BaseEntity} the {@link MetaData} was for + * @param key for the {@link MetaData} entry */ public EntityNotFoundException(final Class type, final Long entityId, final String key) { this(type, String.valueOf(entityId), key); + this.type = type; + this.entityId = entityId; + this.key = key; } /** * Parameterized constructor for {@link MetaData} not found. * - * @param type - * of the entity that was not found - * @param entityId - * of the {@link BaseEntity} the {@link MetaData} was for - * @param key - * for the {@link MetaData} entry + * @param type of the entity that was not found + * @param entityId of the {@link BaseEntity} the {@link MetaData} was for + * @param key for the {@link MetaData} entry */ public EntityNotFoundException(final Class type, final String entityId, final String key) { this(type.getSimpleName() + " for given entity {" + entityId + "} and with key {" + key + "} does not exist."); + this.type = type; + this.entityId = entityId; + this.key = key; } /** * Parameterized constructor for a list of {@link BaseEntity}s not found. * - * @param type - * of the entity that was not found - * - * @param expected - * collection of the {@link BaseEntity#getId()}s - * @param found - * collection of the {@link BaseEntity#getId()}s + * @param type of the entity that was not found + * @param expected collection of the {@link BaseEntity#getId()}s + * @param found collection of the {@link BaseEntity#getId()}s */ public EntityNotFoundException(final Class type, final Collection expected, final Collection found) { this(type.getSimpleName() + "s with given identifiers {" + expected.stream().filter(id -> !found.contains(id)) .map(String::valueOf).collect(Collectors.joining(",")) + "} do not exist."); + this.type = type; + this.entityId = expected.stream().filter(id -> !found.contains(id)).map(String::valueOf); } - -} +} \ No newline at end of file diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/DistributionSetTagManagementTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/DistributionSetTagManagementTest.java index bd4e6d189..a4025868f 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/DistributionSetTagManagementTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/DistributionSetTagManagementTest.java @@ -11,11 +11,14 @@ package org.eclipse.hawkbit.repository.jpa.management; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.Random; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -25,6 +28,7 @@ import org.eclipse.hawkbit.repository.event.remote.entity.DistributionSetTagUpda import org.eclipse.hawkbit.repository.event.remote.entity.TargetCreatedEvent; import org.eclipse.hawkbit.repository.event.remote.entity.TargetTagUpdatedEvent; import org.eclipse.hawkbit.repository.exception.EntityAlreadyExistsException; +import org.eclipse.hawkbit.repository.exception.EntityNotFoundException; import org.eclipse.hawkbit.repository.jpa.AbstractJpaIntegrationTest; import org.eclipse.hawkbit.repository.model.DistributionSet; import org.eclipse.hawkbit.repository.model.DistributionSetFilter; @@ -145,8 +149,7 @@ public class DistributionSetTagManagementTest extends AbstractJpaIntegrationTest } @Test - @Description("Verifies the toogle mechanism by means on assigning tag if at least on DS in the list does not have" - + "the tag yet. Unassign if all of them have the tag already.") + @Description("Verifies assign/unassign.") public void assignAndUnassignDistributionSetTags() { final Collection groupA = testdataFactory.createDistributionSets(20); final Collection groupB = testdataFactory.createDistributionSets("unassigned", 20); @@ -179,6 +182,40 @@ public class DistributionSetTagManagementTest extends AbstractJpaIntegrationTest assertThat(distributionSetManagement.findByTag(Pageable.unpaged(), tag.getId()).getContent()).isEmpty(); } + private static final Random RND = new Random(); + @Test + @Description("Verifies that tagging of set containing missing DS throws meaningful and correct exception.") + public void failOnMissingDs() { + final Collection group = testdataFactory.createDistributionSets(5).stream() + .map(DistributionSet::getId) + .collect(Collectors.toList()); + final DistributionSetTag tag = distributionSetTagManagement + .create(entityFactory.tag().create().name("tag1").description("tagdesc1")); + final List missing = new ArrayList<>(); + for (int i = 0; i < 5; i++) { + while (true) { + final Long id = RND.nextLong(); + if (!group.contains(id)) { + missing.add(id); + break; + } + } + } + Collections.sort(missing); + final Collection withMissing = concat(group, missing); + assertThatThrownBy(() -> distributionSetManagement.assignTag(withMissing, tag.getId())) + .matches(e -> { + if (e instanceof EntityNotFoundException enfe) { + if (enfe.getType().equals(DistributionSet.class)) { + if (enfe.getEntityId() instanceof Collection entityId) { + return entityId.stream().sorted().toList().equals(missing); + } + } + } + return false; + }); + } + @Test @Description("Ensures that a created tag is persisted in the repository as defined.") public void createDistributionSetTag() { diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetTagManagementTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetTagManagementTest.java index dc026fb4a..5b082a50e 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetTagManagementTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetTagManagementTest.java @@ -11,11 +11,14 @@ package org.eclipse.hawkbit.repository.jpa.management; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.Random; import java.util.stream.Collectors; import jakarta.validation.ConstraintViolationException; @@ -26,8 +29,11 @@ import org.eclipse.hawkbit.repository.event.remote.entity.DistributionSetTagUpda import org.eclipse.hawkbit.repository.event.remote.entity.TargetCreatedEvent; import org.eclipse.hawkbit.repository.event.remote.entity.TargetTagUpdatedEvent; import org.eclipse.hawkbit.repository.exception.EntityAlreadyExistsException; +import org.eclipse.hawkbit.repository.exception.EntityNotFoundException; import org.eclipse.hawkbit.repository.jpa.AbstractJpaIntegrationTest; import org.eclipse.hawkbit.repository.jpa.model.JpaTargetTag; +import org.eclipse.hawkbit.repository.model.DistributionSet; +import org.eclipse.hawkbit.repository.model.DistributionSetTag; import org.eclipse.hawkbit.repository.model.NamedEntity; import org.eclipse.hawkbit.repository.model.Tag; import org.eclipse.hawkbit.repository.model.Target; @@ -140,8 +146,7 @@ class TargetTagManagementTest extends AbstractJpaIntegrationTest { } @Test - @Description("Verifies the toogle mechanism by means on assigning tag if at least on target in the list does not have" - + "the tag yet. Unassign if all of them have the tag already.") + @Description("Verifies assign/unassign.") void assignAndUnassignTargetTags() { final List groupA = testdataFactory.createTargets(20); final List groupB = testdataFactory.createTargets(20, "groupb", "groupb");