| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298 |
- package com.etotem.cfc.controller;
- import com.etotem.cfc.common.Result;
- import com.etotem.cfc.controller.guide.PaymentController;
- import com.etotem.cfc.entity.PackageOrder;
- import com.etotem.cfc.mapper.PackageOrderMapper;
- import com.etotem.cfc.service.CommissionService;
- import com.etotem.cfc.service.PaymentService;
- import org.junit.jupiter.api.Test;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.boot.test.mock.mockito.MockBean;
- import javax.annotation.Resource;
- import java.util.*;
- import static org.junit.jupiter.api.Assertions.*;
- import static org.mockito.ArgumentMatchers.*;
- import static org.mockito.Mockito.*;
- /**
- * P0-支付测试:微信/支付宝创建订单 → 回调 → 订单状态查询
- * 覆盖 PaymentController 全链路
- */
- @SpringBootTest
- public class PaymentControllerTest {
- @Resource
- private PaymentController controller;
- @MockBean
- private PaymentService paymentService;
- @MockBean
- private PackageOrderMapper packageOrderMapper;
- @MockBean
- private CommissionService commissionService;
- // ===== 微信支付创建 =====
- @Test
- public void createWechatPayOrder_Success() {
- Map<String, Object> params = new HashMap<>();
- params.put("orderNo", "ORD20260622001");
- params.put("description", "DAN测评任务模板");
- params.put("amount", 19800);
- Map<String, Object> mockResult = new HashMap<>();
- mockResult.put("orderNo", "ORD20260622001");
- mockResult.put("prepayId", "wx_prepay_ORD20260622001");
- mockResult.put("appId", "wx5ba8038ef16fb245");
- mockResult.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
- mockResult.put("nonceStr", "abc123def456");
- mockResult.put("package", "prepay_id=wx_prepay_ORD20260622001");
- mockResult.put("signType", "MD5");
- mockResult.put("paySign", "mock_sign");
- // 生产:PaymentController:54 -> paymentService.createWechatPrepay(orderNo, description, amount, openid)
- when(paymentService.createWechatPrepay(eq("ORD20260622001"), eq("DAN测评任务模板"), eq(19800), isNull()))
- .thenReturn(mockResult);
- Result<Map<String, Object>> result = controller.createWechatPayOrder(params);
- assertEquals(200, result.getCode());
- assertNotNull(result.getData());
- assertEquals("ORD20260622001", result.getData().get("orderNo"));
- assertNotNull(result.getData().get("prepayId"));
- assertTrue(((String) result.getData().get("prepayId")).startsWith("wx_prepay_"));
- }
- @Test
- public void createWechatPayOrder_ReturnMapNotNull() {
- Map<String, Object> params = new HashMap<>();
- params.put("orderNo", "ORD20260622002");
- params.put("description", "年度任务模板");
- params.put("amount", 36500);
- when(paymentService.createWechatPrepay(anyString(), anyString(), anyInt(), isNull()))
- .thenReturn(new HashMap<String, Object>() {{
- put("orderNo", "ORD20260622002");
- put("prepayId", "wx_prepay_test");
- put("appId", "wx5ba8038ef16fb245");
- put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
- put("nonceStr", "nonce123");
- put("package", "prepay_id=wx_prepay_test");
- put("signType", "MD5");
- put("paySign", "sign123");
- }});
- Result<Map<String, Object>> result = controller.createWechatPayOrder(params);
- assertEquals(200, result.getCode());
- assertNotNull(result.getData().get("appId"));
- assertEquals("MD5", result.getData().get("signType"));
- }
- // ===== 支付宝创建 =====
- @Test
- public void createAlipayOrder_Success() {
- Map<String, Object> params = new HashMap<>();
- params.put("orderNo", "ORD20260622003");
- params.put("description", "咨询服务");
- params.put("amount", 5000);
- Map<String, Object> mockResult = new HashMap<>();
- mockResult.put("orderNo", "ORD20260622003");
- mockResult.put("orderString", "alipay_sdk_order_ORD20260622003_5000");
- when(paymentService.createAlipayOrder("ORD20260622003", "咨询服务", 5000))
- .thenReturn(mockResult);
- Result<Map<String, Object>> result = controller.createAlipayOrder(params);
- assertEquals(200, result.getCode());
- assertEquals("ORD20260622003", result.getData().get("orderNo"));
- assertTrue(((String) result.getData().get("orderString")).contains("ORD20260622003"));
- }
- // ===== 微信回调 =====
- @Test
- public void handleWechatCallback_Success() {
- Map<String, Object> params = new HashMap<>();
- params.put("orderNo", "ORD20260622001");
- params.put("transactionId", "WX20260622001");
- PackageOrder mockOrder = new PackageOrder();
- mockOrder.setId(1L);
- mockOrder.setOrderNo("ORD20260622001");
- mockOrder.setStatus("pending");
- mockOrder.setUserId(100L);
- mockOrder.setPrice(19800);
- // 生产:PaymentController:158 -> paymentService.handlePaymentCallback(orderNo, txn, "wechat")
- when(paymentService.handlePaymentCallback(eq("ORD20260622001"), eq("WX20260622001"), eq("wechat")))
- .thenReturn(true);
- Result<Boolean> result = controller.handleWechatCallback(params);
- assertEquals(200, result.getCode());
- assertTrue(result.getData());
- verify(paymentService).handlePaymentCallback("ORD20260622001", "WX20260622001", "wechat");
- }
- @Test
- public void handleWechatCallback_OrderNotFound() {
- Map<String, Object> params = new HashMap<>();
- params.put("orderNo", "NOTEXIST");
- params.put("transactionId", "WX20260622099");
- when(packageOrderMapper.selectOne(any())).thenReturn(null);
- Result<Boolean> result = controller.handleWechatCallback(params);
- assertEquals(200, result.getCode());
- assertFalse(result.getData());
- }
- @Test
- public void handleWechatCallback_OrderUpdateFails() {
- Map<String, Object> params = new HashMap<>();
- params.put("orderNo", "ORD20260622004");
- params.put("transactionId", "WX20260622004");
- PackageOrder mockOrder = new PackageOrder();
- mockOrder.setId(2L);
- mockOrder.setOrderNo("ORD20260622004");
- mockOrder.setStatus("pending");
- mockOrder.setUserId(200L);
- mockOrder.setPrice(10000);
- when(packageOrderMapper.selectOne(any())).thenReturn(mockOrder);
- when(packageOrderMapper.updateById(any(PackageOrder.class))).thenReturn(0);
- Result<Boolean> result = controller.handleWechatCallback(params);
- assertEquals(200, result.getCode());
- assertFalse(result.getData());
- }
- // ===== 支付宝回调 =====
- @Test
- public void handleAlipayCallback_Success() {
- Map<String, Object> params = new HashMap<>();
- params.put("orderNo", "ORD20260622005");
- params.put("transactionId", "ALI20260622005");
- PackageOrder mockOrder = new PackageOrder();
- mockOrder.setId(3L);
- mockOrder.setOrderNo("ORD20260622005");
- mockOrder.setStatus("pending");
- // 生产:PaymentController:171 -> paymentService.handlePaymentCallback(orderNo, txn, "alipay")
- when(paymentService.handlePaymentCallback(eq("ORD20260622005"), eq("ALI20260622005"), eq("alipay")))
- .thenReturn(true);
- Result<Boolean> result = controller.handleAlipayCallback(params);
- assertEquals(200, result.getCode());
- assertTrue(result.getData());
- verify(paymentService).handlePaymentCallback("ORD20260622005", "ALI20260622005", "alipay");
- }
- @Test
- public void handleAlipayCallback_OrderNotFound() {
- Map<String, Object> params = new HashMap<>();
- params.put("orderNo", "NOTEXIST");
- params.put("transactionId", "ALI999");
- when(packageOrderMapper.selectOne(any())).thenReturn(null);
- Result<Boolean> result = controller.handleAlipayCallback(params);
- assertEquals(200, result.getCode());
- assertFalse(result.getData());
- }
- // ===== 订单状态查询 =====
- @Test
- public void getOrderStatus_Success() {
- PackageOrder mockOrder = new PackageOrder();
- mockOrder.setId(1L);
- mockOrder.setOrderNo("ORD20260622001");
- mockOrder.setStatus("paid");
- mockOrder.setTransactionId("WX20260622001");
- mockOrder.setPrice(19800);
- mockOrder.setUserId(100L);
- when(paymentService.getOrderStatus("ORD20260622001")).thenReturn(mockOrder);
- Result<PackageOrder> result = controller.getOrderStatus("ORD20260622001");
- assertEquals(200, result.getCode());
- assertNotNull(result.getData());
- assertEquals("paid", result.getData().getStatus());
- assertEquals("WX20260622001", result.getData().getTransactionId());
- }
- @Test
- public void getOrderStatus_NotFound() {
- when(paymentService.getOrderStatus("NOTEXIST")).thenReturn(null);
- Result<PackageOrder> result = controller.getOrderStatus("NOTEXIST");
- assertEquals(500, result.getCode());
- assertEquals("订单不存在", result.getMessage());
- }
- @Test
- public void getOrderStatus_DifferentStatuses() {
- // pending
- PackageOrder pendingOrder = new PackageOrder();
- pendingOrder.setOrderNo("ORD001");
- pendingOrder.setStatus("pending");
- when(paymentService.getOrderStatus("ORD001")).thenReturn(pendingOrder);
- Result<PackageOrder> r1 = controller.getOrderStatus("ORD001");
- assertEquals("pending", r1.getData().getStatus());
- // paid
- PackageOrder paidOrder = new PackageOrder();
- paidOrder.setOrderNo("ORD002");
- paidOrder.setStatus("paid");
- when(paymentService.getOrderStatus("ORD002")).thenReturn(paidOrder);
- Result<PackageOrder> r2 = controller.getOrderStatus("ORD002");
- assertEquals("paid", r2.getData().getStatus());
- // cancelled
- PackageOrder cancelledOrder = new PackageOrder();
- cancelledOrder.setOrderNo("ORD003");
- cancelledOrder.setStatus("cancelled");
- when(paymentService.getOrderStatus("ORD003")).thenReturn(cancelledOrder);
- Result<PackageOrder> r3 = controller.getOrderStatus("ORD003");
- assertEquals("cancelled", r3.getData().getStatus());
- }
- // ===== 异常边界 =====
- @Test
- public void createWechatPayOrder_AmountIsZero() {
- Map<String, Object> params = new HashMap<>();
- params.put("orderNo", "ORD000");
- params.put("description", "免费任务模板");
- params.put("amount", 0);
- when(paymentService.createWechatPayOrder("ORD000", "免费任务模板", 0))
- .thenReturn(new HashMap<String, Object>() {{
- put("orderNo", "ORD000");
- put("prepayId", null);
- }});
- Result<Map<String, Object>> result = controller.createWechatPayOrder(params);
- assertEquals(200, result.getCode());
- }
- }
|