test: 修復店員排序測試與收益扣回即時解鎖

This commit is contained in:
irving
2025-11-14 01:25:06 -05:00
parent cec5e965f6
commit 25554bac84
3 changed files with 68 additions and 3 deletions

View File

@@ -326,9 +326,12 @@ public class PlayClerkUserInfoServiceImpl extends ServiceImpl<PlayClerkUserInfoM
} }
// 排序:非空的等级排序号优先,值越小越靠前;同一排序号在线状态优先 // 排序:非空的等级排序号优先,值越小越靠前;同一排序号在线状态优先
lambdaQueryWrapper.orderByDesc(PlayClerkUserInfoEntity::getOnlineState) lambdaQueryWrapper
.orderByAsc(true, "CASE WHEN t1.order_number IS NULL THEN 1 ELSE 0 END")
.orderByAsc(PlayClerkLevelInfoEntity::getOrderNumber) .orderByAsc(PlayClerkLevelInfoEntity::getOrderNumber)
.orderByAsc(PlayClerkUserInfoEntity::getCreatedTime); .orderByDesc(PlayClerkUserInfoEntity::getOnlineState)
.orderByDesc(PlayClerkUserInfoEntity::getCreatedTime)
.orderByAsc(PlayClerkUserInfoEntity::getId);
return this.baseMapper.selectJoinPage(page, PlayClerkUserInfoResultVo.class, lambdaQueryWrapper); return this.baseMapper.selectJoinPage(page, PlayClerkUserInfoResultVo.class, lambdaQueryWrapper);
} }

View File

@@ -319,4 +319,63 @@ class PlayClerkUserInfoApiTest extends AbstractApiTest {
clerkIdsToCleanup.add(clerkId); clerkIdsToCleanup.add(clerkId);
return clerkId; return clerkId;
} }
@Test
void listOrderingStableWithMultipleCriteria() throws Exception {
ensureTenantContext();
PlayClerkLevelInfoEntity level = createClerkLevel("stable", 10L, 80);
String filterToken = "stable-" + IdUtils.getUuid().substring(0, 6);
String pinnedOnline = createClerk(filterToken + "-pinned-online", level.getId(), "1");
togglePin(pinnedOnline, "1");
String pinnedOffline = createClerk(filterToken + "-pinned-offline", level.getId(), "0");
togglePin(pinnedOffline, "1");
String online1 = createClerk(filterToken + "-online-one", level.getId(), "1");
pause(50);
String online2 = createClerk(filterToken + "-online-two", level.getId(), "1");
String offline = createClerk(filterToken + "-offline", level.getId(), "0");
MvcResult result = mockMvc.perform(get("/clerk/user/list")
.param("pageNum", "1")
.param("pageSize", "20")
.param("nickname", filterToken)
.header(TENANT_HEADER, DEFAULT_TENANT)
.header(USER_HEADER, DEFAULT_USER))
.andExpect(status().isOk())
.andReturn();
JsonNode root = objectMapper.readTree(result.getResponse().getContentAsString());
JsonNode records = root.path("data");
assertThat(records.isArray()).isTrue();
List<String> orderedIds = new ArrayList<>();
for (JsonNode record : records) {
orderedIds.add(record.path("id").asText());
}
assertThat(orderedIds.indexOf(pinnedOnline))
.isLessThan(orderedIds.indexOf(pinnedOffline));
assertThat(orderedIds.indexOf(pinnedOffline))
.isLessThan(orderedIds.indexOf(online1));
assertThat(orderedIds.indexOf(online1))
.isLessThan(orderedIds.indexOf(offline));
assertThat(orderedIds.indexOf(online1))
.withFailMessage("Created time fallback should maintain order, list=%s", orderedIds)
.isLessThan(orderedIds.indexOf(online2));
}
private void togglePin(String clerkId, String pinState) {
ensureTenantContext();
PlayClerkUserInfoEntity update = new PlayClerkUserInfoEntity();
update.setId(clerkId);
update.setPinToTopState(pinState);
clerkUserInfoService.update(update);
}
private void pause(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
} }

View File

@@ -2,6 +2,7 @@ package com.starry.admin.modules.withdraw.service.impl;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
@@ -147,7 +148,9 @@ class EarningsServiceImplTest {
verify(baseMapper).insert(captor.capture()); verify(baseMapper).insert(captor.capture());
EarningsLineEntity saved = captor.getValue(); EarningsLineEntity saved = captor.getValue();
assertEquals("available", saved.getStatus()); assertEquals("available", saved.getStatus());
assertEquals(unlockAt, saved.getUnlockTime()); LocalDateTime now = LocalDateTime.now();
assertTrue(saved.getUnlockTime().isAfter(unlockAt));
assertTrue(!saved.getUnlockTime().isAfter(now.plusSeconds(1)));
} }
@Test @Test