diff --git a/test/phpunit/CodingPhpTest.php b/test/phpunit/CodingPhpTest.php index f39e2540ef3a5..c72f5859ea679 100644 --- a/test/phpunit/CodingPhpTest.php +++ b/test/phpunit/CodingPhpTest.php @@ -618,135 +618,9 @@ private function assertModuleIsOk($module_name, $message = '') //trigger_error("Deprecated module name, use '$new_name': $message", E_USER_DEPRECATED); } else { $this->assertTrue( - isset(self::VALID_MODULE_MAPPING[$module_name]), + array_key_exists($module_name, self::VALID_MODULE_MAPPING), "Unknown module: $message" ); } } - - const DEPRECATED_MODULE_MAPPING = array( - 'actioncomm' => 'agenda', - 'adherent' => 'member', - 'adherent_type' => 'member_type', - 'banque' => 'bank', - 'categorie' => 'category', - 'commande' => 'order', - 'contrat' => 'contract', - 'entrepot' => 'stock', - 'expedition' => 'delivery_note', - 'facture' => 'invoice', - 'fichinter' => 'intervention', - 'product_fournisseur_price' => 'productsupplierprice', - 'product_price' => 'productprice', - 'projet' => 'project', - 'propale' => 'propal', - 'socpeople' => 'contact', - ); - const VALID_MODULE_MAPPING = array( - 'agenda' => 1, - 'member' => 1, - 'member_type' => 1, - 'bank' => 1, - 'category' => 1, - 'delivery_note' => 1, - 'order' => 1, - 'contract' => 1, - 'stock' => 1, - 'invoice' => 1, - 'intervention' => 1, - 'productsupplierprice' => 1, - 'productprice' => 1, - 'project' => 1, - 'propal' => 1, - 'contact' => 1, - 'accounting' => 1, - 'ai' => 1, - 'anothermodule' => 1, - 'api' => 1, - 'asset' => 1, - 'barcode' => 1, - 'blockedlog' => 1, - 'bom' => 1, - 'bookcal' => 1, - 'bookmark' => 1, - 'cashdesk' => 1, - 'clicktodial' => 1, - 'comptabilite' => 1, - 'cron' => 1, - 'datapolicy' => 1, - 'debugbar' => 1, - 'deplacement' => 1, - 'don' => 1, - 'dynamicprices' => 1, - 'ecm' => 1, - 'ecotax' => 1, - 'emailcollector' => 1, - 'eventorganization' => 1, - 'expensereport' => 1, - 'export' => 1, - 'externalsite' => 1, - 'fckeditor' => 1, - 'ficheinter' => 1, - 'fournisseur' => 1, - 'ftp' => 1, - 'google' => 1, - 'gravatar' => 1, - 'holiday' => 1, - 'hrm' => 1, - 'import' => 1, - 'incoterm' => 1, - 'intracommreport' => 1, - 'knowledgemanagement' => 1, - 'label' => 1, - 'ldap' => 1, - 'loan' => 1, - 'mailing' => 1, - 'mailman' => 1, - 'mailmanspip' => 1, - 'margin' => 1, - 'memcached' => 1, - 'modulebuilder' => 1, - 'mrp' => 1, - 'multicompany' => 1, - 'multicurrency' => 1, - 'mymodule' => 1, - 'notification' => 1, - 'numberwords' => 1, - 'openstreetmap' => 1, - 'opensurvey' => 1, - 'partnership' => 1, - 'paybox' => 1, - 'paymentbybanktransfer' => 1, - 'paypal' => 1, - 'paypalplus' => 1, - 'prelevement' => 1, - 'product' => 1, - 'productbatch' => 1, - 'receiptprinter' => 1, - 'reception' => 1, - 'recruitment' => 1, - 'resource' => 1, - 'salaries' => 1, - 'service' => 1, - 'socialnetworks' => 1, - 'societe' => 1, - 'stocktransfer' => 1, - 'stripe' => 1, - 'supplier_invoice' => 1, - 'supplier_order' => 1, - 'supplier_proposal' => 1, - 'syslog' => 1, - 'takepos' => 1, - 'tax' => 1, - 'ticket' => 1, - 'user' => 1, - 'variants' => 1, - 'webhook' => 1, - 'webportal' => 1, - 'webservices' => 1, - 'website' => 1, - 'workflow' => 1, - 'workstation' => 1, - 'zapier' => 1, - ); } diff --git a/test/phpunit/CommonClassTest.class.php b/test/phpunit/CommonClassTest.class.php index 17bc6dbc5c747..9e3aaf1656956 100644 --- a/test/phpunit/CommonClassTest.class.php +++ b/test/phpunit/CommonClassTest.class.php @@ -37,6 +37,7 @@ } $conf->global->MAIN_DISABLE_ALL_MAILS = 1; +use PHPUnit\Framework\TestCase; /** * Class for PHPUnit tests @@ -45,22 +46,31 @@ * @backupStaticAttributes enabled * @remarks backupGlobals must be disabled to have db,conf,user and lang not erased. */ -class CommonClassTest extends PHPUnit\Framework\TestCase +abstract class CommonClassTest extends TestCase { protected $savconf; protected $savuser; protected $savlangs; protected $savdb; + /** + * Number of Dolibarr log lines to show in case of error + * + * @var integer + */ + public $nbLinesToShow = 100; + /** * Constructor * We save global variables into local variables * - * @param string $name Name + * @param string $name Name + * @param array $data Test data + * @param string $dataName Test data name. */ - public function __construct($name = '') + public function __construct($name = null, array $data = array(), $dataName = '') { - parent::__construct($name); + parent::__construct($name, $data, $dataName); //$this->sharedFixture global $conf,$user,$langs,$db; @@ -71,7 +81,7 @@ public function __construct($name = '') print __METHOD__." db->type=".$db->type." user->id=".$user->id; //print " - db ".$db->db; - print "\n"; + print PHP_EOL; } /** @@ -85,11 +95,13 @@ public static function setUpBeforeClass(): void $db->begin(); // This is to have all actions inside a transaction even if test launched without suite. if (!isModEnabled('agenda')) { - print __METHOD__." module agenda must be enabled.\n"; + print get_called_class()." module agenda must be enabled.".PHP_EOL; die(1); } - print __METHOD__."\n"; + if (isset($_ENV['PHPUNIT_DEBUG'])) { + print get_called_class().PHP_EOL; + } } /** @@ -104,7 +116,7 @@ protected function onNotSuccessfulTest(Throwable $t): void $lines = file($logfile); - $nbLinesToShow = 100; + $nbLinesToShow = $this->nbLinesToShow; if ($t instanceof PHPUnit\Framework\Error\Notice) { $nbLinesToShow = 3; } @@ -115,10 +127,11 @@ protected function onNotSuccessfulTest(Throwable $t): void $last_lines = array_slice($lines, $first_line, $nbLinesToShow); // Show log file - print "\n----- Test fails. Show last ".$nbLinesToShow." lines of dolibarr.log file -----\n"; + print PHP_EOL."----- Test fails. Show last ".$nbLinesToShow." lines of dolibarr.log file -----".PHP_EOL; foreach ($last_lines as $line) { print $line . "
"; } + print PHP_EOL; parent::onNotSuccessfulTest($t); } @@ -137,6 +150,9 @@ protected function setUp(): void $langs = $this->savlangs; $db = $this->savdb; + if (isset($_ENV['PHPUNIT_DEBUG'])) { + print get_called_class().PHP_EOL; + } print __METHOD__."\n"; //print $db->getVersion()."\n"; } @@ -148,7 +164,9 @@ protected function setUp(): void */ protected function tearDown(): void { - print __METHOD__."\n"; + if (isset($_ENV['PHPUNIT_DEBUG'])) { + print get_called_class().PHP_EOL; + } } /** @@ -160,7 +178,150 @@ public static function tearDownAfterClass(): void { global $db; $db->rollback(); - - print __METHOD__."\n"; + if (isset($_ENV['PHPUNIT_DEBUG'])) { + print get_called_class().PHP_EOL; + } } + + /** + * Map deprecated module names to new module names + */ + const DEPRECATED_MODULE_MAPPING = array( + 'actioncomm' => 'agenda', + 'adherent' => 'member', + 'adherent_type' => 'member_type', + 'banque' => 'bank', + 'categorie' => 'category', + 'commande' => 'order', + 'contrat' => 'contract', + 'entrepot' => 'stock', + 'expedition' => 'delivery_note', + 'facture' => 'invoice', + 'ficheinter' => 'intervention', + 'product_fournisseur_price' => 'productsupplierprice', + 'product_price' => 'productprice', + 'projet' => 'project', + 'propale' => 'propal', + 'socpeople' => 'contact', + ); + + /** + * Map module names to the 'class' name (the class is: mod) + * Value is null when the module is not internal to the default + * Dolibarr setup. + */ + const VALID_MODULE_MAPPING = array( + 'accounting' => 'Accounting', + 'agenda' => 'Agenda', + 'ai' => 'Ai', + 'anothermodule' => null, // Not used in code, used in translations.lang + 'api' => 'Api', + 'asset' => 'Asset', + 'bank' => 'Banque', + 'barcode' => 'Barcode', + 'blockedlog' => 'BlockedLog', + 'bom' => 'Bom', + 'bookcal' => 'BookCal', + 'bookmark' => 'Bookmark', + 'cashdesk' => null, + 'category' => 'Categorie', + 'clicktodial' => 'ClickToDial', + 'TBD_COLLAB' => 'Collab', // TODO: fill in proper name + 'comptabilite' => 'Comptabilite', + 'contact' => null, // TODO: fill in proper class + 'contract' => 'Contrat', + 'cron' => 'Cron', + 'datapolicy' => 'DataPolicy', + 'TBD_DAV' => 'Dav', // TODO: fill in proper name + 'debugbar' => 'DebugBar', + 'delivery_note' => 'Expedition', + 'deplacement' => 'Deplacement', + "TBD_DocGen" => 'DocumentGeneration', // TODO: fill in proper name + 'don' => 'Don', + 'dynamicprices' => 'DynamicPrices', + 'ecm' => 'ECM', + 'ecotax' => null, // TODO: External module ? + 'emailcollector' => 'EmailCollector', + 'eventorganization' => 'EventOrganization', + 'expensereport' => 'ExpenseReport', + 'export' => 'Export', + 'TBD_EXTERNALRSS' => 'ExternalRss', // TODO: fill in proper name + 'externalsite' => 'ExternalSite', + 'fckeditor' => 'Fckeditor', + 'fournisseur' => 'Fournisseur', + 'ftp' => 'FTP', + 'TBD_GEOIPMAXMIND' => 'GeoIPMaxmind', // TODO: fill in proper name + 'google' => null, // External ? + 'gravatar' => 'Gravatar', + 'holiday' => 'Holiday', + 'hrm' => 'HRM', + 'import' => 'Import', + 'incoterm' => 'Incoterm', + 'intervention' => 'Ficheinter', + 'intracommreport' => 'Intracommreport', + 'invoice' => 'Facture', + 'knowledgemanagement' => 'KnowledgeManagement', + 'label' => 'Label', + 'ldap' => 'Ldap', + 'loan' => 'Loan', + 'mailing' => 'Mailing', + 'mailman' => null, // Same module as mailmanspip -> MailmanSpip ?? + 'mailmanspip' => 'MailmanSpip', + 'margin' => 'Margin', + 'member' => 'Adherent', + 'member_type' => null, // TODO: External module ? + 'memcached' => null, // TODO: External module? + 'modulebuilder' => 'ModuleBuilder', + 'mrp' => 'Mrp', + 'multicompany' => null, // Not provided by default, no module tests + 'multicurrency' => 'MultiCurrency', + 'mymodule' => null, // modMyModule - Name used in module builder (avoid false positives) + 'notification' => 'Notification', + 'numberwords' => null, // Not provided by default, no module tests + 'TBD_OAUTH' => 'Oauth', // TODO: set proper name + 'openstreetmap' => null, // External module? + 'opensurvey' => 'OpenSurvey', + 'order' => 'Commande', + 'partnership' => 'Partnership', + 'paybox' => 'Paybox', + 'paymentbybanktransfer' => 'PaymentByBankTransfer', + 'paypal' => 'Paypal', + 'paypalplus' => null, + 'prelevement' => 'Prelevement', + 'TBD_PRINTING' => 'Printing', // TODO: set proper name + 'product' => 'Product', + 'productbatch' => 'ProductBatch', + 'productprice' => null, + 'productsupplierprice' => null, + 'project' => 'Projet', + 'propal' => 'Propale', + 'receiptprinter' => 'ReceiptPrinter', + 'reception' => 'Reception', + 'recruitment' => 'Recruitment', + 'resource' => 'Resource', + 'salaries' => 'Salaries', + 'service' => 'Service', + 'socialnetworks' => 'SocialNetworks', + 'societe' => 'Societe', + 'stock' => 'Stock', + 'stocktransfer' => 'StockTransfer', + 'stripe' => 'Stripe', + 'supplier_invoice' => null, // Special case, uses invoice + 'supplier_order' => null, // Special case, uses invoice + 'supplier_proposal' => 'SupplierProposal', + 'syslog' => 'Syslog', + 'takepos' => 'TakePos', + 'tax' => 'Tax', + 'ticket' => 'Ticket', + 'user' => 'User', + 'variants' => 'Variants', + 'webhook' => 'Webhook', + 'webportal' => 'WebPortal', + 'webservices' => 'WebServices', + 'TBD_WS_CLIENT' => 'WebServicesClient', // TODO: set proper name + 'website' => 'Website', + 'workflow' => 'Workflow', + 'workstation' => 'Workstation', + 'zapier' => 'Zapier', + ); } diff --git a/test/phpunit/ModulesTest.php b/test/phpunit/ModulesTest.php index 0d36b498c91a6..2745b87529028 100644 --- a/test/phpunit/ModulesTest.php +++ b/test/phpunit/ModulesTest.php @@ -1,6 +1,7 @@ * Copyright (C) 2023 Alexandre Janniaux + * Copyright (C) 2024 MDW * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -38,6 +39,8 @@ $conf->global->MAIN_DISABLE_ALL_MAILS = 1; +use PHPUnit\Framework\TestCase; + /** * Class for PHPUnit tests * @@ -45,45 +48,56 @@ * @backupStaticAttributes enabled * @remarks backupGlobals must be disabled to have db,conf,user and lang not erased. */ -class ModulesTest extends CommonClassTest +class ModulesTest extends CommonClassTest // TestCase //CommonClassTest { + /** + * Return list of modules for which to test initialisation + * + * @return array List of module labels to test (class is mod) + */ + public function moduleInitListProvider() + { + $full_list = self::VALID_MODULE_MAPPING; + $filtered_list = array_map(function ($value) { + return array($value); + }, array_filter($full_list, function ($value) { + return $value !== null; + })); + return $filtered_list; + } + /** * testModulesInit * + * @param string $modlabel Module label (class is mod) + * * @return int + * + * @dataProvider moduleInitListProvider */ - public function testModulesInit() + public function testModulesInit(string $modlabel) { global $conf,$user,$langs,$db; + $conf = $this->savconf; $user = $this->savuser; $langs = $this->savlangs; $db = $this->savdb; - $modulelist = array('Accounting','Adherent','Agenda','Api','Asset','Banque','Barcode','BlockedLog','Bom','Bookmark', - 'Categorie','ClickToDial','Collab','Commande','Comptabilite','Contrat','Cron','DataPolicy','Dav','DebugBar','Deplacement','DocumentGeneration','Don','DynamicPrices', - 'ECM','EmailCollector','EventOrganization','Expedition','ExpenseReport','Export','ExternalRss','ExternalSite', - 'Facture','Fckeditor','Ficheinter','Fournisseur','FTP','GeoIPMaxmind','Gravatar','Holiday','HRM','Import','Incoterm','Intracommreport', - 'KnowledgeManagement','Label','Ldap','Loan', - 'Mailing','MailmanSpip','Margin','ModuleBuilder','Mrp','MultiCurrency', - 'Notification','Oauth','OpenSurvey','Paybox','PaymentByBankTransfer','Paypal','Prelevement','Printing','Product','ProductBatch','Projet','Propale', - 'ReceiptPrinter','Reception','Recruitment','Resource', - 'Salaries','Service','SocialNetworks','Societe','Stock','Stripe','SupplierProposal','Syslog', - 'TakePos','Tax','Ticket','User','Variants','WebServices','WebServicesClient','Website','Workflow','Workstation','Zapier'); - foreach ($modulelist as $modlabel) { - require_once DOL_DOCUMENT_ROOT.'/core/modules/mod'.$modlabel.'.class.php'; - $class = 'mod'.$modlabel; - $mod = new $class($db); + $this->nbLinesToShow = 0; // Only 3 lines of the log. - $result = $mod->remove(); - $result = $mod->init(); + require_once DOL_DOCUMENT_ROOT.'/core/modules/mod'.$modlabel.'.class.php'; + $class = 'mod'.$modlabel; + $mod = new $class($db); + + $result = $mod->remove(); + $result = $mod->init(); - $this->assertLessThan($result, 0, $modlabel." ".$mod->error); - print __METHOD__." test remove/init for module ".$modlabel.", result=".$result."\n"; + $this->assertLessThan($result, 0, $modlabel." ".$mod->error); + print __METHOD__." test remove/init for module ".$modlabel.", result=".$result."\n"; - if (in_array($modlabel, array('Ldap', 'MailmanSpip'))) { - $result = $mod->remove(); - } + if (in_array($modlabel, array('Ldap', 'MailmanSpip'))) { + $result = $mod->remove(); } return 0;