package org.xmx0632.deliciousfruit.service; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.math.BigDecimal; import java.util.Arrays; import java.util.List; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.xmx0632.deliciousfruit.api.v1.bo.Result; import org.xmx0632.deliciousfruit.api.v1.bo.SettlementRequest; import org.xmx0632.deliciousfruit.api.v1.bo.SettlementRequest.ShoppingItem; import org.xmx0632.deliciousfruit.api.v1.bo.SettlementResponse; import org.xmx0632.deliciousfruit.api.v1.bo.SettlementResponse.ProductFreeInfo; import org.xmx0632.deliciousfruit.api.v1.bo.SettlementResponse.PromotionDetails; import org.xmx0632.deliciousfruit.api.v1.bo.SettlementResponse.PromotionInfo; /* * 只看产品表里第二件立减金额是不是大于0,大于0的就是第二件立减商品 */ public class IosOrderServiceFor2ndProductDeductTest extends BaseIosOrderServiceTestCase { private static final BigDecimal PRODUCT_1_PRICE = BigDecimal.valueOf(11.0); private static final BigDecimal PRODUCT_2_PRICE = BigDecimal.valueOf(8.2); private static final BigDecimal PRODUCT_1_DEDUCT = BigDecimal.valueOf(0.9); private static final BigDecimal PRODUCT_2_DEDUCT = BigDecimal.valueOf(2.0); @Before public void setUp() { super.setUp(); mockFruitProductService4SecondProductDeduct(); } // 第一次请求,如果transactionId为空,自动生成一个唯一ID返回 @Test public void testCaculatePromotionInfo_transactionId() { SettlementRequest settlementRequest = new SettlementRequest(); settlementRequest.setTransactionID(null); ShoppingItem shoppingItem = new ShoppingItem(productId_1.toString(), 1); List<ShoppingItem> shoppingList = Arrays .asList(new ShoppingItem[] { shoppingItem }); settlementRequest.setShoppingList(shoppingList); SettlementResponse response = iosOrderService .caculatePromotionInfo(settlementRequest); System.out.println(response); assertNotNull(response); assertEquals(Result.SUCCESS_RESULT.toString(), response.getResult() .toString()); assertEquals("testTransactionId", response.getTransactionID()); assertEquals(PRODUCT_1_PRICE, response.getTotalPrice()); assertEquals(PRODUCT_1_PRICE, response.getActualAmount()); assertNotNull(response.getPromotionInfo()); assertNotNull(response.getPromotionTips()); assertEquals(0, response.getPromotionTips().size()); assertEquals(BigDecimal.valueOf(10.0), response.getFreight()); assertEquals(BigDecimal.valueOf(10.0), response.getFreightPay()); } // 单品第二件减-只买一件不减价 @Test public void testCaculatePromotionInfo_buy_1_no_priceoff() { SettlementResponse response = getResponse4WithSameProduct(1); assertNotNull(response); assertEquals(Result.SUCCESS_RESULT.toString(), response.getResult() .toString()); assertEquals(TRANSACTION_ID, response.getTransactionID()); assertEquals(PRODUCT_1_PRICE, response.getTotalPrice()); assertEquals(PRODUCT_1_PRICE, response.getActualAmount()); assertNotNull(response.getPromotionInfo()); assertNotNull(response.getPromotionTips()); assertEquals(0, response.getPromotionTips().size()); } // 买2件减价1件减价 @Test public void testCaculatePromotionInfo_buy_2_priceoff_1_times() { assertDeductFor2ndProduct(2, 1); } // 买3件1件减价 @Test public void testCaculatePromotionInfo_buy_3_priceoff_1_times() { assertDeductFor2ndProduct(3, 1); } // 买4件2件减价 @Test public void testCaculatePromotionInfo_buy_4_priceoff_2_times() { assertDeductFor2ndProduct(4, 1); } // 买5件2件减价 @Test public void testCaculatePromotionInfo_buy_5_priceoff_2_times() { assertDeductFor2ndProduct(5, 1); } private void assertDeductFor2ndProduct(int productNum1, int freeProductNum) { SettlementResponse response = getResponse4WithSameProduct(productNum1); assertDeductedResponse(response, productNum1, 0, freeProductNum); } // 买两种第二件立减商品,各3件,每种1件减价 @Test public void testCaculatePromotionInfo_buy_2_product_priceoff_1_times() { assertProductDeductFor2ndWith(3, 3, 2); } @Test public void testCaculatePromotionInfo_buy_2_product_priceoff_2_times() { assertProductDeductFor2ndWith(4, 3, 2); } @Test public void testCaculatePromotionInfo_buy_2_product_priceoff_3_times() { assertProductDeductFor2ndWith(5, 7, 2); } private void assertProductDeductFor2ndWith(int productNum1, int productNum2, int firstPromotionNum) { SettlementResponse response = getResponseWith2DifferentProducts( productNum1, productNum2); assertDeductedResponse(response, productNum1, productNum2, firstPromotionNum); } private void assertDeductedResponse(SettlementResponse response, int productNum1, int productNum2, int firstPromotionNum) { BigDecimal product1total = PRODUCT_1_PRICE.multiply(BigDecimal .valueOf(productNum1)); BigDecimal product2total = PRODUCT_2_PRICE.multiply(BigDecimal .valueOf(productNum2)); BigDecimal totalPrice = product1total.add(product2total); BigDecimal product1deduct = PRODUCT_1_DEDUCT.multiply(BigDecimal .valueOf((productNum1 / 2))); BigDecimal product2deduct = PRODUCT_2_DEDUCT.multiply(BigDecimal .valueOf((productNum2 / 2))); BigDecimal discount = product1deduct.add(product2deduct); BigDecimal actualTotalPrice = totalPrice.subtract(discount); String msg = "[商品1]个数:" + productNum1 + " [商品2]个数:" + productNum2 + "\n" + "原价:" + totalPrice + "=" + PRODUCT_1_PRICE + "*" + productNum1 + "+ " + PRODUCT_2_PRICE + "*" + productNum2 + " 优惠价:" + actualTotalPrice + "\n" + "提示优惠信息数:" + firstPromotionNum; System.out.println(msg); assertNotNull(response); assertEquals(Result.SUCCESS_RESULT.toString(), response.getResult() .toString()); assertEquals(TRANSACTION_ID, response.getTransactionID()); assertEquals(totalPrice, response.getTotalPrice()); assertEquals(actualTotalPrice, response.getActualAmount()); assertNotNull(response.getPromotionTips()); assertEquals(0, response.getPromotionTips().size()); PromotionInfo promotionInfo = response.getPromotionInfo(); assertNotNull(promotionInfo); PromotionDetails promotionForTotal = promotionInfo .getPromotionForTotal(); assertNotNull(promotionForTotal); assertEquals(BigDecimal.ZERO, promotionForTotal.getPriceOff()); PromotionDetails promotionForProduct = promotionInfo .getPromotionForProduct(); assertNotNull(promotionForProduct); assertEquals(discount, promotionForProduct.getPriceOff()); List<ProductFreeInfo> freeInfos = promotionForProduct.getProductsFree(); assertNotNull(freeInfos); assertTrue(freeInfos.size() > 0); assertEquals(firstPromotionNum, freeInfos.size()); if (!freeInfos.isEmpty()) { // 第一种礼物个数 for (ProductFreeInfo productFreeInfo : freeInfos) { // 判断每种赠送产品的个数 System.out.println("deduct:" + productFreeInfo); } } } private void mockFruitProductService4SecondProductDeduct() { mockFruitProductService("香蕉", "箱", productId_1, PRODUCT_1_DEDUCT, PRODUCT_1_PRICE); mockFruitProductService("苹果", "箱", productId_2, PRODUCT_2_DEDUCT, PRODUCT_2_PRICE); mockTransactionIDService(); } private void mockTransactionIDService() { Mockito.when(transactionIDService.getTransactionId()).thenReturn( "testTransactionId"); } }