From 85d5ce7724f780c97cc766d373759309cdcbb67b Mon Sep 17 00:00:00 2001
From: Henri-Damien LAURENT <hdlaurent@afi-sa.net>
Date: Mon, 25 Sep 2023 12:54:18 +0000
Subject: [PATCH] dev#160166 : PLaceholders in renderwithwigdetContext tests

---
 library/Class/Notice/MailRenderer.php         |  12 +-
 library/Class/Url.php                         |  42 +++++++
 .../ZendAfi/View/Helper/Accueil/Kiosque.php   |   2 +-
 .../Library/Widget/Carousel/Record/View.php   |   2 +-
 .../controllers/NewsletterControllerTest.php  | 103 ++++++++++++++++--
 ...wsletter_placeholder_content_expected.html |   4 +-
 ...ewsletter_placeholder_content_expected.txt |   2 +-
 ...etter_placeholder_content_with_widget.html |   3 +
 ...r_placeholder_content_without_articles.txt |   2 +-
 9 files changed, 155 insertions(+), 17 deletions(-)
 create mode 100644 tests/application/modules/admin/controllers/newsletter_placeholder_content_with_widget.html

diff --git a/library/Class/Notice/MailRenderer.php b/library/Class/Notice/MailRenderer.php
index 6b6315d1390..42efe0f3d04 100644
--- a/library/Class/Notice/MailRenderer.php
+++ b/library/Class/Notice/MailRenderer.php
@@ -56,15 +56,19 @@ class Class_Notice_MailRenderer {
 
     $view = (new ZendAfi_Controller_Action_Helper_View)->init();
     $widget = (new Class_Systeme_Widget_Widget)
-      ->loadFromSettings(['type_module' => Class_Systeme_ModulesAccueil_Kiosque::CODE,
+      ->loadFromSettings(['type_module' => Intonation_Library_Widget_Carousel_Record_Definition::CODE,
                           'profile_id' => 1,
                           'preferences' =>
-                          ['layout' => 'list',
-                           'rendering' => 'card-horizontal',
+                          ['layout' => Intonation_Library_Widget_Carousel_Definition::LISTING,
+                           'rendering' => Intonation_Library_Widget_Carousel_Definition::HORIZONTAL_CARD,
+                           'style_list' => 'vignettes',
+                           'size' => 20,
+                           'only_img' => 0,
                            'aleatoire' => 0,
+                           'notice_domain' => $newsletter->getIdCatalogue(),
                            'id_catalogue' => $newsletter->getIdCatalogue(),
                            'id_panier' => $newsletter->getIdPanier(),
-                           'display_order'  => Class_Systeme_ModulesAccueil_News::SELECTION
+                           'display_order'  => Class_Systeme_ModulesAccueil_News::SELECTION,
                           ]
                           ]);
 
diff --git a/library/Class/Url.php b/library/Class/Url.php
index 65669b37404..5db3d398a46 100644
--- a/library/Class/Url.php
+++ b/library/Class/Url.php
@@ -170,6 +170,48 @@ class Class_Url {
   }
 
 
+  public static function sanitizeUrlOptions(array $url_options) : array {
+    $valid_url_keys = ['controller',
+                       'module',
+                       'action',
+                       'id_profil',
+                       'profile_id',
+                       'id',
+                       'titre',
+                       'boite',
+                       'rendering',
+                       'layout',
+                       'tri',
+                       'display_order',
+                       'layout',
+                       'style_liste',
+                       'nb_notices',
+                       'only_img',
+                       'aleatoire',
+                       'nb_analyse',
+                       'op_hauteur_img',
+                       'op_transition',
+                       'op_largeur_img',
+                       'op_hauteur_boite',
+                       'op_captions',
+                       'op_autoplay',
+                       'op_visible',
+                       'op_speed',
+                       'op_auto',
+                       'op_scroll',
+                       'rss_avis',
+                       'id_catalogue',
+                       'id_panier',
+                       'articles_ids',
+                       'articles_categories_ids',
+                       'profil_redirect' ];
+
+    return  array_filter($url_options, function($v) use ($valid_url_keys) {
+      return in_array($v, $valid_url_keys);
+    }, ARRAY_FILTER_USE_KEY);
+  }
+
+
   public static function absolute($url_array_or_string = [], $name = null, $reset = false, $encode = true) {
     return (new static())->absoluteUrl($url_array_or_string, $name, $reset, $encode);
   }
diff --git a/library/ZendAfi/View/Helper/Accueil/Kiosque.php b/library/ZendAfi/View/Helper/Accueil/Kiosque.php
index 7e8ac554ea5..91bfdbe6fef 100644
--- a/library/ZendAfi/View/Helper/Accueil/Kiosque.php
+++ b/library/ZendAfi/View/Helper/Accueil/Kiosque.php
@@ -269,7 +269,7 @@ class ZendAfi_View_Helper_Accueil_Kiosque extends ZendAfi_View_Helper_Accueil_Ba
       : $tris[0];
 
     unset($url_options['preferences']);
-    return $this->view->tagAnchor($this->view->url($url_options, null, true),
+    return $this->view->tagAnchor($this->view->url(Class_Url::sanitizeUrlOptions($url_options), null, true),
                                   htmlentities($titre));
   }
 
diff --git a/library/templates/Intonation/Library/Widget/Carousel/Record/View.php b/library/templates/Intonation/Library/Widget/Carousel/Record/View.php
index 8d4319e9362..f2f2b42f181 100644
--- a/library/templates/Intonation/Library/Widget/Carousel/Record/View.php
+++ b/library/templates/Intonation/Library/Widget/Carousel/Record/View.php
@@ -89,7 +89,7 @@ class Intonation_Library_Widget_Carousel_Record_View
     $params['tri'] = $params['order'];
 
     $criteres = (new Class_CriteresRecherche)->setParams($params);
-    $result = (new Class_MoteurRecherche)->lancerRecherche($criteres);
+    $result = Class_MoteurRecherche::getInstance()->lancerRecherche($criteres);
     return Class_Notice::findAllByIds($result->fetchAllRecordsIds(),
                                       $params['limit'],
                                       1);
diff --git a/tests/application/modules/admin/controllers/NewsletterControllerTest.php b/tests/application/modules/admin/controllers/NewsletterControllerTest.php
index 147fab42c6a..d2ea84bc55c 100644
--- a/tests/application/modules/admin/controllers/NewsletterControllerTest.php
+++ b/tests/application/modules/admin/controllers/NewsletterControllerTest.php
@@ -844,7 +844,7 @@ class Admin_NewsletterControllerSendActionTest
        ['title', 'Animations'],
        ['body_text', 'Pour les jeunes
 Lien pour se désinscrire de cette lettre d\'information : http://localhost'. BASE_URL . '/newsletter/unsubscribe/newsletter/2/user/%user.id%/hash/%hash%'],
-       ['body_html', 'Pour les jeunes<br/><a href="http://localhost'. BASE_URL . '/newsletter/unsubscribe/newsletter/2/user/%user.id%/hash/%hash%">Je ne veux plus recevoir cette lettre d\'information</a>'],
+       ['body_html', 'Pour les jeunes<br/><a href="http://localhost'. BASE_URL . '/newsletter/unsubscribe/newsletter/2/user/%user.id%/hash/%hash%">'],
        ['sender', 'bokehrulez@linuxfr.org'],
        ['created_on', '2016-07-21 11:21:38']
       ];
@@ -856,7 +856,7 @@ Lien pour se désinscrire de cette lettre d\'information : http://localhost'. BA
    * @dataProvider dispatchDatas
    */
   public function dispatchDataShouldBeCorrect($name, $expected) {
-    $this->assertEquals($expected, $this->_dispatch->$name);
+    $this->assertContains($expected, $this->_dispatch->$name);
   }
 
 
@@ -950,6 +950,9 @@ abstract class Admin_NewsletterControllerPreviewActionTestCase
 
     $this->fixture(Class_Notice::class,
                    ['id' => 42,
+                    'type_doc' => Class_TypeDoc::LOGICIEL,
+                    'clef_alpha' => 'MARTINEALAPLAGE',
+                    'facettes' => 'T5 Q1',
                     'titre_principal' => 'Martine à la plage']);
 
     $this->fixture(Class_Catalogue::class,
@@ -1017,6 +1020,31 @@ abstract class Admin_NewsletterControllerPreviewActionPlaceHoldersTestCase exten
   public function setUp() {
     parent::setUp();
 
+    $this->_buildTemplateProfil(['id' => 1]);
+
+    /*
+    // This Should have been enough to get Martine for widget
+    // But there is a Zend_Registry::get('sql') in MoteurRecherche_Result->fetchFromCache
+    Class_AdminVar::set('CACHE_ACTIF', 1);
+    Storm_Cache::beVolatile();
+
+    $this->fixture(Class_NoticeDomain::class,
+                   ['id' => 480,
+                    'domain_id' => 1,
+                    'record_alpha_key' => 'MARTINEALAPLAGE'
+                    ]);
+    */
+
+    // This is required to make Records Widget Contains Martine
+    $search_result =
+      $this->mock()
+           ->whenCalled('fetchAllRecordsIds')
+           ->answers([42]);
+
+    Class_MoteurRecherche::setInstance($this->mock()
+                                       ->whenCalled('lancerRecherche')
+                                       ->answers($search_result));
+
     $this->_newsletter = Class_Newsletter::find(3);
     $this->_newsletter
       ->setContenu("Top\n[newsletter_records]\nMiddle\n[newsletter_articles]\nfooter");
@@ -1027,6 +1055,13 @@ abstract class Admin_NewsletterControllerPreviewActionPlaceHoldersTestCase exten
   }
 
 
+  public function tearDown(){
+    Class_MoteurRecherche::setInstance(null);
+
+    parent::tearDown();
+  }
+
+
   protected function _customizeNewsletter(Class_Newsletter $newsletter){
   }
 
@@ -1074,6 +1109,7 @@ class Admin_NewsletterControllerPreviewActionWithArticlesSelectionAndPlaceHolder
 
 
 
+
 class Admin_NewsletterControllerPreviewActionWithPlaceHoldersWithoutCatalogueTest
   extends Admin_NewsletterControllerPreviewActionPlaceHoldersTestCase {
 
@@ -1130,14 +1166,67 @@ class Admin_NewsletterControllerPreviewActionWithPlaceHoldersAndRenderWidgetTest
   }
 
 
-  protected function _expectedText() {
-    return file_get_contents(__DIR__.'/newsletter_placeholder_content_without_articles.txt');
+  /** @test */
+  public function pageShouldContainsBoiteNoticeWithTitleMartineALaPlage() {
+    $this->assertXPathContentContains('//div[@class="widget-body"]//div[@class="list-group-item"]//div[@class="card"]//div[@role="heading"]//a', 'Martine à la plage');
   }
 
 
   /** @test */
-  public function pageShouldContainsExpectedText() {
-    $this->assertContains($this->_expectedText(), $this->_response->getBody());
+  public function pageShouldContainsBoiteArticleWithTitleExpected() {
+    $this->assertXPathContentContains('//div[@class="widget-body"]//div[@class="list-group-item"]//div[@class="card"]//div[@role="heading"]//a', 'Gilets Jaunes');
+  }
+}
+
+
+
+
+class Admin_NewsletterControllerPreviewActionWithPlaceHoldersAndRenderWidgetWithoutArticleSelectionTest
+  extends Admin_NewsletterControllerPreviewActionPlaceHoldersTestCase {
+
+  protected function _customizeNewsletter(Class_Newsletter $newsletter) {
+    $newsletter
+      ->setRenderWithWidget(1)
+      ->setArticlesIds(0)
+      ->setArticlesCategoriesIds(0);
+  }
+
+
+  /** @test */
+  public function pageShouldContainsBoiteNoticeWithTitleMartineALaPlage() {
+    $this->assertXPathContentContains('//div[@class="widget-body"]//div[@class="list-group-item"]//div[@class="card"]//div[@role="heading"]//a', 'Martine à la plage');
+  }
+
+
+  /** @test */
+  public function pageShouldNotRenderBoiteArticle() {
+    $this->assertContains("Middle\n\nfooter<br/>", $this->_response->getBody());
+  }
+}
+
+
+
+
+class Admin_NewsletterControllerPreviewActionWithPlaceHoldersAndRenderWidgetWithoutNoticeSelectionTest
+  extends Admin_NewsletterControllerPreviewActionPlaceHoldersTestCase {
+
+  protected function _customizeNewsletter(Class_Newsletter $newsletter) {
+    $newsletter
+      ->setRenderWithWidget(1)
+      ->setIdCatalogue(0)
+      ->setIdPanier(0);
+  }
+
+
+  /** @test */
+  public function pageShouldContainsNotRenderBoiteNotice() {
+    $this->assertContains("Top\n\nMiddle\n", $this->_response->getBody());
+  }
+
+
+  /** @test */
+  public function pageShouldContainsBoiteArticleWithTitleExpected() {
+    $this->assertXPathContentContains('//div[@class="widget-body"]//div[@class="list-group-item"]//div[@class="card"]//div[@role="heading"]//a', 'Gilets Jaunes');
   }
 }
 
@@ -1203,7 +1292,7 @@ class Admin_NewsletterControllerPreviewActionWithArticlesSelectionTest
 
   /**  @test */
   public function noticeMartineALaPlageUrlShouldBeRechercheViewNotice42() {
-    $this->assertXPath('//a[contains(@href,"/recherche/viewnotice/clef//id/42")]');
+    $this->assertXPath('//a[contains(@href,"/recherche/viewnotice/clef/MARTINEALAPLAGE/id/42")]');
   }
 
 
diff --git a/tests/application/modules/admin/controllers/newsletter_placeholder_content_expected.html b/tests/application/modules/admin/controllers/newsletter_placeholder_content_expected.html
index 0bd53c7a1b5..196f83b1c51 100644
--- a/tests/application/modules/admin/controllers/newsletter_placeholder_content_expected.html
+++ b/tests/application/modules/admin/controllers/newsletter_placeholder_content_expected.html
@@ -1,6 +1,6 @@
 <div>
   Top
-<div style="padding:5px"><a href="http://localhost/html/recherche/viewnotice/clef//id/42">Martine à la plage</a><div></div><div style="clear:both"></div></div>
+<div style="padding:5px"><a href="http://localhost/html/recherche/viewnotice/clef/MARTINEALAPLAGE/id/42">Martine à la plage</a><div></div><div style="clear:both"></div></div>
 Middle
 <div style="padding:5px"><h1>Le Roi des cons</h1><div>Il est beau, il est fier sur son throne.</div><div style="clear:both"></div></div><div style="padding:5px"><h1>70 millions …</h1><div>Ils sont 70 millions prêts à prendre sa place.</div><div style="clear:both"></div></div><div style="padding:5px"><h1>Gilets Jaunes</h1><div><a href="http://localhost/html/viewarticle/gilets-jaunes"> La révolution a commencé.<img src='http://localhost/html/userfiles/jaunes.gif' /> . <img SRC="http://localhost/html/userfiles/gilets.gif" /></a><a href="http://lienexterne/maquereau"><img src='http://imageexterne/maquereau.gif' /></a></div><div style="clear:both"></div></div><div style="padding:5px"><h1>L'arnaque</h1><div>La révolution a oublié de décapiter la misère et l'exploitation.</div><div style="clear:both"></div></div>
-footer<br/><a href="http://localhost/html/newsletter/unsubscribe/newsletter/3/user//hash/6dd28e9b">Je ne veux plus recevoir cette lettre d'information</a></div>
+footer<br/><a href="http://localhost/html/newsletter/unsubscribe/newsletter/3/user//hash/6dd28e9b">
\ No newline at end of file
diff --git a/tests/application/modules/admin/controllers/newsletter_placeholder_content_expected.txt b/tests/application/modules/admin/controllers/newsletter_placeholder_content_expected.txt
index acd2da2bb53..1158540a389 100644
--- a/tests/application/modules/admin/controllers/newsletter_placeholder_content_expected.txt
+++ b/tests/application/modules/admin/controllers/newsletter_placeholder_content_expected.txt
@@ -2,7 +2,7 @@
   Top<br />
 - Martine à la plage<br />
 <br />
-Lien: http://localhost/html/recherche/viewnotice/clef//id/42<br />
+Lien: http://localhost/html/recherche/viewnotice/clef/MARTINEALAPLAGE/id/42<br />
 <br />
 <br />
 Middle<br />
diff --git a/tests/application/modules/admin/controllers/newsletter_placeholder_content_with_widget.html b/tests/application/modules/admin/controllers/newsletter_placeholder_content_with_widget.html
new file mode 100644
index 00000000000..791a22fb326
--- /dev/null
+++ b/tests/application/modules/admin/controllers/newsletter_placeholder_content_with_widget.html
@@ -0,0 +1,3 @@
+Middle
+<div id="boite_no_651171539e078" class="boite news  widget col"><div class="widget-header" role="heading" aria-level="2">Boite d'articles</div><div class="widget-body"><div class="list-group"><div class="list-group-item"><div class="card"><div class=" container-fluid"><div class=" row no-gutters"><div class="cardify_horizontal_img"></div><div class="cardify_horizontal_content"><div role="heading" aria-level="3" class="card-title card_title card_title_Intonation_Library_View_Wrapper_Article"><a href="http://localhost/html/cms/articleview/id/36" data-popup="">Le Roi des cons</a></div><div title="R&eacute;sum&eacute; de l'article &quot;Le Roi des cons&quot;" class="card-text"><div class="badge-group badge_group badge_group_Intonation_Library_View_Wrapper_Article"><span class="badge_tag badge_article_category"><span class="badge_text">La France</span></span></div><p class="model_description_Class_Article">Il est beau, il est fier sur son throne.</p></div></div><div class="cardify_horizontal_actions"><div class=" container-fluid"><div class=" row no-gutters"><div class="card_action"><a href="http://localhost/html/cms/articleview/id/36" class="card-link"><i class="far fa-arrow-alt-circle-right library" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">Lire la suite <span class="sr-only">Lire l'article: Le Roi des cons</span></div></a></div><div class="card_action 1"><div id="dropdown_65117153a6f40" class="dropdown dropleft dropup"><button class=" more_action btn" id="dropdown_button_65117153a6f40" data-toggle="dropdown" aria-haspopup="true"><i title="Voir plus d'actions pour Le Roi des cons" class="fas fa-ellipsis-h utils" aria-hidden="true"></i><span class="d-none d-md-inline text-left button_text">Plus <span class="sr-only">Voir plus d'actions pour Le Roi des cons</span></span></button><div class="dropdown-menu " aria-labelledby="dropdown_button_65117153a6f40"><div class="py-0 px-3"><div class=" container-fluid"><div class=" row no-gutters"><div class="card_action  share_record_on_facebook"><a href="/social-network/share/on/facebook/url/%252Fcms%252Farticleview%252Fid%252F36%253Fid_profil%253D1/titre/Le+Roi+des+cons/message/article/img_url/" title="Partager sur facebook" class="card-link  share_record_on_facebook" onclick="$.getScript('/social-network/share/on/facebook/url/%252Fcms%252Farticleview%252Fid%252F36%253Fid_profil%253D1/titre/Le+Roi+des+cons/message/article/img_url/');return false;"><i class="fab fa-facebook-f utils" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">facebook <span class="sr-only">Partager Le Roi des cons </span></div></a></div><div class="card_action  share_record_on_twitter"><a href="/social-network/share/on/twitter/url/%252Fcms%252Farticleview%252Fid%252F36%253Fid_profil%253D1/titre/Le+Roi+des+cons/message/article/img_url/" title="Partager sur twitter" class="card-link  share_record_on_twitter" onclick="$.getScript('/social-network/share/on/twitter/url/%252Fcms%252Farticleview%252Fid%252F36%253Fid_profil%253D1/titre/Le+Roi+des+cons/message/article/img_url/');return false;"><i class="fab fa-twitter utils" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">twitter <span class="sr-only">Partager Le Roi des cons </span></div></a></div><div class="card_action view_permalink permalink py-1 my-1"><a title="Afficher le lien permanent du document Le Roi des cons" class="card-link view_permalink permalink py-1 my-1" data-url="http://localhost/html/cms/articleview/id/36?id_profil=1" data-helptext="Copiez le lien suivant" href="http://localhost/html/cms/articleview/id/36?id_profil=1" onclick="popupPermalink(this);return false;"><i class="fas fa-link utils" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">Lien … <span class="sr-only"> permanent pour Le Roi des cons</span></div></a></div><div class="card_action  menu_admin_front_anchor"><a href="/admin/cms/edit/id/36" title="Modifier l'article Le Roi des cons" data-popup="1" class="card-link  menu_admin_front_anchor"><i class="fas fa-edit utils" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">Modifier … <span class="sr-only">l'article Le Roi des cons</span></div></a></div><div class="card_action  menu_admin_front_anchor"><a href="/admin/cms/version/id/36" title="Historique des modifications de l'article Le Roi des cons" data-popup="1" class="card-link  menu_admin_front_anchor"><i class="fas fa-history library" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">Historique … <span class="sr-only">des modifications de l'article Le Roi des cons</span></div></a></div></div></div></div></div></div></div></div></div></div></div></div></div></div><div class="list-group-item"><div class="card"><div class=" container-fluid"><div class=" row no-gutters"><div class="cardify_horizontal_img"></div><div class="cardify_horizontal_content"><div role="heading" aria-level="3" class="card-title card_title card_title_Intonation_Library_View_Wrapper_Article"><a href="http://localhost/html/cms/articleview/id/35" data-popup="">70 millions …</a></div><div title="R&eacute;sum&eacute; de l'article &quot;70 millions &hellip;&quot;" class="card-text"><div class="badge-group badge_group badge_group_Intonation_Library_View_Wrapper_Article"><span class="badge_tag badge_article_category"><span class="badge_text">La France</span></span></div><p class="model_description_Class_Article">Ils sont 70 millions prêts à prendre sa place.</p></div></div><div class="cardify_horizontal_actions"><div class=" container-fluid"><div class=" row no-gutters"><div class="card_action"><a href="http://localhost/html/cms/articleview/id/35" class="card-link"><i class="far fa-arrow-alt-circle-right library" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">Lire la suite <span class="sr-only">Lire l'article: 70 millions …</span></div></a></div><div class="card_action 1"><div id="dropdown_65117153a8dad" class="dropdown dropleft dropup"><button class=" more_action btn" id="dropdown_button_65117153a8dad" data-toggle="dropdown" aria-haspopup="true"><i title="Voir plus d'actions pour 70 millions &hellip;" class="fas fa-ellipsis-h utils" aria-hidden="true"></i><span class="d-none d-md-inline text-left button_text">Plus <span class="sr-only">Voir plus d'actions pour 70 millions …</span></span></button><div class="dropdown-menu " aria-labelledby="dropdown_button_65117153a8dad"><div class="py-0 px-3"><div class=" container-fluid"><div class=" row no-gutters"><div class="card_action  share_record_on_facebook"><a href="/social-network/share/on/facebook/url/%252Fcms%252Farticleview%252Fid%252F35%253Fid_profil%253D1/titre/70+millions+%E2%80%A6/message/article/img_url/" title="Partager sur facebook" class="card-link  share_record_on_facebook" onclick="$.getScript('/social-network/share/on/facebook/url/%252Fcms%252Farticleview%252Fid%252F35%253Fid_profil%253D1/titre/70+millions+%E2%80%A6/message/article/img_url/');return false;"><i class="fab fa-facebook-f utils" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">facebook <span class="sr-only">Partager 70 millions … </span></div></a></div><div class="card_action  share_record_on_twitter"><a href="/social-network/share/on/twitter/url/%252Fcms%252Farticleview%252Fid%252F35%253Fid_profil%253D1/titre/70+millions+%E2%80%A6/message/article/img_url/" title="Partager sur twitter" class="card-link  share_record_on_twitter" onclick="$.getScript('/social-network/share/on/twitter/url/%252Fcms%252Farticleview%252Fid%252F35%253Fid_profil%253D1/titre/70+millions+%E2%80%A6/message/article/img_url/');return false;"><i class="fab fa-twitter utils" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">twitter <span class="sr-only">Partager 70 millions … </span></div></a></div><div class="card_action view_permalink permalink py-1 my-1"><a title="Afficher le lien permanent du document 70 millions &hellip;" class="card-link view_permalink permalink py-1 my-1" data-url="http://localhost/html/cms/articleview/id/35?id_profil=1" data-helptext="Copiez le lien suivant" href="http://localhost/html/cms/articleview/id/35?id_profil=1" onclick="popupPermalink(this);return false;"><i class="fas fa-link utils" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">Lien … <span class="sr-only"> permanent pour 70 millions …</span></div></a></div><div class="card_action  menu_admin_front_anchor"><a href="/admin/cms/edit/id/35" title="Modifier l'article 70 millions &hellip;" data-popup="1" class="card-link  menu_admin_front_anchor"><i class="fas fa-edit utils" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">Modifier … <span class="sr-only">l'article 70 millions …</span></div></a></div><div class="card_action  menu_admin_front_anchor"><a href="/admin/cms/version/id/35" title="Historique des modifications de l'article 70 millions &hellip;" data-popup="1" class="card-link  menu_admin_front_anchor"><i class="fas fa-history library" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">Historique … <span class="sr-only">des modifications de l'article 70 millions …</span></div></a></div></div></div></div></div></div></div></div></div></div></div></div></div></div><div class="list-group-item"><div class="card"><div class=" container-fluid"><div class=" row no-gutters"><div class="cardify_horizontal_img"><a href="http://localhost/html/cms/articleview/id/13" class="card-link"><div class="img-thumbnail" aria-hidden="true"><img src="http://localhost/html/userfiles/jaunes.gif" alt="Couverture de Gilets Jaunes"></div></a></div><div class="cardify_horizontal_content"><div role="heading" aria-level="3" class="card-title card_title card_title_Intonation_Library_View_Wrapper_Article"><a href="http://localhost/html/cms/articleview/id/13" data-popup="">Gilets Jaunes</a></div><div title="R&eacute;sum&eacute; de l'article &quot;Gilets Jaunes&quot;" class="card-text"><p class="model_description_Class_Article"> La révolution a commencé. . </p></div></div><div class="cardify_horizontal_actions"><div class=" container-fluid"><div class=" row no-gutters"><div class="card_action"><a href="http://localhost/html/cms/articleview/id/13" class="card-link"><i class="far fa-arrow-alt-circle-right library" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">Lire la suite <span class="sr-only">Lire l'article: Gilets Jaunes</span></div></a></div><div class="card_action 1"><div id="dropdown_65117153aac47" class="dropdown dropleft dropup"><button class=" more_action btn" id="dropdown_button_65117153aac47" data-toggle="dropdown" aria-haspopup="true"><i title="Voir plus d'actions pour Gilets Jaunes" class="fas fa-ellipsis-h utils" aria-hidden="true"></i><span class="d-none d-md-inline text-left button_text">Plus <span class="sr-only">Voir plus d'actions pour Gilets Jaunes</span></span></button><div class="dropdown-menu " aria-labelledby="dropdown_button_65117153aac47"><div class="py-0 px-3"><div class=" container-fluid"><div class=" row no-gutters"><div class="card_action  share_record_on_facebook"><a href="/social-network/share/on/facebook/url/%252Fcms%252Farticleview%252Fid%252F13%253Fid_profil%253D1/titre/Gilets+Jaunes/message/article/img_url/%252Fhtml%252Fuserfiles%252Fjaunes.gif" title="Partager sur facebook" class="card-link  share_record_on_facebook" onclick="$.getScript('/social-network/share/on/facebook/url/%252Fcms%252Farticleview%252Fid%252F13%253Fid_profil%253D1/titre/Gilets+Jaunes/message/article/img_url/%252Fhtml%252Fuserfiles%252Fjaunes.gif');return false;"><i class="fab fa-facebook-f utils" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">facebook <span class="sr-only">Partager Gilets Jaunes </span></div></a></div><div class="card_action  share_record_on_twitter"><a href="/social-network/share/on/twitter/url/%252Fcms%252Farticleview%252Fid%252F13%253Fid_profil%253D1/titre/Gilets+Jaunes/message/article/img_url/%252Fhtml%252Fuserfiles%252Fjaunes.gif" title="Partager sur twitter" class="card-link  share_record_on_twitter" onclick="$.getScript('/social-network/share/on/twitter/url/%252Fcms%252Farticleview%252Fid%252F13%253Fid_profil%253D1/titre/Gilets+Jaunes/message/article/img_url/%252Fhtml%252Fuserfiles%252Fjaunes.gif');return false;"><i class="fab fa-twitter utils" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">twitter <span class="sr-only">Partager Gilets Jaunes </span></div></a></div><div class="card_action view_permalink permalink py-1 my-1"><a title="Afficher le lien permanent du document Gilets Jaunes" class="card-link view_permalink permalink py-1 my-1" data-url="http://localhost/html/cms/articleview/id/13?id_profil=1" data-helptext="Copiez le lien suivant" href="http://localhost/html/cms/articleview/id/13?id_profil=1" onclick="popupPermalink(this);return false;"><i class="fas fa-link utils" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">Lien … <span class="sr-only"> permanent pour Gilets Jaunes</span></div></a></div><div class="card_action  menu_admin_front_anchor"><a href="/admin/cms/edit/id/13" title="Modifier l'article Gilets Jaunes" data-popup="1" class="card-link  menu_admin_front_anchor"><i class="fas fa-edit utils" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">Modifier … <span class="sr-only">l'article Gilets Jaunes</span></div></a></div><div class="card_action  menu_admin_front_anchor"><a href="/admin/cms/version/id/13" title="Historique des modifications de l'article Gilets Jaunes" data-popup="1" class="card-link  menu_admin_front_anchor"><i class="fas fa-history library" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">Historique … <span class="sr-only">des modifications de l'article Gilets Jaunes</span></div></a></div></div></div></div></div></div></div></div></div></div></div></div></div></div><div class="list-group-item"><div class="card"><div class=" container-fluid"><div class=" row no-gutters"><div class="cardify_horizontal_img"></div><div class="cardify_horizontal_content"><div role="heading" aria-level="3" class="card-title card_title card_title_Intonation_Library_View_Wrapper_Article"><a href="http://localhost/html/cms/articleview/id/12" data-popup="">L'arnaque</a></div><div title="R&eacute;sum&eacute; de l'article &quot;L'arnaque&quot;" class="card-text"><p class="model_description_Class_Article">La révolution a oublié de décapiter la misère et l'exploitation.</p></div></div><div class="cardify_horizontal_actions"><div class=" container-fluid"><div class=" row no-gutters"><div class="card_action"><a href="http://localhost/html/cms/articleview/id/12" class="card-link"><i class="far fa-arrow-alt-circle-right library" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">Lire la suite <span class="sr-only">Lire l'article: L'arnaque</span></div></a></div><div class="card_action 1"><div id="dropdown_65117153ac6f0" class="dropdown dropleft dropup"><button class=" more_action btn" id="dropdown_button_65117153ac6f0" data-toggle="dropdown" aria-haspopup="true"><i title="Voir plus d'actions pour L'arnaque" class="fas fa-ellipsis-h utils" aria-hidden="true"></i><span class="d-none d-md-inline text-left button_text">Plus <span class="sr-only">Voir plus d'actions pour L'arnaque</span></span></button><div class="dropdown-menu " aria-labelledby="dropdown_button_65117153ac6f0"><div class="py-0 px-3"><div class=" container-fluid"><div class=" row no-gutters"><div class="card_action  share_record_on_facebook"><a href="/social-network/share/on/facebook/url/%252Fcms%252Farticleview%252Fid%252F12%253Fid_profil%253D1/titre/L%27arnaque/message/article/img_url/" title="Partager sur facebook" class="card-link  share_record_on_facebook" onclick="$.getScript('/social-network/share/on/facebook/url/%252Fcms%252Farticleview%252Fid%252F12%253Fid_profil%253D1/titre/L%27arnaque/message/article/img_url/');return false;"><i class="fab fa-facebook-f utils" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">facebook <span class="sr-only">Partager L'arnaque </span></div></a></div><div class="card_action  share_record_on_twitter"><a href="/social-network/share/on/twitter/url/%252Fcms%252Farticleview%252Fid%252F12%253Fid_profil%253D1/titre/L%27arnaque/message/article/img_url/" title="Partager sur twitter" class="card-link  share_record_on_twitter" onclick="$.getScript('/social-network/share/on/twitter/url/%252Fcms%252Farticleview%252Fid%252F12%253Fid_profil%253D1/titre/L%27arnaque/message/article/img_url/');return false;"><i class="fab fa-twitter utils" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">twitter <span class="sr-only">Partager L'arnaque </span></div></a></div><div class="card_action view_permalink permalink py-1 my-1"><a title="Afficher le lien permanent du document L'arnaque" class="card-link view_permalink permalink py-1 my-1" data-url="http://localhost/html/cms/articleview/id/12?id_profil=1" data-helptext="Copiez le lien suivant" href="http://localhost/html/cms/articleview/id/12?id_profil=1" onclick="popupPermalink(this);return false;"><i class="fas fa-link utils" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">Lien … <span class="sr-only"> permanent pour L'arnaque</span></div></a></div><div class="card_action  menu_admin_front_anchor"><a href="/admin/cms/edit/id/12" title="Modifier l'article L'arnaque" data-popup="1" class="card-link  menu_admin_front_anchor"><i class="fas fa-edit utils" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">Modifier … <span class="sr-only">l'article L'arnaque</span></div></a></div><div class="card_action  menu_admin_front_anchor"><a href="/admin/cms/version/id/12" title="Historique des modifications de l'article L'arnaque" data-popup="1" class="card-link  menu_admin_front_anchor"><i class="fas fa-history library" aria-hidden="true"></i><div class="d-none d-md-inline text-left button_text">Historique … <span class="sr-only">des modifications de l'article L'arnaque</span></div></a></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div>
+footer<br/><a href="http://localhost/html/newsletter/unsubscribe/newsletter/3/user//hash/6dd28e9b">Je ne veux plus recevoir cette lettre d'information</a></div>
diff --git a/tests/application/modules/admin/controllers/newsletter_placeholder_content_without_articles.txt b/tests/application/modules/admin/controllers/newsletter_placeholder_content_without_articles.txt
index 72e6599ac01..9cf951a3946 100644
--- a/tests/application/modules/admin/controllers/newsletter_placeholder_content_without_articles.txt
+++ b/tests/application/modules/admin/controllers/newsletter_placeholder_content_without_articles.txt
@@ -2,7 +2,7 @@
   Top<br />
 - Martine à la plage<br />
 <br />
-Lien: http://localhost/html/recherche/viewnotice/clef//id/42<br />
+Lien: http://localhost/html/recherche/viewnotice/clef/MARTINEALAPLAGE/id/42<br />
 <br />
 <br />
 Middle<br />
-- 
GitLab