From 39f6fca28e3f78abe48f08e474ec011abb990b36 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期三, 09 九月 2026 10:39:21 +0800
Subject: [PATCH] update
---
backend/src/test/java/com/tourguide/modules/order/service/OrderRefundServiceTest.java | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 54 insertions(+), 4 deletions(-)
diff --git a/backend/src/test/java/com/tourguide/modules/order/service/OrderRefundServiceTest.java b/backend/src/test/java/com/tourguide/modules/order/service/OrderRefundServiceTest.java
index c5d3ddf..5c9fc17 100644
--- a/backend/src/test/java/com/tourguide/modules/order/service/OrderRefundServiceTest.java
+++ b/backend/src/test/java/com/tourguide/modules/order/service/OrderRefundServiceTest.java
@@ -1,5 +1,6 @@
package com.tourguide.modules.order.service;
+import com.tourguide.modules.order.domain.OrderStatus;
import com.tourguide.modules.order.domain.RefundStatus;
import com.tourguide.modules.order.domain.PaymentMethod;
import com.tourguide.modules.order.entity.TourOrder;
@@ -12,6 +13,7 @@
import java.time.LocalDateTime;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
@@ -37,15 +39,18 @@
org.mockito.ArgumentMatchers.eq(new BigDecimal("36.00"))))
.thenAnswer(invocation -> order.getRefundOrderNo());
- refundService.requestRefund(order);
- refundService.requestRefund(order);
+ boolean accepted = refundService.requestRefund(order);
+ boolean duplicateAccepted = refundService.requestRefund(order);
+ assertThat(accepted).isTrue();
+ assertThat(duplicateAccepted).isTrue();
assertThat(order.getRefundStatus()).isEqualTo(RefundStatus.REFUNDING.getCode());
+ assertThat(order.getStatus()).isEqualTo(OrderStatus.CANCELLED.getCode());
assertThat(order.getRefundOrderNo()).startsWith("RF").hasSize(32);
assertThat(order.getRefundAmount()).isEqualByComparingTo("36.00");
assertThat(order.getRefundMethod()).isEqualTo("WECHAT");
verify(refundGateway, times(1)).refund(order, new BigDecimal("36.00"));
- verify(orderMapper, times(1)).updateById(order);
+ verify(orderMapper, times(2)).updateById(order);
}
@Test
@@ -55,8 +60,9 @@
org.mockito.ArgumentMatchers.any(BigDecimal.class)))
.thenThrow(new IllegalStateException("gateway unavailable"));
- refundService.requestRefund(order);
+ boolean accepted = refundService.requestRefund(order);
+ assertThat(accepted).isFalse();
assertThat(order.getRefundStatus()).isEqualTo(RefundStatus.REFUND_FAILED.getCode());
verify(orderMapper, times(2)).updateById(order);
}
@@ -81,11 +87,54 @@
refundService.requestRefund(order);
assertThat(order.getRefundStatus()).isEqualTo(RefundStatus.REFUNDED.getCode());
+ assertThat(order.getStatus()).isEqualTo(OrderStatus.REFUNDED.getCode());
assertThat(order.getRefundTime()).isNotNull();
assertThat(order.getRefundMethod()).isEqualTo(PaymentMethod.TEMPORARY_BYPASS.getCode());
verify(refundGateway, never()).refund(org.mockito.ArgumentMatchers.any(),
org.mockito.ArgumentMatchers.any());
verify(orderMapper).updateById(order);
+ }
+
+ @Test
+ void adminRefundShouldSubmitRequestedAmount() {
+ TourOrder order = paidOrder();
+ when(refundGateway.refund(eq(order), eq(new BigDecimal("20.00"))))
+ .thenAnswer(invocation -> order.getRefundOrderNo());
+
+ boolean accepted = refundService.requestRefund(order, new BigDecimal("20.00"));
+
+ assertThat(accepted).isTrue();
+ assertThat(order.getRefundAmount()).isEqualByComparingTo("20.00");
+ verify(refundGateway).refund(order, new BigDecimal("20.00"));
+ }
+
+ @Test
+ void followUpRefundShouldOnlyUseRemainingAmount() {
+ TourOrder order = paidOrder();
+ order.setStatus(OrderStatus.CANCELLED.getCode());
+ order.setRefundStatus(RefundStatus.PARTIAL.getCode());
+ order.setRefundedAmount(new BigDecimal("20.00"));
+ when(refundGateway.refund(eq(order), eq(new BigDecimal("16.00"))))
+ .thenAnswer(invocation -> order.getRefundOrderNo());
+
+ boolean accepted = refundService.requestRefund(order, new BigDecimal("16.00"));
+
+ assertThat(accepted).isTrue();
+ assertThat(order.getRefundAmount()).isEqualByComparingTo("16.00");
+ assertThat(order.getRefundStatus()).isEqualTo(RefundStatus.REFUNDING.getCode());
+ verify(refundGateway).refund(order, new BigDecimal("16.00"));
+ }
+
+ @Test
+ void refundShouldRejectAmountAboveRemainingBalance() {
+ TourOrder order = paidOrder();
+ order.setRefundedAmount(new BigDecimal("20.00"));
+
+ boolean accepted = refundService.requestRefund(order, new BigDecimal("17.00"));
+
+ assertThat(accepted).isFalse();
+ verify(refundGateway, never()).refund(org.mockito.ArgumentMatchers.any(),
+ org.mockito.ArgumentMatchers.any());
}
private TourOrder paidOrder() {
@@ -97,6 +146,7 @@
order.setAmount(new BigDecimal("40.00"));
order.setPaymentAmount(new BigDecimal("36.00"));
order.setPaymentTime(LocalDateTime.now());
+ order.setStatus(OrderStatus.COMPLETED.getCode());
order.setRefundStatus(RefundStatus.NONE.getCode());
return order;
}
--
Gitblit v1.7.1