|
@@ -0,0 +1,129 @@
|
|
|
|
|
+package com.mangoo.rating.recommend.cart;
|
|
|
|
|
+
|
|
|
|
|
+import com.mangoo.rating.recommend.AjaxResult;
|
|
|
|
|
+import com.mangoo.rating.recommend.manager.ActiveBatchManager;
|
|
|
|
|
+import com.mangoo.rating.recommend.manager.CardPopManager;
|
|
|
|
|
+import com.mangoo.rating.recommend.manager.CardValueHistoryManager;
|
|
|
|
|
+import com.mangoo.rating.recommend.manager.RatingRecommendRuleManager;
|
|
|
|
|
+import com.mangoo.rating.recommend.po.RatingRecommendRulePO;
|
|
|
|
|
+import com.mangoo.rating.recommend.request.recommend.RuleSyncCardDTO;
|
|
|
|
|
+import com.mangoo.rating.recommend.request.recommend.RuleSyncRequest;
|
|
|
|
|
+import com.mangoo.rating.recommend.service.impl.RuleSyncServiceImpl;
|
|
|
|
|
+import org.junit.jupiter.api.BeforeEach;
|
|
|
|
|
+import org.junit.jupiter.api.Test;
|
|
|
|
|
+import org.junit.jupiter.api.extension.ExtendWith;
|
|
|
|
|
+import org.mockito.ArgumentCaptor;
|
|
|
|
|
+import org.mockito.Captor;
|
|
|
|
|
+import org.mockito.InjectMocks;
|
|
|
|
|
+import org.mockito.Mock;
|
|
|
|
|
+import org.mockito.junit.jupiter.MockitoExtension;
|
|
|
|
|
+
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
|
+import java.util.Arrays;
|
|
|
|
|
+import java.util.Collections;
|
|
|
|
|
+import java.util.List;
|
|
|
|
|
+
|
|
|
|
|
+import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
|
|
|
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
|
|
|
|
+import static org.mockito.Mockito.lenient;
|
|
|
|
|
+import static org.mockito.Mockito.never;
|
|
|
|
|
+import static org.mockito.Mockito.verify;
|
|
|
|
|
+import static org.mockito.Mockito.when;
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * RuleSyncServiceImpl Mockito 单测
|
|
|
|
|
+ *
|
|
|
|
|
+ * @author gengjintao
|
|
|
|
|
+ * @date 2026/06/25
|
|
|
|
|
+ */
|
|
|
|
|
+@ExtendWith(MockitoExtension.class)
|
|
|
|
|
+class RuleSyncServiceImplTest {
|
|
|
|
|
+
|
|
|
|
|
+ @Mock
|
|
|
|
|
+ private RatingRecommendRuleManager ruleManager;
|
|
|
|
|
+ @Mock
|
|
|
|
|
+ private CardPopManager cardPopManager;
|
|
|
|
|
+ @Mock
|
|
|
|
|
+ private CardValueHistoryManager cardValueHistoryManager;
|
|
|
|
|
+ @Mock
|
|
|
|
|
+ private ActiveBatchManager activeBatchManager;
|
|
|
|
|
+ @InjectMocks
|
|
|
|
|
+ private RuleSyncServiceImpl ruleSyncService;
|
|
|
|
|
+
|
|
|
|
|
+ @Captor
|
|
|
|
|
+ private ArgumentCaptor<List<RatingRecommendRulePO>> ruleListCaptor;
|
|
|
|
|
+
|
|
|
|
|
+ @BeforeEach
|
|
|
|
|
+ void setUp() {
|
|
|
|
|
+ // 默认无生效批次 + 清旧批次查询返回空,避免 NPE
|
|
|
|
|
+ lenient().when(activeBatchManager.selectActiveBatchNo()).thenReturn(null);
|
|
|
|
|
+ lenient().when(ruleManager.selectDistinctBatchNos()).thenReturn(Collections.emptyList());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private RuleSyncCardDTO card(String cardId) {
|
|
|
|
|
+ RuleSyncCardDTO c = new RuleSyncCardDTO();
|
|
|
|
|
+ c.setCardId(cardId);
|
|
|
|
|
+ c.setPlayer("p");
|
|
|
|
|
+ c.setYear("2026");
|
|
|
|
|
+ c.setSeries("s");
|
|
|
|
|
+ c.setCardSet("BASE");
|
|
|
|
|
+ c.setRecommendEfficiency(2);
|
|
|
|
|
+ return c;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private RuleSyncRequest req(String batchNo, RuleSyncCardDTO... cards) {
|
|
|
|
|
+ RuleSyncRequest r = new RuleSyncRequest();
|
|
|
|
|
+ r.setBatchNo(batchNo);
|
|
|
|
|
+ r.setCards(new ArrayList<>(Arrays.asList(cards)));
|
|
|
|
|
+ return r;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private int code(AjaxResult r) {
|
|
|
|
|
+ return ((Number) r.get("code")).intValue();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void 正常_全量替换并切批次() {
|
|
|
|
|
+ AjaxResult result = ruleSyncService.sync(req("2026062501", card("CARD-1")));
|
|
|
|
|
+ assertEquals(0, code(result)); // 成功码 0
|
|
|
|
|
+ // 切指针到新批次
|
|
|
|
|
+ verify(activeBatchManager).updateActiveBatchNo("2026062501");
|
|
|
|
|
+ // 规则批量插入被调用
|
|
|
|
|
+ verify(ruleManager).batchInsert(ruleListCaptor.capture());
|
|
|
|
|
+ assertEquals(1, ruleListCaptor.getValue().size());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void 空batchNo_拒绝且不写库() {
|
|
|
|
|
+ AjaxResult result = ruleSyncService.sync(req("", card("CARD-1")));
|
|
|
|
|
+ assertNotEquals(0, code(result));
|
|
|
|
|
+ verify(ruleManager, never()).batchInsert(org.mockito.ArgumentMatchers.anyList());
|
|
|
|
|
+ verify(activeBatchManager, never()).updateActiveBatchNo(org.mockito.ArgumentMatchers.anyString());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void 空cards_拒绝() {
|
|
|
|
|
+ RuleSyncRequest r = new RuleSyncRequest();
|
|
|
|
|
+ r.setBatchNo("2026062501");
|
|
|
|
|
+ r.setCards(new ArrayList<>());
|
|
|
|
|
+ AjaxResult result = ruleSyncService.sync(r);
|
|
|
|
|
+ assertNotEquals(0, code(result));
|
|
|
|
|
+ verify(ruleManager, never()).batchInsert(org.mockito.ArgumentMatchers.anyList());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void 旧批次_拒绝回灌() {
|
|
|
|
|
+ when(activeBatchManager.selectActiveBatchNo()).thenReturn("2026062502");
|
|
|
|
|
+ AjaxResult result = ruleSyncService.sync(req("2026062501", card("CARD-1")));
|
|
|
|
|
+ assertNotEquals(0, code(result)); // 新批次 <= 生效批次,拒绝
|
|
|
|
|
+ verify(ruleManager, never()).batchInsert(org.mockito.ArgumentMatchers.anyList());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void cardId去重_重复只插一条() {
|
|
|
|
|
+ AjaxResult result = ruleSyncService.sync(req("2026062501", card("DUP"), card("DUP")));
|
|
|
|
|
+ assertEquals(0, code(result));
|
|
|
|
|
+ verify(ruleManager).batchInsert(ruleListCaptor.capture());
|
|
|
|
|
+ assertEquals(1, ruleListCaptor.getValue().size()); // 同 cardId 去重为 1
|
|
|
|
|
+ }
|
|
|
|
|
+}
|