From a2903122112348a2a68b3a5b094277463f861ec9 Mon Sep 17 00:00:00 2001
From: Matthieu Marcillaud <marcimat@rezo.net>
Date: Sun, 9 Jul 2023 19:09:51 +0200
Subject: [PATCH] tests: tests _DIR_PLUGINS_SUPPL en PHPUnit

---
 ecrire/tests/Plugin/DirPluginsSupplTest.php   |  65 ++++++
 ecrire/tests/Plugin/data/paquet.xml           |   9 +
 .../legacy/unit/plugin/dir_plugins_suppl.php  | 212 ------------------
 3 files changed, 74 insertions(+), 212 deletions(-)
 create mode 100644 ecrire/tests/Plugin/DirPluginsSupplTest.php
 create mode 100644 ecrire/tests/Plugin/data/paquet.xml
 delete mode 100644 ecrire/tests/legacy/unit/plugin/dir_plugins_suppl.php

diff --git a/ecrire/tests/Plugin/DirPluginsSupplTest.php b/ecrire/tests/Plugin/DirPluginsSupplTest.php
new file mode 100644
index 0000000000..7a29b5446f
--- /dev/null
+++ b/ecrire/tests/Plugin/DirPluginsSupplTest.php
@@ -0,0 +1,65 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Spip\Test\Filesystem;
+
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Depends;
+use PHPUnit\Framework\TestCase;
+
+class DirPluginsSupplTest extends TestCase
+{
+	const DIR_PLUGINS_SUPPL = _DIR_TMP . 'test_dir_plugins_suppl/';
+	const DIR_PLUGINS_OUTSIDE = _DIR_TMP . 'test_dir_plugins_outisde/';
+	const PAQUET_TEST = 'toto/paquet.xml';
+
+	public static function setUpBeforeClass(): void {
+		find_in_path('./inc/plugin.php', '', true);
+		supprimer_repertoire(self::DIR_PLUGINS_SUPPL);
+		mkdir(self::DIR_PLUGINS_SUPPL . 'toto', 0777, true);
+		mkdir(self::DIR_PLUGINS_OUTSIDE . 'toto', 0777, true);
+		copy(__DIR__ . '/data/paquet.xml', self::DIR_PLUGINS_SUPPL . self::PAQUET_TEST);
+		copy(__DIR__ . '/data/paquet.xml', self::DIR_PLUGINS_OUTSIDE . self::PAQUET_TEST);
+	}
+
+	public static function tearDownAfterClass(): void {
+		supprimer_repertoire(self::DIR_PLUGINS_SUPPL);
+		supprimer_repertoire(self::DIR_PLUGINS_OUTSIDE);
+	}
+
+	public function testConstant() {
+		// preparation: la constante est elle definie et comprend uniquement 1 reps suppl?
+		if (defined('_DIR_PLUGINS_SUPPL') && _DIR_PLUGINS_SUPPL !== self::DIR_PLUGINS_SUPPL) {
+			$this->markTestSkipped(sprintf('La constante _DIR_PLUGINS_SUPPL est déjà définie, le test ne peut s’appliquer. Valeur "%s"', _DIR_PLUGINS_SUPPL));
+		}
+		define('_DIR_PLUGINS_SUPPL', self::DIR_PLUGINS_SUPPL);
+		if (substr_count(_DIR_PLUGINS_SUPPL, ':') !== 0) {
+			$this->markTestSkipped(sprintf('La constante _DIR_PLUGINS_SUPPL ne doit contenir qu’un seul chemin supplémentaire. Valeur: "%s"', _DIR_PLUGINS_SUPPL));
+		}
+		if (!str_ends_with(_DIR_PLUGINS_SUPPL, '/')) {
+			$this->markTestSkipped(sprintf('La constante _DIR_PLUGINS_SUPPL doit terminer par un /. Valeur: "%s"', _DIR_PLUGINS_SUPPL));
+		}
+		$this->assertTrue(true);
+	}
+
+	#[Depends('testConstant')]
+	public function testDirectory() {
+		// le rep suppl existe
+		$this->assertTrue(is_dir(self::DIR_PLUGINS_SUPPL), sprintf('Le répertoire "%s" aurait du être créé', self::DIR_PLUGINS_SUPPL));
+		$this->assertTrue(file_exists(self::DIR_PLUGINS_SUPPL . self::PAQUET_TEST), sprintf('Le fichier "%s" aurait du être créé', self::DIR_PLUGINS_SUPPL . self::PAQUET_TEST));
+		// le rep outside existe
+		$this->assertTrue(is_dir(self::DIR_PLUGINS_OUTSIDE), sprintf('Le répertoire "%s" aurait du être créé', self::DIR_PLUGINS_OUTSIDE));
+		$this->assertTrue(file_exists(self::DIR_PLUGINS_OUTSIDE . self::PAQUET_TEST), sprintf('Le fichier "%s" aurait du être créé', self::DIR_PLUGINS_OUTSIDE . self::PAQUET_TEST));
+	}
+
+	#[Depends('testDirectory')]
+	public function testListePluginsSuppl() {
+		$plugins = liste_plugin_files(self::DIR_PLUGINS_SUPPL);
+		// verifier qu'on retrouve bien tous les rep suppl de _DIR_PLUGINS_SUPPL
+		$this->assertContains('toto', $plugins, sprintf('Le répertoire "%s" non trouvé dans "%s"', 'toto', self::DIR_PLUGINS_SUPPL));
+		// Mais pas des plugins en trop !
+		$this->assertCount(1, $plugins, sprintf('Il y a plus qu’un plugin trouvé dans "%s"', self::DIR_PLUGINS_SUPPL));
+	}
+
+}
diff --git a/ecrire/tests/Plugin/data/paquet.xml b/ecrire/tests/Plugin/data/paquet.xml
new file mode 100644
index 0000000000..82235ad873
--- /dev/null
+++ b/ecrire/tests/Plugin/data/paquet.xml
@@ -0,0 +1,9 @@
+<paquet
+	prefix="test_dir_plugins_suppl"
+	categorie="squelette"
+	version="1.0.0"
+	etat="stable"
+	compatibilite="[5.0.0-dev;5.*]"
+>
+	<nom>Test Dir PLugins Suppl</nom>
+</paquet>
diff --git a/ecrire/tests/legacy/unit/plugin/dir_plugins_suppl.php b/ecrire/tests/legacy/unit/plugin/dir_plugins_suppl.php
deleted file mode 100644
index d23b6de890..0000000000
--- a/ecrire/tests/legacy/unit/plugin/dir_plugins_suppl.php
+++ /dev/null
@@ -1,212 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-/**
- * Test unitaire de prise en compte de la constante _DIR_PLUGINS_SUPPL par la fonction liste_plugin_files() du fichier
- * ./inc/plugin.php
- */
-
-$test = '_DIR_PLUGINS_SUPPL';
-
-$remonte = __DIR__ . '/';
-while (!is_file($remonte . 'test.inc')) {
-	$remonte .= '../';
-}
-
-require $remonte . 'test.inc';
-find_in_path('./inc/plugin.php', '', true);
-
-// lancer le binz
-echo test_dir_plugins_suppl();
-
-function test_dir_plugins_suppl() {
-	// preparation: la constante est elle definie et comprend uniquement 1 reps suppl?
-	if (!defined('_DIR_PLUGINS_SUPPL')) {
-		define('_DIR_PLUGINS_SUPPL', _DIR_TMP . 'plug_sup/');
-	} elseif (substr_count(_DIR_PLUGINS_SUPPL, ':') !== 0) {
-		return 'NA : la constante _DIR_PLUGINS_SUPPL definie dans mes_options.php ne doit contenir qu\'un seul chemin supplementaire ; actuellement sa valeur est "' . _DIR_PLUGINS_SUPPL . '"';
-	}
-
-	if (!str_ends_with(_DIR_PLUGINS_SUPPL, '/')) {
-		return 'NA : la constante _DIR_PLUGINS_SUPPL doit terminer par un / ; actuellement sa valeur est "' . _DIR_PLUGINS_SUPPL . '"';
-	}
-	// preparation: verifier qu'il existe au moins un dossier plugin par rep suppl (i.e. contenant un fichier paquet.xml)?
-	$Ta_effacer = [];
-	$Ta_retrouver = [];
-
-	$existe_paquet = false;
-
-	// le rep suppl n'existe pas; le creer
-	if (!is_dir(_DIR_RACINE . _DIR_PLUGINS_SUPPL)) {
-		if (!@mkdir(_DIR_RACINE . _DIR_PLUGINS_SUPPL)) {
-			return 'NA probleme de droits d\'ecriture 0, impossible de creer le dossier de _DIR_PLUGINS_SUPPL: "' . _DIR_PLUGINS_SUPPL . '" necessaire pour ce test';
-		}
-		$Ta_effacer[] = _DIR_RACINE . _DIR_PLUGINS_SUPPL;
-	}
-
-	// le rep suppl est vide: creer un dossier de plugin bidon (toto) et y copier un paquet.xml
-	if (
-		(is_countable(scandir(_DIR_RACINE . _DIR_PLUGINS_SUPPL)) ? count(
-			scandir(_DIR_RACINE . _DIR_PLUGINS_SUPPL)
-		) : 0) < 3
-	) {
-		if (!@mkdir(_DIR_RACINE . _DIR_PLUGINS_SUPPL . 'toto')) {
-			nettoyage_plugins_suppl($Ta_effacer);
-			return 'NA probleme de droits d\ecriture 1, impossible de creer un dossier dans "' . _DIR_RACINE . _DIR_PLUGINS_SUPPL . '" necessaire pour ce test';
-		}
-		$Ta_effacer[] = _DIR_RACINE . _DIR_PLUGINS_SUPPL . 'toto';
-
-		if (!@copy(_DIR_PLUGINS_DIST . 'dump/paquet.xml', _DIR_RACINE . _DIR_PLUGINS_SUPPL . 'toto/paquet.xml')) {
-			nettoyage_plugins_suppl($Ta_effacer);
-			return 'NA probleme de droits d\ecriture 2, impossible de creer un fichier dans "' . _DIR_RACINE . _DIR_PLUGINS_SUPPL . 'toto" necessaire pour ce test';
-		}
-		$Ta_effacer[] = _DIR_RACINE . _DIR_PLUGINS_SUPPL . 'toto/paquet.xml';
-		$Ta_retrouver[] = 'toto';
-
-		$existe_paquet = true;
-	} else {
-		if ($pointeur = opendir(_DIR_RACINE . _DIR_PLUGINS_SUPPL)) {
-			while (false !== ($rep = readdir($pointeur))) {
-				if ($rep === '.' || $rep === '..' || !is_dir($rep)) {
-					continue;
-				} elseif ($pointeur = opendir(_DIR_RACINE . _DIR_PLUGINS_SUPPL . $rep)) {
-					while (false !== ($fichier = readdir($pointeur))) {
-						if ($fichier === 'paquet.xml') {
-							$Ta_retrouver[] = $rep;
-							$existe_paquet = true;
-							break;
-						}
-					}
-				}
-			}
-		}
-
-		// tous les sous-dossiers sont scannes et toujours pas de paquet.xml:
-		// creer un dossier bidon et y copier un paquet.xml
-		if (!$existe_paquet) {
-			if (
-				!in_array('toto', scandir(_DIR_RACINE . _DIR_PLUGINS_SUPPL), true) && !@mkdir(
-					_DIR_RACINE . _DIR_PLUGINS_SUPPL . 'toto'
-				)
-			) {
-				nettoyage_plugins_suppl($Ta_effacer);
-				return 'NA probleme de droits d\ecriture 3, impossible de creer un dossier dans "' . _DIR_RACINE . _DIR_PLUGINS_SUPPL . '" necessaire pour ce test';
-			}
-			$Ta_effacer[] = _DIR_RACINE . _DIR_PLUGINS_SUPPL . 'toto';
-
-			if (!@copy(_DIR_PLUGINS_DIST . 'dump/paquet.xml', _DIR_RACINE . _DIR_PLUGINS_SUPPL . 'toto/paquet.xml')) {
-				nettoyage_plugins_suppl($Ta_effacer);
-				return 'NA probleme de droits d\ecriture 4, impossible de creer un fichier dans "' . _DIR_RACINE . _DIR_PLUGINS_SUPPL . 'toto" necessaire pour ce test';
-			}
-			$Ta_retrouver[] = 'toto';
-			$Ta_effacer[] = _DIR_RACINE . _DIR_PLUGINS_SUPPL . 'toto/paquet.xml';
-
-			$existe_paquet = true;
-		}
-	}
-
-	// preparation: creer au moins un dossier plugin hors de _DIR_PLUGINS et _DIR_PLUGINS_SUPPL
-	$rep_non_suppl = '';
-	if (substr_count(_DIR_PLUGINS_SUPPL, '/') > 1) {
-		$rep_non_suppl = substr(_DIR_PLUGINS_SUPPL, 0, strrpos(rtrim(_DIR_PLUGINS_SUPPL, '/'), '/')) . '/test_non_suppl';
-	} else {
-		$rep_non_suppl = _DIR_TMP . 'test_non_suppl';
-	}
-
-	if ($rep_non_suppl === _DIR_PLUGINS_SUPPL) {
-		return 'NA : le dossier "' . $rep_non_suppl . '" ne doit pas faire partie des repertoires definis dans _DIR_PLUGINS_SUPPL pour que ce test fonctionne';
-	}
-
-	if (!is_dir($rep_non_suppl)) {
-		if (!@mkdir($rep_non_suppl)) {
-			nettoyage_plugins_suppl($Ta_effacer);
-			return 'NA probleme de droits d\ecriture 5, impossible de creer le dossier "' . $rep_non_suppl . '" necessaire pour ce test';
-		}
-		$Ta_effacer[] = $rep_non_suppl;
-	}
-
-	if (!file_exists($rep_non_suppl . '/paquet.xml')) {
-		if (!@copy(_DIR_PLUGINS_DIST . 'dump/paquet.xml', $rep_non_suppl . '/paquet.xml')) {
-			nettoyage_plugins_suppl($Ta_effacer);
-			return 'NA probleme de droits d\ecriture 6, impossible de creer un fichier dans "' . $rep_non_suppl . '" necessaire pour ce test';
-		}
-		$Ta_effacer[] = $rep_non_suppl . '/paquet.xml';
-	}
-
-	// test 1: lancer liste_plugin_files() et recuperer l'array retourne
-	// verifier qu'on retrouve bien tous les rep suppl de _DIR_PLUGINS_SUPPL
-	$Tplugins_recups = liste_plugin_files(_DIR_PLUGINS_SUPPL);
-
-	$Terr = [];
-	$mess_err = '';
-	foreach ($Ta_retrouver as $rep) {
-		if (!in_array($rep, $Tplugins_recups, true)) {
-			$Terr[] = $rep;
-		}
-	}
-
-	if ($Terr !== []) {
-		if (count($Terr) !== 1) {
-			$mess_err .= "<li>Les repertoires supplementaires de _DIR_PLUGINS_SUPPL suivants n'ont pas etes trouves par la fonction liste_plugin_files(): ";
-		} else {
-			$mess_err .= "<li>Le repertoire supplementaire de _DIR_PLUGINS_SUPPL suivant n'a pas ete trouve par la fonction liste_plugin_files(): ";
-		}
-
-		$mess_err .= (implode(', ', $Terr));
-	}
-
-	// test 2: la liste des reps plugins trouves comprend t'elle des dossiers
-	// ni dans _DIR_PLUGINS ni dans _DIR_PLUGINS_SUPPL?
-	$Terr = [];
-	foreach ($Tplugins_recups as $rep_plug) {
-		if (
-			!is_dir(_DIR_PLUGINS . $rep_plug) && is_dir(_DIR_RACINE . $rep_plug)
-		) {	// le rep existe mais pas dans _DIR_PLUGINS
-			$ok = false;
-			foreach ($Treps_suppl as $rep_suppl) {
-				if (substr_count($rep_plug, $rep_suppl) > 0) {
-					$ok = true;
-					break;
-				}
-			}
-
-			if (!$ok) {
-				$Terr[] = $rep_plug;
-			}
-		}
-	}
-
-	if ($Terr !== []) {
-		if (count($Terr) !== 1) {
-			$mess_err .= '<li>Les repertoires suivants ont etes trouves par la fonction liste_plugin_files(): ';
-			$mess_err .= (implode(', ', $Terr));
-			$mess_err .= " alors qu'ils n'appartiennent ni a _DIR_PLUGINS ni a _DIR_PLUGINS_SUPPL";
-		} else {
-			$mess_err .= '<li>Le repertoire suivant a ete trouve par la fonction liste_plugin_files(): ';
-			$mess_err .= (implode(', ', $Terr));
-			$mess_err .= " alors qu'il n'appartient ni a _DIR_PLUGINS ni a _DIR_PLUGINS_SUPPL";
-		}
-	}
-
-	// sortie propre du test
-	nettoyage_plugins_suppl($Ta_effacer);
-
-	if ($mess_err !== '') {
-		return '<ul>' . $mess_err . '</ul>';
-	}
-	return 'OK';
-}
-
-// nettoyer tous les fichiers et dossiers crees pour ce test
-function nettoyage_plugins_suppl($Ta_supprimer) {
-	// inverser l'odre des elements de l'array pour eviter d'essayer d'effacer des reps qui contiennent encore des fichiers
-	arsort($Ta_supprimer);
-	foreach ($Ta_supprimer as $a_suppr) {
-		if (is_dir($a_suppr)) {
-			rmdir($a_suppr);
-		} elseif (file_exists($a_suppr)) {
-			unlink($a_suppr);
-		}
-	}
-}
-- 
GitLab