working but not tested

This commit is contained in:
irving
2025-12-24 10:55:26 -05:00
parent 90849e5267
commit a7e567e9b4
22 changed files with 997 additions and 1 deletions

View File

@@ -0,0 +1,151 @@
package com.starry.admin.modules.pk;
import static org.assertj.core.api.Assertions.assertThat;
import com.starry.admin.api.AbstractApiTest;
import com.starry.admin.modules.clerk.module.entity.ClerkPkEnum;
import com.starry.admin.modules.clerk.module.entity.PlayClerkPkEntity;
import com.starry.admin.modules.clerk.service.IPlayClerkPkService;
import com.starry.admin.modules.pk.dto.PkScoreBoardDto;
import com.starry.admin.modules.pk.event.PkContributionEvent;
import com.starry.admin.modules.pk.redis.PkRedisKeyConstants;
import com.starry.admin.modules.pk.service.ClerkPkLifecycleService;
import com.starry.admin.modules.pk.service.IPkScoreboardService;
import com.starry.admin.utils.SecurityUtils;
import com.starry.common.utils.IdUtils;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import javax.annotation.Resource;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.data.redis.core.StringRedisTemplate;
/**
* 集成测试:验证 PK 贡献事件、Redis 计分、结算生命周期的整体行为。
*/
class PkIntegrationTest extends AbstractApiTest {
@Resource
private IPlayClerkPkService clerkPkService;
@Resource
private IPkScoreboardService pkScoreboardService;
@Resource
private ClerkPkLifecycleService clerkPkLifecycleService;
@Resource
private com.starry.admin.modules.pk.listener.PkContributionListener pkContributionListener;
@Resource
private StringRedisTemplate stringRedisTemplate;
@BeforeEach
void clearPkKeys() {
if (stringRedisTemplate.getConnectionFactory() == null) {
return;
}
stringRedisTemplate.getConnectionFactory().getConnection().flushDb();
}
@Test
@DisplayName("PK 贡献事件应累加到 Redis 中的比分和订单数")
void contributionEventsShouldAccumulateScoresInRedis() {
LocalDateTime now = LocalDateTime.now();
String pkId = IdUtils.getUuid();
String clerkAId = "pk-clerk-a";
String clerkBId = "pk-clerk-b";
SecurityUtils.setTenantId(DEFAULT_TENANT);
PlayClerkPkEntity pk = buildActivePk(pkId, clerkAId, clerkBId, now);
clerkPkService.save(pk);
String scoreKey = PkRedisKeyConstants.scoreKey(pkId);
stringRedisTemplate.delete(scoreKey);
assertThat(clerkPkService.findActivePkForClerk(clerkAId, now)).isPresent();
assertThat(clerkPkService.findActivePkForClerk(clerkBId, now)).isPresent();
pkContributionListener.onContribution(
PkContributionEvent.orderContribution("order-1", clerkAId, new BigDecimal("100.50"), now));
// duplicate event for same order should be ignored
pkContributionListener.onContribution(
PkContributionEvent.orderContribution("order-1", clerkAId, new BigDecimal("100.50"), now));
pkContributionListener.onContribution(
PkContributionEvent.orderContribution("order-2", clerkBId, new BigDecimal("50.25"), now));
pkContributionListener.onContribution(
PkContributionEvent.orderContribution("order-3", clerkAId, new BigDecimal("20.00"), now));
PkScoreBoardDto scoreboard = pkScoreboardService.getScoreboard(pkId);
assertThat(scoreboard.getPkId()).isEqualTo(pkId);
assertThat(scoreboard.getClerkAId()).isEqualTo(clerkAId);
assertThat(scoreboard.getClerkBId()).isEqualTo(clerkBId);
assertThat(scoreboard.getClerkAScore()).isEqualByComparingTo(new BigDecimal("120.50"));
assertThat(scoreboard.getClerkBScore()).isEqualByComparingTo(new BigDecimal("50.25"));
assertThat(scoreboard.getClerkAOrderCount()).isEqualTo(2);
assertThat(scoreboard.getClerkBOrderCount()).isEqualTo(1);
}
@Test
@DisplayName("finishPk 应从 Redis 读取比分并写回数据库,同时标记赢家")
void finishPkShouldPersistScoresAndWinner() {
LocalDateTime now = LocalDateTime.now();
String pkId = IdUtils.getUuid();
String clerkAId = "pk-clerk-a2";
String clerkBId = "pk-clerk-b2";
SecurityUtils.setTenantId(DEFAULT_TENANT);
PlayClerkPkEntity pk = buildActivePk(pkId, clerkAId, clerkBId, now);
clerkPkService.save(pk);
String scoreKey = PkRedisKeyConstants.scoreKey(pkId);
stringRedisTemplate.delete(scoreKey);
pkContributionListener.onContribution(
PkContributionEvent.orderContribution("order-a1", clerkAId, new BigDecimal("80.00"), now));
pkContributionListener.onContribution(
PkContributionEvent.orderContribution("order-b1", clerkBId, new BigDecimal("30.00"), now));
pkContributionListener.onContribution(
PkContributionEvent.orderContribution("order-a2", clerkAId, new BigDecimal("40.00"), now));
PkScoreBoardDto beforeFinish = pkScoreboardService.getScoreboard(pkId);
clerkPkLifecycleService.finishPk(pkId);
PlayClerkPkEntity persisted = clerkPkService.selectPlayClerkPkById(pkId);
assertThat(persisted.getStatus()).isEqualTo(ClerkPkEnum.FINISHED.name());
assertThat(persisted.getSettled()).isEqualTo(1);
assertThat(persisted.getClerkAScore()).isEqualByComparingTo(beforeFinish.getClerkAScore());
assertThat(persisted.getClerkBScore()).isEqualByComparingTo(beforeFinish.getClerkBScore());
assertThat(persisted.getClerkAOrderCount()).isEqualTo(beforeFinish.getClerkAOrderCount());
assertThat(persisted.getClerkBOrderCount()).isEqualTo(beforeFinish.getClerkBOrderCount());
String expectedWinner;
if (beforeFinish.getClerkAScore().compareTo(beforeFinish.getClerkBScore()) > 0) {
expectedWinner = clerkAId;
} else if (beforeFinish.getClerkBScore().compareTo(beforeFinish.getClerkAScore()) > 0) {
expectedWinner = clerkBId;
} else {
expectedWinner = null;
}
assertThat(persisted.getWinnerClerkId()).isEqualTo(expectedWinner);
}
private static PlayClerkPkEntity buildActivePk(String pkId, String clerkAId, String clerkBId,
LocalDateTime now) {
PlayClerkPkEntity pk = new PlayClerkPkEntity();
pk.setId(pkId);
pk.setTenantId("tenant-apitest");
pk.setClerkA(clerkAId);
pk.setClerkB(clerkBId);
pk.setPkBeginTime(Date.from(now.minusMinutes(5).atZone(ZoneId.systemDefault()).toInstant()));
pk.setPkEndTime(Date.from(now.plusMinutes(30).atZone(ZoneId.systemDefault()).toInstant()));
pk.setStatus(ClerkPkEnum.IN_PROGRESS.name());
pk.setSettled(0);
return pk;
}
}