Skip to content

Commit

Permalink
feat: improve Deliverable interface and introduce None strategy
Browse files Browse the repository at this point in the history
- NullObject pattern used to cover initial state of the ShoppingCart
  • Loading branch information
akadir committed Sep 13, 2020
1 parent 8b1a882 commit 4831feb
Show file tree
Hide file tree
Showing 6 changed files with 93 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
package io.github.akadir.casestudy.delivery;

import io.github.akadir.casestudy.delivery.strategy.DeliveryStrategy;

public interface Deliverable {
int getProductCount();

int getDeliveryCount();

DeliveryStrategy getDeliveryStrategy();

void setDeliveryStrategy(DeliveryStrategy deliveryStrategy);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package io.github.akadir.casestudy.delivery.strategy;

import io.github.akadir.casestudy.delivery.Deliverable;

public class None implements DeliveryStrategy {
@Override
public double calculateDeliveryCost(Deliverable deliverable) {
return 0;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package io.github.akadir.casestudy.shopping.model;

import io.github.akadir.casestudy.delivery.Deliverable;
import io.github.akadir.casestudy.delivery.strategy.DeliveryStrategy;
import io.github.akadir.casestudy.delivery.strategy.None;
import io.github.akadir.casestudy.discount.campaign.base.Campaign;
import io.github.akadir.casestudy.discount.coupon.base.Coupon;
import io.github.akadir.casestudy.product.model.Product;
Expand All @@ -13,9 +15,11 @@ public class ShoppingCart implements Deliverable {
private Coupon appliedCoupon;
private Campaign appliedCampaign;
private double discount;
private DeliveryStrategy deliveryStrategy;

public ShoppingCart() {
this.products = new HashMap<>();
this.deliveryStrategy = new None();
}

public Map<Product, Integer> getProducts() {
Expand Down Expand Up @@ -55,7 +59,31 @@ public int getDeliveryCount() {
return products.size();
}

@Override
public DeliveryStrategy getDeliveryStrategy() {
return this.deliveryStrategy;
}

@Override
public void setDeliveryStrategy(DeliveryStrategy deliveryStrategy) {
this.deliveryStrategy = deliveryStrategy;
}

public int getProductCount() {
return products.values().stream().mapToInt(a -> a).sum();
}

@Override
public String toString() {
final StringBuilder sb = new StringBuilder("\nDelivery count: ");

sb.append(getDeliveryCount()).append("\nProduct count: ")
.append(getProductCount()).append("\nPrice: ")
.append(getCartPrice()).append("\nDiscounts: ").append(discount)
.append("\nPrice to pay: ").append(getCartPrice() - discount)
.append("\nDelivery strategy: ").append(deliveryStrategy.getClass().getSimpleName())
.append("\nDelivery cost: ").append(deliveryStrategy.calculateDeliveryCost(this));

return sb.toString();
}
}
5 changes: 5 additions & 0 deletions src/test/java/io/github/akadir/casestudy/CaseStudyTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,9 @@ public void create() {
.as("Crete CaseStudy should not throw exception")
.doesNotThrowAnyException();
}

@Test(expected = Test.None.class)
public void whenMainMethodExecutedExpectNoExceptionThrown() {
CaseStudy.main(null);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package io.github.akadir.casestudy.delivery.strategy;

import io.github.akadir.casestudy.product.model.Product;
import io.github.akadir.casestudy.shopping.service.ShoppingCartService;
import io.github.akadir.casestudy.shopping.service.impl.ConcreteShoppingCartServiceImpl;
import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

import static org.assertj.core.api.Assertions.assertThat;

public class NoneTest {

@Test
public void whenNoneDeliveryCostCalculatedThenExpectZeroCost() {
DeliveryStrategy deliveryStrategy = new None();

ShoppingCartService shoppingCartService = new ConcreteShoppingCartServiceImpl();

Map<Product, Integer> productsBackup = new HashMap<>(shoppingCartService.getProducts());

assertThat(deliveryStrategy.calculateDeliveryCost(shoppingCartService.getShoppingCart()))
.as("Should return zero for shopping cart object")
.isZero();

assertThat(deliveryStrategy.calculateDeliveryCost(null))
.as("Should return zero for null")
.isZero();

assertThat(shoppingCartService.getProducts())
.as("Shopping cart should not be modified in delivery cost calculation")
.isEqualTo(productsBackup);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.github.akadir.casestudy.shopping.model;

import io.github.akadir.casestudy.delivery.strategy.None;
import io.github.akadir.casestudy.product.model.Category;
import io.github.akadir.casestudy.product.model.Product;
import org.junit.Test;
Expand Down Expand Up @@ -31,6 +32,10 @@ public void whenShoppingCartCreatedThenExpectProductsInitializedAndDiscountsEmpt
assertThat(shoppingCart.getDiscount())
.as("Cart discount should be zero")
.isZero();

assertThat(shoppingCart.getDeliveryStrategy())
.as("Cart initial delivery strategy should be None.class")
.isInstanceOf(None.class);
}


Expand Down Expand Up @@ -62,5 +67,9 @@ public void whenProductAddedToShoppingCartThenExpectProductsIsNotEmptyAndPriceIn
assertThat(shoppingCart.getDiscount())
.as("Cart discount should be zero")
.isZero();

assertThat(shoppingCart.getDeliveryStrategy())
.as("Cart initial delivery strategy should be None.class")
.isInstanceOf(None.class);
}
}

0 comments on commit 4831feb

Please sign in to comment.