|
|
@@ -0,0 +1,144 @@
|
|
|
+package com.payment.platform.module.payment.unified.enums;
|
|
|
+
|
|
|
+import org.junit.jupiter.api.Test;
|
|
|
+
|
|
|
+import java.util.Set;
|
|
|
+
|
|
|
+import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
|
+import static org.junit.jupiter.api.Assertions.assertFalse;
|
|
|
+import static org.junit.jupiter.api.Assertions.assertTrue;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 统一支付状态机的钉子(spec §4 / Task 2 brief)。
|
|
|
+ *
|
|
|
+ * <p>断言一律用**字面量**而不是常量名:钉的是入库/出网的那个值本身。
|
|
|
+ * 常量改名不该红,常量改值必须红。
|
|
|
+ *
|
|
|
+ * <p>状态转换表是后续所有条件更新({@code previousStatesFor} → {@code WHERE trade_status IN ...})
|
|
|
+ * 的唯一依据:同态不算变化(并发重复回写必须落空),终态不回退。
|
|
|
+ */
|
|
|
+class UnifiedStatusTest {
|
|
|
+
|
|
|
+ // ---------------------------------------------------------------- 订单
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void 订单允许的状态转换() {
|
|
|
+ assertTrue(UnifiedOrderStatus.canTransition("0", "1"));
|
|
|
+ assertTrue(UnifiedOrderStatus.canTransition("0", "2"));
|
|
|
+ assertTrue(UnifiedOrderStatus.canTransition("0", "3"));
|
|
|
+ assertTrue(UnifiedOrderStatus.canTransition("0", "4"));
|
|
|
+ assertTrue(UnifiedOrderStatus.canTransition("0", "6"));
|
|
|
+ assertTrue(UnifiedOrderStatus.canTransition("1", "2"));
|
|
|
+ assertTrue(UnifiedOrderStatus.canTransition("1", "3"));
|
|
|
+ assertTrue(UnifiedOrderStatus.canTransition("1", "4"));
|
|
|
+ assertTrue(UnifiedOrderStatus.canTransition("1", "6"));
|
|
|
+ assertTrue(UnifiedOrderStatus.canTransition("2", "5"));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void 订单终态不回退且同态不算变化() {
|
|
|
+ assertFalse(UnifiedOrderStatus.canTransition("3", "2"));
|
|
|
+ assertFalse(UnifiedOrderStatus.canTransition("4", "2"));
|
|
|
+ assertFalse(UnifiedOrderStatus.canTransition("6", "2"));
|
|
|
+ assertFalse(UnifiedOrderStatus.canTransition("5", "2"));
|
|
|
+ assertFalse(UnifiedOrderStatus.canTransition("2", "2"));
|
|
|
+ assertFalse(UnifiedOrderStatus.canTransition("0", "0"));
|
|
|
+ assertFalse(UnifiedOrderStatus.canTransition("1", "1"));
|
|
|
+ assertFalse(UnifiedOrderStatus.canTransition("2", "99"));
|
|
|
+ assertFalse(UnifiedOrderStatus.canTransition("99", "1"));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void 订单前态集合() {
|
|
|
+ assertEquals(Set.of("0"), UnifiedOrderStatus.previousStatesFor("1"));
|
|
|
+ assertEquals(Set.of("0", "1"), UnifiedOrderStatus.previousStatesFor("2"));
|
|
|
+ assertEquals(Set.of("0", "1"), UnifiedOrderStatus.previousStatesFor("3"));
|
|
|
+ assertEquals(Set.of("0", "1"), UnifiedOrderStatus.previousStatesFor("4"));
|
|
|
+ assertEquals(Set.of("2"), UnifiedOrderStatus.previousStatesFor("5"));
|
|
|
+ assertEquals(Set.of("0", "1"), UnifiedOrderStatus.previousStatesFor("6"));
|
|
|
+ // 初始态没有前态;非法目标同样返回空集合
|
|
|
+ assertEquals(Set.of(), UnifiedOrderStatus.previousStatesFor("0"));
|
|
|
+ assertEquals(Set.of(), UnifiedOrderStatus.previousStatesFor("99"));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void 订单状态集合() {
|
|
|
+ assertEquals(Set.of("0", "1"), UnifiedOrderStatus.PENDING);
|
|
|
+ assertEquals(Set.of("3", "4", "5", "6"), UnifiedOrderStatus.FINAL);
|
|
|
+ assertFalse(UnifiedOrderStatus.isValid("99"));
|
|
|
+ assertTrue(UnifiedOrderStatus.isValid("6"));
|
|
|
+ for (String status : Set.of("0", "1", "2", "3", "4", "5", "6")) {
|
|
|
+ assertTrue(UnifiedOrderStatus.isValid(status), "应为合法订单状态: " + status);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // ---------------------------------------------------------------- 退款
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void 退款允许的状态转换() {
|
|
|
+ assertTrue(UnifiedRefundStatus.canTransition("0", "1"));
|
|
|
+ assertTrue(UnifiedRefundStatus.canTransition("0", "2"));
|
|
|
+ assertTrue(UnifiedRefundStatus.canTransition("0", "3"));
|
|
|
+ assertTrue(UnifiedRefundStatus.canTransition("0", "4"));
|
|
|
+ assertTrue(UnifiedRefundStatus.canTransition("1", "2"));
|
|
|
+ assertTrue(UnifiedRefundStatus.canTransition("1", "3"));
|
|
|
+ assertTrue(UnifiedRefundStatus.canTransition("1", "4"));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void 退款终态不回退且同态不算变化() {
|
|
|
+ assertFalse(UnifiedRefundStatus.canTransition("2", "3"));
|
|
|
+ assertFalse(UnifiedRefundStatus.canTransition("2", "2"));
|
|
|
+ assertFalse(UnifiedRefundStatus.canTransition("0", "0"));
|
|
|
+ assertFalse(UnifiedRefundStatus.canTransition("1", "1"));
|
|
|
+ assertFalse(UnifiedRefundStatus.canTransition("3", "2"));
|
|
|
+ assertFalse(UnifiedRefundStatus.canTransition("4", "2"));
|
|
|
+ assertFalse(UnifiedRefundStatus.canTransition("0", "99"));
|
|
|
+ assertFalse(UnifiedRefundStatus.canTransition("99", "1"));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void 退款前态集合() {
|
|
|
+ assertEquals(Set.of("0"), UnifiedRefundStatus.previousStatesFor("1"));
|
|
|
+ assertEquals(Set.of("0", "1"), UnifiedRefundStatus.previousStatesFor("2"));
|
|
|
+ assertEquals(Set.of("0", "1"), UnifiedRefundStatus.previousStatesFor("3"));
|
|
|
+ assertEquals(Set.of("0", "1"), UnifiedRefundStatus.previousStatesFor("4"));
|
|
|
+ assertEquals(Set.of(), UnifiedRefundStatus.previousStatesFor("0"));
|
|
|
+ assertEquals(Set.of(), UnifiedRefundStatus.previousStatesFor("99"));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void 退款状态集合() {
|
|
|
+ assertEquals(Set.of("0", "1"), UnifiedRefundStatus.PENDING);
|
|
|
+ assertEquals(Set.of("0", "1", "2"), UnifiedRefundStatus.OCCUPIED);
|
|
|
+ assertEquals(Set.of("2", "3", "4"), UnifiedRefundStatus.FINAL);
|
|
|
+ assertFalse(UnifiedRefundStatus.isValid("99"));
|
|
|
+ assertTrue(UnifiedRefundStatus.isValid("4"));
|
|
|
+ for (String status : Set.of("0", "1", "2", "3", "4")) {
|
|
|
+ assertTrue(UnifiedRefundStatus.isValid(status), "应为合法退款状态: " + status);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // ------------------------------------------------- 回调状态 / 来源
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void 回调状态常量与校验() {
|
|
|
+ assertEquals("PENDING", UnifiedNotifyStatus.PENDING);
|
|
|
+ assertEquals("SUCCESS", UnifiedNotifyStatus.SUCCESS);
|
|
|
+ assertEquals("FAILED", UnifiedNotifyStatus.FAILED);
|
|
|
+ assertTrue(UnifiedNotifyStatus.isValid("PENDING"));
|
|
|
+ assertTrue(UnifiedNotifyStatus.isValid("SUCCESS"));
|
|
|
+ assertTrue(UnifiedNotifyStatus.isValid("FAILED"));
|
|
|
+ assertFalse(UnifiedNotifyStatus.isValid("pending"));
|
|
|
+ assertFalse(UnifiedNotifyStatus.isValid("99"));
|
|
|
+ assertFalse(UnifiedNotifyStatus.isValid(null));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void 来源枚举值() {
|
|
|
+ assertEquals(3, UnifiedSource.values().length);
|
|
|
+ assertEquals("OPENAPI", UnifiedSource.OPENAPI.name());
|
|
|
+ assertEquals("CASHIER", UnifiedSource.CASHIER.name());
|
|
|
+ assertEquals("ADMIN", UnifiedSource.ADMIN.name());
|
|
|
+ }
|
|
|
+}
|