From 6458a2440348b24bf09fc492cc2d2ec8c6e4d237 Mon Sep 17 00:00:00 2001 From: clayly Date: Thu, 9 Apr 2026 14:31:13 +0300 Subject: [PATCH 1/2] Fix test assertions that depend on undefined row ordering Several tests use containsExactly() or index-based comparison on query results that have no ORDER BY clause. SQL does not guarantee row ordering without explicit ORDER BY, and databases like YugabyteDB return results in a different (but valid) order than PostgreSQL/H2. These tests verify set membership (correct targets assigned, correct actions stored), not ordering. Changed to order-independent assertions: - AutoAssignTest: containsExactly -> containsExactlyInAnyOrder - ControllerManagementTest: index-based loop -> containsExactlyInAnyOrderElementsOf - TargetFilterQueryManagementTest: containsExactly -> containsExactlyInAnyOrder Verified passing on H2 (default) and YugabyteDB (PostgreSQL-compatible). --- .../eclipse/hawkbit/repository/jpa/acm/AutoAssignTest.java | 2 +- .../jpa/management/ControllerManagementTest.java | 7 +++---- .../jpa/management/TargetFilterQueryManagementTest.java | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/acm/AutoAssignTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/acm/AutoAssignTest.java index faa783a28f..4832bbdeba 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/acm/AutoAssignTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/acm/AutoAssignTest.java @@ -76,6 +76,6 @@ private void verifyOnlyUpdatableTargetsArePartOfAutoAssignment(final Runnable as .as("Only updatable targets should be part of the rollout") // all targets are distribution set type 2 compatible, but since user has UPDATE_TARGET only for targets of type 2 // only target2 and target3 shall be assigned - .containsExactly(target2Type2.getId(), target3Type2.getId()); + .containsExactlyInAnyOrder(target2Type2.getId(), target3Type2.getId()); } } \ No newline at end of file diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/ControllerManagementTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/ControllerManagementTest.java index aea67feba9..32d8c91568 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/ControllerManagementTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/ControllerManagementTest.java @@ -1439,10 +1439,9 @@ void updatedExternalRefOnActionIsReallyUpdated() { root.get(JpaAction_.externalRef).in(allExternalRef), cb.equal(root.get(JpaAction_.active), true) )).stream().map(Action.class::cast).toList(); - assertThat(foundAction).isNotNull(); - for (int i = 0; i < numberOfActions; i++) { - assertThat(foundAction.get(i).getId()).isEqualTo(allActionId.get(i)); - } + assertThat(foundAction).isNotNull().hasSize(numberOfActions); + assertThat(foundAction).extracting(Action::getId) + .containsExactlyInAnyOrderElementsOf(allActionId); } /** diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetFilterQueryManagementTest.java b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetFilterQueryManagementTest.java index 1f7331104d..779e466c9f 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetFilterQueryManagementTest.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/management/TargetFilterQueryManagementTest.java @@ -520,7 +520,7 @@ private void verifyFindByDistributionSetAndRsql( private void verifyExpectedFilterQueriesInList(final Slice tfqList, final TargetFilterQuery... expectedFilterQueries) { - assertThat(tfqList.map(TargetFilterQuery::getId)).containsExactly( + assertThat(tfqList.map(TargetFilterQuery::getId)).containsExactlyInAnyOrder( Arrays.stream(expectedFilterQueries).map(TargetFilterQuery::getId).toArray(Long[]::new)); } @@ -536,7 +536,7 @@ private void verifyExpectedFilterQueriesInList(final Page tfq final TargetFilterQuery... expectedFilterQueries) { assertThat(expectedFilterQueries).as("Target filter query count").hasSize((int) tfqList.getTotalElements()); - assertThat(tfqList.map(TargetFilterQuery::getId)).containsExactly( + assertThat(tfqList.map(TargetFilterQuery::getId)).containsExactlyInAnyOrder( Arrays.stream(expectedFilterQueries).map(TargetFilterQuery::getId).toArray(Long[]::new)); } From 6aefd9e994f877893a7dabac8af16eca47e63fb2 Mon Sep 17 00:00:00 2001 From: clayly Date: Thu, 9 Apr 2026 16:39:04 +0300 Subject: [PATCH 2/2] Trigger ECA re-check