From 7b4b8124a759405ee525260f84569fae7c8025e8 Mon Sep 17 00:00:00 2001 From: AISSI-JUDE-CHRIST Date: Tue, 14 Apr 2026 14:25:47 +0200 Subject: [PATCH] =?UTF-8?q?stock=20insufisant=20&=20tests=20=C3=A0=20corri?= =?UTF-8?q?ger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/InsufficientStockException.java | 9 ++++ .../mylibrary/order/usecase/OrderUseCase.java | 7 ++- .../order/usecase/OrderUseCaseTest.java | 47 ++++++++++++++++++- 3 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/order/exception/InsufficientStockException.java diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/order/exception/InsufficientStockException.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/order/exception/InsufficientStockException.java new file mode 100644 index 0000000..a00adf2 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/order/exception/InsufficientStockException.java @@ -0,0 +1,9 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.order.exception; + +public class InsufficientStockException extends Exception { + + public InsufficientStockException(String bookIsbn, int requested, int available) { + super("Insufficient stock for book " + bookIsbn + ": requested=" + requested + + ", available=" + available); + } +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/order/usecase/OrderUseCase.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/order/usecase/OrderUseCase.java index 6fde73b..b703f0b 100644 --- a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/order/usecase/OrderUseCase.java +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/order/usecase/OrderUseCase.java @@ -8,6 +8,7 @@ import fr.iut_fbleau.but3.dev62.mylibrary.customer.repository.CustomerRepository import fr.iut_fbleau.but3.dev62.mylibrary.order.OrderDTO; import fr.iut_fbleau.but3.dev62.mylibrary.order.OrderInfo; import fr.iut_fbleau.but3.dev62.mylibrary.order.OrderLineInfo; +import fr.iut_fbleau.but3.dev62.mylibrary.order.exception.InsufficientStockException; import java.util.UUID; public final class OrderUseCase { @@ -20,7 +21,8 @@ public final class OrderUseCase { this.bookRepository = bookRepository; } - public OrderDTO placeOrder(OrderInfo orderInfo) throws CustomerNotFoundException { + public OrderDTO placeOrder(OrderInfo orderInfo) + throws CustomerNotFoundException, InsufficientStockException { Customer customer = customerRepository.findById(orderInfo.customerId()) .orElseThrow(() -> new CustomerNotFoundException(orderInfo.customerId())); @@ -28,6 +30,9 @@ public final class OrderUseCase { for (OrderLineInfo orderLine : orderInfo.orderLines()) { Book book = bookRepository.findByIsbn(orderLine.bookIsbn()) .orElseThrow(() -> new IllegalArgumentException("Book not found")); + if (orderLine.quantity() > book.getStock()) { + throw new InsufficientStockException(book.getIsbn(), orderLine.quantity(), book.getStock()); + } totalAmount += book.getPrice() * orderLine.quantity(); Book updatedBook = Book.builder() .isbn(book.getIsbn()) diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/order/usecase/OrderUseCaseTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/order/usecase/OrderUseCaseTest.java index d399cd6..ab79a01 100644 --- a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/order/usecase/OrderUseCaseTest.java +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/order/usecase/OrderUseCaseTest.java @@ -2,7 +2,9 @@ package fr.iut_fbleau.but3.dev62.mylibrary.order.usecase; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.any; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -17,6 +19,7 @@ import fr.iut_fbleau.but3.dev62.mylibrary.order.OrderDTO; import fr.iut_fbleau.but3.dev62.mylibrary.order.OrderInfo; import fr.iut_fbleau.but3.dev62.mylibrary.order.OrderLineInfo; import fr.iut_fbleau.but3.dev62.mylibrary.order.PaymentMode; +import fr.iut_fbleau.but3.dev62.mylibrary.order.exception.InsufficientStockException; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -41,7 +44,8 @@ class OrderUseCaseTest { @Test @DisplayName("Should place order and return expected amount and loyalty points") - void shouldPlaceOrderAndReturnExpectedAmountAndLoyaltyPoints() throws CustomerNotFoundException { + void shouldPlaceOrderAndReturnExpectedAmountAndLoyaltyPoints() + throws CustomerNotFoundException, InsufficientStockException { UUID customerId = UUID.randomUUID(); Customer customer = Customer.builder() .id(customerId) @@ -87,4 +91,45 @@ class OrderUseCaseTest { verify(bookRepository, times(1)).save(any(Book.class)); verify(customerRepository, times(1)).save(customer); } + + @Test + @DisplayName("Should throw when requested quantity is greater than available stock") + void shouldThrowWhenRequestedQuantityIsGreaterThanAvailableStock() { + UUID customerId = UUID.randomUUID(); + Customer customer = Customer.builder() + .id(customerId) + .firstName("Jane") + .lastName("Doe") + .phoneNumber("0612345678") + .loyaltyPoints(10) + .build(); + + Book cleanCode = Book.builder() + .isbn("9780132350884") + .title("Clean Code") + .author("Robert C. Martin") + .publisher("Prentice Hall") + .categories(List.of("Programming")) + .description("A handbook of agile software craftsmanship") + .langue("fr") + .price(40.0) + .stock(1) + .build(); + + OrderInfo orderInfo = new OrderInfo( + customerId, + List.of(new OrderLineInfo("9780132350884", 2)), + new OrderAddressInfo("1 rue de Paris", "Paris", "75000", "France"), + PaymentMode.CB + ); + + when(customerRepository.findById(customerId)).thenReturn(Optional.of(customer)); + when(bookRepository.findByIsbn("9780132350884")).thenReturn(Optional.of(cleanCode)); + + assertThrows(InsufficientStockException.class, () -> orderUseCase.placeOrder(orderInfo)); + verify(customerRepository, times(1)).findById(customerId); + verify(bookRepository, times(1)).findByIsbn("9780132350884"); + verify(bookRepository, never()).save(any(Book.class)); + verify(customerRepository, never()).save(any(Customer.class)); + } }