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; package fr.iut_fbleau.but3.dev62.mylibrary.book;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.List;
public record BookInfo( public record BookInfo(
String isbn, String isbn,
String title, String title,
String author, String author,
String publisher, String publisher,
List<String> categories,
String description,
String langue,
LocalDate publicationDate, LocalDate publicationDate,
double price, double price,
int stockInitial 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; 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.time.LocalDate;
import java.util.UUID; import java.util.List;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
@@ -13,17 +10,14 @@ import lombok.Getter;
@Getter @Getter
public class Book { public class Book {
//private UUID id;
private String isbn; private String isbn;
private String title; private String title;
private String author; private String author;
private String publisher; private String publisher;
private List<String> categories;
private String description;
private String langue;
private LocalDate publicationDate; private LocalDate publicationDate;
private double price; private double price;
private int stock; private int stock;
} }
/*
public void setRandomUUID() {
this.id = UUID.randomUUID();
}
*/
@@ -1,6 +1,7 @@
package fr.iut_fbleau.but3.dev62.mylibrary.book.usecase; 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.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.entity.Book;
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;
@@ -14,18 +15,21 @@ public final class BookUseCase {
this.bookRepository = bookRepository; this.bookRepository = bookRepository;
} }
public String registerNewBook(BookInfo newBook) throws NotValidBookException { public BookIsbnDTO registerNewBook(BookInfo newBook) throws NotValidBookException {
BookValidator.validate(newBook); BookValidator.validate(newBook);
Book bookToSave = Book.builder() Book bookToSave = Book.builder()
.isbn(newBook.isbn()) .isbn(newBook.isbn())
.title(newBook.title()) .title(newBook.title())
.author(newBook.author()) .author(newBook.author())
.publisher(newBook.publisher()) .publisher(newBook.publisher())
.categories(newBook.categories())
.description(newBook.description())
.langue(newBook.langue())
.publicationDate(newBook.publicationDate()) .publicationDate(newBook.publicationDate())
.price(newBook.price()) .price(newBook.price())
.stock(newBook.stockInitial()) .stock(newBook.stockInitial())
.build(); .build();
Book savedBook = bookRepository.save(bookToSave); 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())) { if (isBlank(bookInfo.isbn())) {
throw new NotValidBookException("ISBN is required"); throw new NotValidBookException("ISBN is required");
} }
if (!bookInfo.isbn().matches("\\d{13}")) {
throw new NotValidBookException("ISBN must be 13 digits");
}
if (isBlank(bookInfo.title())) { if (isBlank(bookInfo.title())) {
throw new NotValidBookException("Title is required"); throw new NotValidBookException("Title is required");
} }
@@ -24,6 +27,12 @@ public final class BookValidator {
if (isBlank(bookInfo.publisher())) { if (isBlank(bookInfo.publisher())) {
throw new NotValidBookException("Publisher is required"); 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) { if (bookInfo.price() <= 0) {
throw new NotValidBookException("Price must be positive"); throw new NotValidBookException("Price must be positive");
} }
@@ -10,10 +10,12 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
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.BookIsbnDTO;
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.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 java.time.LocalDate; import java.time.LocalDate;
import java.util.List;
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@@ -43,6 +45,9 @@ class BookUseCaseTest {
"Clean Code", "Clean Code",
"Robert C. Martin", "Robert C. Martin",
"Prentice Hall", "Prentice Hall",
List.of("Programming"),
"A handbook of agile software craftsmanship.",
"fr",
LocalDate.of(2008, 8, 1), LocalDate.of(2008, 8, 1),
42.50, 42.50,
10 10
@@ -53,6 +58,9 @@ class BookUseCaseTest {
.title("Clean Code") .title("Clean Code")
.author("Robert C. Martin") .author("Robert C. Martin")
.publisher("Prentice Hall") .publisher("Prentice Hall")
.categories(List.of("Programming"))
.description("A handbook of agile software craftsmanship.")
.langue("fr")
.publicationDate(LocalDate.of(2008, 8, 1)) .publicationDate(LocalDate.of(2008, 8, 1))
.price(42.50) .price(42.50)
.stock(10) .stock(10)
@@ -60,10 +68,10 @@ class BookUseCaseTest {
when(bookRepository.save(any(Book.class))).thenReturn(savedBook); when(bookRepository.save(any(Book.class))).thenReturn(savedBook);
String isbn = bookUseCase.registerNewBook(validBookInfo); BookIsbnDTO isbn = bookUseCase.registerNewBook(validBookInfo);
assertNotNull(isbn); assertNotNull(isbn);
assertEquals("9783161484100", isbn); assertEquals("9783161484100", isbn.isbn());
verify(bookRepository, times(1)).save(any(Book.class)); verify(bookRepository, times(1)).save(any(Book.class));
} }
@@ -75,6 +83,49 @@ class BookUseCaseTest {
"", "",
"Robert C. Martin", "Robert C. Martin",
"Prentice Hall", "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), LocalDate.of(2008, 8, 1),
42.50, 42.50,
10 10