BookIsbn et correction BookUseCase

This commit is contained in:
aissi
2026-03-25 10:36:22 +01:00
parent 5e1031bd71
commit 44a458dfbe
6 changed files with 82 additions and 15 deletions
@@ -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<String> categories,
String description,
String langue,
LocalDate publicationDate,
double price,
int stockInitial
@@ -0,0 +1,5 @@
package fr.iut_fbleau.but3.dev62.mylibrary.book;
public record BookIsbnDTO(String isbn) {
}
@@ -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<String> categories;
private String description;
private String langue;
private LocalDate publicationDate;
private double price;
private int stock;
}
/*
public void setRandomUUID() {
this.id = UUID.randomUUID();
}
*/
@@ -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());
}
}
@@ -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");
}
@@ -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