test(commercial) : SupplierExportControllerTest sur base fournisseurs (catégories FOURNISSEUR, dédup F3) (ERP-113) #73

Merged
malio merged 3 commits from feature/ERP-113-export-test-fournisseur-categories into develop 2026-06-08 07:49:48 +00:00
Owner

Suivi du finding F3 de la review ERP-92. Test uniquement — aucune modif de code applicatif (le controller d'export ERP-91 est correct).

Problème (F3)

SupplierExportControllerTest étendait AbstractCommercialApiTestCase et redéfinissait un seedSupplier() privé appelant createCategory() du parent → catégorie de type CLIENT, ce qui viole RG-2.10 dans les données de test (latent : l'export ne filtre pas par type de catégorie, mais le contrat de test était faux).

Changements

  • Bascule de base : extends AbstractSupplierApiTestCase (helpers seedSupplier/addContact/supplierCategory sur type FOURNISSEUR).
  • Suppression du seedSupplier() privé (type CLIENT) et du tearDown() redondant — dédup F3.
  • testExportUsesPrincipalContactColumns : utilise addContact() de la base ; le téléphone secondaire (non porté par ce helper) est posé via le setter sur le contact retourné.
  • testExportPopulatesCategoryAndSiteColumns : l'assertion de la colonne « Catégories » dérive le libellé de supplierCategory('NEGOCIANT')->getName() au lieu de hardcoder le préfixe de nom de test (la base nomme test_cli_cat_fr_negociant).
  • Imports Supplier / SupplierContact / DateTimeImmutable retirés (inutilisés).

Vérifications

  • SupplierExportControllerTest : 9 tests, 48 assertions — vert sous APP_DEBUG=0.
  • Suite complète make test : 574 tests, 2448 assertions — OK sous APP_DEBUG=0.
  • make php-cs-fixer-allow-risky : 0 correction.

MR stackée sur feature/ERP-112-fixtures-fournisseurs.

Suivi du finding F3 de la review ERP-92. **Test uniquement** — aucune modif de code applicatif (le controller d'export ERP-91 est correct). ### Problème (F3) `SupplierExportControllerTest` étendait `AbstractCommercialApiTestCase` et redéfinissait un `seedSupplier()` privé appelant `createCategory()` du parent → catégorie de **type CLIENT**, ce qui viole RG-2.10 dans les données de test (latent : l'export ne filtre pas par type de catégorie, mais le contrat de test était faux). ### Changements - Bascule de base : `extends AbstractSupplierApiTestCase` (helpers `seedSupplier`/`addContact`/`supplierCategory` sur type **FOURNISSEUR**). - Suppression du `seedSupplier()` privé (type CLIENT) et du `tearDown()` redondant — dédup F3. - `testExportUsesPrincipalContactColumns` : utilise `addContact()` de la base ; le téléphone secondaire (non porté par ce helper) est posé via le setter sur le contact retourné. - `testExportPopulatesCategoryAndSiteColumns` : l'assertion de la colonne « Catégories » dérive le libellé de `supplierCategory('NEGOCIANT')->getName()` au lieu de hardcoder le préfixe de nom de test (la base nomme `test_cli_cat_fr_negociant`). - Imports `Supplier` / `SupplierContact` / `DateTimeImmutable` retirés (inutilisés). ### Vérifications - `SupplierExportControllerTest` : 9 tests, 48 assertions — vert sous APP_DEBUG=0. - Suite complète `make test` : 574 tests, 2448 assertions — OK sous APP_DEBUG=0. - `make php-cs-fixer-allow-risky` : 0 correction. > MR stackée sur `feature/ERP-112-fixtures-fournisseurs`.
matthieu added the backM2-Fournisseurtype/test labels 2026-06-07 10:50:24 +00:00
matthieu reviewed 2026-06-07 10:54:03 +00:00
matthieu left a comment
Author
Owner

Review — refacto test-only

Migration de SupplierExportControllerTest vers AbstractSupplierApiTestCase, suppression des helpers locaux dupliqués (tearDown, seedSupplier, addContact) au profit de la base mutualisée.

Vérifications

  • Line-by-line : RAS. Les appels addContact(...) respectent la nouvelle signature (supplier, firstName, lastName, phonePrimary, email, position).
  • Removed-behavior : tearDown ré-fourni à l'identique par la base (purge Supplier avant le parent, cascade BDD) ; import DateTimeImmutable retiré car désormais utilisé uniquement dans la base.
  • Cross-file : les helpers retirés étaient private, aucun appelant externe.
  • Correctness : l'ancienne assertion test_cli_cat_negociant était devenue fausse (le helper de base nomme la catégorie test_cli_cat_fr_negociant). La dérivation via supplierCategory(NEGOCIANT)->getName() corrige le drift et rend le test robuste.

Findings : aucun (bug / cleanup).

Tests : 9/9 verts (48 assertions). LGTM.

## Review — refacto test-only ✅ Migration de `SupplierExportControllerTest` vers `AbstractSupplierApiTestCase`, suppression des helpers locaux dupliqués (`tearDown`, `seedSupplier`, `addContact`) au profit de la base mutualisée. **Vérifications** - Line-by-line : RAS. Les appels `addContact(...)` respectent la nouvelle signature `(supplier, firstName, lastName, phonePrimary, email, position)`. - Removed-behavior : `tearDown` ré-fourni à l'identique par la base (purge Supplier avant le parent, cascade BDD) ; import `DateTimeImmutable` retiré car désormais utilisé uniquement dans la base. - Cross-file : les helpers retirés étaient `private`, aucun appelant externe. - Correctness : l'ancienne assertion `test_cli_cat_negociant` était devenue fausse (le helper de base nomme la catégorie `test_cli_cat_fr_negociant`). La dérivation via `supplierCategory(NEGOCIANT)->getName()` corrige le drift et rend le test robuste. **Findings : aucun** (bug / cleanup). **Tests : 9/9 verts (48 assertions).** LGTM.
malio changed target branch from feature/ERP-112-fixtures-fournisseurs to develop 2026-06-08 07:49:29 +00:00
matthieu added 3 commits 2026-06-08 07:49:36 +00:00
Suite fonctionnelle M2 assertant sur le CORPS JSON (jamais les annotations),
jumelle de la suite clients M1 :
- contrat de sérialisation : 4 régressions M1 re-testées (RIB gaté absent pour
  Commerciale, booléens triageProvider/isArchived présents, embed
  categories[].code/name, embed sites[].name/postalCode objet) + enveloppe AP4
  (member/totalItems/view, archivés exclus) + suppression du contact inline ;
- matrice RBAC réelle (app:seed-rbac) bureau/compta/commerciale/usine 200/403,
  gating accounting par omission de clé, mode strict PATCH (RG-2.16) ;
- RG-2.03/2.04/2.05/2.06/2.07/2.08/2.09/2.10/2.11/2.12/2.14/2.15/2.17 ;
- sous-ressources contacts/adresses/ribs (CRUD, sécurité, normalisation) ;
- anti N+1 liste (compte de requêtes constant), audit Supplier + RIB iban/bic.

Fix de contrat découvert et corrigé (sinon DoD figée sur un contrat faux) :
les référentiels comptables (TvaMode/PaymentType/PaymentDelay/Bank) ne portaient
que le groupe client:read:accounting (M1) → sur un fournisseur ils sortaient en
IRI nu. Ajout de supplier:read:accounting → objet {id, code, label} embarqué.

makefile : test-db-setup recrée l'index partiel uq_supplier_company_name_active
(droppé par schema:update comme pour le client) — oubli M2.

DoD § 4.0.bis : réponses JSON RÉELLES (liste + détail admin/commerciale) collées,
capturées via SupplierSerializationContractTest.
- config/packages/test/doctrine.yaml : force dbal profiling en test pour que
  doctrine.debug_data_holder existe sous APP_DEBUG=0 (CI). Le test anti-N+1
  SupplierListTest passait en local (debug=1) mais cassait en CI.
- RBACMatrix/SupplierApi : les 422 RG-2.03 et RG-2.14 assertent desormais le
  propertyPath / message (plus seulement le code) — un 422 orthogonal ne peut
  plus faire passer le test.
- RBACMatrix : gating bureau/commerciale verifie l'ensemble des champs
  comptables (accountNumber/nTva/tvaMode/paymentType), plus seulement siren/ribs.
- violationsByPath() mutualise dans AbstractSupplierApiTestCase (dedup).
test(commercial) : SupplierExportControllerTest sur base fournisseurs (catégories FOURNISSEUR, dédup F3) (ERP-113)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 2m29s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m6s
380b0c9ef1
Fait étendre SupplierExportControllerTest à AbstractSupplierApiTestCase au
lieu d'AbstractCommercialApiTestCase. Supprime le seedSupplier() privé (qui
seedait des catégories de type CLIENT via createCategory(), violant RG-2.10)
et le tearDown() redondant, désormais portés par la base sur des catégories
FOURNISSEUR.

Le contact principal utilise le helper addContact() de la base ; le téléphone
secondaire, non porté par ce helper, est posé via le setter sur le contact
retourné. L'assertion de la colonne Catégories dérive le libellé attendu de
supplierCategory('NEGOCIANT') au lieu de hardcoder le préfixe de nom de test.
matthieu force-pushed feature/ERP-113-export-test-fournisseur-categories from edde89bcba to 380b0c9ef1 2026-06-08 07:49:36 +00:00 Compare
malio merged commit e050a7b910 into develop 2026-06-08 07:49:48 +00:00
malio deleted branch feature/ERP-113-export-test-fournisseur-categories 2026-06-08 07:49:48 +00:00
Sign in to join this conversation.