forked from pierront/mylibrary-template
BookIsbn et correction BookUseCase
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user