{"id":25334176,"url":"https://github.com/studoo-app/cyber-tp4-sio2","last_synced_at":"2025-10-29T08:30:40.262Z","repository":{"id":266314584,"uuid":"896996775","full_name":"studoo-app/CYBER-TP4-SIO2","owner":"studoo-app","description":null,"archived":false,"fork":false,"pushed_at":"2024-12-03T16:14:03.000Z","size":55,"stargazers_count":0,"open_issues_count":0,"forks_count":8,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-12-03T17:25:01.596Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/studoo-app.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-12-01T20:06:48.000Z","updated_at":"2024-12-03T12:41:12.000Z","dependencies_parsed_at":"2024-12-03T17:25:03.531Z","dependency_job_id":"23de0f3a-88fd-486e-81cb-7ca552d40eac","html_url":"https://github.com/studoo-app/CYBER-TP4-SIO2","commit_stats":null,"previous_names":["studoo-app/cyber-tp4-sio2"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/studoo-app%2FCYBER-TP4-SIO2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/studoo-app%2FCYBER-TP4-SIO2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/studoo-app%2FCYBER-TP4-SIO2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/studoo-app%2FCYBER-TP4-SIO2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/studoo-app","download_url":"https://codeload.github.com/studoo-app/CYBER-TP4-SIO2/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238791932,"owners_count":19531027,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-02-14T05:37:10.031Z","updated_at":"2025-10-29T08:30:34.852Z","avatar_url":"https://github.com/studoo-app.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"![separe](https://github.com/studoo-app/.github/blob/main/profile/studoo-banner-logo.png)\n# CYBER TP2 SIO 4 : Pratique des Tests Unitaires et Développement Piloté par les Tests (TDD)\n[![Version](https://img.shields.io/badge/Version-2024-blue)]()\n\n## Objectif\nCe TP vise à renforcer vos compétences dans l’écriture et l’exécution de tests unitaires avec Symfony. \nIl vous permettra également de pratiquer le développement piloté par les tests (TDD) pour construire un service métier.\nVous couvrirez des tests sur des entités, services, contrôleurs et repositories, tout en explorant les bonnes pratiques\ndes tests unitaires.\n\n## Contexte\n\nVous allez construire et tester une application Symfony pour gérer un magasin en ligne. Les principales fonctionnalités\nincluent la gestion des clients, des produits et des commandes, ainsi que le calcul du total des commandes.\n\n## Missions\n\n### 1 - Tester une Entité Simple\n - Créer une entité `Product` avec les attributs suivants :\n   - name (string)\n   - price (float)\n - Créer un test unitaire pour vérifier que l’entité `Product` est valide.\n\n### 2 - Tester une entité complexe avec des relations\n- Créer une entité `Order`\n- Créer une entité `OrderItem`\n- Créer une relation entre `Order` et `OrderItem`\n  - Une entité Order peut contenir plusieurs `OrderItem`\n  - Un OrderItem appartient à une seule entité `Order`\n- Créer un test unitaire pour vérifier que l’entité `Order` est valide.\n\n### 3 - Tester un service\n- Créer le service `OrderCalculator`:\n    ```php\n    // src/Service/OrderCalculator.php\n    namespace App\\Service;\n    \n    use App\\Entity\\Order;\n    \n    class OrderCalculator\n    {\n        public function calculateTotal(Order $order): float\n        {\n            $total = 0;\n            foreach ($order-\u003egetItems() as $item) {\n                $total += $item-\u003egetQuantity() * $item-\u003egetUnitPrice();\n            }\n            return $total;\n        }\n    \n        public function applyDiscount(float $total, float $discount): float\n        {\n            return $total - ($total * $discount / 100);\n        }\n    }\n    ```\n- Créer un test unitaire pour vérifier que les 2 méthodes du service `OrderCalculator` sont valides.\n\n### 4 - Tester un contrôleur\n\n- Créer un contrôleur `ProductController` avec une méthode list :\n    ```php\n    // src/Controller/ProductController.php\n    #[Route('/products', name: 'product_list')]\n    public function list(): JsonResponse\n    {\n        return new JsonResponse([\n            new Product(['name' =\u003e 'Laptop', 'price' =\u003e 1200]),\n            new Product(['name' =\u003e 'Smartphone', 'price' =\u003e 800]),\n        ]);\n    }\n    ```\n- Créer un test unitaire pour vérifier que la méthode list du contrôleur `ProductController` est valide.\n\n### 5 - Tester un repository\n- Créer une méthode `findExpensiveProducts` dans le repository `ProductRepository`:\n    ```php\n    public function findExpensiveProducts(float $price): array\n        {\n            return $this-\u003ecreateQueryBuilder('p')\n                -\u003ewhere('p.price \u003e :price')\n                -\u003esetParameter('price', $price)\n                -\u003egetQuery()\n                -\u003egetResult();\n        }\n    ```\n- Créer un test unitaire pour vérifier que la méthode `findExpensiveProducts` du repository `ProductRepository` est valide.\n\n### 6 - Pratiquer le TDD\n\nNous allons écrire un test pour un service `StockManager` qui réduit le stock d’un produit. \nLe test est écrit avant même d’implémenter la méthode `reduceStock`.\n\n```php\n// tests/Service/StockManagerTest.php\nnamespace App\\Tests\\Service;\n\nuse App\\Entity\\Product;\nuse App\\Service\\StockManager;\nuse PHPUnit\\Framework\\TestCase;\n\nclass StockManagerTest extends TestCase\n{\n    public function testReduceStock(): void\n    {\n        $product = new Product();\n        $product-\u003esetName('Laptop')-\u003esetPrice(1200)-\u003esetStock(10);\n\n        $manager = new StockManager();\n        $manager-\u003ereduceStock($product, 2);\n\n        $this-\u003eassertEquals(8, $product-\u003egetStock());\n    }\n\n    public function testReduceStockWithInvalidQuantity(): void\n    {\n        $product = new Product();\n        $product-\u003esetName('Laptop')-\u003esetPrice(1200)-\u003esetStock(10);\n\n        $manager = new StockManager();\n\n        $this-\u003eexpectException(\\InvalidArgumentException::class);\n        $manager-\u003ereduceStock($product, 15); // Trop de stock à réduire\n    }\n}\n```\nVous devez implémenter la classe `StockManager` pour que les tests passent.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstudoo-app%2Fcyber-tp4-sio2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstudoo-app%2Fcyber-tp4-sio2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstudoo-app%2Fcyber-tp4-sio2/lists"}