ajout du repository en memoire + tests

This commit is contained in:
RKaraMos_EVO
2026-06-12 23:32:35 +02:00
parent 00e90aaa0c
commit a595750194
2 changed files with 191 additions and 0 deletions
@@ -0,0 +1,42 @@
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;
import lombok.NoArgsConstructor;
@NoArgsConstructor
public final class BookRepository {
private final List<Book> books = new ArrayList<>();
public List<Book> findAll() {
return books;
}
public void deleteAll() {
books.clear();
}
public Book save(Book book) {
Optional<Book> existing = findByIsbn(book.getIsbn());
existing.ifPresent(books::remove);
books.add(book);
return book;
}
public Optional<Book> findByIsbn(long isbn) {
return books.stream()
.filter(b -> b.getIsbn() == isbn)
.findFirst();
}
public boolean existsByIsbn(long isbn) {
return books.stream().anyMatch(b -> b.getIsbn() == isbn);
}
public void delete(Book book) {
books.remove(book);
}
}
@@ -0,0 +1,149 @@
package fr.iut_fbleau.but3.dev62.mylibrary.book.repository;
import fr.iut_fbleau.but3.dev62.mylibrary.book.entity.Book;
import fr.iut_fbleau.but3.dev62.mylibrary.book.entity.Category;
import java.time.LocalDate;
import java.util.List;
import java.util.Optional;
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 static org.junit.jupiter.api.Assertions.*;
class BookRepositoryTest {
private BookRepository repository;
private Book book1;
private Book book2;
@BeforeEach
void setUp() {
repository = new BookRepository();
book1 = Book.builder()
.isbn(1111111111111L)
.title("Book One")
.author("Author A")
.publisher("Pub")
.publicationDate(LocalDate.of(2020, 1, 1))
.price(10.0)
.quantity(2)
.categories(List.of(Category.FICTION))
.language("EN")
.build();
book2 = Book.builder()
.isbn(2222222222222L)
.title("Book Two")
.author("Author B")
.publisher("Pub")
.publicationDate(LocalDate.of(2021, 1, 1))
.price(20.0)
.quantity(0)
.categories(List.of(Category.HISTORY))
.language("FR")
.build();
}
@Test
@DisplayName("New repository should be empty")
void testNewRepositoryIsEmpty() {
assertTrue(repository.findAll().isEmpty());
}
@Nested
@DisplayName("Save operations")
class SaveOperations {
@Test
@DisplayName("Save should add a new book")
void testSave() {
Book saved = repository.save(book1);
assertEquals(1, repository.findAll().size());
assertEquals(book1.getIsbn(), saved.getIsbn());
}
@Test
@DisplayName("Save should replace existing book with same ISBN (idempotency)")
void testSaveReplacesExisting() {
repository.save(book1);
Book updated = Book.builder()
.isbn(book1.getIsbn())
.title("New title")
.author("Author A")
.publisher("Pub")
.publicationDate(LocalDate.of(2020, 1, 1))
.price(10.0)
.quantity(99)
.categories(List.of(Category.FICTION))
.language("EN")
.build();
repository.save(updated);
assertEquals(1, repository.findAll().size());
assertEquals(99, repository.findByIsbn(book1.getIsbn()).orElseThrow().getQuantity());
assertEquals("New title", repository.findByIsbn(book1.getIsbn()).orElseThrow().getTitle());
}
}
@Nested
@DisplayName("Find operations")
class FindOperations {
@BeforeEach
void seed() {
repository.save(book1);
repository.save(book2);
}
@Test
@DisplayName("findByIsbn returns the matching book")
void testFindByIsbn() {
Optional<Book> found = repository.findByIsbn(book1.getIsbn());
assertTrue(found.isPresent());
assertEquals(book1.getTitle(), found.get().getTitle());
}
@Test
@DisplayName("findByIsbn returns empty when not found")
void testFindByIsbnNotFound() {
assertTrue(repository.findByIsbn(99L).isEmpty());
}
@Test
@DisplayName("existsByIsbn returns true / false consistently")
void testExistsByIsbn() {
assertTrue(repository.existsByIsbn(book1.getIsbn()));
assertFalse(repository.existsByIsbn(99L));
}
}
@Nested
@DisplayName("Delete operations")
class DeleteOperations {
@BeforeEach
void seed() {
repository.save(book1);
repository.save(book2);
}
@Test
@DisplayName("delete should remove the specified book")
void testDelete() {
repository.delete(book1);
assertEquals(1, repository.findAll().size());
assertFalse(repository.existsByIsbn(book1.getIsbn()));
}
@Test
@DisplayName("deleteAll should clear the repository")
void testDeleteAll() {
repository.deleteAll();
assertTrue(repository.findAll().isEmpty());
}
}
}