Created
April 6, 2024 18:10
-
-
Save renanreismartins/102e479f86511adac9966a4793ae5486 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class OrderCreationController { | |
private final OrderRepository orderRepository; | |
private final ProductCatalog productCatalog; | |
public OrderCreationController(OrderRepository orderRepository, ProductCatalog productCatalog) { | |
this.orderRepository = orderRepository; | |
this.productCatalog = productCatalog; | |
} | |
public Response post(List<Item> requests) { | |
Order order = new Order(); | |
order.setStatus(OrderStatus.CREATED); | |
order.setItems(new ArrayList<>()); | |
order.setCurrency("EUR"); | |
order.setTotal(0D); | |
order.setTax(0D); | |
requests.forEach(r -> { | |
Product product = productCatalog.getById(r.getProductId()); | |
if (product == null) { | |
throw new UnknownProductException(); | |
} else { | |
final Double unitaryTax = (product.getPrice() / 100) * product.getCategory().getTaxPercentage(); | |
final Double unitaryTaxedAmount = product.getPrice() + unitaryTax; | |
final Double taxedAmount = unitaryTaxedAmount * r.getQuantity(); | |
final Double taxAmount = unitaryTax * r.getQuantity(); | |
final Item item = new Item(); | |
item.setProductId(r.getProductId()); | |
item.setQuantity(r.getQuantity()); | |
item.setTax(taxAmount); | |
item.setTaxedAmount(taxedAmount); | |
order.getItems().add(item); | |
order.setTotal(order.getTotal() + taxedAmount); | |
order.setTax(order.getTax() + taxAmount); | |
} | |
}); | |
orderRepository.save(order); | |
return new Response(200); | |
} | |
} | |
public class OrderCreationControllerTest { | |
private TestOrderRepository orderRepository; | |
private OrderCreationController controller; | |
@BeforeEach | |
public void setup() { | |
Category food = new Category(); | |
food.setName("food"); | |
food.setTaxPercentage(10D); | |
Product salad = new Product(); | |
salad.setId(1); | |
salad.setName("salad"); | |
salad.setPrice(3.56D); | |
salad.setCategory(food); | |
Product tomato = new Product(); | |
tomato.setId(2); | |
tomato.setName("tomato"); | |
tomato.setPrice(4.65D); | |
tomato.setCategory(food); | |
ProductCatalog productCatalog = new InMemoryProductCatalog(List.of(salad, tomato)); | |
orderRepository = new TestOrderRepository(); | |
controller = new OrderCreationController(orderRepository, productCatalog); | |
} | |
@Test | |
public void sellMultipleItems() { | |
Item saladRequest = new Item(); | |
saladRequest.setProductId(1); | |
saladRequest.setQuantity(2); | |
Item tomatoRequest = new Item(); | |
tomatoRequest.setProductId(2); | |
tomatoRequest.setQuantity(3); | |
List<Item> requests = new ArrayList<>(); | |
requests.add(saladRequest); | |
requests.add(tomatoRequest); | |
controller.post(requests); | |
final Order insertedOrder = orderRepository.getSavedOrder(); | |
assertThat(insertedOrder.getStatus()).isEqualTo(OrderStatus.CREATED); | |
assertThat(insertedOrder.getCurrency()).isEqualTo("EUR"); | |
assertThat(insertedOrder.getItems()).hasSize(2); | |
assertThat(insertedOrder.getItems().get(0).getProductId()).isEqualTo(1); | |
assertThat(insertedOrder.getItems().get(0).getQuantity()).isEqualTo(2); | |
assertThat(insertedOrder.getItems().get(1).getProductId()).isEqualTo(2); | |
assertThat(insertedOrder.getItems().get(1).getQuantity()).isEqualTo(3); | |
} | |
@Test | |
public void unknownProduct() { | |
List<Item> requests = new ArrayList<>(); | |
Item unknownProductRequest = new Item(); | |
unknownProductRequest.setProductId(-1); | |
requests.add(unknownProductRequest); | |
assertThatThrownBy(() -> controller.post(requests)).isExactlyInstanceOf(UnknownProductException.class); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Repository for the full workshop: https://github.com/renanreismartins/good-code/tree/main