début avis

This commit is contained in:
2026-04-25 11:47:26 +02:00
parent ed39f635bf
commit f6652fb25c
2 changed files with 239 additions and 0 deletions
@@ -0,0 +1,185 @@
package fr.iut_fbleau.but3.dev62.mylibrary.features.avis;
import static org.junit.jupiter.api.Assertions.*;
import fr.iut_fbleau.but3.dev62.mylibrary.avis.AvisDTO;
import fr.iut_fbleau.but3.dev62.mylibrary.avis.AvisInfo;
import fr.iut_fbleau.but3.dev62.mylibrary.avis.exception.NotValidAvisException;
import fr.iut_fbleau.but3.dev62.mylibrary.avis.repository.AvisRepository;
import fr.iut_fbleau.but3.dev62.mylibrary.avis.usecase.AvisUseCase;
import fr.iut_fbleau.but3.dev62.mylibrary.book.entity.Book;
import fr.iut_fbleau.but3.dev62.mylibrary.book.repository.BookRepository;
import fr.iut_fbleau.but3.dev62.mylibrary.customer.entity.Customer;
import fr.iut_fbleau.but3.dev62.mylibrary.customer.exception.CustomerNotFoundException;
import fr.iut_fbleau.but3.dev62.mylibrary.customer.repository.CustomerRepository;
import io.cucumber.datatable.DataTable;
import io.cucumber.java.Before;
import io.cucumber.java.en.And;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
public class AvisSteps {
private final CustomerRepository customerRepository = new CustomerRepository();
private final BookRepository bookRepository = new BookRepository();
private final AvisRepository avisRepository = new AvisRepository();
private final AvisUseCase avisUseCase = new AvisUseCase(avisRepository, customerRepository);
private final Map<String, UUID> customerPhoneUUID = new HashMap<>();
private final Map<String, UUID> bookIsbnUUID = new HashMap<>();
private AvisDTO avisResult;
private NotValidAvisException notValidAvisException;
private boolean customerNotFoundThrown = false;
@Before
public void setUp() {
customerRepository.deleteAll();
bookRepository.deleteAll();
avisRepository.deleteAll();
customerPhoneUUID.clear();
bookIsbnUUID.clear();
avisResult = null;
notValidAvisException = null;
customerNotFoundThrown = false;
}
@Given("the system has the following customers for avis:")
public void theSystemHasTheFollowingCustomersForAvis(DataTable dataTable) {
List<Map<String, String>> customers = dataTable.asMaps(String.class, String.class);
for (Map<String, String> customer : customers) {
String phone = customer.get("numeroTelephone");
Customer newCustomer = Customer.builder()
.firstName(customer.get("prenom"))
.lastName(customer.get("nom"))
.phoneNumber(phone)
.loyaltyPoints(Integer.parseInt(customer.get("pointsFidelite")))
.build();
Customer saved = customerRepository.save(newCustomer);
customerPhoneUUID.put(phone, saved.getId());
}
assertEquals(customers.size(), customerRepository.findAll().size());
}
@And("the catalog has the following books for avis:")
public void theCatalogHasTheFollowingBooksForAvis(DataTable dataTable) {
List<Map<String, String>> books = dataTable.asMaps(String.class, String.class);
for (Map<String, String> book : books) {
String isbn = book.get("isbn");
Book newBook = Book.builder()
.isbn(isbn)
.title(book.get("titre"))
.author(book.get("auteur"))
.publisher(book.get("editeur"))
.publicationDate(LocalDate.parse(book.get("datePublication")))
.price(new BigDecimal(book.get("prix")))
.stock(Integer.parseInt(book.get("stockInitial")))
.categories(List.of(book.get("categories").split(";")))
.description(book.get("description"))
.language(book.get("langue"))
.build();
Book saved = bookRepository.save(newBook);
bookIsbnUUID.put(isbn, saved.getId());
}
assertEquals(books.size(), bookRepository.findAll().size());
}
@When("customer {string} submits a review for book {string} with:")
public void customerSubmitsAReviewForBookWith(String phoneNumber, String isbn, DataTable dataTable)
throws NotValidAvisException, CustomerNotFoundException {
Map<String, String> row = dataTable.asMaps(String.class, String.class).getFirst();
UUID customerId = customerPhoneUUID.get(phoneNumber);
UUID livreId = bookIsbnUUID.get(isbn);
AvisInfo avisInfo = new AvisInfo(
customerId,
livreId,
Integer.parseInt(row.get("note")),
row.get("commentaire"),
LocalDate.parse(row.get("dateAchat"))
);
avisResult = avisUseCase.gererAvis(avisInfo);
}
@Then("a new review is created")
public void aNewReviewIsCreated() {
assertNotNull(avisResult);
assertNotNull(avisResult.getAvisId());
}
@And("the system now has {int} reviews")
public void theSystemNowHasReviews(int expectedCount) {
assertEquals(expectedCount, avisRepository.findAll().size());
}
@When("customer {string} tries to submit a review for book {string} with:")
public void customerTriesToSubmitAReviewForBookWith(String phoneNumber, String isbn, DataTable dataTable) {
Map<String, String> row = dataTable.asMaps(String.class, String.class).getFirst();
UUID customerId = customerPhoneUUID.get(phoneNumber);
UUID livreId = bookIsbnUUID.get(isbn);
AvisInfo avisInfo = new AvisInfo(
customerId,
livreId,
Integer.parseInt(row.get("note")),
row.get("commentaire"),
LocalDate.parse(row.get("dateAchat"))
);
notValidAvisException = assertThrows(NotValidAvisException.class,
() -> avisUseCase.gererAvis(avisInfo));
}
@When("an unknown customer tries to submit a review for book {string} with:")
public void anUnknownCustomerTriesToSubmitAReviewForBookWith(String isbn, DataTable dataTable) {
Map<String, String> row = dataTable.asMaps(String.class, String.class).getFirst();
UUID unknownId = UUID.randomUUID();
UUID livreId = bookIsbnUUID.get(isbn);
AvisInfo avisInfo = new AvisInfo(
unknownId,
livreId,
Integer.parseInt(row.get("note")),
row.get("commentaire"),
LocalDate.parse(row.get("dateAchat"))
);
try {
avisUseCase.gererAvis(avisInfo);
} catch (CustomerNotFoundException e) {
customerNotFoundThrown = true;
} catch (NotValidAvisException e) {
notValidAvisException = e;
}
}
@Then("the review creation fails")
public void theReviewCreationFails() {
assertNotNull(notValidAvisException);
}
@Then("the review creation fails with customer not found")
public void theReviewCreationFailsWithCustomerNotFound() {
assertTrue(customerNotFoundThrown);
}
@And("I receive a validation avis error containing {string}")
public void iReceiveAValidationAvisErrorContaining(String errorMessage) {
assertEquals(errorMessage, notValidAvisException.getMessage());
}
}
+54
View File
@@ -0,0 +1,54 @@
# language: en
Feature: Manage customer reviews
Background:
Given the system has the following customers for avis:
| prenom | nom | numeroTelephone | pointsFidelite |
| Marie | Dupont | 0612345678 | 100 |
| Jean | Martin | 0687654321 | 50 |
And the catalog has the following books for avis:
| isbn | titre | auteur | editeur | datePublication | prix | stockInitial | categories | description | langue |
| 9782016289308 | Le Petit Prince | Antoine de Saint-Exupery | Gallimard | 1943-04-06 | 12.90 | 10 | Roman | Un classique | FR |
| 9782070409189 | L Etranger | Albert Camus | Gallimard | 1942-05-19 | 9.50 | 5 | Roman | Philosophique| FR |
Scenario: Submit a valid review
When customer "0612345678" submits a review for book "9782016289308" with:
| note | commentaire | dateAchat |
| 5 | Excellent livre ! | 2024-01-15 |
Then a new review is created
And the system now has 1 reviews
Scenario: Submit a review with minimum note
When customer "0687654321" submits a review for book "9782070409189" with:
| note | commentaire | dateAchat |
| 1 | Pas mon style | 2024-02-10 |
Then a new review is created
And the system now has 1 reviews
Scenario: Attempt to submit a review with invalid note too high
When customer "0612345678" tries to submit a review for book "9782016289308" with:
| note | commentaire | dateAchat |
| 6 | Trop bien ! | 2024-01-15 |
Then the review creation fails
And I receive a validation avis error containing "Note must be between 1 and 5"
Scenario: Attempt to submit a review with invalid note too low
When customer "0612345678" tries to submit a review for book "9782016289308" with:
| note | commentaire | dateAchat |
| 0 | Nul ! | 2024-01-15 |
Then the review creation fails
And I receive a validation avis error containing "Note must be between 1 and 5"
Scenario: Attempt to submit a review with blank comment
When customer "0612345678" tries to submit a review for book "9782016289308" with:
| note | commentaire | dateAchat |
| 4 | | 2024-01-15 |
Then the review creation fails
And I receive a validation avis error containing "Commentaire cannot be blank"
Scenario: Attempt to submit a review for unknown customer
When an unknown customer tries to submit a review for book "9782016289308" with:
| note | commentaire | dateAchat |
| 4 | Bon livre | 2024-01-15 |
Then the review creation fails with customer not found