capTests
Se connecter

Module DoliSCAN pour Dolibarr doliscan-for-dolibarr

Ce projet nécessite une intervention humaine pour qualifier manuellement 69 cas de test. 49 cas sont couverts par un test automatique relancé à chaque nouvelle version.
Rapport qualité
Consultation en lecture seule. Vous voulez participer ? Contactez le chef de projet pour rejoindre l'équipe et créer votre compte. Se connecter.
Scénarios vérifiés avec succès sur la version 2.2.18 : 19. Tout afficher
Les tests automatiques sont affichés. Les points couverts par un test automatique qui passe (badge Couvert) n'ont pas besoin d'être re-testés à la main : concentrez la recette manuelle sur les points manuels, non couverts ou en régression.
Réf Intitulé Cycle Couverture Verdict
Comptes DoliSCAN
DSCDLB-025 Méthodes de gestion d'un compte : statuts, libellés, liens, spécimen
Détails

Objectif : couvrir les méthodes de cycle de vie au-delà du simple CRUD.

Vérifications :

  • La modification de l'identifiant de connexion est bien persistée ; la suppression retire la ligne.
  • Le libellé de statut est non vide dans tous les modes d'affichage et pour tous les statuts connus.
  • Les transitions non applicables (remise en brouillon d'un brouillon, annulation d'un brouillon, réouverture d'un brouillon) ne font rien, sans erreur.
  • Chaque changement de statut est refusé à un utilisateur sans le droit d'écriture DoliSCAN.
  • La validation réussit quand l'API répond, et échoue proprement quand elle ne répond pas.
  • Le lien vers la fiche et le spécimen de démonstration se construisent sans erreur.

Couverture automatique : test/phpunit/integration-dolibarr/MyAccountCrudTest.php (18 methodes, suite integration).

À tester Couvert Non testé
DSCDLB-027 Résolution du compte DoliSCAN d'un utilisateur donné
Détails

Objectif : le pipeline de synchronisation résout les identifiants DoliSCAN de l'utilisateur courant par cette recherche.

Vérifications :

  • Un utilisateur sans compte ne renvoie rien.
  • Un utilisateur avec un compte renvoie ce compte.
  • Un utilisateur présent dans plusieurs entités renvoie l'un de ses comptes.
  • La recherche est bien isolée par utilisateur.
  • Un identifiant inexistant ou nul ne renvoie rien.
  • L'entité est renseignée sur chaque enregistrement, avec ou sans le module multi-sociétés.

Couverture automatique : test/phpunit/integration-dolibarr/MyAccountFetchFirstTest.php (9 methodes, suite integration).

À tester Couvert Non testé
Dates ISO 8601 et fuseaux
DSCDLB-004 Conversion des dates ISO 8601 UTC de l'API en date locale
Détails

Objectif : l'API doliscan.fr renvoie des dates ISO 8601 en UTC ("2026-03-31T22:00:00.000000Z" = 1er avril 2026 en Europe/Paris). Sans conversion, ces chaînes partent telles quelles dans les filtres SQL de Dolibarr qui stockent des dates locales, et la recherche de doublon échoue (bug PROV119 observé en production).

Vérifications :

  • Une date ISO UTC est convertie en Y-m-d local, en heure d'été comme en heure d'hiver.
  • Une date ISO sans microsecondes ou avec un décalage explicite est acceptée.
  • La conversion en horodatage correspond bien à minuit local.
  • Une chaîne vide ne produit pas d'erreur.

Couverture automatique : test/phpunit/unit/IsoDateConversionTest.php (8 methodes, suite unit). Les tests forcent le fuseau Europe/Paris.

À tester Couvert Non testé
Doublons et orphelines
DSCDLB-019 Détection d'une note de frais existante sur la période et l'utilisateur
Détails

Objectif : éviter qu'une synchronisation quotidienne ne recrée chaque jour la note de frais du mois. La recherche porte sur le triplet date de début, date de fin, utilisateur.

Vérifications :

  • Une période incomplète est refusée (code -2).
  • Sans correspondance, la recherche ne renvoie rien.
  • Avec une correspondance, l'identifiant de la note de frais est renvoyé.
  • Une note de frais d'un autre utilisateur ou d'une autre période n'est jamais retenue.
  • En présence de plusieurs correspondances, la première est retenue.

Couverture automatique : test/phpunit/integration-dolibarr/DoublonNDFTest.php (8 methodes, suite integration).

À tester Couvert Non testé
Helpers purs et compatibilité
DSCDLB-001 Couche de compatibilité Dolibarr (config globale, droits, filtres ECM)
Détails

Objectif : le module doit fonctionner de Dolibarr 18 à 23 sans branche morte ni appel à une API absente.

Vérifications :

  • Lire une constante de configuration absente renvoie la valeur par défaut, jamais une erreur.
  • Un contrôle de droit répond correctement, que l'hôte expose User::hasRight() ou l'ancien $user->rights.
  • Les filtres passés à EcmFiles::fetchAll() sont convertis au format USF à partir de Dolibarr 20, et laissés en tableau en dessous.
  • Le mapping slug DoliSCAN -> fournisseur / type de frais renvoie 0 (et non une erreur) quand la configuration est absente ou le JSON invalide.
  • Les clés de filtre SQL malformées ou contenant une tentative d'injection sont refusées.
  • dsAuditLog() écrit une charge JSON structurée, même sans utilisateur ni entité.

Couverture automatique : test/phpunit/unit/BackportCompatTest.php (34 methodes, suite unit).

À tester Couvert Non testé
DSCDLB-002 Type de retour uniforme SyncResult sur le pipeline d'import
Détails

Objectif : toutes les étapes d'import et de synchronisation renvoient le même objet de résultat, sans casser le code historique qui lisait ->message et ->error.

Vérifications :

  • Un résultat neuf est "ok" et vide.
  • Les fabriques success() / failure() positionnent l'état et le message attendus.
  • Ajouter une erreur fait basculer le résultat en "non ok".
  • La fusion de deux résultats cumule messages et erreurs.
  • Les accès historiques ->message et ->error (lecture et écriture) continuent de fonctionner.

Couverture automatique : test/phpunit/unit/SyncResultTest.php (10 methodes, suite unit).

À tester Couvert Non testé
DSCDLB-003 Helpers purs de calcul : TVA, libellés de ligne, mapping du moyen de paiement
Détails

Objectif : les fonctions du chemin critique de l'import multi-TVA sont exactes. Une régression ici corrompt silencieusement les factures fournisseur et les notes de frais.

Vérifications :

  • Le tableau des taux de TVA est trié par taux décroissant, les taux à zéro sont écartés, les taux décimaux conservés.
  • Le solveur de ventilation HT retrouve le HT exact pour un taux unique et reste cohérent sur deux taux ; il signale une TVA suspecte ou une absence de solution.
  • Le libellé de ligne reprend le libellé saisi, et l'enrichit pour un restaurant (invités), un trajet (départ / arrivée) ou du carburant (véhicule et énergie).
  • Le mapping d'un slug de paiement DoliSCAN renvoie le couple (banque, mode de paiement), avec la surcharge par utilisateur prioritaire sur le réglage global, et des zéros sur slug inconnu ou JSON invalide.
  • Les conversions TTC -> TVA et TTC -> HT sont exactes, y compris à taux nul.

Couverture automatique : test/phpunit/unit/MyndfPureHelpersTest.php (37 methodes, suite unit).

À tester Couvert Non testé
Import des notes de frais
DSCDLB-008 Création de la note de frais Dolibarr d'accueil de l'import
Détails

Objectif : create_ndf() amorce le pipeline d'import en créant, ou en réutilisant, la note de frais Dolibarr de la période.

Vérifications :

  • Une période sans date de début ou sans date de fin est refusée (code -2).
  • Sans doublon existant, une note de frais est créée au statut brouillon, rattachée à l'utilisateur, avec les bonnes dates de début et de fin.
  • Si une note de frais correspond déjà, son identifiant est réutilisé au lieu d'en créer une nouvelle.
  • Deux utilisateurs distincts ont bien deux notes de frais distinctes.

Couverture automatique : test/phpunit/integration-dolibarr/CreateNdfTest.php (6 methodes, suite integration).

À tester Couvert Non testé
DSCDLB-010 Garde-fous d'entrée de l'import (déjà importé, JSON invalide)
Détails

Objectif : rejeter une entrée invalide avant tout appel réseau, pour ne jamais corrompre la base sur une charge utile abîmée.

Vérifications :

  • Une note de frais DoliSCAN déjà validée renvoie le message "déjà importée" et ne relance pas d'import.
  • Une charge JSON invalide renvoie un message d'erreur explicite, sans appel HTTP ni écriture.

Couverture automatique : test/phpunit/integration-dolibarr/ImportNDFGuardsTest.php (2 methodes, suite integration).

À tester Couvert Non testé
DSCDLB-017 Façade objet NDFImporter du pipeline d'import
Détails

Objectif : le point d'entrée objet du pipeline capture la base et l'utilisateur une seule fois, et renvoie systématiquement un résultat de synchronisation uniforme.

Vérifications :

  • Le constructeur lie bien la base de données et l'utilisateur fournis.
  • L'import d'une note de frais déjà validée renvoie un résultat en succès (sortie anticipée).
  • L'import d'une charge JSON invalide renvoie un résultat en échec.
  • La recherche de doublon sans dates renvoie -2.
  • Le contrôle de TVA et la resynchronisation des justificatifs refusent un identifiant d'utilisateur vide.

Couverture automatique : test/phpunit/integration-dolibarr/NDFImporterTest.php (6 methodes, suite integration).

À tester Couvert Non testé
Jetons d'API et horloge
DSCDLB-039 Détection locale de l'expiration d'un jeton, sans appel réseau
Détails

Objectif : lire la date d'expiration inscrite dans le jeton d'API pour le renouveler AVANT de dépenser une requête HTTP vouée à répondre 401. La signature n'est jamais vérifiée localement, c'est le rôle du serveur.

Vérifications :

  • La date d'expiration est lue correctement, y compris quand elle est stockée en chaîne de chiffres, et sur un jeton DoliSCAN réel.
  • Aucune date n'est renvoyée si l'information est absente, non numérique, si la charge est malformée, si la chaîne est vide, ou s'il s'agit d'une ancienne clé qui n'est pas un jeton.
  • Un jeton dont la date est passée est déclaré expiré ; un jeton dont la date est à venir ne l'est pas ; la marge de tolérance d'horloge est respectée.
  • Le budget de renouvellement autorise deux tentatives puis se bloque dans la fenêtre, et se réarme une fois la fenêtre écoulée.
  • Le décalage d'horloge avec le serveur est classé correct, à surveiller ou critique selon les seuils.

Couverture automatique : test/phpunit/unit/TokenExpiryTest.php (28 methodes, suite unit).

À tester Couvert Non testé
DSCDLB-041 Auto-réparation du jeton pendant l'import (préventive et réactive)
Détails

Objectif : un jeton périmé faisait échouer l'import en silence ("ERROR download details"), la note de frais était perdue et le client ouvrait un ticket. Deux niveaux de réparation sont désormais en place.

Vérifications :

  • Préventif : si le jeton stocké a une date d'expiration déjà passée, il est renouvelé AVANT le téléchargement du PDF et des détails, donc aucun appel n'est envoyé avec un jeton mort.
  • Réactif : si le jeton n'est pas introspectable localement mais que le serveur répond 401 sur les détails, le jeton est renouvelé une fois et le téléchargement est rejoué, de sorte que l'import aboutit.
  • Aucun renouvellement quand le jeton est encore valide.
  • Aucune tentative de renouvellement quand le jeton administrateur est lui-même signalé invalide.

Couverture automatique : test/phpunit/integration-dolibarr/ImportNDFTokenAutoRepairTest.php (4 methodes, suite integration).

À tester Couvert Non testé
Notes de frais DoliSCAN
DSCDLB-029 Cycle de vie d'un enregistrement de note de frais DoliSCAN
Détails

Objectif : l'enregistrement DoliSCAN porte la charge utile brute venue du mobile et le lien vers la note de frais Dolibarr.

Vérifications :

  • Création, relecture, modification et suppression.
  • Le workflow de statut (brouillon, validé, figé, annulé).
  • La recherche par statut, par utilisateur et par libellé.
  • Le stockage de la charge JSON est intègre.
  • Les montants total, part personnelle et part professionnelle sont cohérents.
  • L'isolation par entité est effective.

Couverture automatique : test/phpunit/integration-dolibarr/MyNDFTest.php (11 methodes, suite integration).

À tester Couvert Non testé
DSCDLB-030 Méthodes de gestion d'une note de frais : statuts, libellés, métadonnées
Détails

Objectif : couvrir les méthodes de cycle de vie au-delà du CRUD de base.

Vérifications :

  • La modification du montant est persistée, la référence est préservée.
  • La suppression retire la ligne, et une relecture après suppression ne renvoie rien.
  • Le libellé de statut est correct pour les quatre états, et diffère selon le mode court ou long.
  • Les transitions non applicables ne font rien ; les transitions valides (validé vers brouillon, validé vers annulé, annulé vers validé) s'appliquent.
  • Chaque changement de statut est refusé sans le droit d'écriture DoliSCAN.
  • Le lien vers la fiche, les métadonnées de création et le spécimen se construisent sans erreur.

Couverture automatique : test/phpunit/integration-dolibarr/MyNDFCrudTest.php (22 methodes, suite integration).

À tester Couvert Non testé
DSCDLB-031 Filtres de recherche sur les listes : exactitude et non-régression SQL
Détails

Objectif : ces filtres alimentent les listes du module. Ils sont à rejouer avant et après toute modification de l'échappement SQL.

Vérifications, sur les notes de frais comme sur les comptes :

  • Filtre par identifiant, par statut, par libellé, par identifiant de connexion.
  • Filtre SQL personnalisé, seul puis combiné à d'autres filtres.
  • Combinaison de plusieurs filtres en ET et en OU.
  • Pagination et tri.
  • Filtre vide, valeur à zéro, caractères spéciaux dans un libellé.
  • Absence de correspondance : liste vide, pas d'erreur.

Couverture automatique : test/phpunit/integration-dolibarr/FetchAllFilterTest.php (20 methodes, suite integration).

À tester Couvert Non testé
DSCDLB-032 Filtres étendus : clés étrangères, entité, montants, injection SQL
Détails

Objectif : compléter la couverture des filtres sur les axes sensibles pour la sécurité et le cloisonnement.

Vérifications :

  • Le filtre par utilisateur isole bien les données de chaque utilisateur.
  • Le filtre d'entité est appliqué par défaut (cloisonnement multi-sociétés).
  • Un identifiant passé en chaîne ("42") est traité comme un entier.
  • Une tentative d'injection SQL dans un filtre texte n'altère pas la base.
  • Une clé de filtre non autorisée est écartée avant la requête.
  • Combinaison utilisateur plus statut, et combinaison limite plus décalage.

Couverture automatique : test/phpunit/integration-dolibarr/FetchAllExtendedFilterTest.php (7 methodes, suite integration).

À tester Couvert Non testé
Pages d'administration et affichage
DSCDLB-047 Balayage HTTP de toutes les pages du module sur un serveur réel
Détails

Objectif : détecter par requête HTTP réelle les erreurs fatales, méthodes ou fonctions indéfinies et classes manquantes que l'analyse statique ne peut pas voir sur les variables globales de Dolibarr.

Vérifications :

  • Le routeur de test répond.
  • Chaque page d'administration se charge sans erreur.
  • Chaque page racine du module se charge sans erreur.
  • Chaque point d'entrée asynchrone répond sans erreur.
  • Une soumission de formulaire ne déclenche pas d'erreur.

Couverture automatique : test/phpunit/http/AdminPagesHttpTest.php (5 methodes paramétrées, suite http, serveur PHP éphémère).

À tester Couvert Non testé
DSCDLB-048 Les aides d'affichage tolèrent une configuration absente
Détails

Objectif : verrouiller la correction de l'erreur fatale de la page de configuration bancaire sur un module fraîchement installé, où les constantes de banque n'existent pas encore : la valeur nulle était refusée par un typage strict.

Vérifications :

  • L'affichage d'un tiers ou d'un type de frais avec une valeur nulle, zéro ou vide renvoie "Undef" sans lever d'erreur.
  • L'affichage du couple banque et moyen de paiement avec deux valeurs nulles renvoie une chaîne vide sans erreur, et tolère aussi une seule valeur nulle, une chaîne vide ou une chaîne numérique.
  • Le libellé d'entité tolère une valeur nulle (jointures externes de la page de diagnostics).
  • Un identifiant valide continue d'être affiché correctement.

Couverture automatique : test/phpunit/integration-dolibarr/DisplayHelpersTest.php (8 methodes, suite integration).

À tester Couvert Non testé
Permissions
DSCDLB-044 Contexte système, garde de changement de statut et messages lisibles
Détails

Objectif : distinguer une action humaine, qui doit respecter les droits Dolibarr, d'un import automatique, qui rejoue côté serveur ce que l'utilisateur a déjà validé sur son mobile. Et, en cas de refus, expliquer pourquoi en français plutôt que de renvoyer un code.

Vérifications :

  • Le contexte système est inactif par défaut, s'ouvre et se referme correctement, supporte l'imbrication et ne descend jamais en dessous de zéro.
  • Un changement de statut est refusé sans le droit, accepté avec le droit, et accepté en contexte système.
  • Le libellé d'un utilisateur s'écrit "Prénom Nom (identifiant)" et retombe sur l'identifiant puis le numéro quand les noms manquent.
  • Le message de refus est une phrase complète indiquant l'utilisateur, le droit manquant et où l'accorder.
  • Le catalogue des droits requis inclut la facturation fournisseur seulement si un mapping professionnel est configuré, et le droit d'écriture sur les notes de frais DoliSCAN est conseillé plutôt que critique.
  • L'audit signale les droits manquants, et le tri des droits critiques ignore les droits seulement conseillés.

Couverture automatique : test/phpunit/unit/PermsHelpersTest.php (16 methodes, suite unit).

À tester Couvert Non testé