- WxPayService: 统一下单/支付回调/退款/订单查询 - FaqService: FAQ CRUD/关键词搜索/热门推荐/分类查询 - IntentService: 意图识别(正则匹配)/批量解析/规则管理 - 3个Controller + 15+ API端点 (/api/revenue/wxpay|faq|intent/*) - Entity: WxPayOrder, FaqItem, IntentRule - DDL: rev_wx_pay_order/rev_faq_item/rev_intent_rule + 8个索引 - 8个单元测试
147 lines
5.0 KiB
Java
147 lines
5.0 KiB
Java
package com.water.revenue;
|
|
|
|
import com.water.revenue.entity.FaqItem;
|
|
import com.water.revenue.entity.IntentRule;
|
|
import com.water.revenue.entity.WxPayOrder;
|
|
import com.water.revenue.mapper.FaqItemMapper;
|
|
import com.water.revenue.mapper.IntentRuleMapper;
|
|
import com.water.revenue.mapper.WxPayOrderMapper;
|
|
import com.water.revenue.service.wxhall.FaqService;
|
|
import com.water.revenue.service.wxhall.IntentService;
|
|
import com.water.revenue.service.wxhall.WxPayService;
|
|
import org.junit.jupiter.api.Test;
|
|
import org.junit.jupiter.api.extension.ExtendWith;
|
|
import org.mockito.InjectMocks;
|
|
import org.mockito.Mock;
|
|
import org.mockito.junit.jupiter.MockitoExtension;
|
|
|
|
import java.math.BigDecimal;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
import static org.junit.jupiter.api.Assertions.*;
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
import static org.mockito.Mockito.*;
|
|
|
|
@ExtendWith(MockitoExtension.class)
|
|
class WxHallServiceTest {
|
|
|
|
@Mock private WxPayOrderMapper wxPayOrderMapper;
|
|
@Mock private FaqItemMapper faqItemMapper;
|
|
@Mock private IntentRuleMapper intentRuleMapper;
|
|
|
|
@InjectMocks private WxPayService wxPayService;
|
|
@InjectMocks private FaqService faqService;
|
|
@InjectMocks private IntentService intentService;
|
|
|
|
@Test
|
|
void testUnifiedOrder() {
|
|
when(wxPayOrderMapper.insert(any())).thenReturn(1);
|
|
when(wxPayOrderMapper.updateById(any())).thenReturn(1);
|
|
|
|
Map<String, Object> result = wxPayService.unifiedOrder(
|
|
"openid123", "C001", "2024-01", new BigDecimal("50.00"), null);
|
|
|
|
assertNotNull(result.get("outTradeNo"));
|
|
assertEquals(5000, result.get("totalFee"));
|
|
assertNotNull(result.get("prepayId"));
|
|
verify(wxPayOrderMapper).insert(any(WxPayOrder.class));
|
|
}
|
|
|
|
@Test
|
|
void testPayNotify() {
|
|
WxPayOrder order = new WxPayOrder();
|
|
order.setOutTradeNo("WXPAY20240101000001");
|
|
order.setStatus("pending");
|
|
when(wxPayOrderMapper.selectByOutTradeNo(any())).thenReturn(order);
|
|
when(wxPayOrderMapper.updateById(any())).thenReturn(1);
|
|
|
|
Map<String, String> xmlData = Map.of(
|
|
"out_trade_no", "WXPAY20240101000001",
|
|
"transaction_id", "TX123",
|
|
"result_code", "SUCCESS",
|
|
"sign", "test_sign"
|
|
);
|
|
|
|
Map<String, Object> result = wxPayService.payNotify(xmlData);
|
|
assertEquals("SUCCESS", result.get("return_code"));
|
|
verify(wxPayOrderMapper).updateById(any(WxPayOrder.class));
|
|
}
|
|
|
|
@Test
|
|
void testRefund() {
|
|
WxPayOrder order = new WxPayOrder();
|
|
order.setOutTradeNo("WXPAY001");
|
|
order.setStatus("success");
|
|
order.setAmount(new BigDecimal("50.00"));
|
|
when(wxPayOrderMapper.selectByOutTradeNo(any())).thenReturn(order);
|
|
when(wxPayOrderMapper.updateById(any())).thenReturn(1);
|
|
|
|
Map<String, Object> result = wxPayService.refund("WXPAY001", new BigDecimal("30.00"), "用户申请");
|
|
assertEquals("refunded", result.get("status"));
|
|
assertEquals(new BigDecimal("30.00"), result.get("refundAmount"));
|
|
}
|
|
|
|
@Test
|
|
void testSearchFaq() {
|
|
FaqItem faq = new FaqItem();
|
|
faq.setId(1L);
|
|
faq.setQuestion("如何查询水费?");
|
|
faq.setAnswer("通过公众号查询");
|
|
when(faqItemMapper.selectList(any())).thenReturn(List.of(faq));
|
|
|
|
List<FaqItem> results = faqService.searchFaq("水费");
|
|
assertFalse(results.isEmpty());
|
|
assertEquals(1, results.size());
|
|
}
|
|
|
|
@Test
|
|
void testGetHotFaqs() {
|
|
FaqItem faq = new FaqItem();
|
|
faq.setHitCount(100);
|
|
when(faqItemMapper.selectList(any())).thenReturn(List.of(faq));
|
|
|
|
List<FaqItem> results = faqService.getHotFaqs(5);
|
|
assertFalse(results.isEmpty());
|
|
}
|
|
|
|
@Test
|
|
void testIntentResolve() {
|
|
IntentRule rule = new IntentRule();
|
|
rule.setId(1L);
|
|
rule.setPattern(".*查.*账单.*");
|
|
rule.setIntentType("QUERY_BILL");
|
|
rule.setResponse("正在查询...");
|
|
rule.setHitCount(0);
|
|
when(intentRuleMapper.selectList(any())).thenReturn(List.of(rule));
|
|
when(intentRuleMapper.updateById(any())).thenReturn(1);
|
|
|
|
Map<String, Object> result = intentService.resolve("我想查账单");
|
|
assertNotNull(result);
|
|
assertEquals("QUERY_BILL", result.get("intentType"));
|
|
}
|
|
|
|
@Test
|
|
void testIntentResolveNoMatch() {
|
|
when(intentRuleMapper.selectList(any())).thenReturn(List.of());
|
|
|
|
Map<String, Object> result = intentService.resolve("今天天气怎么样");
|
|
assertNotNull(result);
|
|
assertEquals("UNKNOWN", result.get("intentType"));
|
|
}
|
|
|
|
@Test
|
|
void testCreateFaq() {
|
|
FaqItem faq = new FaqItem();
|
|
faq.setQuestion("新问题");
|
|
faq.setAnswer("新答案");
|
|
faq.setCategory("其他");
|
|
when(faqItemMapper.insert(any())).thenReturn(1);
|
|
|
|
FaqItem result = faqService.createFaq(faq);
|
|
assertNotNull(result);
|
|
assertEquals("新问题", result.getQuestion());
|
|
verify(faqItemMapper).insert(any(FaqItem.class));
|
|
}
|
|
}
|