diff --git a/ecrire/tests/Urls/AbsUrlTest.php b/ecrire/tests/Urls/AbsUrlTest.php
index 9e8d3ac5f1594c79a26595609c4c839a1dc15667..9c4c2b1cd374cc7ae9675c197aba30618b38324d 100644
--- a/ecrire/tests/Urls/AbsUrlTest.php
+++ b/ecrire/tests/Urls/AbsUrlTest.php
@@ -2,10 +2,6 @@
 
 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;
diff --git a/ecrire/tests/Urls/LiensAbsolusPriveTest.php b/ecrire/tests/Urls/LiensAbsolusPriveTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..20e70527942602a740de46bb25213a0fca1e9a08
--- /dev/null
+++ b/ecrire/tests/Urls/LiensAbsolusPriveTest.php
@@ -0,0 +1,33 @@
+<?php
+
+declare(strict_types=1);
+
+
+namespace Spip\Test\Urls;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * FIXME: Ce test fonctionnait (avec un hack dans les vieux tests legacy)
+ * Il redéfinissait _SPIP_TEST_CHDIR (mais qui est déjà défini en entrant ici maintenant)
+ */
+class LiensAbsolusPriveTest extends LiensAbsolusTest
+{
+	public static function setUpBeforeClass(): void {
+		#chdir(dirname(__DIR__, 2));
+		find_in_path('./inc/utils.php', '', true);
+	}
+
+	public function testVerifierEspace(): void {
+		if (!test_espace_prive()) {
+			$this->markTestIncomplete('FIXME: être considéré dans l’espace privé dans le test');
+		}
+		$this->assertTrue(test_espace_prive(), 'On doit être dans l’espace privé');
+
+	}
+
+
+	public static function tearDownAfterClass(): void {
+		#chdir(_SPIP_TEST_CHDIR);
+	}
+}
diff --git a/ecrire/tests/Urls/LiensAbsolusTest.php b/ecrire/tests/Urls/LiensAbsolusTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..da58127fe43d5d232d3b982339fda48b3cb74b1d
--- /dev/null
+++ b/ecrire/tests/Urls/LiensAbsolusTest.php
@@ -0,0 +1,56 @@
+<?php
+
+declare(strict_types=1);
+
+
+namespace Spip\Test\Urls;
+
+use PHPUnit\Framework\Attributes\Depends;
+use PHPUnit\Framework\TestCase;
+
+class LiensAbsolusTest extends TestCase
+{
+	public static function setUpBeforeClass(): void {
+		find_in_path('./inc/utils.php', '', true);
+	}
+
+	public function testVerifierEspace() {
+		$this->assertFalse(test_espace_prive(), 'On doit être dans l’espace public');
+	}
+
+	#[Depends('testVerifierEspace')]
+	public function testLienPrive() {
+		$relatif = generer_url_ecrire('toto', 'truc=machin&chose=bidule', false, true);
+		$absolu = generer_url_ecrire('toto', 'truc=machin&chose=bidule', false, false);
+		$expected = 'bla bla <a href=\'' . str_replace('&amp;', '&#38;', $absolu) . '\'>lien prive</a>';
+		$case = 'bla bla <a href=\'' . $relatif . '\'>lien prive</a>';
+		$actual = liens_absolus($case);
+		$this->assertEquals($expected, $actual);
+	}
+
+	#[Depends('testVerifierEspace')]
+	public function testLienPublic() {
+		$relatif = generer_url_public('toto', 'truc=machin&chose=bidule', false, true);
+		$absolu = generer_url_public('toto', 'truc=machin&chose=bidule', false, false);
+		$expected = 'bla bla <a href=\'' . str_replace('&amp;', '&#38;', $absolu) . '\'>lien public</a>';
+		$case = 'bla bla <a href=\'' . $relatif . '\'>lien public</a>';
+		$actual = liens_absolus($case);
+		$this->assertEquals($expected, $actual);
+	}
+
+	#[Depends('testVerifierEspace')]
+	public function testLienMailto() {
+		$expected = 'bla bla <a href="mailto:toto">email</a>';
+		$case = 'bla bla <a href="mailto:toto">email</a>';
+		$actual = liens_absolus($case);
+		$this->assertEquals($expected, $actual);
+	}
+
+	#[Depends('testVerifierEspace')]
+	public function testLienJavascript() {
+		$expected = 'bla bla <a href="javascript:open()">javascript</a>';
+		$case = 'bla bla <a href="javascript:open()">javascript</a>';
+		$actual = liens_absolus($case);
+		$this->assertEquals($expected, $actual);
+	}
+}
diff --git a/ecrire/tests/legacy/unit/filtres/liens_absolus.php b/ecrire/tests/legacy/unit/filtres/liens_absolus.php
deleted file mode 100644
index b0d39e24fa4cf16af50ec636af3bbe68637c9ab9..0000000000000000000000000000000000000000
--- a/ecrire/tests/legacy/unit/filtres/liens_absolus.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-if (!(isset($test) && $test)) {
-	$test = 'liens_absolus';
-}
-
-$remonte = __DIR__ . '/';
-
-while (!is_file($remonte . 'test.inc')) {
-	$remonte .= '../';
-}
-
-require $remonte . 'test.inc';
-
-include_spip('inc/filtres');
-
-$essais['lien prive'] =
- [
- 	"bla bla <a href='" . str_replace(
- 		'&amp;',
- 		'&#38;',
- 		generer_url_ecrire('toto', 'truc=machin&chose=bidule', false, false)
- 	) . "'>lien prive</a>",
- 	"bla bla <a href='" . generer_url_ecrire('toto', 'truc=machin&chose=bidule', false, true) . "'>lien prive</a>",
- ];
-
-$essais['lien public'] =
- [
- 	"bla bla <a href='" . str_replace(
- 		'&amp;',
- 		'&#38;',
- 		generer_url_public('toto', 'truc=machin&chose=bidule', false, false)
- 	) . "'>lien public</a>",
- 	"bla bla <a href='" . generer_url_public('toto', 'truc=machin&chose=bidule', false, true) . "'>lien public</a>",
- ];
-
-$essais['mailto'] =
- ["bla bla <a href='mailto:toto'>email</a>", "bla bla <a href='mailto:toto'>email</a>"];
-
-$essais['javascript'] =
- ["bla bla <a href='javascript:open()'>javascript</a>", "bla bla <a href='javascript:open()'>javascript</a>"];
-
-//
-
-// hop ! on y va
-//
-
-# tests invalides si _SPIP_SCRIPT vaut ''
-
-if (_SPIP_SCRIPT === '') {
-	die('NA _SPIP_SCRIPT=""');
-}
-
-# non applicable
-
-$err = tester_fun('liens_absolus', $essais);
-
-// si le tableau $err est pas vide ca va pas
-
-if ($err) {
-	die('<dl>' . implode('', $err) . '</dl>');
-}
-
-echo 'OK';
diff --git a/ecrire/tests/legacy/unit/filtres/liens_absolus_prive.php b/ecrire/tests/legacy/unit/filtres/liens_absolus_prive.php
deleted file mode 100644
index 0f07416fbdabc76ebc4c7a3840fa09fa6ae833bd..0000000000000000000000000000000000000000
--- a/ecrire/tests/legacy/unit/filtres/liens_absolus_prive.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-/*
- * Le meme que liens_absolus.php mais on hacke _SPIP_TEST_INC
- * pour que le chdir() au debut de test.inc nous transporte dans ecrire/
- * ceci avant que inc_version.php soit inclus ...
- */
-// let's go ecrire/
-$dir_racine = dirname(__DIR__, 2);
-while (!is_dir($dir_racine . '/ecrire')) {
-	$dir_racine = dirname($dir_racine);
-}
-
-define('_SPIP_TEST_CHDIR', $dir_racine . '/ecrire');
-$test = 'liens_absolus_prive';
-
-// si on rajoute ça ...
-// ça serait presque mieux , mais generer_url_public fait pas de resolv_path()
-//define('_SPIP_SCRIPT', '../../');
-
-include __DIR__ . '/liens_absolus.php';