From 5196f30fd8bf06e69f7382c2b9e60bc600f4cb7a Mon Sep 17 00:00:00 2001 From: felix-vi Date: Tue, 28 Apr 2026 18:59:19 +0200 Subject: [PATCH] =?UTF-8?q?:white=5Fcheck=5Fmark:=20r=C3=A9ussite=20des=20?= =?UTF-8?q?test=20des=20usecase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mylibrary/book/usecase/BookUseCase.java | 90 +++++++++++++++++++ .../book/usecase/BookUseCaseTest.java | 30 ++++--- 2 files changed, 110 insertions(+), 10 deletions(-) create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/usecase/BookUseCase.java diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/usecase/BookUseCase.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/usecase/BookUseCase.java new file mode 100644 index 0000000..b59de47 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/usecase/BookUseCase.java @@ -0,0 +1,90 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book.usecase; + +import fr.iut_fbleau.but3.dev62.mylibrary.book.BookDTO; +import fr.iut_fbleau.but3.dev62.mylibrary.book.BookDetails; +import fr.iut_fbleau.but3.dev62.mylibrary.book.BookInfo; +import fr.iut_fbleau.but3.dev62.mylibrary.book.BookSalesInfo; +import fr.iut_fbleau.but3.dev62.mylibrary.book.converter.BookConverter; +import fr.iut_fbleau.but3.dev62.mylibrary.book.entity.Book; +import fr.iut_fbleau.but3.dev62.mylibrary.book.exception.BookNotFoundException; +import fr.iut_fbleau.but3.dev62.mylibrary.book.exception.IllegalBookStockException; +import fr.iut_fbleau.but3.dev62.mylibrary.book.exception.NotValidBookException; +import fr.iut_fbleau.but3.dev62.mylibrary.book.repository.BookRepository; +import fr.iut_fbleau.but3.dev62.mylibrary.book.validator.BookValidator; + +import java.util.Optional; + +public class BookUseCase { + + private final BookRepository bookRepository; + + public BookUseCase(BookRepository bookRepository) { + + this.bookRepository = bookRepository; + } + + public String registerBook(BookInfo newbook, BookSalesInfo newbooksalesinfo, BookDetails newbookdetails) throws NotValidBookException { + BookValidator.validate(newbook); + BookValidator.validate(newbooksalesinfo); + BookValidator.validate(newbookdetails); + Book bookToRegister = BookConverter.ToDomain(newbook, newbooksalesinfo, newbookdetails); + Book bookToRegistered = bookRepository.save(bookToRegister); + return bookToRegistered.getIsbn(); + } + + public Optional findBookByIsbn(String isbn) { + Optional optionalBook = bookRepository.findByIsbn(isbn); + return optionalBook.map(BookConverter::ToDTO); + } + + public BookDTO updateBook(String isbn, BookInfo bookinfo, BookSalesInfo booksalesinfo, BookDetails bookdetails) + throws BookNotFoundException, NotValidBookException { + BookValidator.validate(bookinfo); + BookValidator.validate(booksalesinfo); + BookValidator.validate(bookdetails); + Book bookByIsbn = getBookIfDoesNotExistThrowBookNotFoundException(isbn); + Book book = Book.builder() + .isbn(isbn) + .title(bookinfo.title()) + .author(bookinfo.author()) + .editor(bookinfo.editor()) + .date(bookByIsbn.getDate()) + .price(booksalesinfo.getPrice()) + .stock(booksalesinfo.getStock()) + .categories(bookdetails.getCategories()) + .description(bookdetails.getDescription()) + .language(bookByIsbn.getLanguage()) + .build(); + Book updatedBook = bookRepository.save(book); + return BookConverter.ToDTO(updatedBook); + } + + public void deleteBook(String isbn) throws BookNotFoundException { + Book bookToDelete = getBookIfDoesNotExistThrowBookNotFoundException(isbn); + this.bookRepository.delete(bookToDelete); + } + + public int addStockCopies(String isbn, int stockCopiesToAdd) throws BookNotFoundException { + Book bookToAddStockCopies = getBookIfDoesNotExistThrowBookNotFoundException(isbn); + bookToAddStockCopies.addStock(stockCopiesToAdd); + bookRepository.save(bookToAddStockCopies); + return bookToAddStockCopies.getStock(); + } + + public int subtractStockCopies(String isbn, int stockCopiesToRemove) + throws BookNotFoundException, IllegalBookStockException { + Book bookToSubtractStockCopies = getBookIfDoesNotExistThrowBookNotFoundException(isbn); + bookToSubtractStockCopies.removeStock(stockCopiesToRemove); + bookRepository.save(bookToSubtractStockCopies); + return bookToSubtractStockCopies.getStock(); + } + + private Book getBookIfDoesNotExistThrowBookNotFoundException(String isbn) + throws BookNotFoundException { + Optional optionalBookByIsbn = bookRepository.findByIsbn(isbn); + if (optionalBookByIsbn.isEmpty()) { + throw new BookNotFoundException(isbn); + } + return optionalBookByIsbn.get(); + } +} diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/usecase/BookUseCaseTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/usecase/BookUseCaseTest.java index 5820538..64f1eec 100644 --- a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/usecase/BookUseCaseTest.java +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/usecase/BookUseCaseTest.java @@ -5,6 +5,8 @@ import fr.iut_fbleau.but3.dev62.mylibrary.book.BookDetails; import fr.iut_fbleau.but3.dev62.mylibrary.book.BookInfo; import fr.iut_fbleau.but3.dev62.mylibrary.book.BookSalesInfo; import fr.iut_fbleau.but3.dev62.mylibrary.book.entity.Book; +import fr.iut_fbleau.but3.dev62.mylibrary.book.exception.BookNotFoundException; +import fr.iut_fbleau.but3.dev62.mylibrary.book.exception.IllegalBookStockException; import fr.iut_fbleau.but3.dev62.mylibrary.book.exception.NotValidBookException; import fr.iut_fbleau.but3.dev62.mylibrary.book.repository.BookRepository; import org.junit.jupiter.api.BeforeEach; @@ -87,7 +89,7 @@ public class BookUseCaseTest { void testRegisterBookWithValidData() throws NotValidBookException { when(bookRepository.save(any(Book.class))).thenReturn(testBook); - String registeredIsbn = bookUseCase.registerBook(validBookInfo); + String registeredIsbn = bookUseCase.registerBook(validBookInfo, validBookSalesInfo, validBookDetails); assertNotNull(registeredIsbn); assertEquals(bookIsbn, registeredIsbn); @@ -98,9 +100,17 @@ public class BookUseCaseTest { @DisplayName("Should throw exception when book data is not valid") void testRegisterBookWithInvalidData() { BookInfo invalidBookInfo = new BookInfo(bookIsbn,"", "", "", date); - + BookSalesInfo invalidUpdateSalesInfo = BookSalesInfo.builder() + .price(0) + .stock(-3) + .build(); + BookDetails invalidUpdateDetails = BookDetails.builder() + .categories(categories) + .description("") + .language("") + .build(); assertThrows(NotValidBookException.class, - () -> bookUseCase.registerBook(invalidBookInfo)); + () -> bookUseCase.registerBook(invalidBookInfo, invalidUpdateSalesInfo, invalidUpdateDetails)); verify(bookRepository, never()).save(any(Book.class)); } @@ -125,7 +135,7 @@ public class BookUseCaseTest { @Test @DisplayName("Should return empty Optional when isbn doesn't exist") - void testFindBookByIsbn() { + void testFindBookByIsbnNotFound() { when(bookRepository.findByIsbn("1656546262516")).thenReturn(Optional.empty()); Optional foundBook = bookUseCase.findBookByIsbn("1656546262516"); @@ -166,10 +176,10 @@ public class BookUseCaseTest { .build(); BookDetails updateDetails = BookDetails.builder() .categories(categories) - .description("C'était un brave partit trop tôt") + .description("C'était un brave partit trop tôt beaucoup trop tôt") .language("Français") .build(); - BookDTO result = BookUseCase.updateBook(updateInfo, updateSalesInfo, updateDetails); + BookDTO result = bookUseCase.updateBook(bookIsbn, updateInfo, updateSalesInfo, updateDetails); assertNotNull(result); assertEquals(bookIsbn, result.getIsbn()); @@ -204,7 +214,7 @@ public class BookUseCaseTest { .build(); assertThrows(BookNotFoundException.class, - () -> bookUseCase.updateBook(updateInfo, updateSalesInfo, updateDetails)); + () -> bookUseCase.updateBook(nonExistentIsbn, updateInfo, updateSalesInfo, updateDetails)); verify(bookRepository, times(1)).findByIsbn(nonExistentIsbn); verify(bookRepository, never()).save(any(Book.class)); @@ -225,7 +235,7 @@ public class BookUseCaseTest { .build(); assertThrows(NotValidBookException.class, - () -> bookUseCase.updateBook(invalidUpdateInfo, invalidUpdateSalesInfo, invalidUpdateDetails)); + () -> bookUseCase.updateBook(bookIsbn, invalidUpdateInfo, invalidUpdateSalesInfo, invalidUpdateDetails)); verify(bookRepository, never()).findByIsbn(any(String.class)); verify(bookRepository, never()).save(any(Book.class)); @@ -299,7 +309,7 @@ public class BookUseCaseTest { @Test @DisplayName("Should subtract stock copies from book") - void testSubtractStockCopies() throws BookNotFoundException, IllegalBookCpoiesException { + void testSubtractStockCopies() throws BookNotFoundException, IllegalBookStockException { when(bookRepository.findByIsbn(bookIsbn)).thenReturn(Optional.of(testBook)); when(bookRepository.save(testBook)).thenReturn(testBook); @@ -322,7 +332,7 @@ public class BookUseCaseTest { int copiesToRemove = 200; - assertThrows(IllegalBookCpoiesException.class, + assertThrows(IllegalBookStockException.class, () -> bookUseCase.subtractStockCopies(bookIsbn, copiesToRemove)); verify(bookRepository, times(1)).findByIsbn(bookIsbn);