From 80c2b82c98ccca80d62269767c173b20a7767e64 Mon Sep 17 00:00:00 2001 From: felix-vi Date: Wed, 25 Mar 2026 09:40:02 +0100 Subject: [PATCH 01/19] =?UTF-8?q?D=C3=A9but=20de=20la=20feature=20avec=20d?= =?UTF-8?q?es=20tests=20de=20base=20sur=20les=20variables?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- interface-contracts.json | 1 + .../dev62/mylibrary/book/BookDetails.java | 17 +++++ .../but3/dev62/mylibrary/book/BookInfo.java | 6 ++ .../dev62/mylibrary/book/entity/Book.java | 21 ++++++ .../book/converter/BookConverterTest.java | 73 +++++++++++++++++++ 5 files changed, 118 insertions(+) create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookDetails.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookInfo.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/Book.java create mode 100644 src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java diff --git a/interface-contracts.json b/interface-contracts.json index 98f304b..c5375c0 100644 --- a/interface-contracts.json +++ b/interface-contracts.json @@ -14,6 +14,7 @@ "langue": "string" }, "output": { + "_comment": "c'est ce qui affiche quand tu crée avec la usecase (regarde register de customer)", "isbn": "string(13)" } }, diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookDetails.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookDetails.java new file mode 100644 index 0000000..15aa3fc --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookDetails.java @@ -0,0 +1,17 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book; + + +import lombok.Builder; +import lombok.Getter; + +import java.util.ArrayList; + +@Builder +@Getter +public class BookDetails { + private ArrayList categories = new ArrayList<>(); + private String description ; + private String language; + + +} 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 new file mode 100644 index 0000000..0ecc1b8 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookInfo.java @@ -0,0 +1,6 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book; + +import java.time.LocalDate; + +public record BookInfo(String title, String author, String editor, LocalDate date) { +} 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 new file mode 100644 index 0000000..e7ef3db --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/Book.java @@ -0,0 +1,21 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book.entity; + + +import lombok.Builder; +import lombok.Getter; + +import java.time.LocalDate; +import java.util.ArrayList; + +@Getter +@Builder +public class Book { + private ArrayList categories = new ArrayList<>(); + private String description ; + private String language; + private String title; + private String author; + private String editor; + private LocalDate date; + +} diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java new file mode 100644 index 0000000..e517aef --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java @@ -0,0 +1,73 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book.converter; + +import fr.iut_fbleau.but3.dev62.mylibrary.book.BookDTO; +import fr.iut_fbleau.but3.dev62.mylibrary.book.BookInfo; +import fr.iut_fbleau.but3.dev62.mylibrary.book.BookDetails; +import fr.iut_fbleau.but3.dev62.mylibrary.book.entity.Book; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@DisplayName("BookConverterTest Unit Tests") +public class BookConverterTest { + + @Nested + @DisplayName("toDomain() method tests") + class ToDomainTests { + + @Test + void ShouldConvertBookToDomain(){ + LocalDate date = LocalDate.of(2026, 3, 24); + BookInfo bookinfo = new BookInfo("La vie de Maxime", "Marvin Aubert", "Kioon", date); + ArrayList categories = new ArrayList<>(); + categories.add("Thriller"); + categories.add("Biographie"); + BookDetails.builder() + .categories(categories) + .description("C'était un brave partit trop tôt") + .language("Français") + .build(); + + Book result = BookConvert.ToDomain(bookinfo,bookdetails); + + //assertNotNull(result); + assertEquals(bookinfo.title(), result.getTitle()); + assertEquals(bookinfo.author(), result.getAuthor()); + assertEquals(bookinfo.editor(), result.getEditor()); + assertEquals(bookinfo.date(), result.getDate()); + assertEquals(categories, result.getCategories()); + assertEquals(bookdetails.getDescription(), result.getDescription()); + assertEquals(bookdetails.getLanguage(), result.getLanguage()); + } + } +/** + @Nested + @DisplayName("toDTO() method tests") + class ToDTOTests { + LocalDate date = LocalDate.of(2026, 3, 24); + ArrayList categories = new ArrayList(); + categories.add("Thriller"); + categories.add("Biographie"); + Book book = Book.builder() + .isbn(1234567891012) + .title("La vie de Maxime") + .author("Marvin Aubert") + .editor("Kioon") + .date(date) + .price() + .stock() + .categories(categories) + .Description() + .language() + .build(); + + BookDTO result = BookConvert.ToDTO(book); + + }**/ +} -- 2.54.0 From 370d35078fde57bf8fba682c3218a90b73de3ae8 Mon Sep 17 00:00:00 2001 From: felix-vi Date: Wed, 25 Mar 2026 10:00:56 +0100 Subject: [PATCH 02/19] :white_check_mark: Reussite du test converter ToDomain --- .../but3/dev62/mylibrary/book/BookDTO.java | 21 ++++++++++++++++++ .../book/converter/BookConverter.java | 22 +++++++++++++++++++ .../dev62/mylibrary/book/entity/Book.java | 4 ++-- .../book/converter/BookConverterTest.java | 6 ++--- 4 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookDTO.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverter.java diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookDTO.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookDTO.java new file mode 100644 index 0000000..b9f8697 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookDTO.java @@ -0,0 +1,21 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book; + + +import lombok.Builder; +import lombok.Getter; + +import java.time.LocalDate; +import java.util.ArrayList; + +@Getter +@Builder +public class BookDTO { + private ArrayList categories = new ArrayList<>(); + private String description ; + private String language; + private String title; + private String author; + private String editor; + private LocalDate date; + +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverter.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverter.java new file mode 100644 index 0000000..0173a9a --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverter.java @@ -0,0 +1,22 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book.converter; + + +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; + +public final class BookConverter { + private BookConverter(){} + + public static BookDTO ToDomain(BookInfo bookinfo, BookDetails bookdetails){ + return BookDTO.builder() + .title(bookinfo.title()) + .author(bookinfo.author()) + .editor(bookinfo.editor()) + .date(bookinfo.date()) + .categories(bookdetails.getCategories()) + .description(bookdetails.getDescription()) + .language(bookdetails.getLanguage()) + .build(); + } +} 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 e7ef3db..f1297ea 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 @@ -11,8 +11,8 @@ import java.util.ArrayList; @Builder public class Book { private ArrayList categories = new ArrayList<>(); - private String description ; - private String language; + private String description ; + private String language; private String title; private String author; private String editor; diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java index e517aef..5e30473 100644 --- a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java @@ -4,6 +4,7 @@ import fr.iut_fbleau.but3.dev62.mylibrary.book.BookDTO; import fr.iut_fbleau.but3.dev62.mylibrary.book.BookInfo; import fr.iut_fbleau.but3.dev62.mylibrary.book.BookDetails; import fr.iut_fbleau.but3.dev62.mylibrary.book.entity.Book; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -12,7 +13,6 @@ import java.util.ArrayList; import java.time.LocalDate; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; @DisplayName("BookConverterTest Unit Tests") public class BookConverterTest { @@ -28,13 +28,13 @@ public class BookConverterTest { ArrayList categories = new ArrayList<>(); categories.add("Thriller"); categories.add("Biographie"); - BookDetails.builder() + BookDetails bookdetails = BookDetails.builder() .categories(categories) .description("C'était un brave partit trop tôt") .language("Français") .build(); - Book result = BookConvert.ToDomain(bookinfo,bookdetails); + BookDTO result = BookConverter.ToDomain(bookinfo, bookdetails); //assertNotNull(result); assertEquals(bookinfo.title(), result.getTitle()); -- 2.54.0 From c767f47719ab745d7100dcf19921be4fd367b701 Mon Sep 17 00:00:00 2001 From: felix-vi Date: Wed, 25 Mar 2026 10:18:39 +0100 Subject: [PATCH 03/19] =?UTF-8?q?:white=5Fcheck=5Fmark:=20Reussite=20du=20?= =?UTF-8?q?test=20converter=20ToDomain=20apr=C3=A8s=20l'ajout=20des=20vari?= =?UTF-8?q?able=20manquante?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iut_fbleau/but3/dev62/mylibrary/book/BookDTO.java | 10 ++++++---- .../dev62/mylibrary/book/converter/BookConverter.java | 3 +++ .../but3/dev62/mylibrary/book/entity/Book.java | 10 ++++++---- .../mylibrary/book/converter/BookConverterTest.java | 9 ++++----- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookDTO.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookDTO.java index b9f8697..d36ac70 100644 --- a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookDTO.java +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookDTO.java @@ -10,12 +10,14 @@ import java.util.ArrayList; @Getter @Builder public class BookDTO { - private ArrayList categories = new ArrayList<>(); - private String description ; - private String language; + private String isbn; private String title; private String author; private String editor; private LocalDate date; - + private double price; + private Integer stock; + private ArrayList categories = new ArrayList<>(); + private String description ; + private String language; } diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverter.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverter.java index 0173a9a..6761041 100644 --- a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverter.java +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverter.java @@ -10,10 +10,13 @@ public final class BookConverter { public static BookDTO ToDomain(BookInfo bookinfo, BookDetails bookdetails){ return BookDTO.builder() + .isbn("0000000000000") .title(bookinfo.title()) .author(bookinfo.author()) .editor(bookinfo.editor()) .date(bookinfo.date()) + .price(50.99) + .stock(5) .categories(bookdetails.getCategories()) .description(bookdetails.getDescription()) .language(bookdetails.getLanguage()) 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 f1297ea..4192245 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 @@ -10,12 +10,14 @@ import java.util.ArrayList; @Getter @Builder public class Book { - private ArrayList categories = new ArrayList<>(); - private String description ; - private String language; + private String isbn; private String title; private String author; private String editor; private LocalDate date; - + private double price; + private Integer stock; + private ArrayList categories = new ArrayList<>(); + private String description ; + private String language; } diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java index 5e30473..db8f38a 100644 --- a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java @@ -36,7 +36,6 @@ public class BookConverterTest { BookDTO result = BookConverter.ToDomain(bookinfo, bookdetails); - //assertNotNull(result); assertEquals(bookinfo.title(), result.getTitle()); assertEquals(bookinfo.author(), result.getAuthor()); assertEquals(bookinfo.editor(), result.getEditor()); @@ -46,16 +45,16 @@ public class BookConverterTest { assertEquals(bookdetails.getLanguage(), result.getLanguage()); } } -/** +/* @Nested @DisplayName("toDTO() method tests") class ToDTOTests { LocalDate date = LocalDate.of(2026, 3, 24); - ArrayList categories = new ArrayList(); + ArrayList categories = new ArrayList<>(); categories.add("Thriller"); categories.add("Biographie"); Book book = Book.builder() - .isbn(1234567891012) + .isbn("1234567891012") .title("La vie de Maxime") .author("Marvin Aubert") .editor("Kioon") @@ -69,5 +68,5 @@ public class BookConverterTest { BookDTO result = BookConvert.ToDTO(book); - }**/ + }*/ } -- 2.54.0 From 55e43fca89c2f5224827359e578b2aa32cac31b3 Mon Sep 17 00:00:00 2001 From: felix-vi Date: Wed, 25 Mar 2026 10:30:12 +0100 Subject: [PATCH 04/19] :white_check_mark: Reussite du test converter ToDTO --- .../book/converter/BookConverter.java | 16 ++++++ .../book/converter/BookConverterTest.java | 52 ++++++++++++------- 2 files changed, 49 insertions(+), 19 deletions(-) diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverter.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverter.java index 6761041..e3b9f97 100644 --- a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverter.java +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverter.java @@ -4,6 +4,7 @@ package fr.iut_fbleau.but3.dev62.mylibrary.book.converter; 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.entity.Book; public final class BookConverter { private BookConverter(){} @@ -22,4 +23,19 @@ public final class BookConverter { .language(bookdetails.getLanguage()) .build(); } + + public static BookDTO ToDTO(Book book){ + return BookDTO.builder() + .isbn(book.getIsbn()) + .title(book.getTitle()) + .author(book.getAuthor()) + .editor(book.getEditor()) + .date(book.getDate()) + .price(book.getPrice()) + .stock(book.getStock()) + .categories(book.getCategories()) + .description(book.getDescription()) + .language(book.getLanguage()) + .build(); + } } diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java index db8f38a..3b3231b 100644 --- a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java @@ -45,28 +45,42 @@ public class BookConverterTest { assertEquals(bookdetails.getLanguage(), result.getLanguage()); } } -/* + @Nested @DisplayName("toDTO() method tests") class ToDTOTests { - LocalDate date = LocalDate.of(2026, 3, 24); - ArrayList categories = new ArrayList<>(); - categories.add("Thriller"); - categories.add("Biographie"); - Book book = Book.builder() - .isbn("1234567891012") - .title("La vie de Maxime") - .author("Marvin Aubert") - .editor("Kioon") - .date(date) - .price() - .stock() - .categories(categories) - .Description() - .language() - .build(); - BookDTO result = BookConvert.ToDTO(book); + @Test + void ShouldConvertBookToDTO() { + LocalDate date = LocalDate.of(2026, 3, 24); + ArrayList categories = new ArrayList<>(); + categories.add("Thriller"); + categories.add("Biographie"); + Book book = Book.builder() + .isbn("1234567891012") + .title("La vie de Maxime") + .author("Marvin Aubert") + .editor("Kioon") + .date(date) + .price(12.99) + .stock(50) + .categories(categories) + .description("C'était un brave partit trop tôt") + .language("Français") + .build(); - }*/ + BookDTO result = BookConverter.ToDTO(book); + + assertEquals(book.getIsbn(), result.getIsbn()); + assertEquals(book.getTitle(), result.getTitle()); + assertEquals(book.getAuthor(), result.getAuthor()); + assertEquals(book.getEditor(), result.getEditor()); + assertEquals(book.getDate(), result.getDate()); + assertEquals(book.getPrice(), result.getPrice()); + assertEquals(book.getStock(), result.getStock()); + assertEquals(book.getCategories(), result.getCategories()); + assertEquals(book.getDescription(), result.getDescription()); + assertEquals(book.getLanguage(), result.getLanguage()); + } + } } -- 2.54.0 From e8563d44b169ced9db0d8af90d8a1cbf660a6772 Mon Sep 17 00:00:00 2001 From: felix-vi Date: Wed, 25 Mar 2026 10:56:04 +0100 Subject: [PATCH 05/19] =?UTF-8?q?:white=5Fcheck=5Fmark:=20Reussite=20du=20?= =?UTF-8?q?test=20de=20pr=C3=A9servation=20du=20champ=20string=20vide=20ap?= =?UTF-8?q?r=C3=A8s=20les=20conversion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/converter/BookConverter.java | 4 ++-- .../dev62/mylibrary/book/entity/Book.java | 1 + .../book/converter/BookConverterTest.java | 22 ++++++++++++++++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverter.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverter.java index e3b9f97..5bb8efc 100644 --- a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverter.java +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverter.java @@ -9,8 +9,8 @@ import fr.iut_fbleau.but3.dev62.mylibrary.book.entity.Book; public final class BookConverter { private BookConverter(){} - public static BookDTO ToDomain(BookInfo bookinfo, BookDetails bookdetails){ - return BookDTO.builder() + public static Book ToDomain(BookInfo bookinfo, BookDetails bookdetails){ + return Book.builder() .isbn("0000000000000") .title(bookinfo.title()) .author(bookinfo.author()) 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 4192245..8ddecb9 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 @@ -20,4 +20,5 @@ public class Book { private ArrayList categories = new ArrayList<>(); private String description ; private String language; + } diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java index 3b3231b..cd1731a 100644 --- a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java @@ -34,7 +34,7 @@ public class BookConverterTest { .language("Français") .build(); - BookDTO result = BookConverter.ToDomain(bookinfo, bookdetails); + Book result = BookConverter.ToDomain(bookinfo, bookdetails); assertEquals(bookinfo.title(), result.getTitle()); assertEquals(bookinfo.author(), result.getAuthor()); @@ -83,4 +83,24 @@ public class BookConverterTest { assertEquals(book.getLanguage(), result.getLanguage()); } } + + @Test + @DisplayName("Should preserve empty string values during conversion") + void shouldPreserveEmptyStrings() { + LocalDate date = LocalDate.of(2026, 3, 24); + BookInfo bookinfo = new BookInfo("La vie de Maxime", "Marvin Aubert", "Kioon", date); + ArrayList categories = new ArrayList<>(); + categories.add("Thriller"); + categories.add("Biographie"); + BookDetails bookdetails = BookDetails.builder() + .categories(categories) + .description("") + .language("Français") + .build(); + + Book book = BookConverter.ToDomain(bookinfo, bookdetails); + BookDTO result = BookConverter.ToDTO(book); + + assertEquals("", result.getDescription()); + } } -- 2.54.0 From 958f391b05718f568aa714d9c084e516657795f5 Mon Sep 17 00:00:00 2001 From: felix-vi Date: Wed, 25 Mar 2026 11:56:51 +0100 Subject: [PATCH 06/19] :white_check_mark: Reussite du test des variables de Book --- .../dev62/mylibrary/book/entity/BookTest.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/BookTest.java diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/BookTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/BookTest.java new file mode 100644 index 0000000..5fc5eec --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/BookTest.java @@ -0,0 +1,54 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book.entity; + +import fr.iut_fbleau.but3.dev62.mylibrary.book.BookDTO; +import fr.iut_fbleau.but3.dev62.mylibrary.book.converter.BookConverter; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.time.LocalDate; +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class BookTest { + + @Test + @DisplayName("Builder should create a valid Customer instance") + void testCustomerBuilder() { + String isbn = "1234567891012"; + String title = "La vie de Maxime"; + String author = "Marvin Aubert"; + String editor = "Kioon"; + LocalDate date = LocalDate.of(2026, 3, 24); + double price = 12.99; + Integer stock = 50; + ArrayList categories = new ArrayList<>(); + categories.add("Thriller"); + categories.add("Biographie"); + String description = "C'était un brave partit trop tôt"; + String language = "Français"; + Book book = Book.builder() + .isbn(isbn) + .title(title) + .author(author) + .editor(editor) + .date(date) + .price(price) + .stock(stock) + .categories(categories) + .description(description) + .language(language) + .build(); + + assertEquals(isbn, book.getIsbn()); + assertEquals(title, book.getTitle()); + assertEquals(author, book.getAuthor()); + assertEquals(editor, book.getEditor()); + assertEquals(date, book.getDate()); + assertEquals(price, book.getPrice()); + assertEquals(stock, book.getStock()); + assertEquals(categories, book.getCategories()); + assertEquals(description, book.getDescription()); + assertEquals(language, book.getLanguage()); + } +} -- 2.54.0 From 961b3b69ba134a03b9291a4d7be6b8bd0fb3589e Mon Sep 17 00:00:00 2001 From: felix-vi Date: Wed, 25 Mar 2026 12:07:23 +0100 Subject: [PATCH 07/19] :white_check_mark: Reussite du test d'ajout de copie dans les stock' --- .../dev62/mylibrary/book/entity/Book.java | 3 ++ .../dev62/mylibrary/book/entity/BookTest.java | 34 +++++++++++++++++++ 2 files changed, 37 insertions(+) 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 8ddecb9..ad27bfb 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 @@ -21,4 +21,7 @@ public class Book { private String description ; private String language; + public void addStock(Integer copyToAdd){ + this.stock += copyToAdd; + } } diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/BookTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/BookTest.java index 5fc5eec..db21e1d 100644 --- a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/BookTest.java +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/BookTest.java @@ -3,6 +3,7 @@ package fr.iut_fbleau.but3.dev62.mylibrary.book.entity; import fr.iut_fbleau.but3.dev62.mylibrary.book.BookDTO; import fr.iut_fbleau.but3.dev62.mylibrary.book.converter.BookConverter; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import java.time.LocalDate; @@ -51,4 +52,37 @@ public class BookTest { assertEquals(description, book.getDescription()); assertEquals(language, book.getLanguage()); } + + @Nested + @DisplayName("Loyalty Points Tests") + class StockTests { + + @Test + @DisplayName("addCopy should correctly increment stocks") + void testAddCopy() { + Book book =Book.builder() + .stock(5) + .build(); + Integer copyToAdd = 5; + Integer copyExpected = 10; + + book.addStock(copyToAdd); + + assertEquals(copyExpected, book.getStock()); + } + + @Test + @DisplayName("addCopy should correctly increment zero points correctly") + void testAddZeroToCopy() { + Book book =Book.builder() + .stock(5) + .build(); + Integer copyToAdd = 0; + Integer copyExpected = 5; + + book.addStock(copyToAdd); + + assertEquals(copyExpected, book.getStock()); + } + } } -- 2.54.0 From 2b29d34615a481c81f771e432c69be3afb73a6f9 Mon Sep 17 00:00:00 2001 From: felix-vi Date: Wed, 25 Mar 2026 12:24:46 +0100 Subject: [PATCH 08/19] :white_check_mark: Reussite du test de reduction des stock avec l'exception possible --- .../dev62/mylibrary/book/entity/Book.java | 8 +++ .../exception/IllegalBookStockException.java | 13 ++++ .../dev62/mylibrary/book/entity/BookTest.java | 68 ++++++++++++++++++- 3 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/IllegalBookStockException.java 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 ad27bfb..500c09d 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,6 +1,7 @@ package fr.iut_fbleau.but3.dev62.mylibrary.book.entity; +import fr.iut_fbleau.but3.dev62.mylibrary.book.exception.IllegalBookStockException; import lombok.Builder; import lombok.Getter; @@ -24,4 +25,11 @@ public class Book { public void addStock(Integer copyToAdd){ this.stock += copyToAdd; } + + public void removeStock(Integer copyToRemomve) throws IllegalBookStockException { + if (copyToRemomve > this.stock){ + throw new IllegalBookStockException(copyToRemomve, this.stock); + } + this.stock -= copyToRemomve; + } } diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/IllegalBookStockException.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/IllegalBookStockException.java new file mode 100644 index 0000000..6d7db41 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/IllegalBookStockException.java @@ -0,0 +1,13 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book.exception; + +import java.text.MessageFormat; + +public class IllegalBookStockException extends Exception { + public static final String CANNOT_REMOVE_COPY = "Cannot remove {0} copy from {1} copy"; + + public IllegalBookStockException(Integer toremove, Integer actual ) { + + super(MessageFormat.format(CANNOT_REMOVE_COPY, toremove, + actual)); + } +} diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/BookTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/BookTest.java index db21e1d..14fe7da 100644 --- a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/BookTest.java +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/BookTest.java @@ -1,7 +1,7 @@ package fr.iut_fbleau.but3.dev62.mylibrary.book.entity; -import fr.iut_fbleau.but3.dev62.mylibrary.book.BookDTO; -import fr.iut_fbleau.but3.dev62.mylibrary.book.converter.BookConverter; + +import fr.iut_fbleau.but3.dev62.mylibrary.book.exception.IllegalBookStockException; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -9,7 +9,8 @@ import org.junit.jupiter.api.Test; import java.time.LocalDate; import java.util.ArrayList; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; public class BookTest { @@ -84,5 +85,66 @@ public class BookTest { assertEquals(copyExpected, book.getStock()); } + + @Test + @DisplayName("removeLoyaltyPoints should correctly decrement loyalty points") + void testRemoveCopy() throws IllegalBookStockException { + Book book =Book.builder() + .stock(5) + .build(); + Integer copyToRemove = 2; + Integer copyExpected = 3; + + book.removeStock(copyToRemove); + + assertEquals(copyExpected, book.getStock()); + } + + @Test + @DisplayName("removeLoyaltyPoints should correctly decrement loyalty points") + void testRemoveZeroToCopy() throws IllegalBookStockException { + Book book =Book.builder() + .stock(5) + .build(); + Integer copyToRemove = 0; + Integer copyExpected = 5; + + book.removeStock(copyToRemove); + + assertEquals(copyExpected, book.getStock()); + } + + @Test + @DisplayName("removeLoyaltyPoints should correctly decrement loyalty points") + void testRemoveAllToCopy() throws IllegalBookStockException { + Book book =Book.builder() + .stock(5) + .build(); + Integer copyToRemove = 5; + Integer copyExpected = 0; + + book.removeStock(copyToRemove); + + assertEquals(copyExpected, book.getStock()); + } + + @Test + @DisplayName("removeSTock should throw exception when trying to remove more copy than available") + void testRemoveTooManyCopy() { + Book book = Book.builder() + .stock(50) + .build(); + int copyToRemove = 75; + + IllegalBookStockException exception = assertThrows( + IllegalBookStockException.class, + () -> book.removeStock(copyToRemove) + ); + + assertEquals(50, book.getStock()); + + assertTrue(exception.getMessage().contains(String.valueOf(copyToRemove))); + assertTrue(exception.getMessage().contains(String.valueOf(book.getStock()))); + } } } -- 2.54.0 From 495343ddb8af905addc8d063f5cad1d017c31282 Mon Sep 17 00:00:00 2001 From: felix-vi Date: Sat, 25 Apr 2026 21:12:20 +0200 Subject: [PATCH 09/19] :white_check_mark: Reussite du test de reduction des stock avec l'exception possible --- .../dev62/mylibrary/book/entity/BookTest.java | 20 +++++- .../IllegalBookStockExceptionTest.java | 71 +++++++++++++++++++ 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/IllegalBookStockExceptionTest.java diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/BookTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/BookTest.java index 14fe7da..1af2d9a 100644 --- a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/BookTest.java +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/BookTest.java @@ -55,7 +55,7 @@ public class BookTest { } @Nested - @DisplayName("Loyalty Points Tests") + @DisplayName("Stock Tests") class StockTests { @Test @@ -147,4 +147,22 @@ public class BookTest { assertTrue(exception.getMessage().contains(String.valueOf(book.getStock()))); } } + + @Nested + @DisplayName("Price Tests") + class PriceTests { + @Test + @DisplayName("addCopy should correctly increment stocks") + void testAddCopy() { + Book book =Book.builder() + .stock(5) + .build(); + Integer copyToAdd = 5; + Integer copyExpected = 10; + + book.addStock(copyToAdd); + + assertEquals(copyExpected, book.getStock()); + } + } } diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/IllegalBookStockExceptionTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/IllegalBookStockExceptionTest.java new file mode 100644 index 0000000..2a8f91a --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/IllegalBookStockExceptionTest.java @@ -0,0 +1,71 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book.exception; + +import fr.iut_fbleau.but3.dev62.mylibrary.customer.exception.IllegalCustomerPointException; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import java.text.MessageFormat; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class IllegalBookStockExceptionTest { + + @Test + @DisplayName("Exception message should contain the needed and actual stock") + void testExceptionMessageContainsStock() { + int neededStock = 100; + int actualStock = 50; + + IllegalBookStockException exception = new IllegalBookStockException(neededStock, actualStock); + + String expectedMessage = "Cannot remove 100 copy from 50 copy"; + assertEquals(expectedMessage, exception.getMessage()); + } + + @ParameterizedTest + @CsvSource({ + "100, 50", + "75, 25", + "200, 150", + "1000, 750" + }) + @DisplayName("Exception message should be formatted correctly for different stock values") + void testExceptionMessageForDifferentStockValues(int neededStock, int actualStock) { + IllegalBookStockException exception = new IllegalBookStockException(neededStock, actualStock); + + String expectedMessage = MessageFormat.format(IllegalBookStockException.CANNOT_REMOVE_COPY, neededStock, actualStock); + assertEquals(expectedMessage, exception.getMessage()); + } + + @Test + @DisplayName("Exception should use the correct constant message format") + void testExceptionUsesConstantMessageFormat() { + int neededStock = 100; + int actualStock = 50; + + IllegalBookStockException exception = new IllegalBookStockException(neededStock, actualStock); + + String expectedFormatWithPlaceholder = "Cannot remove {0} copy from {1} copy"; + assertEquals(IllegalBookStockException.CANNOT_REMOVE_COPY, + expectedFormatWithPlaceholder); + assertTrue(exception.getMessage().contains(String.valueOf(neededStock))); + assertTrue(exception.getMessage().contains(String.valueOf(actualStock))); + } + + @Test + @DisplayName("Exception should be properly thrown and caught") + void testExceptionCanBeThrownAndCaught() { + int neededStock = 100; + int actualStock = 50; + + try { + throw new IllegalBookStockException(neededStock, actualStock); + } catch (IllegalBookStockException e) { + String expectedMessage = String.format("Cannot remove %d copy from %d copy", neededStock, actualStock); + assertEquals(expectedMessage, e.getMessage()); + } + } +} -- 2.54.0 From aca81b68db7d99aff32134900502c013d2c91f9d Mon Sep 17 00:00:00 2001 From: felix-vi Date: Sat, 25 Apr 2026 22:54:47 +0200 Subject: [PATCH 10/19] =?UTF-8?q?:white=5Fcheck=5Fmark:=20revue=20de=20la?= =?UTF-8?q?=20sturcture=20de=20d=C3=A9coupe=20des=20variable=20est=20reuss?= =?UTF-8?q?ite=20des=20test=20concern=C3=A9=20par=20ce=20changement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../but3/dev62/mylibrary/book/BookInfo.java | 2 +- .../dev62/mylibrary/book/BookSalesInfo.java | 11 ++++++++++ .../book/converter/BookConverter.java | 9 ++++---- .../book/converter/BookConverterTest.java | 22 ++++++++++++++----- .../IllegalBookStockExceptionTest.java | 1 - 5 files changed, 34 insertions(+), 11 deletions(-) create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookSalesInfo.java 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 0ecc1b8..6bdbcb2 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 @@ -2,5 +2,5 @@ package fr.iut_fbleau.but3.dev62.mylibrary.book; import java.time.LocalDate; -public record BookInfo(String title, String author, String editor, LocalDate date) { +public record BookInfo(String isbn, String title, String author, String editor, LocalDate date) { } diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookSalesInfo.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookSalesInfo.java new file mode 100644 index 0000000..5d0b828 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/BookSalesInfo.java @@ -0,0 +1,11 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book; + +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class BookSalesInfo { + private double price; + private Integer stock; +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverter.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverter.java index 5bb8efc..42713a2 100644 --- a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverter.java +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverter.java @@ -4,20 +4,21 @@ package fr.iut_fbleau.but3.dev62.mylibrary.book.converter; 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.entity.Book; public final class BookConverter { private BookConverter(){} - public static Book ToDomain(BookInfo bookinfo, BookDetails bookdetails){ + public static Book ToDomain(BookInfo bookinfo, BookSalesInfo booksalesinfo, BookDetails bookdetails){ return Book.builder() - .isbn("0000000000000") + .isbn(bookinfo.isbn()) .title(bookinfo.title()) .author(bookinfo.author()) .editor(bookinfo.editor()) .date(bookinfo.date()) - .price(50.99) - .stock(5) + .price(booksalesinfo.getPrice()) + .stock(booksalesinfo.getStock()) .categories(bookdetails.getCategories()) .description(bookdetails.getDescription()) .language(bookdetails.getLanguage()) diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java index cd1731a..071d520 100644 --- a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/converter/BookConverterTest.java @@ -3,6 +3,7 @@ package fr.iut_fbleau.but3.dev62.mylibrary.book.converter; import fr.iut_fbleau.but3.dev62.mylibrary.book.BookDTO; import fr.iut_fbleau.but3.dev62.mylibrary.book.BookInfo; import fr.iut_fbleau.but3.dev62.mylibrary.book.BookDetails; +import fr.iut_fbleau.but3.dev62.mylibrary.book.BookSalesInfo; import fr.iut_fbleau.but3.dev62.mylibrary.book.entity.Book; import org.junit.jupiter.api.DisplayName; @@ -24,7 +25,11 @@ public class BookConverterTest { @Test void ShouldConvertBookToDomain(){ LocalDate date = LocalDate.of(2026, 3, 24); - BookInfo bookinfo = new BookInfo("La vie de Maxime", "Marvin Aubert", "Kioon", date); + BookInfo bookinfo = new BookInfo("0000000000000","La vie de Maxime", "Marvin Aubert", "Kioon", date); + BookSalesInfo booksalesinfo = BookSalesInfo.builder() + .price(12) + .stock(10) + .build(); ArrayList categories = new ArrayList<>(); categories.add("Thriller"); categories.add("Biographie"); @@ -34,13 +39,16 @@ public class BookConverterTest { .language("Français") .build(); - Book result = BookConverter.ToDomain(bookinfo, bookdetails); + Book result = BookConverter.ToDomain(bookinfo, booksalesinfo, bookdetails); + assertEquals(bookinfo.isbn(), result.getIsbn()); assertEquals(bookinfo.title(), result.getTitle()); assertEquals(bookinfo.author(), result.getAuthor()); assertEquals(bookinfo.editor(), result.getEditor()); assertEquals(bookinfo.date(), result.getDate()); - assertEquals(categories, result.getCategories()); + assertEquals(booksalesinfo.getPrice(), result.getPrice()); + assertEquals(booksalesinfo.getStock(), result.getStock()); + assertEquals(bookdetails.getCategories(), result.getCategories()); assertEquals(bookdetails.getDescription(), result.getDescription()); assertEquals(bookdetails.getLanguage(), result.getLanguage()); } @@ -88,7 +96,11 @@ public class BookConverterTest { @DisplayName("Should preserve empty string values during conversion") void shouldPreserveEmptyStrings() { LocalDate date = LocalDate.of(2026, 3, 24); - BookInfo bookinfo = new BookInfo("La vie de Maxime", "Marvin Aubert", "Kioon", date); + BookInfo bookinfo = new BookInfo("0000000000000","La vie de Maxime", "Marvin Aubert", "Kioon", date); + BookSalesInfo booksalesinfo = BookSalesInfo.builder() + .price(12) + .stock(10) + .build(); ArrayList categories = new ArrayList<>(); categories.add("Thriller"); categories.add("Biographie"); @@ -98,7 +110,7 @@ public class BookConverterTest { .language("Français") .build(); - Book book = BookConverter.ToDomain(bookinfo, bookdetails); + Book book = BookConverter.ToDomain(bookinfo, booksalesinfo, bookdetails); BookDTO result = BookConverter.ToDTO(book); assertEquals("", result.getDescription()); diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/IllegalBookStockExceptionTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/IllegalBookStockExceptionTest.java index 2a8f91a..9c4b18f 100644 --- a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/IllegalBookStockExceptionTest.java +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/IllegalBookStockExceptionTest.java @@ -1,6 +1,5 @@ package fr.iut_fbleau.but3.dev62.mylibrary.book.exception; -import fr.iut_fbleau.but3.dev62.mylibrary.customer.exception.IllegalCustomerPointException; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; -- 2.54.0 From adb6a885ae225d34b3135176ad8041d47c5a80c2 Mon Sep 17 00:00:00 2001 From: felix-vi Date: Sun, 26 Apr 2026 15:56:24 +0200 Subject: [PATCH 11/19] =?UTF-8?q?:white=5Fcheck=5Fmark:=20cr=C3=A9ation=20?= =?UTF-8?q?des=20test=20de=20validation=20des=20valeurs=20des=20variables?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/validator/BookValidatorTest.java | 352 ++++++++++++++++++ 1 file changed, 352 insertions(+) create mode 100644 src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/validator/BookValidatorTest.java diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/validator/BookValidatorTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/validator/BookValidatorTest.java new file mode 100644 index 0000000..e838cad --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/validator/BookValidatorTest.java @@ -0,0 +1,352 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book.validator; + +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 org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.ValueSource; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class BookValidatorTest { + + @Test + @DisplayName("Should validate book with valid data") + void testValidateValidCustomer() { + LocalDate date = LocalDate.of(2026, 3, 24); + BookInfo validBook = new BookInfo("0000000000000","La vie de Maxime", "Marvin Aubert", "Kioon", date); + + assertDoesNotThrow(() -> BookValidator.validate(validBook)); + } + + @Nested + @DisplayName("ISBN validation tests") + class ISBNValidationTests { + + @Test + @DisplayName("Should throw exception when isbn is blank") + void testValidateBlankTitle() { + LocalDate date = LocalDate.of(2026, 3, 24); + BookInfo bookWithBlankTitle = new BookInfo("", "La vie de Maxime", "Marvin Aubert", "Kioon", date); + + NotValidBookException exception = assertThrows( + NotValidBookException.class, + () -> BookValidator.validate(bookWithBlankTitle) + ); + + assertEquals(BookValidator.ISBN_CANNOT_BE_BLANK, exception.getMessage()); + } + + @ParameterizedTest + @ValueSource(strings = {" ", " ", "\t", "\n"}) + @DisplayName("Should throw exception when title contains only whitespace") + void testValidateWhitespaceISBN(String whitespace) { + LocalDate date = LocalDate.of(2026, 3, 24); + BookInfo bookWithWhitespaceTitle = new BookInfo(whitespace, "La vie de Maxime", "Marvin Aubert", "Kioon", date); + + NotValidBookException exception = assertThrows( + NotValidBookException.class, + () -> BookValidator.validate(bookWithWhitespaceTitle) + ); + + assertEquals(BookValidator.TITLE_CANNOT_BE_BLANK, exception.getMessage()); + } + + @ParameterizedTest + @ValueSource(strings = {"00000", "0000000000", "0000000000000000"}) + @DisplayName("Should throw exception when isbn contains only thriteen character") + void testValidateThirteenCharacterISBN(String number) { + LocalDate date = LocalDate.of(2026, 3, 24); + BookInfo bookWithWhitespaceTitle = new BookInfo(number, "La vie de Maxime", "Marvin Aubert", "Kioon", date); + + NotValidBookException exception = assertThrows( + NotValidBookException.class, + () -> BookValidator.validate(bookWithWhitespaceTitle) + ); + + assertEquals(BookValidator.ISBN_CANNOT_CONTAIN_MORE_OR_LESS_THIRTEEN_CHARACTER, exception.getMessage()); + } + } + + @Nested + @DisplayName("Title validation tests") + class TitleValidationTests { + + @Test + @DisplayName("Should throw exception when title is blank") + void testValidateBlankTitle() { + LocalDate date = LocalDate.of(2026, 3, 24); + BookInfo bookWithBlankTitle = new BookInfo("0000000000000","", "Marvin Aubert", "Kioon", date); + + NotValidBookException exception = assertThrows( + NotValidBookException.class, + () -> BookValidator.validate(bookWithBlankTitle) + ); + + assertEquals(BookValidator.TITLE_CANNOT_BE_BLANK, exception.getMessage()); + } + + @ParameterizedTest + @ValueSource(strings = {" ", " ", "\t", "\n"}) + @DisplayName("Should throw exception when title contains only whitespace") + void testValidateWhitespaceFirstName(String whitespace) { + LocalDate date = LocalDate.of(2026, 3, 24); + BookInfo bookWithWhitespaceTitle = new BookInfo("0000000000000",whitespace, "Marvin Aubert", "Kioon", date); + + NotValidBookException exception = assertThrows( + NotValidBookException.class, + () -> BookValidator.validate(bookWithWhitespaceTitle) + ); + + assertEquals(BookValidator.TITLE_CANNOT_BE_BLANK, exception.getMessage()); + } + } + + @Nested + @DisplayName("author validation tests") + class AuthorValidationTests { + + @Test + @DisplayName("Should throw exception when author is blank") + void testValidateBlankAuthor() { + LocalDate date = LocalDate.of(2026, 3, 24); + BookInfo bookWithBlankAuthor = new BookInfo("0000000000000","La vie de Maxime", "", "Kioon", date); + + NotValidBookException exception = assertThrows( + NotValidBookException.class, + () -> BookValidator.validate(bookWithBlankAuthor) + ); + + assertEquals(BookValidator.AUTHOR_CANNOT_BE_BLANK, exception.getMessage()); + } + + @ParameterizedTest + @ValueSource(strings = {" ", " ", "\t", "\n"}) + @DisplayName("Should throw exception when author contains only whitespace") + void testValidateWhitespaceAuthor(String whitespace) { + LocalDate date = LocalDate.of(2026, 3, 24); + BookInfo bookWithWhitespaceAuthor = new BookInfo("0000000000000","La vie de Maxime", whitespace, "Kioon", date); + + NotValidBookException exception = assertThrows( + NotValidBookException.class, + () -> BookValidator.validate(bookWithWhitespaceAuthor) + ); + + assertEquals(BookValidator.AUTHOR_CANNOT_BE_BLANK, exception.getMessage()); + } + } + + @Nested + @DisplayName("editor validation tests") + class EditorValidationTests { + + @Test + @DisplayName("Should throw exception when editor is blank") + void testValidateBlankEditor() { + LocalDate date = LocalDate.of(2026, 3, 24); + BookInfo bookWithBlankEditor = new BookInfo("0000000000000","La vie de Maxime", "Marvin Aubert", "", date); + + NotValidBookException exception = assertThrows( + NotValidBookException.class, + () -> BookValidator.validate(bookWithBlankEditor) + ); + + assertEquals(BookValidator.EDITOR_CANNOT_BE_BLANK, exception.getMessage()); + } + + @ParameterizedTest + @ValueSource(strings = {" ", " ", "\t", "\n"}) + @DisplayName("Should throw exception when editor contains only whitespace") + void testValidateWhitespaceEditor(String whitespace) { + LocalDate date = LocalDate.of(2026, 3, 24); + BookInfo bookWithWhitespaceEditor = new BookInfo("0000000000000","La vie de Maxime", "Marvin Aubert", whitespace, date); + + NotValidBookException exception = assertThrows( + NotValidBookException.class, + () -> BookValidator.validate(bookWithWhitespaceEditor) + ); + + assertEquals(BookValidator.EDITOR_CANNOT_BE_BLANK, exception.getMessage()); + } + } + + @Nested + @DisplayName("date validation tests") + class DateValidationTests { + + @Test + @DisplayName("Should throw exception when date is after the actual date") + void testValidateFuturDate() { + LocalDate date = LocalDate.of(2026, 5, 24); + BookInfo bookWithFuturDate = new BookInfo("0000000000000","La vie de Maxime", "Marvin Aubert", "Kioon", date); + + NotValidBookException exception = assertThrows( + NotValidBookException.class, + () -> BookValidator.validate(bookWithFuturDate) + ); + + assertEquals(BookValidator.DATE_CANNOT_BE_AFTER_TODAY, exception.getMessage()); + } + } + + @Nested + @DisplayName("price validation tests") + class PriceValidationTests { + + @ParameterizedTest + @ValueSource(doubles = {-3, -15, 0}) + @DisplayName("Should throw exception when price is negative or equal to zero") + void testValidateNegativePrice(double invalidprice) { + BookSalesInfo bookWithNegativePrice = BookSalesInfo.builder() + .price(invalidprice) + .stock(10) + .build(); + + NotValidBookException exception = assertThrows( + NotValidBookException.class, + () -> BookValidator.validate(bookWithNegativePrice) + ); + + assertEquals(BookValidator.PRICE_CANNOT_BE_NEGATIVE_OR_EQUAL_ZERO, exception.getMessage()); + } + } + + @Nested + @DisplayName("stock validation tests") + class StockValidationTests { + + @Test + @DisplayName("Should throw exception when stock is negative") + void testValidateNegativeSTock() { + BookSalesInfo bookWithNegativeStock = BookSalesInfo.builder() + .price(3) + .stock(-3) + .build(); + + NotValidBookException exception = assertThrows( + NotValidBookException.class, + () -> BookValidator.validate(bookWithNegativeStock) + ); + + assertEquals(BookValidator.STOCK_CANNOT_BE_NEGATIVE, exception.getMessage()); + } + } + + @Nested + @DisplayName("categories validation tests") + class CategoriesValidationTests { + + @Test + @DisplayName("Should throw exception when categories is empty") + void testValidateBlankCategories() { + ArrayList categories = new ArrayList<>(); + String description = "C'était un brave partit trop tôt"; + String language = "Français"; + BookDetails bookWithEmptyCategories = BookDetails.builder() + .categories(categories) + .description(description) + .language(language) + .build(); + + NotValidBookException exception = assertThrows( + NotValidBookException.class, + () -> BookValidator.validate(bookWithEmptyCategories) + ); + + assertEquals(BookValidator.Categories_CANNOT_BE_EMPTY, exception.getMessage()); + } + + @ParameterizedTest + @MethodSource("provideLists") + @DisplayName("Should throw exception when categories contains an whitespace") + void testValidateWhitespaceCategories(ArrayList invalidlist) { + String description = "C'était un brave partit trop tôt"; + String language = "Français"; + BookDetails bookWithWhitespaceCategories = BookDetails.builder() + .categories(invalidlist) + .description(description) + .language(language) + .build(); + + NotValidBookException exception = assertThrows( + NotValidBookException.class, + () -> BookValidator.validate(bookWithWhitespaceCategories) + ); + + assertEquals(BookValidator.Categories_CANNOT_CONTAIN_BLANK, exception.getMessage()); + } + + static Stream> provideLists() { + return Stream.of( + new ArrayList(java.util.List.of("")), + new ArrayList(java.util.List.of(" ")), + new ArrayList(java.util.List.of(" ")), + new ArrayList(java.util.List.of("\t")), + new ArrayList(java.util.List.of("\n")), + new ArrayList(java.util.List.of("A", "", "C")) + ); + } + } + + @Nested + @DisplayName("language validation tests") + class LanguageValidationTests { + + @Test + @DisplayName("Should throw exception when language is blank") + void testValidateNegativeLanguage() { + ArrayList categories = new ArrayList<>(); + categories.add("Thriller"); + categories.add("Biographie"); + String description = "C'était un brave partit trop tôt"; + String language = ""; + + BookDetails bookWithBlankLanguage = BookDetails.builder() + .categories(categories) + .description(description) + .language(language) + .build(); + + NotValidBookException exception = assertThrows( + NotValidBookException.class, + () -> BookValidator.validate(bookWithBlankLanguage) + ); + + assertEquals(BookValidator.LANGUAGE_CANNOT_BE_BLANK, exception.getMessage()); + } + + @ParameterizedTest + @ValueSource(strings = {" ", " ", "\t", "\n"}) + @DisplayName("Should throw exception when language contains only whitespace") + void testValidateWhitespaceLanguage(String whitespace) { + ArrayList categories = new ArrayList<>(); + categories.add("Thriller"); + categories.add("Biographie"); + String description = "C'était un brave partit trop tôt"; + + BookDetails bookWithWhitespaceLanguage = BookDetails.builder() + .categories(categories) + .description(description) + .language(whitespace) + .build(); + + NotValidBookException exception = assertThrows( + NotValidBookException.class, + () -> BookValidator.validate(bookWithWhitespaceLanguage) + ); + + assertEquals(BookValidator.LANGUAGE_CANNOT_BE_BLANK, exception.getMessage()); + } + } +} -- 2.54.0 From 182fcc0259fc1ce9e8fe70710ff61a0e58734369 Mon Sep 17 00:00:00 2001 From: felix-vi Date: Sun, 26 Apr 2026 16:36:21 +0200 Subject: [PATCH 12/19] =?UTF-8?q?:white=5Fcheck=5Fmark:=20oublie=20des=20t?= =?UTF-8?q?est=20g=C3=A9n=C3=A9ral=20pour=20booksalesinfo=20et=20bookdetai?= =?UTF-8?q?ls?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/validator/BookValidatorTest.java | 46 +++++++++++++++---- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/validator/BookValidatorTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/validator/BookValidatorTest.java index e838cad..17a52b3 100644 --- a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/validator/BookValidatorTest.java +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/validator/BookValidatorTest.java @@ -23,13 +23,39 @@ public class BookValidatorTest { @Test @DisplayName("Should validate book with valid data") - void testValidateValidCustomer() { + void testValidateValidBook() { LocalDate date = LocalDate.of(2026, 3, 24); BookInfo validBook = new BookInfo("0000000000000","La vie de Maxime", "Marvin Aubert", "Kioon", date); assertDoesNotThrow(() -> BookValidator.validate(validBook)); } + @Test + @DisplayName("Should validate book details with valid data") + void testValidateValidBookDetails() { + ArrayList categories = new ArrayList<>(); + categories.add("Thriller"); + categories.add("Biographie"); + BookDetails validBookDetails = BookDetails.builder() + .categories(categories) + .description("C'était un brave partit trop tôt") + .language("Français") + .build(); + + assertDoesNotThrow(() -> BookValidator.validate(validBookDetails)); + } + + @Test + @DisplayName("Should validate book sales informations with valid data") + void testValidateValidBookSalesInfo() { + BookSalesInfo validBookSalesInfo = BookSalesInfo.builder() + .price(15) + .stock(10) + .build(); + + assertDoesNotThrow(() -> BookValidator.validate(validBookSalesInfo)); + } + @Nested @DisplayName("ISBN validation tests") class ISBNValidationTests { @@ -45,12 +71,12 @@ public class BookValidatorTest { () -> BookValidator.validate(bookWithBlankTitle) ); - assertEquals(BookValidator.ISBN_CANNOT_BE_BLANK, exception.getMessage()); + assertEquals(BookValidator.ISBN_IS_NOT_VALID, exception.getMessage()); } @ParameterizedTest @ValueSource(strings = {" ", " ", "\t", "\n"}) - @DisplayName("Should throw exception when title contains only whitespace") + @DisplayName("Should throw exception when isbn contains only whitespace") void testValidateWhitespaceISBN(String whitespace) { LocalDate date = LocalDate.of(2026, 3, 24); BookInfo bookWithWhitespaceTitle = new BookInfo(whitespace, "La vie de Maxime", "Marvin Aubert", "Kioon", date); @@ -60,7 +86,7 @@ public class BookValidatorTest { () -> BookValidator.validate(bookWithWhitespaceTitle) ); - assertEquals(BookValidator.TITLE_CANNOT_BE_BLANK, exception.getMessage()); + assertEquals(BookValidator.ISBN_IS_NOT_VALID, exception.getMessage()); } @ParameterizedTest @@ -75,7 +101,7 @@ public class BookValidatorTest { () -> BookValidator.validate(bookWithWhitespaceTitle) ); - assertEquals(BookValidator.ISBN_CANNOT_CONTAIN_MORE_OR_LESS_THIRTEEN_CHARACTER, exception.getMessage()); + assertEquals(BookValidator.ISBN_IS_NOT_VALID, exception.getMessage()); } } @@ -196,7 +222,7 @@ public class BookValidatorTest { () -> BookValidator.validate(bookWithFuturDate) ); - assertEquals(BookValidator.DATE_CANNOT_BE_AFTER_TODAY, exception.getMessage()); + assertEquals(BookValidator.DATE_IS_NOT_VALID, exception.getMessage()); } } @@ -218,7 +244,7 @@ public class BookValidatorTest { () -> BookValidator.validate(bookWithNegativePrice) ); - assertEquals(BookValidator.PRICE_CANNOT_BE_NEGATIVE_OR_EQUAL_ZERO, exception.getMessage()); + assertEquals(BookValidator.PRICE_IS_NOT_VALID, exception.getMessage()); } } @@ -239,7 +265,7 @@ public class BookValidatorTest { () -> BookValidator.validate(bookWithNegativeStock) ); - assertEquals(BookValidator.STOCK_CANNOT_BE_NEGATIVE, exception.getMessage()); + assertEquals(BookValidator.STOCK_IS_NOT_VALID, exception.getMessage()); } } @@ -264,7 +290,7 @@ public class BookValidatorTest { () -> BookValidator.validate(bookWithEmptyCategories) ); - assertEquals(BookValidator.Categories_CANNOT_BE_EMPTY, exception.getMessage()); + assertEquals(BookValidator.CATEGORIES_IS_NOT_VALID, exception.getMessage()); } @ParameterizedTest @@ -284,7 +310,7 @@ public class BookValidatorTest { () -> BookValidator.validate(bookWithWhitespaceCategories) ); - assertEquals(BookValidator.Categories_CANNOT_CONTAIN_BLANK, exception.getMessage()); + assertEquals(BookValidator.CATEGORIES_IS_NOT_VALID, exception.getMessage()); } static Stream> provideLists() { -- 2.54.0 From 7d11743c02ce4e2cd542f238317c595dd265fbe1 Mon Sep 17 00:00:00 2001 From: felix-vi Date: Sun, 26 Apr 2026 17:00:16 +0200 Subject: [PATCH 13/19] =?UTF-8?q?:white=5Fcheck=5Fmark:=20r=C3=A9ussite=20?= =?UTF-8?q?des=20test=20du=20validator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/exception/NotValidBookException.java | 7 ++ .../book/validator/BookValidator.java | 111 ++++++++++++++++++ .../book/validator/BookValidatorTest.java | 15 +-- 3 files changed, 126 insertions(+), 7 deletions(-) create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/NotValidBookException.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/validator/BookValidator.java diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/NotValidBookException.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/NotValidBookException.java new file mode 100644 index 0000000..bec0172 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/NotValidBookException.java @@ -0,0 +1,7 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book.exception; + +public class NotValidBookException extends RuntimeException { + public NotValidBookException(String message) { + super(message); + } +} 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 new file mode 100644 index 0000000..ca601b0 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/validator/BookValidator.java @@ -0,0 +1,111 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book.validator; + +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.exception.NotValidBookException; +import fr.iut_fbleau.but3.dev62.mylibrary.customer.exception.NotValidCustomerException; + +import java.time.LocalDate; +import java.util.ArrayList; + +public class BookValidator { + + public static final String ISBN_IS_NOT_VALID = "Isbn is not valid"; + public static final String TITLE_CANNOT_BE_BLANK = "Title cannot be blank"; + public static final String AUTHOR_CANNOT_BE_BLANK = "Author cannot be blank"; + public static final String EDITOR_CANNOT_BE_BLANK = "Editor cannot be blank"; + public static final String DATE_IS_NOT_VALID = "Date is not valid"; + public static final String PRICE_IS_NOT_VALID = "Price is not valid"; + public static final String STOCK_IS_NOT_VALID = "Stock is not valid"; + public static final String CATEGORIES_IS_NOT_VALID = "Categories is not valid"; + public static final String LANGUAGE_CANNOT_BE_BLANK = "Language cannot be blank"; + + private BookValidator() { + } + + public static void validate(BookInfo newBook) throws NotValidCustomerException { + validateISBN(newBook); + validateTitle(newBook); + validateAuthor(newBook); + validateEditor(newBook); + validateDate(newBook); + } + + public static void validate(BookSalesInfo newBook) throws NotValidCustomerException { + validatePrice(newBook); + validateStock(newBook); + } + + public static void validate(BookDetails newBook) throws NotValidCustomerException { + validateCategories(newBook); + validateLanguage(newBook); + } + + private static void validateISBN(BookInfo newBook) throws NotValidBookException { + if (newBook.isbn().isBlank()) { + throw new NotValidBookException(ISBN_IS_NOT_VALID); + } else if (newBook.isbn().length() != 13) { + throw new NotValidBookException(ISBN_IS_NOT_VALID); + } + } + + private static void validateTitle(BookInfo newBook) throws NotValidBookException { + if (newBook.title().isBlank()) { + throw new NotValidBookException(TITLE_CANNOT_BE_BLANK); + } + } + + private static void validateAuthor(BookInfo newBook) throws NotValidBookException { + if (newBook.author().isBlank()) { + throw new NotValidBookException(AUTHOR_CANNOT_BE_BLANK); + } + } + + private static void validateEditor(BookInfo newBook) throws NotValidBookException { + if (newBook.editor().isBlank()) { + throw new NotValidBookException(EDITOR_CANNOT_BE_BLANK); + } + } + + private static void validateDate(BookInfo newBook) throws NotValidBookException { + if (newBook.date().isAfter(LocalDate.now())) { + throw new NotValidBookException(DATE_IS_NOT_VALID); + } + } + + private static void validatePrice(BookSalesInfo newBook) throws NotValidBookException { + if (newBook.getPrice() <= 0) { + throw new NotValidBookException(PRICE_IS_NOT_VALID); + } + } + + private static void validateStock(BookSalesInfo newBook) throws NotValidBookException { + if (newBook.getStock() < 0) { + throw new NotValidBookException(STOCK_IS_NOT_VALID); + } + } + + private static void validateCategories(BookDetails newBook) throws NotValidBookException { + if (newBook.getCategories().isEmpty()) { + throw new NotValidBookException(CATEGORIES_IS_NOT_VALID); + }else if (CategoriesNotBlank(newBook.getCategories())) { + throw new NotValidBookException(CATEGORIES_IS_NOT_VALID); + } + } + + private static boolean CategoriesNotBlank(ArrayList categories){ + for (String categorie : categories) { + if (categorie.isBlank()) { + return true; + } + } + return false; + } + + private static void validateLanguage(BookDetails newBook) throws NotValidBookException { + if (newBook.getLanguage().isBlank()) { + throw new NotValidBookException(LANGUAGE_CANNOT_BE_BLANK); + } + } +} diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/validator/BookValidatorTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/validator/BookValidatorTest.java index 17a52b3..73dc509 100644 --- a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/validator/BookValidatorTest.java +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/validator/BookValidatorTest.java @@ -3,6 +3,7 @@ package fr.iut_fbleau.but3.dev62.mylibrary.book.validator; 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.exception.NotValidBookException; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -62,13 +63,13 @@ public class BookValidatorTest { @Test @DisplayName("Should throw exception when isbn is blank") - void testValidateBlankTitle() { + void testValidateBlankISBN() { LocalDate date = LocalDate.of(2026, 3, 24); - BookInfo bookWithBlankTitle = new BookInfo("", "La vie de Maxime", "Marvin Aubert", "Kioon", date); + BookInfo bookWithBlankISBN = new BookInfo("", "La vie de Maxime", "Marvin Aubert", "Kioon", date); NotValidBookException exception = assertThrows( NotValidBookException.class, - () -> BookValidator.validate(bookWithBlankTitle) + () -> BookValidator.validate(bookWithBlankISBN) ); assertEquals(BookValidator.ISBN_IS_NOT_VALID, exception.getMessage()); @@ -79,11 +80,11 @@ public class BookValidatorTest { @DisplayName("Should throw exception when isbn contains only whitespace") void testValidateWhitespaceISBN(String whitespace) { LocalDate date = LocalDate.of(2026, 3, 24); - BookInfo bookWithWhitespaceTitle = new BookInfo(whitespace, "La vie de Maxime", "Marvin Aubert", "Kioon", date); + BookInfo bookWithWhitespaceISBN = new BookInfo(whitespace, "La vie de Maxime", "Marvin Aubert", "Kioon", date); NotValidBookException exception = assertThrows( NotValidBookException.class, - () -> BookValidator.validate(bookWithWhitespaceTitle) + () -> BookValidator.validate(bookWithWhitespaceISBN) ); assertEquals(BookValidator.ISBN_IS_NOT_VALID, exception.getMessage()); @@ -94,11 +95,11 @@ public class BookValidatorTest { @DisplayName("Should throw exception when isbn contains only thriteen character") void testValidateThirteenCharacterISBN(String number) { LocalDate date = LocalDate.of(2026, 3, 24); - BookInfo bookWithWhitespaceTitle = new BookInfo(number, "La vie de Maxime", "Marvin Aubert", "Kioon", date); + BookInfo bookWithNotExactCharacterISBN = new BookInfo(number, "La vie de Maxime", "Marvin Aubert", "Kioon", date); NotValidBookException exception = assertThrows( NotValidBookException.class, - () -> BookValidator.validate(bookWithWhitespaceTitle) + () -> BookValidator.validate(bookWithNotExactCharacterISBN) ); assertEquals(BookValidator.ISBN_IS_NOT_VALID, exception.getMessage()); -- 2.54.0 From d8ae07a032c3b0bf534617342123330fb25f977d Mon Sep 17 00:00:00 2001 From: felix-vi Date: Sun, 26 Apr 2026 17:10:27 +0200 Subject: [PATCH 14/19] =?UTF-8?q?:white=5Fcheck=5Fmark:=20r=C3=A9ussite=20?= =?UTF-8?q?des=20test=20des=20exceptions=20sur=20le=20fichier=20NotValidBo?= =?UTF-8?q?okExceptionTest.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/NotValidBookExceptionTest.java | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/NotValidBookExceptionTest.java diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/NotValidBookExceptionTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/NotValidBookExceptionTest.java new file mode 100644 index 0000000..d6d6050 --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/NotValidBookExceptionTest.java @@ -0,0 +1,61 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book.exception; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class NotValidBookExceptionTest { + + @Test + @DisplayName("Exception should be created with the provided message") + void testExceptionCreation() { + String errorMessage = "Book data is not valid"; + + NotValidBookException exception = new NotValidBookException(errorMessage); + + assertEquals(errorMessage, exception.getMessage()); + } + + @ParameterizedTest + @ValueSource(strings = { + "Isbn is required", + "Title cannot be empty", + "Date format is invalid", + "Price must be above 0" + }) + @DisplayName("Exception should handle different validation messages") + void testExceptionWithDifferentMessages(String errorMessage) { + NotValidBookException exception = new NotValidBookException(errorMessage); + + assertEquals(errorMessage, exception.getMessage()); + } + + @Test + @DisplayName("Exception should be properly thrown and caught") + void testExceptionCanBeThrownAndCaught() { + String errorMessage = "Required field is missing"; + + Exception exception = assertThrows(NotValidBookException.class, () -> { + throw new NotValidBookException(errorMessage); + }); + + assertEquals(errorMessage, exception.getMessage()); + } + + @Test + @DisplayName("Exception should be catchable as a general Exception") + void testExceptionInheritance() { + String errorMessage = "Invalid book data"; + + try { + throw new NotValidBookException(errorMessage); + } catch (Exception e) { + assertEquals(NotValidBookException.class, e.getClass()); + assertEquals(errorMessage, e.getMessage()); + } + } +} -- 2.54.0 From 4c79ddcf6a4d0254dc9c71563d6d89fc150d4c31 Mon Sep 17 00:00:00 2001 From: felix-vi Date: Sun, 26 Apr 2026 17:53:24 +0200 Subject: [PATCH 15/19] =?UTF-8?q?:white=5Fcheck=5Fmark:=20cr=C3=A9ation=20?= =?UTF-8?q?des=20test=20des=20fonctions=20d'une=20BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/repository/BookRepositoryTest.java | 255 ++++++++++++++++++ 1 file changed, 255 insertions(+) create mode 100644 src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/repository/BookRepositoryTest.java diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/repository/BookRepositoryTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/repository/BookRepositoryTest.java new file mode 100644 index 0000000..62908e9 --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/repository/BookRepositoryTest.java @@ -0,0 +1,255 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book.repository; + +import fr.iut_fbleau.but3.dev62.mylibrary.book.entity.Book; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class BookRepositoryTest { + + private BookRepository repository; + private Book book1; + private Book book2; + + @BeforeEach + void setUp() { + repository = new BookRepository(); + + LocalDate date = LocalDate.of(2026, 3, 24); + ArrayList categories = new ArrayList<>(); + categories.add("Thriller"); + categories.add("Biographie"); + + book1 = Book.builder() + .isbn("1234567891012") + .title("La vie de Maxime") + .author("Marvin Aubert") + .editor("Kioon") + .date(date) + .price(12.99) + .stock(50) + .categories(categories) + .description("C'était un brave partit trop tôt") + .language("Français") + .build(); + + book2 = Book.builder() + .isbn("1234567891015") + .title("La vie de Marvin") + .author("Maxime Lebreton") + .editor("Kioon") + .date(date) + .price(12.99) + .stock(50) + .categories(categories) + .description("C'était un brave partit trop tôt") + .language("Français") + .build(); + } + + @Test + @DisplayName("New repository should be empty") + void testNewRepositoryIsEmpty() { + List books = repository.findAll(); + + assertTrue(books.isEmpty()); + assertEquals(0, books.size()); + } + + @Nested + @DisplayName("Save operations") + class SaveOperations { + + @Test + @DisplayName("Save should add a new book") + void testSaveNewBook() { + Book savedBook = repository.save(book1); + + assertEquals(1, repository.findAll().size()); + assertEquals(book1.getIsbn(), savedBook.getIsbn()); + assertEquals(book1.getTitle(), savedBook.getTitle()); + } + + @Test + @DisplayName("Save should update existing book with same isbn") + void testSaveUpdatesExistingBook() { + repository.save(book1); + + String isbn = "1516515616216"; + LocalDate date = LocalDate.of(2026, 3, 24); + ArrayList categories = new ArrayList<>(); + categories.add("Thriller"); + categories.add("Biographie"); + + Book updatedBook = Book.builder() + .isbn(isbn) + .title("La vie de Maxime") + .author("Updated") + .editor("Kioon") + .date(date) + .price(12.99) + .stock(50) + .categories(categories) + .description("C'était un brave partit trop tôt") + .language("Français") + .build(); + + Book savedBook = repository.save(updatedBook); + + assertEquals(1, repository.findAll().size()); + assertEquals(isbn, savedBook.getIsbn()); + assertEquals("La vie de Maxime", savedBook.getTitle()); + assertEquals("Updated", savedBook.getAuthor()); + assertEquals("Kioon", savedBook.getEditor()); + assertEquals(date, savedBook.getDate()); + assertEquals(12.99, savedBook.getPrice()); + assertEquals(50, savedBook.getStock()); + assertEquals(categories, savedBook.getCategories()); + assertEquals("C'était un brave partit trop tôt", savedBook.getDescription()); + assertEquals("Français", savedBook.getLanguage()); + } + + @Test + @DisplayName("Save multiple books should add all of them") + void testSaveMultipleBooks() { + repository.save(book1); + repository.save(book2); + + List books = repository.findAll(); + + assertEquals(2, books.size()); + assertTrue(books.contains(book1)); + assertTrue(books.contains(book2)); + } + } + + @Nested + @DisplayName("Find operations") + class FindOperations { + + @BeforeEach + void setUpBooks() { + repository.save(book1); + repository.save(book2); + } + + @Test + @DisplayName("FindAll should return all books") + void testFindAll() { + List books = repository.findAll(); + + assertEquals(2, books.size()); + assertTrue(books.contains(book1)); + assertTrue(books.contains(book2)); + } + + @Test + @DisplayName("FindByIsbn should return book with matching isbn") + void testFindByIsbn() { + Optional foundBook = repository.findByIsbn(book1.getIsbn()); + + assertTrue(foundBook.isPresent()); + assertEquals(book1.getTitle(), foundBook.get().getTitle()); + assertEquals(book1.getAuthor(), foundBook.get().getAuthor()); + } + + @Test + @DisplayName("FindByIsbn should return empty Optional when isbn doesn't exist") + void testFindByIsbnNotFound() { + String nonExistedisbn = "1515265522652"; + + Optional foundBook = repository.findByIsbn(nonExistedisbn); + + assertTrue(foundBook.isEmpty()); + } + + @Test + @DisplayName("ExistsByIsbn should return true when isbn exists") + void testExistsByIsbnExists() { + boolean exists = repository.existsByIsbn(book1.getIsbn()); + + assertTrue(exists); + } + + @Test + @DisplayName("ExistsByIsbn should return false when isbn doesn't exist") + void testExistsByIsbnNotExists() { + String nonExistedisbn = "1515265522652"; + + boolean exists = repository.existsByIsbn(nonExistedisbn); + + assertFalse(exists); + } + } + + @Nested + @DisplayName("Delete operations") + class DeleteOperations { + + @BeforeEach + void setUpCustomers() { + repository.save(book1); + repository.save(book2); + } + + @Test + @DisplayName("Delete should remove the specified book") + void testDelete() { + repository.delete(book1); + + List books = repository.findAll(); + + assertEquals(1, books.size()); + assertFalse(books.contains(book1)); + assertTrue(books.contains(book2)); + } + + @Test + @DisplayName("DeleteAll should remove all books") + void testDeleteAll() { + repository.deleteAll(); + + List books = repository.findAll(); + + assertTrue(books.isEmpty()); + assertEquals(0, books.size()); + } + + @Test + @DisplayName("Delete should not throw exception when book doesn't exist") + void testDeleteNonExistentBook() { + LocalDate date = LocalDate.of(2026, 3, 24); + ArrayList categories = new ArrayList<>(); + categories.add("Thriller"); + categories.add("Biographie"); + Book nonExistentBook = Book.builder() + .isbn("1515466461319") + .title("La vie de Patrick") + .author("Updated") + .editor("Kioon") + .date(date) + .price(12.99) + .stock(50) + .categories(categories) + .description("C'était un brave partit trop tôt") + .language("Français") + .build(); + + assertDoesNotThrow(() -> repository.delete(nonExistentBook)); + + assertEquals(2, repository.findAll().size()); + } + } +} -- 2.54.0 From 099cb403cad86449de1c4df1dc44eb1e16f72d90 Mon Sep 17 00:00:00 2001 From: felix-vi Date: Sun, 26 Apr 2026 18:11:37 +0200 Subject: [PATCH 16/19] =?UTF-8?q?:white=5Fcheck=5Fmark:=20r=C3=A9ussite=20?= =?UTF-8?q?des=20test=20pour=20une=20future=20BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/repository/BookRepository.java | 43 +++++++++++++++++++ .../book/repository/BookRepositoryTest.java | 6 +-- 2 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/repository/BookRepository.java diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/repository/BookRepository.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/repository/BookRepository.java new file mode 100644 index 0000000..f7790b5 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/repository/BookRepository.java @@ -0,0 +1,43 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book.repository; + +import fr.iut_fbleau.but3.dev62.mylibrary.book.entity.Book; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class BookRepository { + + private final List books = new ArrayList<>(); + + public List findAll() { + return books; + } + + public void deleteAll() { + books.clear(); + } + + public Book save(Book newBook) { + Optional optionalBookWithSameIsbn = this.findByIsbn(newBook.getIsbn()); + optionalBookWithSameIsbn.ifPresent(books::remove); + this.books.add(newBook); + return newBook; + } + + public Optional findByIsbn(String isbn) { + return this.books.stream() + .filter(book -> book.getIsbn().equals(isbn)) + .findFirst(); + } + + public boolean existsByIsbn(String isbn) { + return this.books.stream() + .anyMatch(book -> book.getIsbn().equals(isbn)); + } + + public void delete(Book book) { + + this.books.remove(book); + } +} diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/repository/BookRepositoryTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/repository/BookRepositoryTest.java index 62908e9..5d3d5e6 100644 --- a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/repository/BookRepositoryTest.java +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/repository/BookRepositoryTest.java @@ -87,7 +87,7 @@ public class BookRepositoryTest { void testSaveUpdatesExistingBook() { repository.save(book1); - String isbn = "1516515616216"; + String isbn = "1234567891012"; LocalDate date = LocalDate.of(2026, 3, 24); ArrayList categories = new ArrayList<>(); categories.add("Thriller"); @@ -102,7 +102,7 @@ public class BookRepositoryTest { .price(12.99) .stock(50) .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") .build(); @@ -117,7 +117,7 @@ public class BookRepositoryTest { assertEquals(12.99, savedBook.getPrice()); assertEquals(50, savedBook.getStock()); assertEquals(categories, savedBook.getCategories()); - assertEquals("C'était un brave partit trop tôt", savedBook.getDescription()); + assertEquals("C'était un brave partit trop tôt beaucoup trop tôt", savedBook.getDescription()); assertEquals("Français", savedBook.getLanguage()); } -- 2.54.0 From 4d47cdd9a012314a333c6f1d9983d7db7dbc7343 Mon Sep 17 00:00:00 2001 From: felix-vi Date: Tue, 28 Apr 2026 18:18:23 +0200 Subject: [PATCH 17/19] =?UTF-8?q?:white=5Fcheck=5Fmark:=20test=20des=20use?= =?UTF-8?q?case=20cr=C3=A9er?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/validator/BookValidator.java | 7 +- .../dev62/mylibrary/book/entity/BookTest.java | 4 +- .../book/repository/BookRepositoryTest.java | 2 +- .../book/usecase/BookUseCaseTest.java | 345 ++++++++++++++++++ 4 files changed, 351 insertions(+), 7 deletions(-) create mode 100644 src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/usecase/BookUseCaseTest.java 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 ca601b0..66626af 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 @@ -4,7 +4,6 @@ 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.exception.NotValidBookException; -import fr.iut_fbleau.but3.dev62.mylibrary.customer.exception.NotValidCustomerException; import java.time.LocalDate; import java.util.ArrayList; @@ -24,7 +23,7 @@ public class BookValidator { private BookValidator() { } - public static void validate(BookInfo newBook) throws NotValidCustomerException { + public static void validate(BookInfo newBook) throws NotValidBookException { validateISBN(newBook); validateTitle(newBook); validateAuthor(newBook); @@ -32,12 +31,12 @@ public class BookValidator { validateDate(newBook); } - public static void validate(BookSalesInfo newBook) throws NotValidCustomerException { + public static void validate(BookSalesInfo newBook) throws NotValidBookException { validatePrice(newBook); validateStock(newBook); } - public static void validate(BookDetails newBook) throws NotValidCustomerException { + public static void validate(BookDetails newBook) throws NotValidBookException { validateCategories(newBook); validateLanguage(newBook); } diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/BookTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/BookTest.java index 1af2d9a..1cf6303 100644 --- a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/BookTest.java +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/entity/BookTest.java @@ -15,8 +15,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue; public class BookTest { @Test - @DisplayName("Builder should create a valid Customer instance") - void testCustomerBuilder() { + @DisplayName("Builder should create a valid Book instance") + void testBookBuilder() { String isbn = "1234567891012"; String title = "La vie de Maxime"; String author = "Marvin Aubert"; diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/repository/BookRepositoryTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/repository/BookRepositoryTest.java index 5d3d5e6..a6c5669 100644 --- a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/repository/BookRepositoryTest.java +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/repository/BookRepositoryTest.java @@ -199,7 +199,7 @@ public class BookRepositoryTest { class DeleteOperations { @BeforeEach - void setUpCustomers() { + void setUpBooks() { repository.save(book1); repository.save(book2); } 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 new file mode 100644 index 0000000..5820538 --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/usecase/BookUseCaseTest.java @@ -0,0 +1,345 @@ +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.entity.Book; +import fr.iut_fbleau.but3.dev62.mylibrary.book.exception.NotValidBookException; +import fr.iut_fbleau.but3.dev62.mylibrary.book.repository.BookRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; +import static org.mockito.Mockito.never; + +@ExtendWith(MockitoExtension.class) +public class BookUseCaseTest { + + @Mock + private BookRepository bookRepository; + + @InjectMocks + private BookUseCase bookUseCase; + + private String bookIsbn; + private ArrayList categories; + private LocalDate date; + private Book testBook; + private BookInfo validBookInfo; + private BookDetails validBookDetails; + private BookSalesInfo validBookSalesInfo; + + @BeforeEach + void setUp() { + bookIsbn = "1234567891012"; + date = LocalDate.of(2026, 3, 24); + categories = new ArrayList<>(); + categories.add("Thriller"); + categories.add("Biographie"); + + testBook = Book.builder() + .isbn(bookIsbn) + .title("La vie de Maxime") + .author("Marvin AUbert") + .editor("Kioon") + .date(date) + .price(12.99) + .stock(50) + .categories(categories) + .description("C'était un brave partit trop tôt") + .language("Français") + .build(); + + validBookInfo = new BookInfo(bookIsbn,"La vie de Maxime", "Marvin AUbert", "Kioon", date); + validBookSalesInfo = BookSalesInfo.builder() + .price(12.99) + .stock(50) + .build(); + validBookDetails = BookDetails.builder() + .categories(categories) + .description("C'était un brave partit trop tôt") + .language("Français") + .build(); + } + + @Nested + @DisplayName("Register Book tests") + class RegisterBookTests { + + @Test + @DisplayName("Should register book when valid data is provided") + void testRegisterBookWithValidData() throws NotValidBookException { + when(bookRepository.save(any(Book.class))).thenReturn(testBook); + + String registeredIsbn = bookUseCase.registerBook(validBookInfo); + + assertNotNull(registeredIsbn); + assertEquals(bookIsbn, registeredIsbn); + verify(bookRepository, times(1)).save(any(Book.class)); + } + + @Test + @DisplayName("Should throw exception when book data is not valid") + void testRegisterBookWithInvalidData() { + BookInfo invalidBookInfo = new BookInfo(bookIsbn,"", "", "", date); + + assertThrows(NotValidBookException.class, + () -> bookUseCase.registerBook(invalidBookInfo)); + + verify(bookRepository, never()).save(any(Book.class)); + } + } + + @Nested + @DisplayName("Find book tests") + class FindBookTests { + + @Test + @DisplayName("Should return book when isbn exists") + void testFindBookByIsbn() { + when(bookRepository.findByIsbn("1234567891012")).thenReturn(Optional.of(testBook)); + + Optional foundBook = bookUseCase.findBookByIsbn("1234567891012"); + + assertTrue(foundBook.isPresent()); + assertEquals(testBook.getIsbn(), foundBook.get().getIsbn()); + assertEquals(testBook.getTitle(), foundBook.get().getTitle()); + verify(bookRepository, times(1)).findByIsbn("1234567891012"); + } + + @Test + @DisplayName("Should return empty Optional when isbn doesn't exist") + void testFindBookByIsbn() { + when(bookRepository.findByIsbn("1656546262516")).thenReturn(Optional.empty()); + + Optional foundBook = bookUseCase.findBookByIsbn("1656546262516"); + + assertTrue(foundBook.isEmpty()); + verify(bookRepository, times(1)).findByIsbn("1656546262516"); + } + } + + @Nested + @DisplayName("Update book tests") + class UpdateBookTests { + + @Test + @DisplayName("Should update book when valid data is provided") + void testUpdateBookWithValidData() throws BookNotFoundException, NotValidBookException { + when(bookRepository.findByIsbn(bookIsbn)).thenReturn(Optional.of(testBook)); + + Book updatedBook = Book.builder() + .isbn(bookIsbn) + .title("La vie de Maxime") + .author("Updated") + .editor("Kioon") + .date(date) + .price(12.99) + .stock(50) + .categories(categories) + .description("C'était un brave partit trop tôt") + .language("Français") + .build(); + + when(bookRepository.save(any(Book.class))).thenReturn(updatedBook); + + BookInfo updateInfo = new BookInfo(bookIsbn, "La vie de Maxime", "Updated", "Kioon", date); + BookSalesInfo updateSalesInfo = BookSalesInfo.builder() + .price(12.99) + .stock(50) + .build(); + BookDetails updateDetails = BookDetails.builder() + .categories(categories) + .description("C'était un brave partit trop tôt") + .language("Français") + .build(); + BookDTO result = BookUseCase.updateBook(updateInfo, updateSalesInfo, updateDetails); + + assertNotNull(result); + assertEquals(bookIsbn, result.getIsbn()); + assertEquals("La vie de Maxime", result.getTitle()); + assertEquals("Updated", result.getAuthor()); + assertEquals("Kioon", result.getEditor()); + assertEquals(date, result.getDate()); + assertEquals(12.99, result.getPrice()); + assertEquals(50, result.getStock()); + assertEquals(categories, result.getCategories()); + assertEquals("C'était un brave partit trop tôt", result.getDescription()); + assertEquals("Français", result.getLanguage()); + verify(bookRepository, times(1)).findByIsbn(bookIsbn); + verify(bookRepository, times(1)).save(any(Book.class)); + } + + @Test + @DisplayName("Should throw exception when book isbn doesn't exist") + void testUpdateBookNotFound() { + String nonExistentIsbn = "1656546262516"; + when(bookRepository.findByIsbn(nonExistentIsbn)).thenReturn(Optional.empty()); + + BookInfo updateInfo = new BookInfo(nonExistentIsbn, "La vie de Maxime", "Updated", "Kioon", date); + BookSalesInfo updateSalesInfo = BookSalesInfo.builder() + .price(12.99) + .stock(50) + .build(); + BookDetails updateDetails = BookDetails.builder() + .categories(categories) + .description("C'était un brave partit trop tôt") + .language("Français") + .build(); + + assertThrows(BookNotFoundException.class, + () -> bookUseCase.updateBook(updateInfo, updateSalesInfo, updateDetails)); + + verify(bookRepository, times(1)).findByIsbn(nonExistentIsbn); + verify(bookRepository, never()).save(any(Book.class)); + } + + @Test + @DisplayName("Should throw exception when update data is not valid") + void testUpdateBookWithInvalidData() { + BookInfo invalidUpdateInfo = 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, + () -> bookUseCase.updateBook(invalidUpdateInfo, invalidUpdateSalesInfo, invalidUpdateDetails)); + + verify(bookRepository, never()).findByIsbn(any(String.class)); + verify(bookRepository, never()).save(any(Book.class)); + } + } + + @Nested + @DisplayName("Delete book tests") + class DeleteBookTests { + + @Test + @DisplayName("Should delete book when isbn exists") + void testDeleteBook() throws BookNotFoundException { + when(bookRepository.findByIsbn(bookIsbn)).thenReturn(Optional.of(testBook)); + doNothing().when(bookRepository).delete(testBook); + + bookUseCase.deleteBook(bookIsbn); + + verify(bookRepository, times(1)).findByIsbn(bookIsbn); + verify(bookRepository, times(1)).delete(testBook); + } + + @Test + @DisplayName("Should throw exception when book isbn doesn't exist") + void testDeleteBookNotFound() { + String nonExistentIsbn = "1656546262516"; + when(bookRepository.findByIsbn(nonExistentIsbn)).thenReturn(Optional.empty()); + + assertThrows(BookNotFoundException.class, + () -> bookUseCase.deleteBook(nonExistentIsbn)); + + verify(bookRepository, times(1)).findByIsbn(nonExistentIsbn); + verify(bookRepository, never()).delete(any(Book.class)); + } + } + + @Nested + @DisplayName("Stock copies tests") + class StockCopiesTests { + + @Test + @DisplayName("Should add stock copies to book") + void testAddStockCopies() throws BookNotFoundException { + when(bookRepository.findByIsbn(bookIsbn)).thenReturn(Optional.of(testBook)); + when(bookRepository.save(testBook)).thenReturn(testBook); + + int initialCopies = testBook.getStock(); + int copiesToAdd = 50; + int expectedCopies = initialCopies + copiesToAdd; + + int newCopies = bookUseCase.addStockCopies(bookIsbn, copiesToAdd); + + assertEquals(expectedCopies, newCopies); + assertEquals(expectedCopies, testBook.getStock()); + verify(bookRepository, times(1)).findByIsbn(bookIsbn); + verify(bookRepository, times(1)).save(testBook); + } + + @Test + @DisplayName("Should throw exception when adding copies to non-existent book") + void testAddStockCopiesToNonExistentBook() { + String nonExistentIsbn = "1656546262516"; + when(bookRepository.findByIsbn(nonExistentIsbn)).thenReturn(Optional.empty()); + + assertThrows(BookNotFoundException.class, + () -> bookUseCase.addStockCopies(nonExistentIsbn, 50)); + + verify(bookRepository, times(1)).findByIsbn(nonExistentIsbn); + verify(bookRepository, never()).save(any(Book.class)); + } + + @Test + @DisplayName("Should subtract stock copies from book") + void testSubtractStockCopies() throws BookNotFoundException, IllegalBookCpoiesException { + when(bookRepository.findByIsbn(bookIsbn)).thenReturn(Optional.of(testBook)); + when(bookRepository.save(testBook)).thenReturn(testBook); + + int initialCopies = testBook.getStock(); + int copiesToRemove = 30; + int expectedCopies = initialCopies - copiesToRemove; + + int newCopies = bookUseCase.subtractStockCopies(bookIsbn, copiesToRemove); + + assertEquals(expectedCopies, newCopies); + assertEquals(expectedCopies, testBook.getStock()); + verify(bookRepository, times(1)).findByIsbn(bookIsbn); + verify(bookRepository, times(1)).save(testBook); + } + + @Test + @DisplayName("Should throw exception when trying to remove more copies than available") + void testSubtractTooManyStockCopies() { + when(bookRepository.findByIsbn(bookIsbn)).thenReturn(Optional.of(testBook)); + + int copiesToRemove = 200; + + assertThrows(IllegalBookCpoiesException.class, + () -> bookUseCase.subtractStockCopies(bookIsbn, copiesToRemove)); + + verify(bookRepository, times(1)).findByIsbn(bookIsbn); + verify(bookRepository, never()).save(any(Book.class)); + } + + @Test + @DisplayName("Should throw exception when subtracting copies from non-existent book") + void testSubtractStockCopiesFromNonExistentBook() { + String nonExistentIsbn = "1656546262516"; + when(bookRepository.findByIsbn(nonExistentIsbn)).thenReturn(Optional.empty()); + + assertThrows(BookNotFoundException.class, + () -> bookUseCase.subtractStockCopies(nonExistentIsbn, 50)); + + verify(bookRepository, times(1)).findByIsbn(nonExistentIsbn); + verify(bookRepository, never()).save(any(Book.class)); + } + } +} -- 2.54.0 From 5196f30fd8bf06e69f7382c2b9e60bc600f4cb7a Mon Sep 17 00:00:00 2001 From: felix-vi Date: Tue, 28 Apr 2026 18:59:19 +0200 Subject: [PATCH 18/19] =?UTF-8?q?:white=5Fcheck=5Fmark:=20r=C3=A9ussite=20?= =?UTF-8?q?des=20test=20des=20usecase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mylibrary/book/usecase/BookUseCase.java | 90 +++++++++++++++++++ .../book/usecase/BookUseCaseTest.java | 30 ++++--- 2 files changed, 110 insertions(+), 10 deletions(-) create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/usecase/BookUseCase.java 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 new file mode 100644 index 0000000..b59de47 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/usecase/BookUseCase.java @@ -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 findBookByIsbn(String isbn) { + Optional 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 optionalBookByIsbn = bookRepository.findByIsbn(isbn); + if (optionalBookByIsbn.isEmpty()) { + throw new BookNotFoundException(isbn); + } + return optionalBookByIsbn.get(); + } +} 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 5820538..64f1eec 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 @@ -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.BookSalesInfo; 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 org.junit.jupiter.api.BeforeEach; @@ -87,7 +89,7 @@ public class BookUseCaseTest { void testRegisterBookWithValidData() throws NotValidBookException { when(bookRepository.save(any(Book.class))).thenReturn(testBook); - String registeredIsbn = bookUseCase.registerBook(validBookInfo); + String registeredIsbn = bookUseCase.registerBook(validBookInfo, validBookSalesInfo, validBookDetails); assertNotNull(registeredIsbn); assertEquals(bookIsbn, registeredIsbn); @@ -98,9 +100,17 @@ public class BookUseCaseTest { @DisplayName("Should throw exception when book data is not valid") void testRegisterBookWithInvalidData() { 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, - () -> bookUseCase.registerBook(invalidBookInfo)); + () -> bookUseCase.registerBook(invalidBookInfo, invalidUpdateSalesInfo, invalidUpdateDetails)); verify(bookRepository, never()).save(any(Book.class)); } @@ -125,7 +135,7 @@ public class BookUseCaseTest { @Test @DisplayName("Should return empty Optional when isbn doesn't exist") - void testFindBookByIsbn() { + void testFindBookByIsbnNotFound() { when(bookRepository.findByIsbn("1656546262516")).thenReturn(Optional.empty()); Optional foundBook = bookUseCase.findBookByIsbn("1656546262516"); @@ -166,10 +176,10 @@ public class BookUseCaseTest { .build(); BookDetails updateDetails = BookDetails.builder() .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") .build(); - BookDTO result = BookUseCase.updateBook(updateInfo, updateSalesInfo, updateDetails); + BookDTO result = bookUseCase.updateBook(bookIsbn, updateInfo, updateSalesInfo, updateDetails); assertNotNull(result); assertEquals(bookIsbn, result.getIsbn()); @@ -204,7 +214,7 @@ public class BookUseCaseTest { .build(); assertThrows(BookNotFoundException.class, - () -> bookUseCase.updateBook(updateInfo, updateSalesInfo, updateDetails)); + () -> bookUseCase.updateBook(nonExistentIsbn, updateInfo, updateSalesInfo, updateDetails)); verify(bookRepository, times(1)).findByIsbn(nonExistentIsbn); verify(bookRepository, never()).save(any(Book.class)); @@ -225,7 +235,7 @@ public class BookUseCaseTest { .build(); assertThrows(NotValidBookException.class, - () -> bookUseCase.updateBook(invalidUpdateInfo, invalidUpdateSalesInfo, invalidUpdateDetails)); + () -> bookUseCase.updateBook(bookIsbn, invalidUpdateInfo, invalidUpdateSalesInfo, invalidUpdateDetails)); verify(bookRepository, never()).findByIsbn(any(String.class)); verify(bookRepository, never()).save(any(Book.class)); @@ -299,7 +309,7 @@ public class BookUseCaseTest { @Test @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.save(testBook)).thenReturn(testBook); @@ -322,7 +332,7 @@ public class BookUseCaseTest { int copiesToRemove = 200; - assertThrows(IllegalBookCpoiesException.class, + assertThrows(IllegalBookStockException.class, () -> bookUseCase.subtractStockCopies(bookIsbn, copiesToRemove)); verify(bookRepository, times(1)).findByIsbn(bookIsbn); -- 2.54.0 From ee299e1e19eb957b55a9873a77303bc630dd4239 Mon Sep 17 00:00:00 2001 From: felix-vi Date: Tue, 28 Apr 2026 19:09:55 +0200 Subject: [PATCH 19/19] =?UTF-8?q?:white=5Fcheck=5Fmark:=20r=C3=A9ussite=20?= =?UTF-8?q?des=20test=20du=20fichier=20exception=20BookNotFoundException?= =?UTF-8?q?=20et=20bons=20appel=20dans=20les=20test=20des=20usecases?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/exception/BookNotFoundException.java | 11 +++++ .../exception/BookNotFoundExceptionTest.java | 48 +++++++++++++++++++ .../book/usecase/BookUseCaseTest.java | 1 + 3 files changed, 60 insertions(+) create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/BookNotFoundException.java create mode 100644 src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/BookNotFoundExceptionTest.java diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/BookNotFoundException.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/BookNotFoundException.java new file mode 100644 index 0000000..51136c0 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/BookNotFoundException.java @@ -0,0 +1,11 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book.exception; + +import java.text.MessageFormat; + +public class BookNotFoundException extends RuntimeException { + public static final String THE_BOOK_WITH_ID_DOES_NOT_EXIST_MESSAGE = "The book with isbn {0} does not exist"; + + public BookNotFoundException(String isbn) { + super(MessageFormat.format(THE_BOOK_WITH_ID_DOES_NOT_EXIST_MESSAGE, isbn)); + } +} diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/BookNotFoundExceptionTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/BookNotFoundExceptionTest.java new file mode 100644 index 0000000..bbcc134 --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/exception/BookNotFoundExceptionTest.java @@ -0,0 +1,48 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book.exception; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class BookNotFoundExceptionTest { + + @Test + @DisplayName("Exception message should contain the isbn provided") + void testExceptionMessageContainsIsbn() { + String isbn = "1234567891012"; + + BookNotFoundException exception = new BookNotFoundException(isbn); + + String expectedMessage = String.format("The book with isbn %s does not exist", isbn); + assertEquals(expectedMessage, exception.getMessage()); + } + + @Test + @DisplayName("Exception should use the correct constant message format") + void testExceptionUsesConstantMessageFormat() { + String isbn = "1234567891012"; + + BookNotFoundException exception = new BookNotFoundException(isbn); + + String expectedFormatWithPlaceholder = "The book with isbn {0} does not exist"; + assertEquals(BookNotFoundException.THE_BOOK_WITH_ID_DOES_NOT_EXIST_MESSAGE, + expectedFormatWithPlaceholder); + assertTrue(exception.getMessage().contains(isbn.toString())); + } + + @Test + @DisplayName("Exception should be properly thrown and caught") + void testExceptionCanBeThrownAndCaught() { + String isbn = "1234567891012"; + + try { + throw new BookNotFoundException(isbn); + } catch (BookNotFoundException e) { + String expectedMessage = String.format("The book with isbn %s does not exist", isbn); + assertEquals(expectedMessage, e.getMessage()); + } + } +} 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 64f1eec..eda3b8c 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 @@ -6,6 +6,7 @@ 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.entity.Book; import fr.iut_fbleau.but3.dev62.mylibrary.book.exception.BookNotFoundException; +import fr.iut_fbleau.but3.dev62.mylibrary.book.exception.BookNotFoundExceptionTest; 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; -- 2.54.0