From fb55f3ae855aede7b70f3318bc31ef96e31c121b 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  | 150 ++++++++++++++----
 ...wsletter_placeholder_content_expected.html |   6 -
 ...ewsletter_placeholder_content_expected.txt |   8 +-
 ...r_placeholder_content_without_articles.txt |   2 +-
 8 files changed, 178 insertions(+), 46 deletions(-)
 delete mode 100644 tests/application/modules/admin/controllers/newsletter_placeholder_content_expected.html

diff --git a/library/Class/Notice/MailRenderer.php b/library/Class/Notice/MailRenderer.php
index 6b6315d1390..e5a09ed234b 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::WALL,
+                           'rendering' => Intonation_Library_Widget_Carousel_Definition::HORIZONTAL_CARD,
+                           'style_list' => 'vignettes',
+                           'size' => 6,
+                           '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..3895ba8ebc6 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,
@@ -1013,10 +1016,36 @@ abstract class Admin_NewsletterControllerPreviewActionTestCase
 
 abstract class Admin_NewsletterControllerPreviewActionPlaceHoldersTestCase extends Admin_NewsletterControllerPreviewActionTestCase{
   protected Class_Newsletter $_newsletter;
+  protected string $_file_path = '';
 
   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,10 +1056,22 @@ abstract class Admin_NewsletterControllerPreviewActionPlaceHoldersTestCase exten
   }
 
 
+  public function tearDown(){
+    Class_MoteurRecherche::setInstance(null);
+
+    parent::tearDown();
+  }
+
+
   protected function _customizeNewsletter(Class_Newsletter $newsletter){
   }
 
 
+  public function expectedLine() {
+    return array_map(fn($elt)=> [$elt],file($this->_file_path));
+  }
+
+
   /** @test */
   public function placeholderNewsletterRecordsShouldHaveBeenRemoved() {
     $this->assertNotXPathContentContains('//body', '[newsletter_records]');
@@ -1041,6 +1082,14 @@ abstract class Admin_NewsletterControllerPreviewActionPlaceHoldersTestCase exten
   public function placeholderNewsletterArticlesShouldHaveBeenRemoved() {
     $this->assertNotXPathContentContains('//body', '[newsletter_articles]');
   }
+
+
+  /** @test
+   *  @dataProvider expectedLine
+   */
+  public function contentShouldBeAsExpected(string $expected_line) {
+    $this->assertContains( $expected_line, $this->_response->getBody());
+  }
 }
 
 
