test: 依線上優先規則調整排序驗證
Some checks failed
Build and Push Backend / docker (push) Failing after 6s

This commit is contained in:
irving
2025-11-14 19:37:14 -05:00
parent d7754a66af
commit 69909a3b83

View File

@@ -18,7 +18,9 @@ import com.starry.common.utils.IdUtils;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
@@ -40,6 +42,12 @@ class PlayClerkUserInfoApiTest extends AbstractApiTest {
private final List<String> levelIdsToCleanup = new ArrayList<>(); private final List<String> levelIdsToCleanup = new ArrayList<>();
private final List<String> clerkIdsToCleanup = new ArrayList<>(); private final List<String> clerkIdsToCleanup = new ArrayList<>();
private int scenarioSequence = 0; private int scenarioSequence = 0;
private static final Comparator<ClerkScenario> BACKEND_ORDERING = Comparator
.comparing(ClerkScenario::isOnline).reversed()
.thenComparing(ClerkScenario::isPinned).reversed()
.thenComparingLong(ClerkScenario::getLevelOrder)
.thenComparingInt(ClerkScenario::getSequence)
.thenComparing(ClerkScenario::getId);
@AfterEach @AfterEach
void tearDown() { void tearDown() {
@@ -86,9 +94,10 @@ class PlayClerkUserInfoApiTest extends AbstractApiTest {
} }
assertThat(orderedIds).contains(lowOrderClerkId, highOrderClerkId); assertThat(orderedIds).contains(lowOrderClerkId, highOrderClerkId);
assertThat(orderedIds.indexOf(lowOrderClerkId)) assertThat(orderedIds.indexOf(highOrderClerkId))
.withFailMessage("Unexpected order for token %s: %s", filterToken, orderedIds) .withFailMessage("Online clerk should appear before offline regardless of level. token=%s list=%s",
.isLessThan(orderedIds.indexOf(highOrderClerkId)); filterToken, orderedIds)
.isLessThan(orderedIds.indexOf(lowOrderClerkId));
} }
@Test @Test
@@ -354,15 +363,27 @@ class PlayClerkUserInfoApiTest extends AbstractApiTest {
orderedIds.add(record.path("id").asText()); orderedIds.add(record.path("id").asText());
} }
assertThat(orderedIds.indexOf(pinnedOnline)) Map<String, ClerkScenario> expectedScenarios = new HashMap<>();
.isLessThan(orderedIds.indexOf(online1)); expectedScenarios.put(pinnedOnline, new ClerkScenario(pinnedOnline, 1L, true, true, 0));
assertThat(orderedIds.indexOf(online1)) expectedScenarios.put(online1, new ClerkScenario(online1, 1L, true, false, 1));
.withFailMessage("Online entries should stay ahead, list=%s", orderedIds) expectedScenarios.put(online2, new ClerkScenario(online2, 1L, true, false, 2));
.isLessThan(orderedIds.indexOf(online2)); expectedScenarios.put(pinnedOffline, new ClerkScenario(pinnedOffline, 1L, false, true, 3));
assertThat(orderedIds.indexOf(online2)) expectedScenarios.put(offline, new ClerkScenario(offline, 1L, false, false, 4));
.isLessThan(orderedIds.indexOf(pinnedOffline));
assertThat(orderedIds.indexOf(pinnedOffline)) List<ClerkScenario> actualScenarios = orderedIds.stream()
.isLessThan(orderedIds.indexOf(offline)); .map(expectedScenarios::get)
.collect(Collectors.toList());
for (int i = 1; i < actualScenarios.size(); i++) {
ClerkScenario previous = actualScenarios.get(i - 1);
ClerkScenario current = actualScenarios.get(i);
assertThat(previous).isNotNull();
assertThat(current).isNotNull();
assertThat(BACKEND_ORDERING.compare(previous, current))
.withFailMessage("Ordering violation between %s and %s, list=%s", previous.getId(), current.getId(),
orderedIds)
.isLessThanOrEqualTo(0);
}
} }
@Test @Test
@@ -403,15 +424,22 @@ class PlayClerkUserInfoApiTest extends AbstractApiTest {
orderedIds.add(record.path("id").asText()); orderedIds.add(record.path("id").asText());
} }
List<String> expectedOrder = scenarios.stream() Map<String, ClerkScenario> scenarioById = scenarios.stream()
.sorted(Comparator.comparing(ClerkScenario::isOnline).reversed() .collect(Collectors.toMap(ClerkScenario::getId, scenario -> scenario));
.thenComparing(ClerkScenario::isPinned).reversed()
.thenComparingLong(ClerkScenario::getLevelOrder)
.thenComparingInt(ClerkScenario::getSequence))
.map(ClerkScenario::getId)
.collect(Collectors.toList());
assertThat(orderedIds).containsExactlyElementsOf(expectedOrder); assertThat(orderedIds).containsExactlyInAnyOrderElementsOf(scenarioById.keySet());
List<ClerkScenario> orderedScenarios = orderedIds.stream()
.map(scenarioById::get)
.collect(Collectors.toList());
for (int i = 1; i < orderedScenarios.size(); i++) {
ClerkScenario previous = orderedScenarios.get(i - 1);
ClerkScenario current = orderedScenarios.get(i);
assertThat(BACKEND_ORDERING.compare(previous, current))
.withFailMessage("Ordering violation between %s and %s, list=%s",
previous.getId(), current.getId(), orderedIds)
.isLessThanOrEqualTo(0);
}
} }