forked from pierront/mylibrary-template
✅ réussite des test des usecase
This commit is contained in:
@@ -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<BookDTO> findBookByIsbn(String isbn) {
|
||||||
|
Optional<Book> 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<Book> optionalBookByIsbn = bookRepository.findByIsbn(isbn);
|
||||||
|
if (optionalBookByIsbn.isEmpty()) {
|
||||||
|
throw new BookNotFoundException(isbn);
|
||||||
|
}
|
||||||
|
return optionalBookByIsbn.get();
|
||||||
|
}
|
||||||
|
}
|
||||||
+20
-10
@@ -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.BookInfo;
|
||||||
import fr.iut_fbleau.but3.dev62.mylibrary.book.BookSalesInfo;
|
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.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.exception.NotValidBookException;
|
||||||
import fr.iut_fbleau.but3.dev62.mylibrary.book.repository.BookRepository;
|
import fr.iut_fbleau.but3.dev62.mylibrary.book.repository.BookRepository;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
@@ -87,7 +89,7 @@ public class BookUseCaseTest {
|
|||||||
void testRegisterBookWithValidData() throws NotValidBookException {
|
void testRegisterBookWithValidData() throws NotValidBookException {
|
||||||
when(bookRepository.save(any(Book.class))).thenReturn(testBook);
|
when(bookRepository.save(any(Book.class))).thenReturn(testBook);
|
||||||
|
|
||||||
String registeredIsbn = bookUseCase.registerBook(validBookInfo);
|
String registeredIsbn = bookUseCase.registerBook(validBookInfo, validBookSalesInfo, validBookDetails);
|
||||||
|
|
||||||
assertNotNull(registeredIsbn);
|
assertNotNull(registeredIsbn);
|
||||||
assertEquals(bookIsbn, registeredIsbn);
|
assertEquals(bookIsbn, registeredIsbn);
|
||||||
@@ -98,9 +100,17 @@ public class BookUseCaseTest {
|
|||||||
@DisplayName("Should throw exception when book data is not valid")
|
@DisplayName("Should throw exception when book data is not valid")
|
||||||
void testRegisterBookWithInvalidData() {
|
void testRegisterBookWithInvalidData() {
|
||||||
BookInfo invalidBookInfo = new BookInfo(bookIsbn,"", "", "", date);
|
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,
|
assertThrows(NotValidBookException.class,
|
||||||
() -> bookUseCase.registerBook(invalidBookInfo));
|
() -> bookUseCase.registerBook(invalidBookInfo, invalidUpdateSalesInfo, invalidUpdateDetails));
|
||||||
|
|
||||||
verify(bookRepository, never()).save(any(Book.class));
|
verify(bookRepository, never()).save(any(Book.class));
|
||||||
}
|
}
|
||||||
@@ -125,7 +135,7 @@ public class BookUseCaseTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
@DisplayName("Should return empty Optional when isbn doesn't exist")
|
@DisplayName("Should return empty Optional when isbn doesn't exist")
|
||||||
void testFindBookByIsbn() {
|
void testFindBookByIsbnNotFound() {
|
||||||
when(bookRepository.findByIsbn("1656546262516")).thenReturn(Optional.empty());
|
when(bookRepository.findByIsbn("1656546262516")).thenReturn(Optional.empty());
|
||||||
|
|
||||||
Optional<BookDTO> foundBook = bookUseCase.findBookByIsbn("1656546262516");
|
Optional<BookDTO> foundBook = bookUseCase.findBookByIsbn("1656546262516");
|
||||||
@@ -166,10 +176,10 @@ public class BookUseCaseTest {
|
|||||||
.build();
|
.build();
|
||||||
BookDetails updateDetails = BookDetails.builder()
|
BookDetails updateDetails = BookDetails.builder()
|
||||||
.categories(categories)
|
.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")
|
.language("Français")
|
||||||
.build();
|
.build();
|
||||||
BookDTO result = BookUseCase.updateBook(updateInfo, updateSalesInfo, updateDetails);
|
BookDTO result = bookUseCase.updateBook(bookIsbn, updateInfo, updateSalesInfo, updateDetails);
|
||||||
|
|
||||||
assertNotNull(result);
|
assertNotNull(result);
|
||||||
assertEquals(bookIsbn, result.getIsbn());
|
assertEquals(bookIsbn, result.getIsbn());
|
||||||
@@ -204,7 +214,7 @@ public class BookUseCaseTest {
|
|||||||
.build();
|
.build();
|
||||||
|
|
||||||
assertThrows(BookNotFoundException.class,
|
assertThrows(BookNotFoundException.class,
|
||||||
() -> bookUseCase.updateBook(updateInfo, updateSalesInfo, updateDetails));
|
() -> bookUseCase.updateBook(nonExistentIsbn, updateInfo, updateSalesInfo, updateDetails));
|
||||||
|
|
||||||
verify(bookRepository, times(1)).findByIsbn(nonExistentIsbn);
|
verify(bookRepository, times(1)).findByIsbn(nonExistentIsbn);
|
||||||
verify(bookRepository, never()).save(any(Book.class));
|
verify(bookRepository, never()).save(any(Book.class));
|
||||||
@@ -225,7 +235,7 @@ public class BookUseCaseTest {
|
|||||||
.build();
|
.build();
|
||||||
|
|
||||||
assertThrows(NotValidBookException.class,
|
assertThrows(NotValidBookException.class,
|
||||||
() -> bookUseCase.updateBook(invalidUpdateInfo, invalidUpdateSalesInfo, invalidUpdateDetails));
|
() -> bookUseCase.updateBook(bookIsbn, invalidUpdateInfo, invalidUpdateSalesInfo, invalidUpdateDetails));
|
||||||
|
|
||||||
verify(bookRepository, never()).findByIsbn(any(String.class));
|
verify(bookRepository, never()).findByIsbn(any(String.class));
|
||||||
verify(bookRepository, never()).save(any(Book.class));
|
verify(bookRepository, never()).save(any(Book.class));
|
||||||
@@ -299,7 +309,7 @@ public class BookUseCaseTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
@DisplayName("Should subtract stock copies from book")
|
@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.findByIsbn(bookIsbn)).thenReturn(Optional.of(testBook));
|
||||||
when(bookRepository.save(testBook)).thenReturn(testBook);
|
when(bookRepository.save(testBook)).thenReturn(testBook);
|
||||||
|
|
||||||
@@ -322,7 +332,7 @@ public class BookUseCaseTest {
|
|||||||
|
|
||||||
int copiesToRemove = 200;
|
int copiesToRemove = 200;
|
||||||
|
|
||||||
assertThrows(IllegalBookCpoiesException.class,
|
assertThrows(IllegalBookStockException.class,
|
||||||
() -> bookUseCase.subtractStockCopies(bookIsbn, copiesToRemove));
|
() -> bookUseCase.subtractStockCopies(bookIsbn, copiesToRemove));
|
||||||
|
|
||||||
verify(bookRepository, times(1)).findByIsbn(bookIsbn);
|
verify(bookRepository, times(1)).findByIsbn(bookIsbn);
|
||||||
|
|||||||
Reference in New Issue
Block a user