diff --git a/ecrire/tests/Filtre/EntitesHtmlTest.php b/ecrire/tests/Filtre/EntitesHtmlTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..1b2227113e60b638cf68060be923a3e71911a57b
--- /dev/null
+++ b/ecrire/tests/Filtre/EntitesHtmlTest.php
@@ -0,0 +1,90 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Spip\Test\Filtre;
+
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\TestCase;
+
+class EntitesHtmlTest extends TestCase
+{
+	public static function setUpBeforeClass(): void {
+		find_in_path('inc/filtres.php', '', true);
+	}
+
+	#[DataProvider('providerEntitesHtml')]
+	public function testEntitesHtml($expected, ...$args): void {
+		$actual = entites_html(...$args);
+		$this->assertSame($expected, $actual);
+	}
+
+	public static function providerEntitesHtml(): array {
+		return [
+			'empty' => [
+				'expected' => '',
+				'texte' => '',
+				'tout' => false,
+			],
+			'zero' => [
+				'expected' => '0',
+				'texte' => '0',
+				'tout' => false,
+			],
+			'liens' => [
+				'expected' => 'Un texte avec des &lt;a href=&quot;http://spip.net&quot;&gt;liens&lt;/a&gt; [Article 1-&gt;art1] [spip-&gt;http://www.spip.net] http://www.spip.net',
+				'texte' =>'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net',
+				'tout' => false,
+			],
+			'entites_echappees' => [
+				'expected' => 'Un texte avec des entit&amp;eacute;s echap&amp;eacute; &amp;amp;&amp;lt;&amp;gt;&amp;quot;',
+				'texte' => 'Un texte avec des entit&amp;eacute;s echap&amp;eacute; &amp;amp;&amp;lt;&amp;gt;&amp;quot;',
+				'tout' => false,
+			],
+			'entites_numeriques' => [
+				'expected' => 'Un texte avec des entit&#233;s num&#233;riques &amp;#38;&amp;#60;&amp;#62;&amp;quot;',
+				'texte' => 'Un texte avec des entit&#233;s num&#233;riques &#38;&#60;&#62;&quot;',
+				'tout' => false,
+			],
+			'entites_numeriques_echappees' => [
+				'expected' => 'Un texte avec des entit&amp;#233;s num&amp;#233;riques echap&amp;#233;es &amp;#38;&amp;#60;&amp;#62;&amp;quot;',
+				'texte' => 'Un texte avec des entit&amp;#233;s num&amp;#233;riques echap&amp;#233;es &amp;#38;&amp;#60;&amp;#62;&amp;quot;',
+				'tout' => false,
+			],
+			'sans_entites' => [
+				'expected' => 'Un texte sans entites &amp;&lt;&gt;&quot;&#039;',
+				'texte' => 'Un texte sans entites &<>"\'',
+				'tout' => false,
+			],
+			'code' => [
+				'expected' => '&lt;code&gt;&amp;#233;&lt;/code&gt;&#233;',
+				'texte' => '<code>&#233;</code>&#233;',
+			],
+			'raccourcis_spip' => [
+				'expected' => '{{{Des raccourcis}}} {italique} {{gras}} &lt;code&gt;du code&lt;/code&gt;',
+				'texte' => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
+				'tout' => false,
+			],
+			'modele_inexistant' => [
+				'expected' => 'Un modele &lt;modeleinexistant|lien=[-&gt;http://www.spip.net]&gt;',
+				'texte' => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>',
+				'tout' => false,
+			],
+			'multiligne' => [
+				'expected' => <<<TEXT
+				Un texte avec des retour
+				a la ligne et meme des
+
+				paragraphes
+				TEXT,
+				'texte' => <<<TEXT
+				Un texte avec des retour
+				a la ligne et meme des
+
+				paragraphes
+				TEXT,
+				'tout' => false,
+			],
+		];
+	}
+}
diff --git a/ecrire/tests/legacy/unit/filtres/entites_html.php b/ecrire/tests/legacy/unit/filtres/entites_html.php
deleted file mode 100644
index 0082ec08ef9b8cf3a6f6cfa646de033d77ea3d4f..0000000000000000000000000000000000000000
--- a/ecrire/tests/legacy/unit/filtres/entites_html.php
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-$test = 'entites_html';
-
-$remonte = __DIR__ . '/';
-
-while (!is_file($remonte . 'test.inc')) {
-	$remonte .= '../';
-}
-
-require $remonte . 'test.inc';
-
-include_spip('inc/filtres');
-
-$essais[] =
- ['&lt;code&gt;&amp;#233;&lt;/code&gt;&#233;', '<code>&#233;</code>&#233;'];
-
-//
-
-// hop ! on y va
-//
-
-$err = tester_fun('entites_html', $essais);
-
-// si le tableau $err est pas vide ca va pas
-
-if ($err) {
-	die('<dl>' . implode('', $err) . '</dl>');
-}
-
-echo 'OK';
-
-function essais_entites_html() {
-	return [
-		0 =>
-		 [
-		 	0 => '',
-		 	1 => '',
-		 	2 => false,
-		 ],
-		1 =>
-		 [
-		 	0 => '0',
-		 	1 => '0',
-		 	2 => false,
-		 ],
-		2 =>
-		 [
-		 	0 => 'Un texte avec des &lt;a href=&quot;http://spip.net&quot;&gt;liens&lt;/a&gt; [Article 1-&gt;art1] [spip-&gt;http://www.spip.net] http://www.spip.net',
-		 	1 => 'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->http://www.spip.net] http://www.spip.net',
-		 	2 => false,
-		 ],
-		3 =>
-		 [
-		 	0 => 'Un texte avec des entit&amp;eacute;s &amp;&amp;lt;&amp;gt;&amp;quot;',
-		 	1 => 'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;',
-		 	2 => false,
-		 ],
-		4 =>
-		 [
-		 	0 => 'Un texte avec des entit&amp;eacute;s echap&amp;eacute; &amp;amp;&amp;lt;&amp;gt;&amp;quot;',
-		 	1 => 'Un texte avec des entit&amp;eacute;s echap&amp;eacute; &amp;amp;&amp;lt;&amp;gt;&amp;quot;',
-		 	2 => false,
-		 ],
-		5 =>
-		 [
-		 	0 => 'Un texte avec des entit&#233;s num&#233;riques &amp;#38;&amp;#60;&amp;#62;&amp;quot;',
-		 	1 => 'Un texte avec des entit&#233;s num&#233;riques &#38;&#60;&#62;&quot;',
-		 	2 => false,
-		 ],
-		6 =>
-		 [
-		 	0 => 'Un texte avec des entit&amp;#233;s num&amp;#233;riques echap&amp;#233;es &amp;#38;&amp;#60;&amp;#62;&amp;quot;',
-		 	1 => 'Un texte avec des entit&amp;#233;s num&amp;#233;riques echap&amp;#233;es &amp;#38;&amp;#60;&amp;#62;&amp;quot;',
-		 	2 => false,
-		 ],
-		7 =>
-		 [
-		 	0 => "Un texte sans entites &amp;&lt;&gt;&quot;'",
-		 	1 => 'Un texte sans entites &<>"\'',
-		 	2 => false,
-		 ],
-		8 =>
-		 [
-		 	0 => '{{{Des raccourcis}}} {italique} {{gras}} &lt;code&gt;du code&lt;/code&gt;',
-		 	1 => '{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
-		 	2 => false,
-		 ],
-		9 =>
-		 [
-		 	0 => 'Un modele &lt;modeleinexistant|lien=[-&gt;http://www.spip.net]&gt;',
-		 	1 => 'Un modele <modeleinexistant|lien=[->http://www.spip.net]>',
-		 	2 => false,
-		 ],
-		10 =>
-		 [
-		 	0 => 'Un texte avec des retour
-a la ligne et meme des
-
-paragraphes',
-		 	1 => 'Un texte avec des retour
-a la ligne et meme des
-
-paragraphes',
-		 	2 => false,
-		 ],
-	];
-}