package com.ruoyi.order.service.impl; import com.ruoyi.other.api.domain.TCoupon; import org.junit.jupiter.api.Test; import java.math.BigDecimal; import static org.junit.jupiter.api.Assertions.assertEquals; class ChargingCouponSupportTest { @Test void couponDoesNotReducePrepayment() { TCoupon coupon = chargingCoupon(1); coupon.setMeetTheConditions(new BigDecimal("30")); coupon.setDiscountAmount(new BigDecimal("10")); BigDecimal paymentAmount = ChargingCouponSupport.calculatePrepaymentAmount(new BigDecimal("30"), false); assertEquals(new BigDecimal("30.00"), paymentAmount); } @Test void legacyUpfrontDiscountOrderUsesActuallyCollectedAmountAsRefundBase() { BigDecimal prepayment = ChargingCouponSupport.resolveSettlementPrepayment( new BigDecimal("30"), BigDecimal.ZERO, new BigDecimal("20"), new BigDecimal("10")); assertEquals(new BigDecimal("20"), prepayment); } @Test void fullReductionCannotDiscountElectricity() { TCoupon coupon = chargingCoupon(1); coupon.setMeetTheConditions(new BigDecimal("10")); coupon.setDiscountAmount(new BigDecimal("10")); BigDecimal discount = ChargingCouponSupport.calculateSettlementDiscount( coupon, new BigDecimal("15"), new BigDecimal("3")); assertEquals(new BigDecimal("3.0000"), discount); } @Test void percentageDiscountHonorsMaximumDiscountAndServiceCharge() { TCoupon coupon = chargingCoupon(2); coupon.setMeetTheConditions(new BigDecimal("10")); coupon.setDiscount(new BigDecimal("8")); coupon.setMaximumDiscountAmount(new BigDecimal("1.50")); BigDecimal discount = ChargingCouponSupport.calculateSettlementDiscount( coupon, new BigDecimal("10"), new BigDecimal("5")); assertEquals(new BigDecimal("1.5000"), discount); } @Test void couponBelowActualSettlementThresholdIsNotUsed() { TCoupon coupon = chargingCoupon(1); coupon.setMeetTheConditions(new BigDecimal("30")); coupon.setDiscountAmount(new BigDecimal("1")); BigDecimal discount = ChargingCouponSupport.calculateSettlementDiscount( coupon, new BigDecimal("29.99"), new BigDecimal("5")); assertEquals(new BigDecimal("0.0000"), discount); } @Test void electricFreeWhitelistOnlyWaivesElectricity() { BigDecimal[] split = ChargingCouponSupport.calculateWhitelistRefundSplitByBenefitType( true, 2, new BigDecimal("10"), new BigDecimal("5")); assertEquals(new BigDecimal("10"), split[0]); assertEquals(BigDecimal.ZERO, split[1]); } @Test void serviceFreeWhitelistOnlyWaivesServiceCharge() { BigDecimal[] split = ChargingCouponSupport.calculateWhitelistRefundSplitByBenefitType( true, 3, new BigDecimal("10"), new BigDecimal("5")); assertEquals(BigDecimal.ZERO, split[0]); assertEquals(new BigDecimal("5"), split[1]); } @Test void fullWhitelistWaivesElectricityAndServiceCharge() { BigDecimal[] split = ChargingCouponSupport.calculateWhitelistRefundSplitByBenefitType( true, 1, new BigDecimal("10"), new BigDecimal("5")); assertEquals(new BigDecimal("10"), split[0]); assertEquals(new BigDecimal("5"), split[1]); } @Test void nonWhitelistDoesNotReceiveWhitelistRefund() { BigDecimal[] split = ChargingCouponSupport.calculateWhitelistRefundSplitByBenefitType( false, 2, new BigDecimal("10"), new BigDecimal("5")); assertEquals(BigDecimal.ZERO, split[0]); assertEquals(BigDecimal.ZERO, split[1]); } private TCoupon chargingCoupon(int preferentialMode) { TCoupon coupon = new TCoupon(); coupon.setType(1); coupon.setPreferentialMode(preferentialMode); return coupon; } }