|
|
|
@ -1,15 +1,20 @@ |
|
|
|
using System; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
using System.Threading.Tasks; |
|
|
|
using EasyAbp.EShop.Orders.Orders; |
|
|
|
using EasyAbp.EShop.Orders.Orders.Dtos; |
|
|
|
using EasyAbp.EShop.Payments.Payments; |
|
|
|
using EasyAbp.EShop.Payments.Refunds.Dtos; |
|
|
|
using EasyAbp.PaymentService.Refunds; |
|
|
|
using Microsoft.Extensions.DependencyInjection; |
|
|
|
using NSubstitute; |
|
|
|
using NSubstitute.Core; |
|
|
|
using Shouldly; |
|
|
|
using Volo.Abp.Data; |
|
|
|
using Volo.Abp.Domain.Entities.Events.Distributed; |
|
|
|
using Volo.Abp.Json; |
|
|
|
using Volo.Abp.Uow; |
|
|
|
using Volo.Abp.Validation; |
|
|
|
using Xunit; |
|
|
|
|
|
|
|
@ -30,8 +35,8 @@ namespace EasyAbp.EShop.Payments.Refunds |
|
|
|
private void MockPaymentRepository(IServiceCollection services) |
|
|
|
{ |
|
|
|
var paymentRepository = Substitute.For<IPaymentRepository>(); |
|
|
|
|
|
|
|
paymentRepository.GetAsync(PaymentsTestData.Payment1).Returns(x => |
|
|
|
|
|
|
|
var payment1Returns = (CallInfo _) => |
|
|
|
{ |
|
|
|
var paymentType = typeof(Payment); |
|
|
|
var paymentItemType = typeof(PaymentItem); |
|
|
|
@ -42,7 +47,7 @@ namespace EasyAbp.EShop.Payments.Refunds |
|
|
|
paymentItemType.GetProperty(nameof(PaymentItem.ActualPaymentAmount))?.SetValue(paymentItem, 1m); |
|
|
|
paymentItemType.GetProperty(nameof(PaymentItem.ItemType))?.SetValue(paymentItem, PaymentsConsts.PaymentItemType); |
|
|
|
paymentItemType.GetProperty(nameof(PaymentItem.ItemKey))?.SetValue(paymentItem, PaymentsTestData.Order1.ToString()); |
|
|
|
paymentItem.ExtraProperties.Add("StoreId", PaymentsTestData.Store1.ToString()); |
|
|
|
paymentItem.ExtraProperties.Add(nameof(paymentItem.StoreId), PaymentsTestData.Store1); |
|
|
|
|
|
|
|
var payment = Activator.CreateInstance(paymentType, true) as Payment; |
|
|
|
payment.ShouldNotBeNull(); |
|
|
|
@ -52,22 +57,25 @@ namespace EasyAbp.EShop.Payments.Refunds |
|
|
|
paymentType.GetProperty(nameof(Payment.PaymentItems))?.SetValue(payment, new List<PaymentItem> {paymentItem}); |
|
|
|
|
|
|
|
return payment; |
|
|
|
}); |
|
|
|
|
|
|
|
paymentRepository.GetAsync(PaymentsTestData.Payment2).Returns(x => |
|
|
|
}; |
|
|
|
|
|
|
|
var payment2Returns = (CallInfo _) => |
|
|
|
{ |
|
|
|
var paymentType = typeof(Payment); |
|
|
|
var paymentItemType = typeof(PaymentItem); |
|
|
|
|
|
|
|
|
|
|
|
var paymentItem = Activator.CreateInstance(paymentItemType, true) as PaymentItem; |
|
|
|
paymentItem.ShouldNotBeNull(); |
|
|
|
paymentItemType.GetProperty(nameof(PaymentItem.Id))?.SetValue(paymentItem, PaymentsTestData.PaymentItem1); |
|
|
|
paymentItemType.GetProperty(nameof(PaymentItem.Id)) |
|
|
|
?.SetValue(paymentItem, PaymentsTestData.PaymentItem1); |
|
|
|
paymentItemType.GetProperty(nameof(PaymentItem.ActualPaymentAmount))?.SetValue(paymentItem, 1m); |
|
|
|
// pending refund amount
|
|
|
|
paymentItemType.GetProperty(nameof(PaymentItem.PendingRefundAmount))?.SetValue(paymentItem, 1m); |
|
|
|
paymentItemType.GetProperty(nameof(PaymentItem.ItemType))?.SetValue(paymentItem, PaymentsConsts.PaymentItemType); |
|
|
|
paymentItemType.GetProperty(nameof(PaymentItem.ItemKey))?.SetValue(paymentItem, PaymentsTestData.Order1.ToString()); |
|
|
|
paymentItem.ExtraProperties.Add("StoreId", PaymentsTestData.Store1.ToString()); |
|
|
|
paymentItemType.GetProperty(nameof(PaymentItem.ItemType)) |
|
|
|
?.SetValue(paymentItem, PaymentsConsts.PaymentItemType); |
|
|
|
paymentItemType.GetProperty(nameof(PaymentItem.ItemKey)) |
|
|
|
?.SetValue(paymentItem, PaymentsTestData.Order1.ToString()); |
|
|
|
paymentItem.ExtraProperties.Add(nameof(paymentItem.StoreId), PaymentsTestData.Store1); |
|
|
|
|
|
|
|
var payment = Activator.CreateInstance(paymentType, true) as Payment; |
|
|
|
payment.ShouldNotBeNull(); |
|
|
|
@ -76,10 +84,17 @@ namespace EasyAbp.EShop.Payments.Refunds |
|
|
|
paymentType.GetProperty(nameof(Payment.ActualPaymentAmount))?.SetValue(payment, 1m); |
|
|
|
// pending refund amount
|
|
|
|
paymentType.GetProperty(nameof(Payment.PendingRefundAmount))?.SetValue(payment, 1m); |
|
|
|
paymentType.GetProperty(nameof(Payment.PaymentItems))?.SetValue(payment, new List<PaymentItem> {paymentItem}); |
|
|
|
paymentType.GetProperty(nameof(Payment.PaymentItems)) |
|
|
|
?.SetValue(payment, new List<PaymentItem> { paymentItem }); |
|
|
|
|
|
|
|
return payment; |
|
|
|
}); |
|
|
|
}; |
|
|
|
|
|
|
|
paymentRepository.GetAsync(PaymentsTestData.Payment1).Returns(payment1Returns); |
|
|
|
paymentRepository.FindAsync(PaymentsTestData.Payment1).Returns(payment1Returns); |
|
|
|
|
|
|
|
paymentRepository.GetAsync(PaymentsTestData.Payment2).Returns(payment2Returns); |
|
|
|
paymentRepository.FindAsync(PaymentsTestData.Payment2).Returns(payment2Returns); |
|
|
|
|
|
|
|
services.AddTransient(_ => paymentRepository); |
|
|
|
} |
|
|
|
@ -175,11 +190,11 @@ namespace EasyAbp.EShop.Payments.Refunds |
|
|
|
eventData.CreateRefundInput.RefundItems.Count.ShouldBe(1); |
|
|
|
|
|
|
|
var refundItem = eventData.CreateRefundInput.RefundItems[0]; |
|
|
|
refundItem.GetProperty<Guid>("OrderId").ShouldBe(PaymentsTestData.Order1); |
|
|
|
refundItem.GetProperty<Guid?>(nameof(RefundItem.OrderId)).ShouldBe(PaymentsTestData.Order1); |
|
|
|
|
|
|
|
var orderLines = |
|
|
|
_jsonSerializer.Deserialize<List<OrderLineRefundInfoModel>>( |
|
|
|
refundItem.GetProperty<string>("OrderLines")); |
|
|
|
refundItem.GetProperty<string>(nameof(RefundItem.OrderLines))); |
|
|
|
|
|
|
|
orderLines.Count.ShouldBe(1); |
|
|
|
orderLines[0].OrderLineId.ShouldBe(PaymentsTestData.OrderLine1); |
|
|
|
@ -188,7 +203,7 @@ namespace EasyAbp.EShop.Payments.Refunds |
|
|
|
|
|
|
|
var orderExtraFees = |
|
|
|
_jsonSerializer.Deserialize<List<OrderExtraFeeRefundInfoModel>>( |
|
|
|
refundItem.GetProperty<string>("OrderExtraFees")); |
|
|
|
refundItem.GetProperty<string>(nameof(RefundItem.OrderExtraFees))); |
|
|
|
|
|
|
|
orderExtraFees.Count.ShouldBe(1); |
|
|
|
orderExtraFees[0].Name.ShouldBe("Name"); |
|
|
|
@ -413,5 +428,94 @@ namespace EasyAbp.EShop.Payments.Refunds |
|
|
|
await _refundAppService.CreateAsync(request); |
|
|
|
}, "RefundAmount should be greater than 0."); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
[UnitOfWork] |
|
|
|
public virtual async Task Should_Sync_A_Refund_From_RefundEto() |
|
|
|
{ |
|
|
|
var synchronizer = ServiceProvider.GetRequiredService<RefundSynchronizer>(); |
|
|
|
|
|
|
|
var refundItem = new RefundItemEto |
|
|
|
{ |
|
|
|
Id = PaymentsTestData.RefundItem1, |
|
|
|
PaymentItemId = PaymentsTestData.PaymentItem1, |
|
|
|
RefundAmount = 1.5m, |
|
|
|
CustomerRemark = "CustomerRemark1", |
|
|
|
StaffRemark = "StaffRemark1" |
|
|
|
}; |
|
|
|
|
|
|
|
var now = DateTime.Now; |
|
|
|
|
|
|
|
refundItem.SetProperty(nameof(RefundItem.StoreId), PaymentsTestData.Store1); |
|
|
|
refundItem.SetProperty(nameof(RefundItem.OrderId), PaymentsTestData.Order1); |
|
|
|
refundItem.SetProperty(nameof(RefundItem.OrderLines), _jsonSerializer.Serialize(new List<OrderLineRefundInfoModel> |
|
|
|
{ |
|
|
|
new() |
|
|
|
{ |
|
|
|
OrderLineId = PaymentsTestData.OrderLine1, |
|
|
|
Quantity = 2, |
|
|
|
TotalAmount = 1m |
|
|
|
} |
|
|
|
})); |
|
|
|
refundItem.SetProperty(nameof(RefundItem.OrderExtraFees), _jsonSerializer.Serialize(new List<OrderExtraFeeRefundInfoModel> |
|
|
|
{ |
|
|
|
new() |
|
|
|
{ |
|
|
|
Name = "Name", |
|
|
|
Key = "Key", |
|
|
|
TotalAmount = 0.5m |
|
|
|
} |
|
|
|
})); |
|
|
|
|
|
|
|
await synchronizer.HandleEventAsync(new EntityCreatedEto<RefundEto>(new RefundEto |
|
|
|
{ |
|
|
|
Id = PaymentsTestData.Refund1, |
|
|
|
TenantId = null, |
|
|
|
PaymentId = PaymentsTestData.Payment1, |
|
|
|
RefundPaymentMethod = null, |
|
|
|
ExternalTradingCode = "testcode", |
|
|
|
Currency = "CNY", |
|
|
|
RefundAmount = 1.5m, |
|
|
|
DisplayReason = "DisplayReason", |
|
|
|
CustomerRemark = "CustomerRemark", |
|
|
|
StaffRemark = "StaffRemark", |
|
|
|
CompletedTime = now, |
|
|
|
CanceledTime = null, |
|
|
|
RefundItems = new List<RefundItemEto> { refundItem } |
|
|
|
})); |
|
|
|
|
|
|
|
var refundDto = await _refundAppService.GetAsync(PaymentsTestData.Refund1); |
|
|
|
|
|
|
|
refundDto.PaymentId.ShouldBe(PaymentsTestData.Payment1); |
|
|
|
refundDto.ExternalTradingCode.ShouldBe("testcode"); |
|
|
|
refundDto.Currency.ShouldBe("CNY"); |
|
|
|
refundDto.RefundAmount.ShouldBe(1.5m); |
|
|
|
refundDto.DisplayReason.ShouldBe("DisplayReason"); |
|
|
|
refundDto.CustomerRemark.ShouldBe("CustomerRemark"); |
|
|
|
refundDto.StaffRemark.ShouldBe("StaffRemark"); |
|
|
|
refundDto.CompletedTime.ShouldBe(now); |
|
|
|
refundDto.CanceledTime.ShouldBeNull(); |
|
|
|
refundDto.RefundItems.Count.ShouldBe(1); |
|
|
|
|
|
|
|
var refundItemDto = refundDto.RefundItems.First(); |
|
|
|
refundItemDto.Id.ShouldBe(PaymentsTestData.RefundItem1); |
|
|
|
refundItemDto.PaymentItemId.ShouldBe(PaymentsTestData.PaymentItem1); |
|
|
|
refundItemDto.RefundAmount.ShouldBe(1.5m); |
|
|
|
refundItemDto.CustomerRemark.ShouldBe("CustomerRemark1"); |
|
|
|
refundItemDto.StaffRemark.ShouldBe("StaffRemark1"); |
|
|
|
// Extra properties
|
|
|
|
refundItemDto.StoreId.ShouldBe(PaymentsTestData.Store1); |
|
|
|
refundItemDto.OrderId.ShouldBe(PaymentsTestData.Order1); |
|
|
|
refundItemDto.OrderLines.Count.ShouldBe(1); |
|
|
|
var orderLineDto = refundItemDto.OrderLines.First(); |
|
|
|
orderLineDto.OrderLineId.ShouldBe(PaymentsTestData.OrderLine1); |
|
|
|
orderLineDto.RefundedQuantity.ShouldBe(2); |
|
|
|
orderLineDto.RefundAmount.ShouldBe(1m); |
|
|
|
refundItemDto.OrderExtraFees.Count.ShouldBe(1); |
|
|
|
var orderExtraFee = refundItemDto.OrderExtraFees.First(); |
|
|
|
orderExtraFee.Name.ShouldBe("Name"); |
|
|
|
orderExtraFee.Key.ShouldBe("Key"); |
|
|
|
orderExtraFee.RefundAmount.ShouldBe(0.5m); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|