From e28c67d34a840bcd9ac8639468c47b71128734a8 Mon Sep 17 00:00:00 2001
From: Ghislain Loas <ghislo@sandbox.pergame.net>
Date: Fri, 17 Apr 2015 16:07:19 +0200
Subject: [PATCH] hotline_#24018_fix_duplicate_id_module_in_same_page fix
 missing save

---
 library/Class/Profil.php                      |  8 +-
 .../ProfilOptionsControllerTest.php           | 97 ++++++++++++++-----
 2 files changed, 78 insertions(+), 27 deletions(-)

diff --git a/library/Class/Profil.php b/library/Class/Profil.php
index fcc9a3844cb..cd3e6c45915 100644
--- a/library/Class/Profil.php
+++ b/library/Class/Profil.php
@@ -1597,6 +1597,12 @@ class Class_Profil extends Storm_Model_Abstract {
 	public function afterSave() {
 		$this->_has_parent_profil = null;
 		$this->_should_forward_attributes = [];
+		$this->syncModulesIds();
+	}
+
+
+
+	protected function syncModulesIds() {
 		$this->syncModulesIdsWithParentProfil();
 	}
 
@@ -1641,7 +1647,7 @@ class Class_Profil extends Storm_Model_Abstract {
 		$module_cfg = $cfg_accueil['modules'][$id];
 		unset($cfg_accueil['modules'][$id]);
 		$cfg_accueil['modules'][$new_id] = $module_cfg;
-		$this->setCfgAccueil($cfg_accueil);
+		$this->setCfgAccueil($cfg_accueil)->save();
 		return $this;
 	}
 
diff --git a/tests/application/modules/opac/controllers/ProfilOptionsControllerTest.php b/tests/application/modules/opac/controllers/ProfilOptionsControllerTest.php
index dd314b0bddd..fcdc094e1b5 100644
--- a/tests/application/modules/opac/controllers/ProfilOptionsControllerTest.php
+++ b/tests/application/modules/opac/controllers/ProfilOptionsControllerTest.php
@@ -1101,7 +1101,7 @@ class ProfilOptionsControllerPageJeuxViewModuleCritiquesTest extends ProfilOptio
 	 */
 	public function breadcrumbShouldNotContainsSpanProfilJeunesse() {
 		$this->assertNotXPathContentContains('//div[@class="barre_nav"]//span',
-																			'Jeunesse',$this->_response->getBody());
+																				 'Jeunesse',$this->_response->getBody());
 	}
 
 
@@ -1184,7 +1184,7 @@ class ProfilOptionsControllerProfilBreadcrumbHomePageTest extends ProfilOptionsC
 	 */
 	public function breadcrumbShouldNotContainsSpanProfilHomePage() {
 		$this->assertNotXPathContentContains('//div[@class="barre_nav"]//span',
-																			'HomePage',$this->_response->getBody());
+																				 'HomePage',$this->_response->getBody());
 	}
 }
 
@@ -2367,48 +2367,93 @@ class ProfilOptionsControllerSelectedActionInMenuVerticalWidgetInHomeTest extend
 
 
 
-class ProfilOptionControllerWithHeritedBannerTest extends AbstractControllerTestCase {
+abstract class ProfilOptionControllerHeritedModulesTestCase extends AbstractControllerTestCase {
+	protected $_profil_portal, $_profil_gnu;
+
 	public function setUp() {
 		parent::setUp();
 
-		$profil_portal = $this->fixture('Class_Profil',
-																		['id' => 1,
-																		 'browser' => 'opac',
-																		 'libelle' => 'Bokeh Portal'])
-													->setCfgAccueil(['modules' => ['1' => ['division' => '4',
-																																 'type_module' => 'RECH_SIMPLE',
-																																 'preferences' => []],
-																												 '4' => ['division' => '4',
-																																 'type_module' => 'NEWS']]]);
-
-		$profil_gnu = $this->fixture('Class_profil',
-																 ['id' => 2,
-																	'parent_profil' => $profil_portal,
-																	'browser' => 'opac',
-																	'libelle' => 'A GNU Portal'])
-											 ->setCfgAccueil(['modules' => ['4' => ['division' => '1',
-																															'type_module' => 'NEWS'],
-																											'10' => ['division' => '1',
-																															 'type_module' => 'NEWS']]]);
-		$profil_gnu->save();
-		$profil_gnu->beCurrentProfil();
+		$this->fixture('Class_AdminVar',['id'=>'MENU_BOITE', 'valeur' => 0]);
+
+		$this->_profil_portal = $this->fixture('Class_Profil',
+																					 ['id' => 1,
+																						'browser' => 'opac',
+																						'libelle' => 'Bokeh Portal'])
+																 ->setCfgAccueil(['modules' => ['1' => ['division' => '4',
+																																				'type_module' => 'RECH_SIMPLE',
+																																				'preferences' => []],
+																																'4' => ['division' => '4',
+																																				'type_module' => 'NEWS']]]);
+
+		$this->_profil_gnu = $this->fixture('Class_profil',
+																				['id' => 2,
+																				 'parent_profil' => $this->_profil_portal,
+																				 'browser' => 'opac',
+																				 'libelle' => 'A GNU Portal'])
+															->setCfgAccueil(['modules' => ['4' => ['division' => '1',
+																																		 'type_module' => 'NEWS'],
+																														 '10' => ['division' => '1',
+																																			'type_module' => 'NEWS']]]);
+	}
+}
+
 
+
+class ProfilOptionControllerWithHeritedBannerTest extends ProfilOptionControllerHeritedModulesTestCase {
+
+	public function setUp() {
+		parent::setUp();
+		$this->_profil_gnu->beCurrentProfil()->save();
 		$this->dispatch('/opac', true);
 	}
 
 
 	/** @test */
-	public function htmlShouldCOntainsOnlyOneIdBoite4() {
+	public function htmlShouldContainsOnlyOneIdBoite4() {
 		$this->assertXPathCount('//div[@id="boite_4"]', 1);
 	}
 
 
 	/** @test */
-	public function htmlShouldCOntainsIdBoite11() {
+	public function htmlShouldContainsIdBoite11() {
 		$this->assertXPathCount('//div[@id="boite_11"]', 1);
 	}
 
 
+	/** @test */
+	public function profilShouldIncrementCfgIdsAndDeleteOldId() {
+		$this->assertEquals([10,11], array_keys(Class_Profil::find(2)->getCfgAccueilAsArray()['modules']));
+	}
+}
+
+
+
+class ProfilOptionControllerWithHeritedPagesTest extends ProfilOptionControllerHeritedModulesTestCase {
+
+	public function setUp() {
+		parent::setUp();
+
+		$this->_profil_portal
+			->setSubProfils([$this->_profil_gnu])
+			->beCurrentProfil()
+			->save();
+
+		$this->dispatch('/opac', true);
+	}
+
+
+	/** @test */
+	public function htmlShouldContainsIdBoite1() {
+		$this->assertXPathCount('//div[@id="boite_1"]', 1);
+	}
+
+
+	/** @test */
+	public function htmlShouldContainsIdBoite4() {
+		$this->assertXPathCount('//div[@id="boite_4"]', 1);
+	}
+
+
 	/** @test */
 	public function profilShouldIncrementCfgIdsAndDeleteOldId() {
 		$this->assertEquals([10,11], array_keys(Class_Profil::find(2)->getCfgAccueilAsArray()['modules']));
-- 
GitLab