diff --git a/ecrire/tests/Urls/AbsUrlTest.php b/ecrire/tests/Urls/AbsUrlTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9e8d3ac5f1594c79a26595609c4c839a1dc15667
--- /dev/null
+++ b/ecrire/tests/Urls/AbsUrlTest.php
@@ -0,0 +1,49 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Test unitaire de la fonction tester_url_absolue du fichier ./inc/utils.php
+ */
+
+namespace Spip\Test\Urls;
+
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\TestCase;
+use Spip\Test\SquelettesTestCase;
+
+class AbsUrlTest extends SquelettesTestCase
+{
+	public static function setUpBeforeClass(): void {
+		find_in_path('./inc/utils.php', '', true);
+	}
+
+	/**
+	 * Le filtre |abs_url doit modifier les liens a@href et img@src
+	 * a l'interieur d'un texte, et modifier les simples chaines de caracteres
+	 * quand elles proviennent de # URL_ARTICLE, mais pas ailleurs (# TITRE par ex)
+	 */
+	public function testAbsUrl() {
+		$this->assertOkCode(<<<SPIP
+		<BOUCLE_a(ARTICLES){texte=='<(a|img) '}{0,1}>
+		[(#URL_ARTICLE
+			|abs_url
+			|=={#URL_ARTICLE}
+			|?{#VAL{'erreur sur #URL_ARTICLE 1 :'}
+				|concat{#URL_ARTICLE|abs_url}
+				|concat{'=',#URL_ARTICLE}})]
+		[(#URL_ARTICLE
+			|abs_url{#URL_SITE_SPIP/}
+			|=={#URL_SITE_SPIP|concat{/}|suivre_lien{#URL_ARTICLE}}
+			|?{'',#VAL{'erreur sur #URL_ARTICLE 2 :'}
+				|concat{#URL_ARTICLE|abs_url{#URL_SITE_SPIP/}
+				|concat{'!=',#URL_SITE_SPIP,/,#URL_ARTICLE}}})]
+		[(#TITRE|abs_url|=={#TITRE}|?{'','erreur sur #TITRE'})]
+		[(#TITRE|abs_url|=={#TEXTE}|?{'erreur sur #TEXTE'})]
+		</BOUCLE_a>
+		OK
+		<//B_a>
+		SPIP);
+	}
+
+}
diff --git a/ecrire/tests/Utils/ParametreUrlTest.php b/ecrire/tests/Urls/ParametreUrlTest.php
similarity index 99%
rename from ecrire/tests/Utils/ParametreUrlTest.php
rename to ecrire/tests/Urls/ParametreUrlTest.php
index 15399d1a9d2d20a533180718da25a515635b12d2..36bd0534bca97dad1d45ee4ebe6638c087b68566 100644
--- a/ecrire/tests/Utils/ParametreUrlTest.php
+++ b/ecrire/tests/Urls/ParametreUrlTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction parametre_url du fichier ./inc/utils.php
  */
 
-namespace Spip\Test\Utils;
+namespace Spip\Test\Urls;
 
 use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\TestCase;
diff --git a/ecrire/tests/Utils/TesterUrlAbsolueTest.php b/ecrire/tests/Urls/TesterUrlAbsolueTest.php
similarity index 97%
rename from ecrire/tests/Utils/TesterUrlAbsolueTest.php
rename to ecrire/tests/Urls/TesterUrlAbsolueTest.php
index 6092525851a0ed70e49091c518ae1d41cfca93c7..7eab31428c04789b69e08e4f8e566fe5b03b05d8 100644
--- a/ecrire/tests/Utils/TesterUrlAbsolueTest.php
+++ b/ecrire/tests/Urls/TesterUrlAbsolueTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction tester_url_absolue du fichier ./inc/utils.php
  */
 
-namespace Spip\Test\Utils;
+namespace Spip\Test\Urls;
 
 use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\TestCase;
diff --git a/ecrire/tests/Utils/UrlDeTest.php b/ecrire/tests/Urls/UrlDeTest.php
similarity index 98%
rename from ecrire/tests/Utils/UrlDeTest.php
rename to ecrire/tests/Urls/UrlDeTest.php
index 942cab38da692a8cf3051217f2f94adc524d68fc..ca8fe21b98b5638d2f648b3af60227ec5d7ffa17 100644
--- a/ecrire/tests/Utils/UrlDeTest.php
+++ b/ecrire/tests/Urls/UrlDeTest.php
@@ -6,7 +6,7 @@ declare(strict_types=1);
  * Test unitaire de la fonction url_de_ du fichier ./inc/utils.php
  */
 
-namespace Spip\Test\Utils;
+namespace Spip\Test\Urls;
 
 use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\TestCase;
diff --git a/ecrire/tests/legacy/unit/filtres/abs_url.html b/ecrire/tests/legacy/unit/filtres/abs_url.html
deleted file mode 100644
index 61f12efba1e56e3a9c37b36701454787d8a1d1c7..0000000000000000000000000000000000000000
--- a/ecrire/tests/legacy/unit/filtres/abs_url.html
+++ /dev/null
@@ -1,16 +0,0 @@
-[(#REM)
-
-Le filtre |abs_url doit modifier les liens a@href et img@src
-a l'interieur d'un texte, et modifier les simples chaines de caracteres
-quand elles proviennent de # URL_ARTICLE, mais pas ailleurs (# TITRE par ex)
-
-]
-<BOUCLE_a(ARTICLES){texte=='<(a|img) '}{0,1}>[
-(#URL_ARTICLE|abs_url|=={#URL_ARTICLE}|?{#VAL{'erreur sur #URL_ARTICLE 1 :'}|concat{#URL_ARTICLE|abs_url,'=',#URL_ARTICLE}})][
-(#URL_ARTICLE|abs_url{#URL_SITE_SPIP/}|=={#URL_SITE_SPIP|concat{/}|suivre_lien{#URL_ARTICLE}}|?{'',#VAL{'erreur sur #URL_ARTICLE 2 :'}|concat{#URL_ARTICLE|abs_url{#URL_SITE_SPIP/},'!=',#URL_SITE_SPIP|concat{/}|concat{#URL_ARTICLE}}})][
-(#TITRE|abs_url|=={#TITRE}|?{'','erreur sur #TITRE'})][
-(#TITRE|abs_url|=={#TEXTE}|?{'erreur sur #TEXTE'})]</BOUCLE_a>
-
-OK
-
-<//B_a>
\ No newline at end of file