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");
}
}