working but not tested
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user