diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookInfo.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookInfo.java index d90e431..9eb28e3 100644 --- a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookInfo.java +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookInfo.java @@ -1,12 +1,16 @@ package fr.iut_fbleau.but3.dev62.mylibrary.book; import java.time.LocalDate; +import java.util.List; public record BookInfo( String isbn, String title, String author, String publisher, + List categories, + String description, + String langue, LocalDate publicationDate, double price, int stockInitial diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookIsbnDTO.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookIsbnDTO.java new file mode 100644 index 0000000..1546875 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookIsbnDTO.java @@ -0,0 +1,5 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book; + +public record BookIsbnDTO(String isbn) { +} + diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/Book.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/Book.java index 35f9c18..6e329fd 100644 --- a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/Book.java +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/Book.java @@ -1,10 +1,7 @@ package fr.iut_fbleau.but3.dev62.mylibrary.book.entity; -import fr.iut_fbleau.but3.dev62.mylibrary.customer.exception.IllegalCustomerPointException; - -import java.rmi.server.UID; import java.time.LocalDate; -import java.util.UUID; +import java.util.List; import lombok.Builder; import lombok.Getter; @@ -13,17 +10,14 @@ import lombok.Getter; @Getter public class Book { - //private UUID id; private String isbn; private String title; private String author; private String publisher; + private List categories; + private String description; + private String langue; private LocalDate publicationDate; private double price; private int stock; -} -/* -public void setRandomUUID() { - this.id = UUID.randomUUID(); -} -*/ \ No newline at end of file +} \ No newline at end of file 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 index 5d9142e..e22b0cd 100644 --- 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 @@ -1,6 +1,7 @@ package fr.iut_fbleau.but3.dev62.mylibrary.book.usecase; import fr.iut_fbleau.but3.dev62.mylibrary.book.BookInfo; +import fr.iut_fbleau.but3.dev62.mylibrary.book.BookIsbnDTO; import fr.iut_fbleau.but3.dev62.mylibrary.book.entity.Book; import fr.iut_fbleau.but3.dev62.mylibrary.book.exception.NotValidBookException; import fr.iut_fbleau.but3.dev62.mylibrary.book.repository.BookRepository; @@ -14,18 +15,21 @@ public final class BookUseCase { this.bookRepository = bookRepository; } - public String registerNewBook(BookInfo newBook) throws NotValidBookException { + public BookIsbnDTO registerNewBook(BookInfo newBook) throws NotValidBookException { BookValidator.validate(newBook); Book bookToSave = Book.builder() .isbn(newBook.isbn()) .title(newBook.title()) .author(newBook.author()) .publisher(newBook.publisher()) + .categories(newBook.categories()) + .description(newBook.description()) + .langue(newBook.langue()) .publicationDate(newBook.publicationDate()) .price(newBook.price()) .stock(newBook.stockInitial()) .build(); Book savedBook = bookRepository.save(bookToSave); - return savedBook.getIsbn(); + return new BookIsbnDTO(savedBook.getIsbn()); } } diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/validator/BookValidator.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/validator/BookValidator.java index 4a342cf..41b7b90 100644 --- a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/validator/BookValidator.java +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/validator/BookValidator.java @@ -15,6 +15,9 @@ public final class BookValidator { if (isBlank(bookInfo.isbn())) { throw new NotValidBookException("ISBN is required"); } + if (!bookInfo.isbn().matches("\\d{13}")) { + throw new NotValidBookException("ISBN must be 13 digits"); + } if (isBlank(bookInfo.title())) { throw new NotValidBookException("Title is required"); } @@ -24,6 +27,12 @@ public final class BookValidator { if (isBlank(bookInfo.publisher())) { throw new NotValidBookException("Publisher is required"); } + if (bookInfo.categories() == null) { + throw new NotValidBookException("Categories is required"); + } + if (bookInfo.categories().stream().anyMatch(BookValidator::isBlank)) { + throw new NotValidBookException("Categories cannot contain empty values"); + } if (bookInfo.price() <= 0) { throw new NotValidBookException("Price must be positive"); } 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 2853d90..0379ccf 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 @@ -10,10 +10,12 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import fr.iut_fbleau.but3.dev62.mylibrary.book.BookInfo; +import fr.iut_fbleau.but3.dev62.mylibrary.book.BookIsbnDTO; import fr.iut_fbleau.but3.dev62.mylibrary.book.entity.Book; import fr.iut_fbleau.but3.dev62.mylibrary.book.exception.NotValidBookException; import fr.iut_fbleau.but3.dev62.mylibrary.book.repository.BookRepository; import java.time.LocalDate; +import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -43,6 +45,9 @@ class BookUseCaseTest { "Clean Code", "Robert C. Martin", "Prentice Hall", + List.of("Programming"), + "A handbook of agile software craftsmanship.", + "fr", LocalDate.of(2008, 8, 1), 42.50, 10 @@ -53,6 +58,9 @@ class BookUseCaseTest { .title("Clean Code") .author("Robert C. Martin") .publisher("Prentice Hall") + .categories(List.of("Programming")) + .description("A handbook of agile software craftsmanship.") + .langue("fr") .publicationDate(LocalDate.of(2008, 8, 1)) .price(42.50) .stock(10) @@ -60,10 +68,10 @@ class BookUseCaseTest { when(bookRepository.save(any(Book.class))).thenReturn(savedBook); - String isbn = bookUseCase.registerNewBook(validBookInfo); + BookIsbnDTO isbn = bookUseCase.registerNewBook(validBookInfo); assertNotNull(isbn); - assertEquals("9783161484100", isbn); + assertEquals("9783161484100", isbn.isbn()); verify(bookRepository, times(1)).save(any(Book.class)); } @@ -75,6 +83,49 @@ class BookUseCaseTest { "", "Robert C. Martin", "Prentice Hall", + List.of("Programming"), + "A handbook of agile software craftsmanship.", + "fr", + LocalDate.of(2008, 8, 1), + 42.50, + 10 + ); + + assertThrows(NotValidBookException.class, () -> bookUseCase.registerNewBook(invalidBookInfo)); + verify(bookRepository, never()).save(any(Book.class)); + } + + @Test + @DisplayName("Should throw when ISBN is not 13 digits") + void shouldThrowWhenIsbnIsNot13Digits() { + BookInfo invalidBookInfo = new BookInfo( + "97831614841X", + "Clean Code", + "Robert C. Martin", + "Prentice Hall", + List.of("Programming"), + "A handbook of agile software craftsmanship.", + "fr", + LocalDate.of(2008, 8, 1), + 42.50, + 10 + ); + + assertThrows(NotValidBookException.class, () -> bookUseCase.registerNewBook(invalidBookInfo)); + verify(bookRepository, never()).save(any(Book.class)); + } + + @Test + @DisplayName("Should throw when categories contain empty value") + void shouldThrowWhenCategoriesContainEmptyValue() { + BookInfo invalidBookInfo = new BookInfo( + "9783161484100", + "Clean Code", + "Robert C. Martin", + "Prentice Hall", + List.of(""), + "A handbook of agile software craftsmanship.", + "fr", LocalDate.of(2008, 8, 1), 42.50, 10