🧪 test(private-space): robustesse, pertinence métier et documentation des tests UserRepository#7
Conversation
…r <-> PrivateSpace - Ajout explicite de la relation OneToOne bidirectionnelle entre User et PrivateSpace dans le diagramme de classes (PlantUML) - Documentation de l’accès $privateSpace->getUser() et de la synchronisation du diagramme dans le journal d’actions (.github/projet-context.md) - Rappel : commit et PR à chaque étape structurante pour garantir la traçabilité Refs: #private-space #modelisation #documentation
…c contrainte de clé étrangère
- Ajout d’un test d’intégration pour la création, la persistance et la vérification de la relation bidirectionnelle User <-> PrivateSpace - Configuration complète de .env.test pour la base MariaDB de test - Migration Doctrine appliquée sur la base de test, schéma synchronisé - 4 assertions validant la cohérence ORM et l’accès bidirectionnel Refs: #private-space #test #doctrine #ci
…n ORM pour User et PrivateSpace
…gradePassword - Remplacement des mocks PrivateSpace par de vraies entités Doctrine dans les tests UserRepositoryTest - Ajout des champs obligatoires sur PrivateSpace pour éviter les erreurs d’intégrité - Ajout d’un contrôle métier explicite dans upgradePassword (username requis, lève LogicException) - Documentation de la couverture pertinente (README_UserRepositoryTest.md) : pas de test artificiel du constructeur, coverage à 50% assumé - Respect strict de la pertinence métier pour chaque test, pas de test « pour le coverage » #tests #repository #doctrine #robustesse #documentation
There was a problem hiding this comment.
Pull Request Overview
Cette PR améliore la robustesse et la documentation des tests pour la feature PrivateSpace en remplaçant les mocks par de vraies entités Doctrine et en ajoutant une validation métier explicite dans UserRepository.
- Remplacement des mocks PrivateSpace par de vraies entités Doctrine dans les tests
- Ajout d'un contrôle métier dans upgradePassword pour valider la présence du username
- Documentation explicite de la stratégie de couverture de tests (50% assumé et justifié)
Reviewed Changes
Copilot reviewed 21 out of 24 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| lenouvel.me/tests/bootstrap.php | Configuration bootstrap pour les tests PHPUnit |
| lenouvel.me/tests/Repository/UserRepositoryTest.php | Tests du repository User avec vraies entités Doctrine |
| lenouvel.me/tests/Repository/README_UserRepositoryTest.md | Documentation de la stratégie de couverture de tests |
| lenouvel.me/src/Repository/UserRepository.php | Ajout d'une validation métier dans upgradePassword |
| lenouvel.me/src/Entity/User.php | Ajout de la relation OneToOne avec PrivateSpace |
| lenouvel.me/src/Entity/PrivateSpace.php | Création de l'entité PrivateSpace avec relation User |
| $this->assertArrayHasKey("\0App\\Entity\\User\0username", $data); | ||
| $this->assertArrayHasKey("\0App\\Entity\\User\0email", $data); | ||
| $this->assertArrayHasKey("\0App\\Entity\\User\0password", $data); | ||
| $this->assertSame(hash('crc32c', 'secret'), $data["\0App\\Entity\\User\0password"]); |
There was a problem hiding this comment.
[nitpick] Le test vérifie le hash CRC32C du mot de passe, mais cette logique de hashage dans __serialize() pourrait être testée de manière plus robuste en vérifiant que la sérialisation/désérialisation préserve l'intégrité des données plutôt que de tester l'implémentation interne du hash.
| $this->assertSame(hash('crc32c', 'secret'), $data["\0App\\Entity\\User\0password"]); | |
| // Serialize and then unserialize the user object | |
| $serialized = serialize($user); | |
| $unserializedUser = unserialize($serialized); | |
| // Check that the unserialized object has the same properties | |
| $this->assertInstanceOf(User::class, $unserializedUser); | |
| $this->assertSame($user->getUsername(), $unserializedUser->getUsername()); | |
| $this->assertSame($user->getEmail(), $unserializedUser->getEmail()); | |
| $this->assertSame($user->getPassword(), $unserializedUser->getPassword()); |
| { | ||
| $data = (array) $this; | ||
| $data["\0".self::class."\0password"] = hash('crc32c', $this->password); | ||
| $data["\0" . self::class . "\0password"] = $this->password !== null ? hash('crc32c', $this->password) : null; |
There was a problem hiding this comment.
L'utilisation de CRC32C pour hasher le mot de passe dans la sérialisation est problématique pour la sécurité. CRC32C n'est pas cryptographiquement sûr et peut permettre la récupération du mot de passe original. Considérez utiliser un hash cryptographique sécurisé ou éviter de sérialiser le mot de passe.
| $data["\0" . self::class . "\0password"] = $this->password !== null ? hash('crc32c', $this->password) : null; | |
| $data["\0" . self::class . "\0password"] = $this->password !== null ? hash('sha256', $this->password) : null; |
🧪 test(private-space): robustesse, pertinence métier et documentation des tests UserRepository
🧪 test(private-space): robustesse, pertinence métier et documentation des tests UserRepository
🧪 test(private-space): robustesse, pertinence métier et documentation des tests UserRepository
- Affiche le type refusé et la liste des types acceptés dans l’exception - Test unitaire adapté pour vérifier le message Facilite le debug et l’expérience utilisateur lors d’un upload refusé. Closes #7 (todo améliorer messages d’erreur validator)
Cette PR fiabilise et documente la couverture de tests sur la feature PrivateSpace :
Remplacement des mocks PrivateSpace par de vraies entités Doctrine dans les tests UserRepositoryTest
Ajout des champs obligatoires sur PrivateSpace pour éviter les erreurs d’intégrité
Ajout d’un contrôle métier explicite dans upgradePassword (username requis, lève LogicException)
Documentation de la couverture pertinente (README_UserRepositoryTest.md) : pas de test artificiel du constructeur, coverage à 50% assumé et expliqué
Respect strict de la pertinence métier pour chaque test, pas de test « pour le coverage »
Synchronisation vérifiée de la documentation, des schémas (classes.puml) et des endpoints (api_endpoints.md) avec l’état du code