From cdf4c046bc9dd34401336cc667425e9d2ee1acf5 Mon Sep 17 00:00:00 2001 From: Naernis Date: Fri, 13 Jun 2025 21:12:24 +0200 Subject: [PATCH] book end --- .../but3/dev62/mylibrary/book/book.java | 52 +++++++ .../dev62/mylibrary/book/bookManagement.java | 54 +++++++ .../dev62/mylibrary/book/bookError/error.java | 43 ++++++ .../book/function/bookFunctionTest.java | 145 ++++++++++++++++++ .../mylibrary/book/result/bookResultTest.java | 81 ++++++++++ .../mylibrary/features/book/BookSteps.java | 2 - 6 files changed, 375 insertions(+), 2 deletions(-) create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/book.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/bookManagement.java create mode 100644 src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/bookError/error.java create mode 100644 src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/function/bookFunctionTest.java create mode 100644 src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/result/bookResultTest.java diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/book.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/book.java new file mode 100644 index 0000000..d76d70c --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/book.java @@ -0,0 +1,52 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book; + +public class book { + private String isbn; + private String title; + private String author; + private String publisher; + private String publicationDate; + private String price; + private String quantity; + private String language; + + public book(String isbn, String title, String author, String publisher, + String publicationDate, String price, String quantity, String language) { + this.isbn = isbn; + this.title = title; + this.author = author; + this.publisher = publisher; + this.publicationDate = publicationDate; + this.price = price; + this.quantity = quantity; + this.language = language; + } + + // Getters (setters optionnels si besoin) + + public String getIsbn() { + return isbn; + } + public String getTitle() { + return title; + } + public String getAuthor() { + return author; + } + public String getPublisher() { + return publisher; + } + public String getPublicationDate() { + return publicationDate; + } + public String getPrice() { + return price; + } + public String getQuantity() { + return quantity; + } + public String getLanguage() { + return language; + } + +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/bookManagement.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/bookManagement.java new file mode 100644 index 0000000..fbfcd54 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/book/bookManagement.java @@ -0,0 +1,54 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book; +import java.util.*; + +public class bookManagement { + private final Map books = new LinkedHashMap<>(); + + public boolean registerBook(book book) { + if (!isValid(book)) { + throw new IllegalArgumentException("Invalid book data provided"); + } + if (books.containsKey(book.getIsbn())) { + throw new IllegalStateException("Conflict with existing book in database"); + } + books.put(book.getIsbn(), book); + return true; + } + + public List getAllBooks() { + return new ArrayList<>(books.values()); + } + + public book getBookByIsbn(String isbn) { + if (!books.containsKey(isbn)) { + throw new NoSuchElementException("Book not found"); + } + return books.get(isbn); + } + + public List getBooksByTitle(String title) { + return books.values().stream() + .filter(book -> book.getTitle().equalsIgnoreCase(title)) + .toList(); + } + + public int getBookCount() { + return books.size(); + } + + private boolean isValid(book book) { + return book != null && + notEmpty(book.getIsbn()) && + notEmpty(book.getTitle()) && + notEmpty(book.getAuthor()) && + notEmpty(book.getPublisher()) && + notEmpty(book.getPublicationDate()) && + notEmpty(book.getPrice()) && + notEmpty(book.getQuantity()) && + notEmpty(book.getLanguage()); + } + + private boolean notEmpty(String value) { + return value != null && !value.isBlank(); + } +} diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/bookError/error.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/bookError/error.java new file mode 100644 index 0000000..082ddb7 --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/bookError/error.java @@ -0,0 +1,43 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book.bookError; + +import org.junit.jupiter.api.*; +import static org.junit.jupiter.api.Assertions.*; +import java.util.*; + +@DisplayName("Book error and failure scenarios") +public class error { + + private String lastErrorMessage; + private boolean lastOperationSuccess; + private List> lastBookResult; + + @Test + @DisplayName("Registration fails when data is invalid") + void testRegistrationFails() { + lastOperationSuccess = false; + assertFalse(lastOperationSuccess); + } + + @Test + @DisplayName("Error message contains expected substring") + void testErrorMessageContains() { + lastErrorMessage = "Conflict with existing book in database"; + assertNotNull(lastErrorMessage); + assertTrue(lastErrorMessage.contains("Conflict")); + } + + @Test + @DisplayName("Receiving an empty list of books") + void testEmptyBookList() { + lastBookResult = new ArrayList<>(); + assertNotNull(lastBookResult); + assertTrue(lastBookResult.isEmpty()); + } + + @Test + @DisplayName("Request fails") + void testRequestFails() { + lastOperationSuccess = false; + assertFalse(lastOperationSuccess); + } +} diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/function/bookFunctionTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/function/bookFunctionTest.java new file mode 100644 index 0000000..101bca8 --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/function/bookFunctionTest.java @@ -0,0 +1,145 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book.function; + +import static org.junit.jupiter.api.Assertions.*; +import io.cucumber.datatable.DataTable; +import org.junit.jupiter.api.*; +import java.util.*; + +@DisplayName("Book retrieval scenarios and data registration") +public class bookFunctionTest { + + private Map> books; + private List> lastBookResult; + private Map lastSingleBookResult; + private boolean lastOperationSuccess; + private String lastErrorMessage; + + @BeforeEach + void setUp() { + books = new HashMap<>(); + lastBookResult = new ArrayList<>(); + lastSingleBookResult = null; + lastOperationSuccess = false; + lastErrorMessage = null; + } + + @Test + @DisplayName("Register a new book with valid data") + void testRegisterNewBook() { + DataTable dataTable = DataTable.create( + List.of( + List.of("isbn", "title", "author", "publisher", "publicationDate", "price", "quantity", "language"), + List.of("999", "La vie de Bob", "Boby Bob", "Bob", "2025-01-01", "29.99", "10", "FR") + ) + ); + iRegisterANewBookWithTheFollowingInformation(dataTable); + assertTrue(lastOperationSuccess); + } + + public void iRegisterANewBookWithTheFollowingInformation(DataTable dataTable) { + Map newBook = dataTable.asMaps(String.class, String.class).get(0); + String isbn = newBook.get("isbn"); + + if (isbn == null || isbn.isBlank() + || newBook.get("title") == null || newBook.get("title").isBlank() + || newBook.get("author") == null || newBook.get("author").isBlank() + || newBook.get("publisher") == null || newBook.get("publisher").isBlank() + || newBook.get("publicationDate") == null || newBook.get("publicationDate").isBlank() + || newBook.get("price") == null || newBook.get("price").isBlank() + || newBook.get("quantity") == null || newBook.get("quantity").isBlank() + || newBook.get("language") == null || newBook.get("language").isBlank()) { + lastOperationSuccess = false; + lastErrorMessage = "Invalid book data provided"; + return; + } + + if (books.containsKey(isbn)) { + lastOperationSuccess = false; + lastErrorMessage = "Conflict with existing book in database"; + return; + } + + books.put(isbn, new HashMap<>(newBook)); + lastOperationSuccess = true; + lastErrorMessage = null; + } + + @Test + @DisplayName("Request all books") + void testRequestAllBooks() { + books.put("1", Map.of("title", "Livre A")); + books.put("2", Map.of("title", "Livre B")); + + iRequestAllBooks(); + assertEquals(2, lastBookResult.size()); + } + + public void iRequestAllBooks() { + lastBookResult = new ArrayList<>(books.values()); + lastOperationSuccess = true; + lastErrorMessage = null; + } + + @Test + @DisplayName("Request single book by ID") + void testRequestBookById() { + books.put("123", Map.of("isbn", "123", "title", "blabla")); + iRequestTheBookWithId("123"); + + assertNotNull(lastSingleBookResult); + assertEquals("blabla", lastSingleBookResult.get("title")); + } + + public void iRequestTheBookWithId(String isbn) { + if (!books.containsKey(isbn)) { + lastSingleBookResult = null; + lastOperationSuccess = false; + lastErrorMessage = "Book not found"; + return; + } + lastSingleBookResult = books.get(isbn); + lastOperationSuccess = true; + lastErrorMessage = null; + } + + @Test + @DisplayName("Attempt to register a book that should fail") + void testRegisterBookWithExpectedFailure() { + DataTable dataTable = DataTable.create( + List.of( + List.of("isbn", "title", "author", "publisher", "publicationDate", "price", "quantity", "language"), + List.of("666", "La vie de Boby", "Boby Bob", "bob", "2025-01-01", "25.00", "10", "FR") + ) + ); + iTryToRegisterANewBookWithTheFollowingInformation(dataTable); + assertFalse(lastOperationSuccess); + assertNotNull(lastErrorMessage); + } + + public void iTryToRegisterANewBookWithTheFollowingInformation(DataTable dataTable) { + iRegisterANewBookWithTheFollowingInformation(dataTable); + if (lastOperationSuccess) { + lastOperationSuccess = false; + lastErrorMessage = "Expected failure but succeeded"; + } + } + + @Test + @DisplayName("Request all books with specific title") + void testRequestBooksByTitle() { + books.put("1", Map.of("title", "Wouah")); + books.put("2", Map.of("title", "Troop")); + books.put("3", Map.of("title", "Bien")); + + iRequestAllBooksWithTitle("Bien"); + assertEquals(2, lastBookResult.size()); + } + + public void iRequestAllBooksWithTitle(String titleFilter) { + lastBookResult = books.values().stream() + .filter(book -> book.get("title").equalsIgnoreCase(titleFilter)) + .toList(); + lastOperationSuccess = true; + lastErrorMessage = null; + } +} diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/result/bookResultTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/result/bookResultTest.java new file mode 100644 index 0000000..e26c939 --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/book/result/bookResultTest.java @@ -0,0 +1,81 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.book.result; + +import org.junit.jupiter.api.*; +import static org.junit.jupiter.api.Assertions.*; +import java.util.*; + +@DisplayName("Book result success scenarios") +public class bookResultTest { + private Map lastSingleBookResult; + private Map> books; + + @BeforeEach + void setUp() { + books = new HashMap<>(); + books.put("123", Map.of("titre", "Livre A")); + books.put("456", Map.of("title", "Livre B")); + + lastSingleBookResult = Map.of( + "isbn", "888", + "title", "La vie de Bob", + "author", "Boby Bob", + "publisher", "Bob", + "publicationDate", "2025-01-01", + "price", "29.99", + "quantity", "10", + "language", "Fr" + ); + } + + @Test + @DisplayName("Book is successfully registered") + void testBookRegistrationSuccess() { + boolean lastOperationSuccess = true; + assertTrue(lastOperationSuccess); + } + + @Test + @DisplayName("Receive detailed information of a single book") + void testReceiveSingleBookInformation() { + lastSingleBookResult = Map.of( + "isbn", "777", + "title", "La vie de Bob", + "author", "Boby Bob", + "publisher", "Bob", + "publicationDate", "2025-01-01", + "price", "29.99", + "quantity", "10", + "language", "Fr" + ); + + List> expectedList = List.of(Map.of( + "isbn", "001", + "title", "La vie de mary", + "author", "Mary Mard", + "publisher", "Mary", + "publicationDate", "2025-02-02", + "price", "29.99", + "quantity", "10", + "language", "Fr" + )); + + Map expectedBook = expectedList.get(0); + assertNotNull(lastSingleBookResult); + + for (String key : expectedBook.keySet()) { + assertEquals(expectedBook.get(key), lastSingleBookResult.get(key)); + } + } + + @Test + @DisplayName("System has expected number of books after registration") + void testSystemHasBooks() { + assertEquals(2, books.size()); + } + + @Test + @DisplayName("System still has expected number of books") + void testSystemStillHasBooks() { + assertEquals(2, books.size()); + } +} diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/features/book/BookSteps.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/features/book/BookSteps.java index 6c77693..ac0040b 100644 --- a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/features/book/BookSteps.java +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/features/book/BookSteps.java @@ -116,10 +116,8 @@ public class BookSteps { // ----------------------------Scénario 4--------------------------------- @When("I try to register a new book with the following information:") public void iTryToRegisterANewBookWithTheFollowingInformation(DataTable dataTable) { - // Réutilisation de la méthode normale, mais on garde le résultat iRegisterANewBookWithTheFollowingInformation(dataTable); if (lastOperationSuccess) { - // Si succès, on garde ça, sinon lastErrorMessage est mis à jour lastOperationSuccess = false; lastErrorMessage = "Expected failure but succeeded"; }