diff --git a/ecrire/tests/Filtre/AttributHtmlTest.php b/ecrire/tests/Filtre/AttributHtmlTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a230d96f24e867f6152511e1d950e112572e5134
--- /dev/null
+++ b/ecrire/tests/Filtre/AttributHtmlTest.php
@@ -0,0 +1,42 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Test unitaire de la fonction ajouter_class du fichier ./inc/filtres.php
+ */
+
+namespace Spip\Test\Filtre;
+
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\TestCase;
+
+class AttributHtmlTest extends TestCase
+{
+	public static function setUpBeforeClass(): void {
+		find_in_path('./inc/filtres.php', '', true);
+	}
+
+	#[DataProvider('providerAttributHtml')]
+	public function testAttributHtml($expected, $texte): void {
+		$actual = attribut_html($texte);
+		$this->assertSame($expected, $actual);
+	}
+
+	public static function providerAttributHtml(): array {
+		return [
+			0 => [
+				'expected' => 'aujourd&#039;hui &gt; &#034;30&#034; &rarr; 50',
+				'texte' => 'aujourd\'hui > "30" &rarr; <a href=\'http://www.spip.net\'>50</a>',
+			],
+			1 => [
+				'expected' => 'L&#039;histoire &#039;tr&#232;s&#039; &#034;folle&#034; des m&#233;tas en iitalik',
+				'texte' => 'L\'histoire \'tr&egrave;s\' "folle" <strong>des</strong>&nbsp;m&eacute;tas<p>en <em>ii</em>talik</p>',
+			],
+			2 => [
+				'expected' => 'allons &#224; la mer',
+				'texte' => 'allons ' . chr(195) . chr(160) . ' la mer', // le a` risque de matcher \s
+			],
+		];
+	}
+}
diff --git a/ecrire/tests/legacy/unit/filtres/attribut_html.php b/ecrire/tests/legacy/unit/filtres/attribut_html.php
deleted file mode 100644
index a7ca0d3d8dc0a71184b253c3daeb8c58d386d65d..0000000000000000000000000000000000000000
--- a/ecrire/tests/legacy/unit/filtres/attribut_html.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-$test = 'attribut_html';
-
-$remonte = __DIR__ . '/';
-
-while (!is_file($remonte . 'test.inc')) {
-	$remonte .= '../';
-}
-
-require $remonte . 'test.inc';
-
-include_spip('inc/filtres');
-
-$url = '/ecrire/?exec=exec&id_obj=id_obj&no_val';
-
-$amp = str_replace('&', '&amp;', $url);
-
-$essais[] =
- ['aujourd&#039;hui &gt; &#034;30&#034; &rarr; 50', "aujourd'hui > \"30\" &rarr; <a href='http://www.spip.net'>50</a>"];
-
-$essais[] =
- [
- 	'L&#039;histoire &#039;tr&#232;s&#039; &#034;folle&#034; des m&#233;tas en iitalik',
- 	'L\'histoire \'tr&egrave;s\' "folle" <strong>des</strong>&nbsp;m&eacute;tas<p>en <em>ii</em>talik</p>',
- ];
-
-// le a` risque de matcher \s
-
-$essais[] =
-['allons &#224; la mer', 'allons ' . chr(195) . chr(160) . ' la mer'];
-
-//
-
-// hop ! on y va
-//
-
-$err = tester_fun('attribut_html', $essais);
-
-// si le tableau $err est pas vide ca va pas
-
-if ($err) {
-	die('<dl>' . implode('', $err) . '</dl>');
-}
-
-echo 'OK';