@@ -1050,95 +1099,132 @@ abstract class Admin_NewsletterControllerPreviewActionPlaceHoldersTestCase exten
 class Admin_NewsletterControllerPreviewActionWithArticlesSelectionAndPlaceHoldersTest
   extends Admin_NewsletterControllerPreviewActionPlaceHoldersTestCase {
 
-  protected function _expectedText() {
-    return file_get_contents(__DIR__.'/newsletter_placeholder_content_expected.txt');
-  }
+  protected string $_file_path =__DIR__.'/newsletter_placeholder_content_expected.txt';
 
 
-  protected function _expectedHtml() {
-    return file_get_contents(__DIR__.'/newsletter_placeholder_content_expected.html');
-  }
+}
 
 
-  /** @test */
-  public function contentTextShouldBeAsExpected() {
-    $this->assertContains( $this->_expectedText(), $this->_response->getBody());
+
+
+class Admin_NewsletterControllerPreviewActionWithPlaceHoldersWithoutCatalogueTest
+  extends Admin_NewsletterControllerPreviewActionPlaceHoldersTestCase {
+
+  protected string $_file_path = __DIR__.'/newsletter_placeholder_content_without_catalogue_expected.txt';
+
+  protected function _customizeNewsletter(Class_Newsletter $newsletter) {
+    $newsletter
+      ->setIdCatalogue(0);
   }
+}
 
 
-  /** @test */
-  public function contentHtmlShouldBeAsExpected() {
-    $this->assertContains( $this->_expectedHtml(), $this->_response->getBody());
+
+
+class Admin_NewsletterControllerPreviewActionWithPlaceholdersWithoutArticlesTest
+  extends Admin_NewsletterControllerPreviewActionPlaceHoldersTestCase {
+
+  protected string $_file_path = __DIR__.'/newsletter_placeholder_content_without_articles.txt';
+
+  protected function _customizeNewsletter(Class_Newsletter $newsletter) {
+    $newsletter
+      ->setArticlesIds(0)
+      ->setArticlesCategoriesIds(0);
   }
 }
 
 
 
-class Admin_NewsletterControllerPreviewActionWithPlaceHoldersWithoutCatalogueTest
+
+class Admin_NewsletterControllerPreviewActionWithPlaceHoldersAndRenderWidgetTest
   extends Admin_NewsletterControllerPreviewActionPlaceHoldersTestCase {
 
   protected function _customizeNewsletter(Class_Newsletter $newsletter) {
     $newsletter
-      ->setIdCatalogue(0);
+      ->setRenderWithWidget(1);
   }
 
 
-  protected function _expectedText() {
-    return file_get_contents(__DIR__.'/newsletter_placeholder_content_without_catalogue_expected.txt');
+  /** @test */
+  public function pageShouldContainsBoiteNoticeWithTitleMartineALaPlage() {
+    $this->assertXPathContentContains('//div[@class="widget-body"]//div[@class="masonry-brick"]//div[@class="card"]//span[@class="200a"]', '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');
   }
+
+
+  /**
+   * @group ignore
+   */
+  public function contentShouldBeAsExpected(string $expected_line) {}
 }
 
 
 
 
-class Admin_NewsletterControllerPreviewActionWithPlaceholdersWithoutArticlesTest
+class Admin_NewsletterControllerPreviewActionWithPlaceHoldersAndRenderWidgetWithoutArticleSelectionTest
   extends Admin_NewsletterControllerPreviewActionPlaceHoldersTestCase {
 
   protected function _customizeNewsletter(Class_Newsletter $newsletter) {
     $newsletter
+      ->setRenderWithWidget(1)
       ->setArticlesIds(0)
       ->setArticlesCategoriesIds(0);
   }
 
 
-  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="masonry-brick"]//div[@class="card"]//span[@class="200a"]', 'Martine à la plage');
   }
 
 
   /** @test */
-  public function pageShouldContainsExpectedText() {
-    $this->assertContains($this->_expectedText(), $this->_response->getBody());
+  public function pageShouldNotRenderBoiteArticle() {
+    $this->assertContains("Middle\n\nfooter<br/>", $this->_response->getBody());
   }
+
+
+  /**
+   * @group ignore
+   */
+  public function contentShouldBeAsExpected(string $expected_line) {}
 }
 
 
 
 
-class Admin_NewsletterControllerPreviewActionWithPlaceHoldersAndRenderWidgetTest
+class Admin_NewsletterControllerPreviewActionWithPlaceHoldersAndRenderWidgetWithoutNoticeSelectionTest
   extends Admin_NewsletterControllerPreviewActionPlaceHoldersTestCase {
 
   protected function _customizeNewsletter(Class_Newsletter $newsletter) {
     $newsletter
-      ->setRenderWithWidget(1);
+      ->setRenderWithWidget(1)
+      ->setIdCatalogue(0)
+      ->setIdPanier(0);
   }
 
 
-  protected function _expectedText() {
-    return file_get_contents(__DIR__.'/newsletter_placeholder_content_without_articles.txt');
+  /** @test */
+  public function pageShouldContainsNotRenderBoiteNotice() {
+    $this->assertContains("Top\n\nMiddle\n", $this->_response->getBody());
   }
 
 
   /** @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');
   }
+
+
+  /**
+   * @group ignore
+   */
+  public function contentShouldBeAsExpected(string $expected_line) {}
 }
 
 
@@ -1203,7 +1289,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
deleted file mode 100644
index 0bd53c7a1b5..00000000000
--- a/tests/application/modules/admin/controllers/newsletter_placeholder_content_expected.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<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>
-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>
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..a4297bf43ed 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 />
@@ -16,3 +16,9 @@ Middle<br />
 <br />
 footer<br />
 Lien pour se désinscrire de cette lettre d'information : http://localhost/html/newsletter/unsubscribe/newsletter/3/user//hash/6dd28e9b</p>
+<div>
+  Top
+<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">
\ No newline at end of file
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