Vous devez tester un système de gestion de commandes pour une fromagerie artisanale. Le code vous est fourni, mais il
contient peut-être des erreurs.
Votre mission est d’écrire des tests unitaires (JUnit5) pour vérifier que les règles métier suivantes sont bien
respectées.
- Un produit peut être vendu :
- à l’unité (
UNIT) : ex. camembert, tomme - au poids (
WEIGHT) : ex. comté, roquefort
- à l’unité (
- Chaque produit possède :
- un nom
- un prix unitaire (€/pièce ou €/kg)
- un poids minimum (en kg) si vendu au poids
- une catégorie promotionnelle (
PromotionalCategory) qui détermine s’il peut bénéficier de promotions saisonnières
- Un client a un nom et un statut :
NEW: nouveau clientREGULAR: client régulierLOYAL: client fidèle
- Une commande contient une ou plusieurs lignes de commande (produit + quantité)
- La quantité est :
- un nombre entier pour les produits à l’unité
- un poids (double) pour les produits au poids
- La date de la commande est importante pour les promotions saisonnières
Le total d’une commande est calculé comme suit :
Somme des (prix unitaire × quantité) pour chaque ligne de commande.
Les promotions suivantes peuvent s’appliquer :
- 10 % de réduction pour les clients
LOYAL
- 5 % de réduction si le total dépasse strictement 100 €
- Certains produits bénéficient de 15 % de réduction selon leur catégorie promotionnelle et la date de la commande
- Exemples de règles :
- Les produits de catégorie
AOPsont en promotion en décembre (Noël) - Les produits
REGIONALsont en promotion en juin (fête des pères) et en septembre (rentrée) - Les produits
SEASONALsont en promotion en avril (Pâques) et en mai (fête des mères)
- Les produits de catégorie
- Ces règles sont gérées par le calendrier commercial
Les promotions sont cumulables.
- La réduction liée au statut du client (par exemple 10 % pour les clients
LOYAL) doit être appliquée avant la réduction liée au montant total de la commande. - Le seuil de 100 € est donc évalué après application de la réduction fidélité.
Exemple :
- Total brut : 120 €
- Client :
LOYAL(réduction de 10 %) - Étapes de calcul :
- 120 € – 10 % = 108 €
- 108 € > 100 € → réduction supplémentaire de 5 %
- 108 € – 5 % = 102,60 €
- Application de la TVA (20 %) : 102,60 × 1,20 = 123,12 €
- Une TVA de 20 % est appliquée sur le total après réduction
- Chaque produit a un stock initial (en kg ou en unités)
- Une commande ne peut pas dépasser le stock disponible
- Le stock est décrémenté après chaque commande
- Le stock ne peut jamais devenir négatif
- Un produit au poids ne peut pas être commandé en dessous de son poids minimum
- Un client
NEWne doit pas bénéficier de la réduction fidélité - La réduction de 5 % ne s’applique que si le total dépasse 100 €
- La TVA doit être de 20 %, pas plus ni moins
- Un produit ne peut pas être commandé si le stock est insuffisant
Le programme doit lever des exceptions spécifiques dans les cas suivants :
| Exception | Déclenchée quand… |
|---|---|
InsufficientStockException |
Le stock est insuffisant pour la quantité demandée |
BelowMinimumWeightException |
Un produit au poids est commandé en dessous de son poids minimum |
InvalidQuantityException |
La quantité est négative ou nulle |
InvalidProductTypeException |
Une quantité non entière est utilisée pour un produit à l’unité, ou inversement |
DuplicateProductException |
Le même produit est ajouté plusieurs fois dans une commande |
PromotionNotApplicableException |
Une promotion est appliquée à une période ou un produit non éligible |
UnauthorizedDiscountException |
Un client NEW bénéficie d’une réduction réservée aux clients LOYAL |
InvalidCustomerStatusException |
Le statut du client est inconnu ou invalide |
EmptyOrderException |
Une commande est validée sans aucune ligne de commande |
- Écrire des tests unitaires JUnit5 pour :
- Vérifier les calculs de total avec et sans promotions
- Tester les cas limites (poids minimum, seuil de réduction, stock insuffisant)
- Vérifier que les règles métier sont bien respectées
- Vérifier que les exceptions sont levées correctement
- Détecter les erreurs dans le code fourni
- Vous n’avez pas à modifier le code métier, uniquement à le tester
