Vous travaillez sur le développement d'une application de gestion de Bibliothèque en ligne. Cette application permet de gérer les livres, les auteurs, les emprunts et les clients.
Votre mission est de tester les différentes entités, services et contrôleurs de cette application.
Créer et tester une entité Book qui représente un livre dans la bibliothèque.
- Créez une entité Book avec les propriétés suivantes :
- id (integer) : Identifiant unique.
- title (string) : Titre du livre.
- isbn (string) : Numéro ISBN.
- publishedAt (DateTime) : Date de publication.
- Écrivez un test unitaire pour vérifier le bon fonctionnement des getters et setters de l'entité.
Créer et tester les validations de l'entité Book. Un livre doit avoir un titre, un numéro ISBN et une date de publication.
- Ajoutez les annotations de validation suivantes à l'entité Book :
- title : Ne peut pas être vide
- isbn : Ne peut pas être vide,
- publishedAt : Ne peut pas être vide et doit être une chaine de 14 caractères numériques.
- Écrivez un test unitaire pour vérifier que :
- Un livre sans titre n'est pas valide.
- Un livre sans ISBN n'est pas valide.
- Un livre sans date de publication n'est pas valide.
- Un livre avec toutes les informations requises est valide.
Créer et tester une relation entre un Auteur et un Livre. Un auteur peut écrire plusieurs livres.
- Créez une entité Author avec les propriétés suivantes :
- id (integer) : Identifiant unique.
- name (string) : Nom complet de l'auteur.
- books (relation)
- Écrivez un test unitaire pour vérifier que :
- On peut lier des livres à un auteur.
- La suppression d’un livre de la liste de l’auteur fonctionne.
Créer et tester un service BorrowingManager qui gère les emprunts de livres par les clients. Ce service doit vérifier si un client peut emprunter un livre en fonction de la disponibilité et du nombre de livres qu'il a déjà empruntés.
On souhaite implémenter le service suivant :
// src/Service/BorrowingManager.php
namespace App\Service;
use App\Entity\Book;
use App\Entity\Client;
class BorrowingManager
{
public function canBorrowBook(Client $client, Book $book): bool
{
if ($client->getBorrowedBooksCount() >= 5) {
return false;
}
if ($book->isBorrowed()) {
return false;
}
return true;
}
}
- Implémenter le service et effectuer les modifications necéssaires.
- Écrivez un test unitaire pour la méthode canBorrowBook() en vérifiant :
- Un client qui a déjà emprunté 5 livres ne peut pas emprunter d'autres.
- Un client peut emprunter un livre disponible.
- Un client ne peut pas emprunter un livre déjà emprunté par un autre client.
A l'aide du fichier de tests ci-dessous, créer un service LateFeeCalculator qui sera destiné pour une implémentation future au calcul du montant des frais de retard lorsqu'un client rend un livre en retard.
La méthode calculera le nombre de jours de retard et applique un frais de 0,50 € par jour de retard. Si le livre est rendu à temps ou en avance, le frais est de 0,00 €.
Vous utiliserez la méthodologie TDD (Test Driven Development).
// tests/Service/LateFeeCalculatorTest.php
namespace App\Tests\Service;
use PHPUnit\Framework\TestCase;
use App\Service\LateFeeCalculator;
class LateFeeCalculatorTest extends TestCase
{
public function testCalculateLateFee(): void
{
$calculator = new LateFeeCalculator();
$dueDate = new \DateTime('2024-01-01');
$returnDate = new \DateTime('2024-01-04');
$this->assertEquals(1.5, $calculator->calculateLateFee($dueDate, $returnDate));
}
}
- Implémenter le test
LateFeeCalculatorTest
- Implémenter le service afin que le test unitaire fonctionne
- Ajoutez des tests pour les cas suivants :
- Le livre est retourné avant la date d’échéance (frais = 0 €).
- Le livre est retourné le jour même (frais = 0 €).
- Le livre est retourné avec 3 jours de retard (frais = 1,50 €).