Skip to content

Instantly share code, notes, and snippets.

@renanreismartins
Created April 6, 2024 18:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save renanreismartins/102e479f86511adac9966a4793ae5486 to your computer and use it in GitHub Desktop.
Save renanreismartins/102e479f86511adac9966a4793ae5486 to your computer and use it in GitHub Desktop.
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);
}
}
@renanreismartins
Copy link
Author

renanreismartins commented Apr 6, 2024

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment