|
|
@@ -884,6 +884,30 @@ class UnifiedRefundServiceTest {
|
|
|
verifyNoInteractions(orderService, client, tx);
|
|
|
}
|
|
|
|
|
|
+ @Test
|
|
|
+ void zeroRefundAmount_isRejectedBeforeAnyLookup() {
|
|
|
+ assertNonPositiveAmountRejected(0L);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void negativeRefundAmount_isRejectedBeforeAnyLookup() {
|
|
|
+ assertNonPositiveAmountRejected(-1L);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 金额闸门必须在任何查单/取商户/调上游之前:非法金额不消耗幂等键,
|
|
|
+ * 也不能让调用方从后续 404 文案里探到订单是否存在。
|
|
|
+ */
|
|
|
+ private void assertNonPositiveAmountRejected(long amount) {
|
|
|
+ BusinessException e = assertThrows(BusinessException.class,
|
|
|
+ () -> service.createRefund(command(amount, "R1"), TENANT, null,
|
|
|
+ UnifiedSource.OPENAPI));
|
|
|
+
|
|
|
+ assertEquals(400, e.getCode(), "amount=" + amount + " 实测消息: " + e.getMessage());
|
|
|
+ assertEquals("退款金额必须大于 0", e.getMessage(), "amount=" + amount);
|
|
|
+ verifyNoInteractions(orderService, merchantService, client, tx, refundMapper);
|
|
|
+ }
|
|
|
+
|
|
|
// ────────────────────────────── 查询语义(Task 13 依赖) ──────────────────────────────
|
|
|
|
|
|
@Test
|