diff --git a/tests/application/modules/admin/controllers/CmsControllerTest.php b/tests/application/modules/admin/controllers/CmsControllerTest.php index bd13d20a1540a1347deb6fa001fe4578b1c6bcd6..d30f338f727f104c810ecb627fddb14ecd39db2e 100644 --- a/tests/application/modules/admin/controllers/CmsControllerTest.php +++ b/tests/application/modules/admin/controllers/CmsControllerTest.php @@ -1,2902 +1,2904 @@ -<?php -/** - * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved. - * - * BOKEH is free software; you can redistribute it and/or modify - * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by - * the Free Software Foundation. - * - * There are special exceptions to the terms and conditions of the AGPL as it - * is applied to this software (see README file). - * - * BOKEH is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE - * along with BOKEH; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -require_once 'AdminAbstractControllerTestCase.php'; - - -abstract class CmsControllerTestCase extends Admin_AbstractControllerTestCase { - protected - $concert, /** @var Class_Article */ - $lieu_bonlieu, - $lieu_arcadium, - $_admin_bib, - $_laurent, - $_bernard, - $_group_testing, - $_group_admin, - $_cat_a_la_une, - $_cat_atelier; - - - public function setUp() { - parent::setUp(); - $_SERVER['SCRIPT_NAME'] = ''; - - Storm_Model_Loader::defaultToVolatile(); - $this->setupBib(); - - $this->_group_testing = $this->fixture('Class_UserGroup', ['id' => 22, - 'libelle' => 'Testing group']); - - - $this->_group_admin = $this->fixture('Class_UserGroup', ['id' => 24, - 'libelle' => 'Admin group']); - - $this->_laurent = $this->fixture('Class_Users', ['id'=>20, - 'login' => 'laurent', - 'mail' => 'laurent@afi-sa.fr', - 'bib' => $this->annecy, - 'password' => 'toto', - 'role_level' => ZendAfi_Acl_AdminControllerRoles::ADMIN_PORTAIL, - 'user_groups' => [$this->_group_admin]]); - - $this->_admin_bib = $this->fixture('Class_Users',['id' => 10, - 'login' => 'AdminBibConnected', - 'nom' => 'Super', - 'prenom' => 'Mario', - 'bib' => $this->annecy, - 'role' => 'admin_bib', - 'mail' => 'admin@afi-sa.fr', - 'password' => 'toto', - 'role_level' => ZendAfi_Acl_AdminControllerRoles::ADMIN_BIB, - 'user_groups' => [$this->_group_testing]]); - - $this->_bernard = $this->fixture('Class_Users',['id' =>30, - 'login' => 'bernie', - 'bib' => $this->annecy, - 'mail' => 'bernard@afi-sa.fr', - 'password' => 'bernie', - 'role_level' => ZendAfi_Acl_AdminControllerRoles::ADMIN_PORTAIL, - 'user_groups' => [$this->_group_admin]]); - - - ZendAfi_Auth::getInstance()->logUser($this->_admin_bib); - - $this - ->setupLieux() - ->setupDomaines() - ->setupArticles() - ->setupPermissions(); - - $this->fixture('Class_AdminVar', ['id' => 'LANGUES', 'valeur' => 'en;ro']); - $this->fixture('Class_AdminVar', ['id' => 'ARTICLES_LIST_MODE', 'valeur' => '']); - } - - - public function tearDown() { - Storm_Model_Loader::defaultToDb(); - parent::tearDown(); - } - - - public function setupLieux() { - $this->lieu_bonlieu = $this->fixture('Class_Lieu', ['id' => 3, - 'libelle' => 'Bonlieu', - 'adresse' => '1, rue Jean Jaures', - 'code_postal' => '74000', - 'ville' => 'Annecy', - 'pays' => 'France' - ]); - - $this->lieu_arcadium = $this->fixture('Class_Lieu', ['id' => 10 , - 'libelle' => 'Arcadium', - 'adresse' => '32 bd du Fier', - 'code_postal' => '74000', - 'ville' => 'Annecy', - 'pays' => 'France']); - - return $this; - } - - - public function setupDomaines() { - // /!\ disabling afterSave call to saveThesaurus which make direct SQL queries - $this->onLoaderOfModel('Class_Catalogue') - ->whenCalled('saveThesaurus') - ->answers(null); - - $this->domaine_art = $this->fixture('Class_Catalogue', - ['id' => 11, 'libelle' => 'Art']); - - $this->domaine_histoire = $this->fixture('Class_Catalogue', - ['id' => 10, - 'libelle' => 'Histoire', - 'sous_domaines' => [$this->domaine_art]]); - - $domaine_a_la_une = $this->fixture('Class_Catalogue', - ['id' => 66, 'libelle' => 'A la Une']); - $this->fixture('Class_Catalogue', - ['id' => 78, - 'libelle' => 'Root', - 'sous_domaines' => [$domaine_a_la_une]]); - return $this; - } - - - public function setupBib() { - $this->annecy = $this->fixture('Class_Bib',['id' => 1, - 'id_zone' => 4, - 'libelle' => 'Annecy' - ]); - - - $this->cran_gevrier = $this->fixture('Class_Bib',['id' => 3, - 'id_zone' => 4, - 'libelle' => 'Cran-Gevrier', - 'article_categories' => []]); - } - - - public function setupArticles() { - $this->root_category = $this->fixture('Class_ArticleCategorie', - ['id' => 1, 'libelle' => 'Root']); - - $this->_cat_atelier = $this->fixture('Class_ArticleCategorie', - ['id' => 33, - 'libelle' => 'Atelier', - 'parent_categorie' => $this->root_category]); - - $this->_cat_a_la_une = $this->fixture('Class_ArticleCategorie', - ['id' => 23, - 'libelle' => 'A la Une', - 'parent_categorie' => $this->root_category]); - - $this->cat_evenements = $this->fixture('Class_ArticleCategorie', - ['id' => 34, - 'libelle' => 'Evènements', - 'parent_categorie' => $this->_cat_a_la_une, - 'sous_categories' => []]); - $this->_cat_a_la_une->setSousCategories([$this->cat_evenements]); - - $this->annecy - ->setArticleCategories([$this->root_category]) - ->assertSave(); - - $this->concert = $this->fixture('Class_Article', - ['id' => 4, - 'categorie' => $this->cat_evenements, - 'titre' => 'Erik Truffaz en concert', - 'auteur' => $this->fixture('Class_Users', - ['id' => 2, - 'Nom' => 'Tom et Jerry', - 'password'=>'toto', - 'login'=>'tom']), - 'description' => 'Venez nombreux ici: <img src="'.BASE_URL.'/images/bonlieu.jpg" />', - 'contenu' => 'à Bonlieu. <img src="'.BASE_URL.'/images/truffaz.jpg" />', - 'debut' => '2011-03-20', - 'fin' => '2011-03-28', - 'events_debut' => '2011-03-27 21:00', - 'events_fin' => '2011-03-28 22:30', - 'cacher_titre' => 1, - 'langue' => 'fr', - 'tags' => 'concert;jazz', - 'avis' => true, - 'indexation' => false, - 'date_creation' => '2010-12-25 10:23:23', - 'date_maj' => '2010-12-26 11:12:34', - 'domaine_ids' => [11,12], - 'avis_users' => []]); - - $this->cat_evenements->setArticles([$this->concert]); - - $this->categorie_wrapper = $this->onLoaderOfModel('Class_ArticleCategorie'); - - $this->cat_evenements->setBib($this->annecy); - - return $this; - } - - - function setupPermissions() { - $cnt = 1; - foreach ([['CATEGORY', 'ARTICLE', 'Sur la catégorie', 1, 'Créer des sous-catégories'], - ['ARTICLE', 'ARTICLE', 'Sur la catégorie', 2, 'Créer des articles'], - ['PENDING', 'ARTICLE', 'Nouveaux statuts autorisés', 1, 'À valider'], - ['VALIDATED', 'ARTICLE', 'Nouveaux statuts autorisés', 101, 'Validé'], - ['REFUSED', 'ARTICLE', 'Nouveaux statuts autorisés', 102, 'Refusé'], - ['ARCHIVED', 'ARTICLE', 'Nouveaux statuts autorisés', 103, 'Archivé']] as $permission) - $this->fixture('Class_Permission', - ['id' => $cnt++, - 'code' => $permission[0], - 'module' => $permission[1], - 'type' => $permission[2], - 'sorting' => $permission[3], - 'description' => $permission[4]]); - } - - - function assertInputValueEquals($input_name, $value) { - $this->assertXPath(sprintf('//input[@name="%s"][@value="%s"]', - $input_name, $value)); - } - - - function assertCheckboxIsChecked($input_name) { - $this->assertXPath(sprintf('//input[@type="checkbox"][@name="%s"][@checked="checked"]', - $input_name)); - } - - - function assertCheckboxIsNotChecked($input_name) { - $this->assertXPath(sprintf('//input[@type="checkbox"][@name="%s"]', $input_name)); - } - - - function assertTextAreaContains($name, $content) { - $this->assertXPathContentContains(sprintf('//textarea[@name="%s"]', $name), - $content, $this->_response->getBody()); - } - - - function assertNotTextAreaContains($name, $content) { - $this->assertNotXPathContentContains(sprintf('//textarea[@name="%s"]', $name), - $content); - } -} - - - -abstract class CmsControllerWithPermissionTestCase extends CmsControllerTestCase { - protected $_current_id = 1; - - public function setUp() { - parent::setUp(); - Class_Permission::createArticle()->permitTo($this->_group_testing, $this->_cat_a_la_une); - Class_Permission::createArticleCategory()->permitTo($this->_group_testing, $this->_cat_a_la_une); - - Class_Permission::validateArticle()->permitTo($this->_group_admin, - $this->_cat_a_la_une); - - - } -} - - - -class CmsControllerArticleEditWithoutLanguesTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - Class_Exemplaire::beVolatile(); - Class_AdminVar::getLoader() - ->newInstanceWithId('LANGUES') - ->setValeur(''); - - $this->dispatch('/admin/cms/edit/id/4'); - } - - - /** @test */ - public function traductionsSelectorShouldNotBeVisible() { - $this->assertNotXPath('//div[@class="traduction_navigator"]'); - } -} - - - -class CmsControllerArticleConcertAsAdminPortailEditActionTest extends CmsControllerWithPermissionTestCase { - protected function _loginHook($account) { - $account->ROLE = "admin_portail"; - $account->ROLE_LEVEL = ZendAfi_Acl_AdminControllerRoles::ADMIN_PORTAIL; - } - - public function setUp() { - parent::setUp(); - Class_Users::getLoader() - ->getIdentity() - ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::ADMIN_PORTAIL); - Class_Exemplaire::beVolatile(); - $this->dispatch('/admin/cms/edit/id/4', true); - } - - - /** @test */ - public function newsFormShouldBePresent() { - $this->assertXPath('//form[@id="form"]'); - } - - - /** @test */ - public function articleShouldcontainsAuteurTomEtJerry() { - $this->assertXPathContentContains('//td','Tom et Jerry'); - } - - /** @test */ - public function contentHeadShouldContainsLastEditOn26December() { - $this->assertXPathContentContains('//div[@class="content_edit_head"]//dl/dd[preceding-sibling::dt[contains(text(), "Modifié le")]]', - '26 décembre 2010 11:12:34'); - } - - - /** @test */ - public function contentHeadShouldContainsCretedOn25December() { - $this->assertXPathContentContains('//div[@class="content_edit_head"]//dl/dd[preceding-sibling::dt[contains(text(), "Créé le")]]', - '25 décembre 2010 10:23:23'); - } - - - /** @test */ - function categorieSelectShouldContainsOptGroupAnnecy() { - $this->assertXPath('//select[@name="id_cat"]//optgroup[@label="Annecy"]'); - } - - - /** @test */ - function categorieSelectShouldContainsOptGroupPortail() { - $this->assertXPath('//select[@name="id_cat"]//optgroup[@label="Portail"]'); - } - - - /** @test */ - function categorieSelectShouldContainsOptGroupCranGevrier() { - $this->assertXPath('//select[@name="id_cat"]//optgroup[@label="Cran-Gevrier"]'); - } - - - /** @test */ - public function selectIdLieuShouldContainsAucunAndBeSelected() { - $this->assertXPath('//select[@name="id_lieu"]//option[@selected="selected"][@label="Aucun"][@value="0"]'); - } - - - /** @test */ - public function selectIdLieuShouldContainsBonlieu() { - $this->assertXPath('//select[@name="id_lieu"]//option[not(@selected)][@label="Bonlieu"][@value="3"]'); - } - - - /** @test */ - public function selectIdLieuShouldContainsArcadium() { - $this->assertXPath('//select[@name="id_lieu"]//option[@label="Arcadium"][@value="10"]'); - } - - - /** @test */ - public function datePickerForDebutShouldContains20_03_2011() { - $this->assertInputValueEquals('debut', '20/03/2011'); - } - - - /** @test */ - public function datePickerForFinShouldContains28_03_2011() { - $this->assertInputValueEquals('fin', '28/03/2011'); - } - - - /** @test */ - public function datePickerForFinShouldHaveMaxLength10() { - $this->assertXPath('//input[@name="fin"][@maxlength="10"]'); - } - - - /** @test */ - public function datePickerJavascriptForDebutShouldBeDateOnlyTrue() { - $this->assertXPathContentContains('//script', - 'input#debut").appendDtpicker({"dateFormat":"DD\/MM\/YYYY","locale":"fr","firstDayOfWeek":1,"minuteInterval":15,"closeOnSelected":"true","autodateOnStart":false,"dateOnly":true}'); - } - - - /** @test */ - public function datePickerForEventDebutShouldContains27_03_2011_at_21_00() { - $this->assertInputValueEquals('events_debut', '27/03/2011 21:00'); - } - - - /** @test */ - public function datePickerForEventFinShouldContains28_03_2011_at_22_30() { - $this->assertInputValueEquals('events_fin', '28/03/2011 22:30'); - } - - - /** @test */ - public function datePickerForEventFinShouldHaveMaxLength16() { - $this->assertXPath('//input[@name="events_fin"][@maxlength="16"]'); - } - - - /** @test */ - public function datePickerJavascriptForEventDebutShouldBeDateOnlyFalse() { - $this->assertXPathContentContains('//script', - 'input#events_debut").appendDtpicker({"dateFormat":"DD\/MM\/YYYY hh:mm","locale":"fr","firstDayOfWeek":1,"minuteInterval":15,"closeOnSelected":"true","autodateOnStart":false,"dateOnly":false}'); - } - - - /** @test */ - public function boutonValiderClickShouldNotBeAjax() { - $this->assertNotXPath('//td//div[contains(@onclick, "initializeAjaxFormSubmit")]'); - } -} - - - - -class CmsControllerArticleConcertAsReferentEditActionTest extends CmsControllerArticleConcertAsAdminPortailEditActionTest { - - protected $_referent; - protected $_referent_membership; - protected $modo; - - public function setUp() { - parent::setUp(); - $this->modo = Class_Users::newInstanceWithId(22, ['login' => 'modo', - 'role_level' =>ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL ]); - $this->modo->save(); - ZendAfi_Auth::getInstance()->logUser($this->modo); - $this->_referent = Class_UserGroup::newInstanceWithId(280) - ->setLibelle('Referent') - ->setRights([Class_UserGroup::RIGHT_USER_DOMAINES_SUPPRESSION_LIMIT, - Class_UserGroup::RIGHT_USER_MODO]) - ->setUsers([$this->modo]); - - $this->_referent->save(); - - $this->dispatch('/admin/cms/edit/id/4', true); - } - - -} - - - - -class CmsControllerArticleWithoutCategoryAddActionTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - $this->dispatch('/admin/cms/add/id_cat/99999'); - } - - /** @test */ - function answerShouldRedirectToAdminCms() { - $this->assertRedirectTo('/admin/cms/index', $this->getResponseLocation()); - } -} - - - - -class CmsControllerArticleDuplicateActionTest extends CmsControllerWithPermissionTestCase { - protected - $_admin_bib, - $_concert; - - public function setUp() { - parent::setUp(); - - $this->_admin_bib = $this->fixture('Class_Users', - ['id' => 10, - 'login' => 'AdminBibConnected', - 'bib' => $this->fixture('Class_Bib', - ['id' => 2, - 'id_zone' => 4, - 'libelle' => 'Annecy']), - 'role' => 'admin_bib', - 'mail' => 'admin@afi-sa.fr', - 'password' => 'toto', - 'role_level' => ZendAfi_Acl_AdminControllerRoles::ADMIN_BIB]); - ZendAfi_Auth::getInstance()->logUser($this->_admin_bib); - $this->setupArticle(); - $this->dispatch('/admin/cms/newsduplicate/id/8080', true); - } - - - public function setupArticle() { - $this->fixture('Class_Article', - ['id' => 8080, - 'titre' => 'Concert', - 'categorie' => $this->fixture('Class_ArticleCategorie', - ['id' => 23, - 'libelle' => 'A la Une']), - 'auteur' => $this->_admin_bib, - 'description' => 'Venez nombreux ici: <img src="'.BASE_URL.'/images/bonlieu.jpg" />', - 'contenu' => 'à Bonlieu. <img src="'.BASE_URL.'/images/truffaz.jpg" />', - 'debut' => '2011-03-20', - 'fin' => '2011-03-28', - 'events_debut' => '2011-03-27', - 'events_fin' => '2011-03-28', - 'cacher_titre' => 1, - 'langue' => 'fr', - 'tags' => 'concert;jazz', - 'avis' => true]); - } - - - /** @test */ - function contenuDuplicateShouldContainsVenezNombreux() { - $this->assertXPathContentContains('//textarea','Venez nombreux ici'); - } - - - /** @test */ - function eventsFinDuplicateShouldContains20110328() { - $this->assertXPath('//input[@name="events_fin"][@value="28/03/2011 00:00"]'); - } - - - /** @test */ - public function formActionShouldBeAddIdCat23() { - $this->assertXPath('//form[contains(@action, "/admin/cms/add/id_cat/23")]'); - } - - - /** @test */ - public function titreShouldBeDupliquerLArticleConcert() { - $this->assertXPathContentContains('//h1', 'Dupliquer l\'article: Concert'); - } -} - - - - -class CmsControllerArticleConcertEditActionTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - $this->dispatch('/admin/cms/edit/id/4', true); - } - - - /** - * @group integration - * @test - */ - public function pageShouldBeHtml5Valid() { - $this->assertHTML5(); - } - - - /** @test */ - public function fermerShouldRedirectToCategoriesAnchor() { - $this->assertXPath("//div[contains(@onclick, '/admin/cms/index/id/4')]"); - } - - /** @test */ - function linkTraductionEnShouldBeFlagEn() { - $this->assertXPath('//a[contains(@href, "/admin/cms/edit/id/4/lang/en")]//img[contains(@src, "en.png")]',$this->_response->getBody()); - } - - - /** @test */ - function linkTraductionEnShouldNotHaveDataPopup() { - $this->assertXPath('//a[contains(@href, "/admin/cms/edit/id/4/lang/en")][not(@data-popup)]'); - } - - - /** @test */ - function linkTraductionFrShouldBeSelectedFlagFr() { - $this->assertXPath('//a[contains(@href, "/admin/cms/edit/id/4/lang/fr")]//img[contains(@class,"selected")][contains(@src, "fr.png")]'); - } - - - /** @test */ - function pageTitleShouldBeModifierUnArticle() { - $this->assertXPathContentContains('//h1', 'Modifier un article'); - } - - - /** @test */ - function titreShouldBeErikTruffazEnConcert() { - $this->assertInputValueEquals('titre', "Erik Truffaz en concert"); - } - - - /** @test */ - function titreShouldAccept200CharsAsDefinedInClassArticle() { - $this->assertXPath('//input[@name="titre"][@maxlength="255"]'); - } - - - /** @test */ - function eventDebutShouldBe27_03_2011() { - $this->assertInputValueEquals('events_debut', '27/03/2011 21:00'); - } - - - /** @test */ - function eventFinShouldBe28_03_2011() { - $this->assertInputValueEquals('events_fin', '28/03/2011 22:30'); - } - - - /** @test */ - function debutShouldBe20_03_2011() { - $this->assertInputValueEquals('debut', '20/03/2011'); - } - - - /** @test */ - function finShouldBe28_03_2011() { - $this->assertInputValueEquals('fin', '28/03/2011'); - } - - - /** @test */ - function formActionShouldContainsEditUrl() { - $this->assertXPath("//form[@id='form'][@method='post'][contains(@action, 'admin/cms/edit/id/4')]"); - } - - - /** @test */ - function cacherTitreShouldBeChecked() { - $this->assertCheckboxIsChecked('cacher_titre'); - } - - - /** @test */ - function contenuShouldContainsABonlieu() { - $this->assertTextAreaContains('contenu', 'à Bonlieu'); - } - - - /** @test */ - function contenuShouldContainsAndFixedImageURL() { - $this->assertTextAreaContains('contenu', 'http://localhost' . BASE_URL . '/images/truffaz.jpg'); - } - - - - /** @test */ - function descriptionShouldContainsVenezNombreux() { - $this->assertTextAreaContains('description', - 'Venez nombreux ici'); - } - - /** @test */ - function descriptionShouldContainsAndFixedImageURL() { - $this->assertTextAreaContains('description', - 'http://localhost' . BASE_URL . '/images/bonlieu.jpg'); - } - - - /** @test */ - function tagsShouldContainsConcertJazz() { - $this->assertTextAreaContains('tags', 'concert;jazz'); - } - - /** @test */ - function avisShouldBeChecked() { - $this->assertCheckboxIsChecked('avis'); - } - - - /** @test */ - function indexationShouldNotBeChecked() { - $this->assertCheckboxIsNotChecked('indexation'); - } - - - /** @test */ - function categorieSelectShouldHaveEvenementsSelected() { - $this->assertXPathContentContains('//select[@name="id_cat"]//option[@selected="selected"]', - 'Evènements'); - } - - - /** @test */ - function categorieSelectShouldContainsOptGroupAnnecy() { - $this->assertXPath('//select[@name="id_cat"]//optgroup[@label="Annecy"]'); - } - - - /** @test */ - function categorieSelectShouldNotContainsOptGroupPortail() { - $this->assertNotXPath('//select[@name="id_cat"]//optgroup[@label="Portail"]'); - } - - - /** @test */ - function categorieSelectShouldNotContainsOptGroupCranGevrier() { - $this->assertNotXPath('//select[@name="id_cat"]//optgroup[@label="Cran-Gevrier"]'); - } - - - /** @test */ - public function permalinkShouldContainsArticleAbsoluteUrl() { - $this->assertXPathContentContains('//div//span', "cms/articleview/id/4"); - } - - - /** @test */ - function previewShouldContainsArticleUrl() { - $this->assertXPath('//a[@data-prettyphoto="true"][contains(@href, "/cms/articleview/id/4")]'); - } - - - /** @test */ - function previewTitleShouldBeVisualisationDeLArticle() { - $this->assertXPath('//a[@data-prettyphoto="true"][contains(@title, "Visualisation de l\'article: Erik Truffaz en concert")]'); - } - - - /** @test */ - public function checkBoxShouldCheckedDomaineArtEtHistoire() { - $this->assertXPath("//input[@name='domaine_ids'][@value='11-12']"); - } - - /** @test */ - public function emailShouldNotBePresent() { - $this->assertNotXPath("//input[@name='destination_email']"); - } -} - - - - -class CmsControllerArticleConcertEditRenderPopupActionTest extends CmsControllerWithPermissionTestCase { - protected - $_json, - $_xpath; - - - public function setUp() { - parent::setUp(); - $this->dispatch('/admin/cms/edit/id/4/render/popup', true); - $this->_json = json_decode($this->_response->getBody()); - $this->_xpath = new Storm_Test_XPath(); - } - - - /** @test */ - public function prettyPhotoShouldBeLoaded() { - $this->_xpath->assertXPath($this->_json->content, '//script[contains(@src, "jquery.prettyPhoto")]'); - } - - - /** @test */ - public function linkToEditLangEnShouldHaveDataPopup() { - $this->_xpath->assertXPath($this->_json->content, '//a[contains(@href, "edit/id/4/lang/en")][@data-popup="true"]'); - } - - - /** @test */ - public function boutonRetourShouldCloseThePopup() { - $this->_xpath->assertXPath($this->_json->content, - '//div[@class="bouton"][contains(@onclick, "opacDialogClose")][not(contains(@onclick, "window.replace"))]//td[text()="Fermer"]'); - } - - - /** - * @test - * @pagetitles - */ - public function jsonTitleShouldBeModifierUnArticle() { - $this->assertEquals('Modifier un article: Erik Truffaz en concert', $this->_json->title); - } - - - /** @test */ - public function contentShouldContainsFormEditArticle() { - $this->assertContains('form id="form"', $this->_json->content); - } - - - /** @test */ - public function fullDayValueShouldNotBeChecked() { - $xpath = new Storm_Test_XPath(); - $xpath->assertXPath($this->_json->content, - '//input[@type="checkbox"][@name="all_day"][not(@checked)]', $this->_json->content); - } - - - /** @test */ - public function datePickerScriptShouldBeInSetTimeoutForAjaxLoading() { - $this->assertContains('setTimeout(function(){$.datepicker.setDefaults', $this->_json->content); - } - - /** @test */ - public function headerContentTypeShouldBeApplicationJSon() { - $this->assertHeader('Content-Type', 'application/json'); - } - - - /** @test */ - public function boutonValiderShouldSubmitFormUsingAjax() { - $this->_xpath->assertXPath($this->_json->content, - '//td//div[contains(@onclick, "initializeAjaxFormSubmit")]'); - } - - - /** @test */ - public function tagPreviewArticleShouldNotHaveRenderPopupInLink() { - $this->_xpath->assertXPath($this->_json->content, - '//a[contains(@href, "cms/articleview/id/4?iframe=true")]'); - } - - - /** @test */ - public function contentShouldNotContainsJQuery() { - $this->_xpath->assertNotXPath($this->_json->content, - '//script[contains(@src, "'.JQUERY.'")]'); - } - - - /** @test */ - public function contentShouldNotContainsJQueryUI() { - $this->_xpath->assertNotXPath($this->_json->content, - '//script[contains(@src, "'.JQUERYUI.'")]', - $this->_json->content); - } - -} - - - - -class CmsControllerArticleConcertEditArticleWithQuotesActionTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - $this->concert->setTitre('"Erik Truffaz" en concert'); - } - - - /** @test */ - function titleShouldBeEscaped() { - $this->dispatch('/admin/cms/edit/id/4'); - $this->assertContains('value=""Erik Truffaz" en concert"', $this->_response->getBody()); - } - - - /** @test */ - function traductionTitleShouldBeEscaped() { - $this->dispatch('/admin/cms/edit/id/4/lang/ro'); - $this->assertContains('value=""Erik Truffaz" en concert"', $this->_response->getBody()); - } -} - - - - -class CmsControllerArticleConcertEditActionPostTest extends CmsControllerWithPermissionTestCase { - protected $_tomorrow, $_storm_default_to_volatile = true; - - public function setUp() { - parent::setUp(); - - $_SERVER['SCRIPT_NAME'] = '/tom'; - - $filesystem = new Storm_FileSystem_Volatile(); - $thumbnail_paths = PATH_TEMP .'vignettes_titre/'; - $filesystem - ->mkdir($thumbnail_paths) - ->cd($thumbnail_paths); - - Class_Article::setFileWriter($this->mock() - ->whenCalled('fileExists') - ->with('/tom/images/bonlieu.jpg') - ->answers(false) - - ->whenCalled('fileExists') - ->with('./images/bonlieu.jpg') - ->answers(true) - - ->beStrict()); - - Class_WebService_Vignette::setFileSystem($filesystem); - - $image = $this->mock() - ->whenCalled('thumbnailImage') - ->with(160, 220, true, true) - ->answers(null) - - ->whenCalled('writeImage') - ->with(PATH_TEMP . 'vignettes_titre/ERIKTRUFFAZLADYLANDQUARTETENCONCERT-4-TOM----8.jpg') - ->answers(null) - - ->beStrict(); - - $image_factory = $this->mock() - ->whenCalled('newImage') - ->with('./images/bonlieu.jpg') - ->answers($image); - Class_Notice_Thumbnail_ProviderAbstract::setDefaultImageFactory($image_factory); - - - $this->_tomorrow = new DateTime('tomorrow'); - - $this->fixture('Class_Notice', - ['id' => 123910, - 'alpha_titre' => 'LANGUE NON SPECIFIEE', - 'type_doc' => Class_TypeDoc::ARTICLE]); - - $this->fixture('Class_Article', - ['id' => 4, - 'id_notice' => 123910, - 'auteur' => null, - 'id_lieu' => 3, - 'domaine_ids' => ['11', '12'], - 'id_cat' => 23, - 'langue' => null, - 'titre' => 'Langue non spécifiée', - 'description' => '', - 'contenu' => ' ', - 'date_creation' => '2010-12-25']); - - - $this->fixture('Class_NoticeDomain', - ['id' => 1, - 'domain_id' => 10, - 'panier_id' => 0, - 'record_alpha_key' => 'ERIKTRUFFAZLADYLANDQUARTETENCONCERT-4-TOM----8']); - - - $post_datas= ['titre' => 'Erik Truffaz - Ladyland quartet en concert', - 'auteur' => $this->fixture('Class_Users', - ['id' => 1, - 'login' => 'tom', - 'password' => 'pwd']), - 'indexation' => 1, - 'id_cat' => 34, - 'debut' => '01/03/2011', - 'fin' => $this->_tomorrow->format('d-m-Y'), - 'events_debut' => '02/03/2011 08:35', - 'events_fin' => '05/03/2011 10:42', - 'contenu' => 'Ici: <img src="../../images/bonlieu.jpg" />', - 'description' => 'Affiche: <img src="' . Class_Url::siteUrl() . '/images/concert.jpg" />', - 'id_lieu' => 3, - 'domaine_ids' => ['10'], - 'id_items' => ['1']]; - - $this->postDispatch('/admin/cms/edit/id/4',$post_datas); - } - - - public function tearDown() { - Class_WebService_Vignette::setFileSystem(null); - Class_Notice_Thumbnail_ProviderAbstract::setDefaultImageFactory(null); - parent::tearDown(); - } - - - /** @test */ - public function erikTruffazShouldBeIndexed() { - $this->assertNotNull(Class_Notice::findFirstBy(['alpha_titre' =>'ERIK TRUFFAZ LADYLAND QUARTET EN CONCERT'])); - } - - - /** @test */ - public function clefAlphaShouldBeAsExpected() { - $this->assertEquals('ERIKTRUFFAZLADYLANDQUARTETENCONCERT-4-TOM----8', - Class_Article::find(4)->getAlphaKey()); - } - - - /** @test */ - public function erikTruffazShouldBeLinkedToExpectedDomain() { - $this->assertEquals(10, Class_NoticeDomain::findFirstBy(['record_alpha_key' => 'ERIKTRUFFAZLADYLANDQUARTETENCONCERT-4-TOM----8'])->getDomainId()); - } - - - /** @test */ - public function erikTruffazShouldBeLinkedToExpectedDomainByFacet() { - $this->assertContains('Q10', Class_Notice::findFirstBy(['alpha_titre' =>'ERIK TRUFFAZ LADYLAND QUARTET EN CONCERT'])->getFacettes()); - } - - - /** @test */ - public function articleShouldNotHaveIdItems() { - $this->assertTrue(Class_Article::find(4)->isAttributeEmpty('id_items')); - } - - - - /** @test */ - function titreShouldBeUpdatedToErikTruffazLadyland() { - $this->assertEquals('Erik Truffaz - Ladyland quartet en concert', - Class_Article::find(4)->getTitre()); - } - - - /** @test */ - function dateDebutShouldBe2011_03_01() { - $this->assertContains('2011-03-01', Class_Article::find(4)->getDebut()); - } - - - /** @test */ - function dateFinShouldBe2011_03_26() { - $this->assertContains($this->_tomorrow->format('Y-m-d'), Class_Article::find(4)->getFin()); - } - - - /** @test */ - function eventDebutShouldBe2011_03_02_at_08_35() { - $this->assertContains('2011-03-02 08:35', Class_Article::find(4)->getEventsDebut()); - } - - - /** @test */ - function eventFinShouldBe2011_03_05_at_10_42() { - $this->assertContains('2011-03-05 10:42', Class_Article::find(4)->getEventsFin()); - } - - - /** @test */ - function dateMAJShouldBeToday() { - $today = new Zend_Date(); - $this->assertContains($today->toString('yyyy-MM-dd'), - Class_Article::find(4)->getDateMaj()); - } - - - /** @test */ - function dateCreationShouldBe2010_12_25() { - $this->assertContains('2010-12-25', - Class_Article::find(4)->getDateCreation()); - } - - - /** @test */ - function contenuShouldHaveFixedImageURL() { - $this->assertEquals('Ici: <img src="' . Class_Url::baseUrl() . '/images/bonlieu.jpg" />', - Class_Article::find(4)->getContenu()); - } - - - /** @test */ - function descriptionShouldHaveRelativeImageURL() { - $this->assertEquals('Affiche: <img src="' . Class_Url::baseUrl() . '/images/concert.jpg" />', - Class_Article::find(4)->getDescription()); - } - - - /** @test */ - function derniereModificationShouldBeNow() { - $this->assertContains( date('Y-m-d'), - Class_Article::find(4)->getDateMaj()); - } - - - /** @test */ - public function articleAuteurShouldBeTom() { - $this->assertEquals(Class_Article::find(4)->getNomCompletAuteur(), 'tom'); - } - - - /** @test */ - function categorieShouldBeEvenements() { - $this->assertEquals($this->cat_evenements, Class_Article::find(4)->getCategorie()); - } - - - /** @test */ - public function lieuShouldBeBonlieu() { - $this->assertEquals($this->lieu_bonlieu, Class_Article::find(4)->getLieu()); - } - - - /** @test */ - public function domainesShouldBeOnlyHistoire() { - $this->assertEquals(['10'], Class_Article::find(4)->getDomaineIdsAsArray()); - } - - - /** @test */ - public function flashMessengerShouldNotContainsPopup() { - $this->assertNotFlashMessengerPopup(); - } - - - /** @test */ - public function articleRecordThumbnailShouldBeSet() { - $this->assertContains('temp/vignettes_titre/ERIKTRUFFAZLADYLANDQUARTETENCONCERT-4-TOM----8.jpg', Class_Article::find(4)->getNotice()->getUrlVignette()); - } -} - - - -class CmsControllerArticleConcertEditActionPostRenderPopupTest extends CmsControllerWithPermissionTestCase { - protected - $_data, - $_xpath, - $_json; - - public function setUp() { - parent::setUp(); - - $this->_data = ['titre' => 'Erik Truffaz - Ladyland quartet en concert', - 'auteur' => Class_Users::newInstanceWithId(1, ['login' => 'tom']), - 'id_cat' => 34, - 'contenu' => 'Ici: <img src="../../images/bonlieu.jpg" />', - 'description' => '', - 'debut' => '', - 'fin' => '', - 'events_debut' => '', - 'events_fin' => '', - 'id_items' => ['1']]; - - $_SERVER['HTTP_REFERER'] = 'opac/index'; - $this->postDispatch('/admin/cms/edit/id/4/render/popup', $this->_data); - $this->_json = json_decode($this->_response->getBody()); - $this->_xpath = new Storm_Test_XPath(); - } - - - /** @test */ - public function responseShouldBeARedirectWithJavascript() { - $this->_xpath->assertXPathContentContains($this->_json->content, - '//script', - 'window.location="opac/index"'); - } - - - /** @test */ - public function responseShouldContainsVeuillezPatienter() { - $this->_xpath->assertXPathContentContains($this->_json->content, - '//p', - 'Veuillez patienter'); - } - - - /** @test */ - public function flashMessengerShouldNotContainsPopup() { - $this->assertNotFlashMessengerPopup(); - } -} - - - - - -class CmsControllerArticleConcertEditActionPostWithWrongDataRenderPopupTest extends CmsControllerWithPermissionTestCase { - protected - $_data, - $_json, - $_xpath; - - public function setUp() { - parent::setUp(); - - $this->_data = ['titre' => '', - 'id_cat' => 34, - 'contenu' => 'Ici: <img src="../../images/bonlieu.jpg" />', - 'debut' => '', - 'fin' => '', - 'events_debut' => '', - 'events_fin' => '', - 'description' => '', - 'id_items' => ['1']]; - - $_SERVER['HTTP_REFERER'] = 'opac/cms/viewarticle/id/4'; - $this->postDispatch('/admin/cms/edit/id/4/render/popup', $this->_data); - - $this->_json = json_decode($this->_response->getBody()); - $this->_xpath = new Storm_Test_XPath(); - } - - - /** @test */ - public function responseShouldNotBeARedirect() { - $this->assertNotRedirect(); - } - - - /** - * @test - * @pagetitles - */ - public function responseTitleShouldBeModifierUnArticle() { - $this->assertEquals('Modifier un article: Erik Truffaz en concert', $this->_json->title); - } - - - /** @test */ - public function boutonValiderShouldSubmitFormUsingAjax() { - $this->_xpath->assertXPath($this->_json->content, - '//td//div[contains(@onclick, "initializeAjaxFormSubmit")]', - $this->_json->content); - } - - - /** @test */ - function errorShouldContainsVousDevezCompleterLeChampTitre() { - $this->_xpath->assertXPathContentContains($this->_json->content, - '//ul[@class="errors"]', - "le champ 'Titre'"); - } - - - public function flashMessengerShouldContainsPopupWithCmsEditUrl() { - $this->assertFlashMessengerContainsPopup('http://localhost'.BASE_URL.'/admin/cms/edit/id/4/render/popup'); - } -} - - - - -class CmsControllerArticleConcertEditActionPostWithErrorTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - - $this->postDispatch('/admin/cms/edit/id/4', - ['titre' => '', - 'debut' => '01/04/2011', - 'fin' => '26/03/2011', - 'events_debut' => '', - 'events_fin' => '01/04/2011', - 'description' => '', - 'contenu' => '', - 'id_cat' => 23]); - } - - - /** @test */ - public function actionShouldBeEdit() { - $this->assertAction('edit'); - } - - - /** @test */ - public function shouldNotRedirect() { - $this->assertNotRedirect(); - } - - - /** @test */ - public function currentTitleShouldBeDifferentFromDatabaseOne() { - $this->assertTrue(Class_Article::find(4)->hasChangedAttribute('titre')); - } - - - /** @test */ - public function errorShouldContainsDateDebutError() { - $this->assertXPathContentContains('//ul[@class="errors"]', - "La date de début de publication doit être plus récente que la date de fin", - $this->_response->getBody()); - } - - - /** @test */ - public function errorShouldContainsVousDevezCompleterLeChampTitre() { - $this->assertXPathContentContains('//ul[@class="errors"]', "Vous devez compléter le champ 'Titre'"); - } -} - - - - -class CmsControllerArticleAddActionPostTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - - $data = ['titre' => 'Marcus Miller en <br/>concert !', - 'debut' => '', - 'fin' => '', - 'events_debut' => '', - 'auteur' => $this->fixture('Class_Users', - ['id' => 1, - 'login' => 'tom', - 'mail' => 'tom@afi-sa.fr', - 'password' => 'pwd']), - - 'events_fin' => '', - 'description' => '', - 'id_cat' => 23, - 'contenu' => 'Youpi!!', - 'domaine_ids' => ['11','12']]; - $this->mock_transport = new MockMailTransport(); - Zend_Mail::setDefaultTransport($this->mock_transport); - Class_Profil::getCurrentProfil()->setMailSite('laurent@afi-sa.fr'); - Class_AdminVar::newInstanceWithId('WORKFLOW')->setValeur('0'); - $this->postDispatch('/admin/cms/add/id_cat/23', $data); - $this->new_article = Class_Article::findFirstBy(['order' => 'id desc']); - } - - - - - /** @test */ - public function MailShouldNotBeSendToUserIfWorkflowIsNotActive() { - $this->assertEquals([],$this->mock_transport->getSentMails()); - } - - /** @test */ - function contenuShouldEqualsYoupii() { - $this->assertEquals('Youpi!!', $this->new_article->getContenu()); - } - - - /** @test */ - function redirectToEditNewArticle() { - $this->assertRedirectTo('/admin/cms/edit/id/5/id_cat/23', $this->getResponseLocation()); - } - - - /** @test */ - function dateMAJShouldBeToday() { - $today = new Zend_Date(); - $this->assertContains($today->toString('yyyy-MM-dd'), - $this->new_article->getDateMaj()); - } - - - /** @test */ - function dateCreationShouldBeToday() { - $today = new Zend_Date(); - $this->assertContains($today->toString('yyyy-MM-dd'), - $this->new_article->getDateCreation()); - } - - - /** @test */ - function categorieShouldBeALaUne() { - $this->assertEquals('A la Une', $this->new_article->getCategorie()->getLibelle()); - } - - - /** @test */ - public function domainesShouldBeArtAndMusique() { - $this->assertEquals(['11','12'],$this->new_article->getDomaineIdsAsArray()); - } - - - /** @test */ - public function titreShouldBeMarcusMillerEnConcert() { - $this->assertEquals('Marcus Miller en concert !', $this->new_article->getTitre()); - } -} - - - -class CmsControllerNewsAddToCatALaUneActionTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - $this->dispatch('admin/cms/add/id_cat/23',true); - } - - /** @test */ - public function formActionShouldContainsAddUrl() { - $this->assertXPath("//form[@id='form'][@method='post'][contains(@action, 'admin/cms/add/id_cat/23')]"); - } - - /** @test */ - public function pageTitleShouldBeAjouterUnArticle() { - $this->assertXPathContentContains('//h1', 'Ajouter un article'); - } - - /** @test */ - public function titreCacheOptionShouldBePresent() { - $this->assertXPathContentContains('//form[@id="form"]//tr[2]//td[1]', - 'Titre caché'); - $this->assertXPath('//form[@id="form"]//tr[2]//td[2]//input[@name="cacher_titre"]'); - - } - - /** @test */ - public function cacherTitreShouldNotBeChecked() { - $this->assertCheckboxIsNotChecked('cacher_titre'); - } - - /** @test */ - public function finShouldBeEmpty() { - $this->assertInputValueEquals('fin', ''); - } - - /** @test */ - public function avisShouldNotBeChecked() { - $this->assertCheckboxIsNotChecked('avis'); - } - - /** @test */ - public function indexationShouldBeChecked() { - $this->assertCheckboxIsChecked('indexation'); - } - - /** @test */ - public function categorieSelectShouldHaveALaUneSelected() { - $this->assertXPathContentContains('//select[@name="id_cat"]//option[@selected="selected"]', - 'A la Une'); - } - - /** @test */ - public function selectIdLieuShouldContainsBonlieu() { - $this->assertXPath('//select[@name="id_lieu"]//option[not(@selected)][@label="Bonlieu"][@value="3"]'); - } - - - /** @test */ - public function checkBoxShouldCheckedDomaineALaUne() { - $this->assertXPath("//input[@name='domaine_ids'][@value='66']"); - } -} - - - - -class CmsControllerNewsAddActionWithoutWorkflowTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - Class_AdminVar::newInstanceWithId('WORKFLOW')->setValeur(''); - $this->dispatch('admin/cms/add/id_cat/23'); - } - - /** @test */ - public function workflowInputsShouldNotAppear() { - $this->assertNotXpath('//input[@name="status"]'); - } - - /** @test */ - public function auteurShouldBeDisplayByDefault() { - $this->assertXPathContentContains('//td','Mario Super',$this->_response->getBody()); - } -} - - - - -class CmsControllerArticleVisibilityTest extends CmsControllerWithPermissionTestCase { - /** @test */ - function makeVisibleShouldRedirectToCategorieEvenements() { - $this->dispatch('admin/cms/makevisible/id/4'); - $this->assertRedirectTo('/admin/cms/index/id/4'); - $this->assertTrue($this->concert->isVisible()); - } - - - /** @test */ - function makeInvisibleShouldRedirectToCategorieEvenements() { - $this->dispatch('admin/cms/makeinvisible/id/4'); - $this->assertRedirectTo('/admin/cms/index/id/4'); - $this->assertFalse($this->concert->isVisible()); - } -} - - - - -class CmsControllerNewsAddActionPostWithoutWorkflowTest extends CmsControllerWithPermissionTestCase { - /** @var Class_Article */ - protected $_article; - - public function setUp() { - parent::setUp(); - - $this->fixture('Class_AdminVar', ['id' => 'WORKFLOW', 'valeur' => 0]); - - $this->postDispatch('/admin/cms/add/id_cat/23', - ['titre' => 'Katsuhiro Otomo en dédicace !', - 'debut' => '', - 'fin' => '', - 'events_debut' => '', - 'events_fin' => '', - 'description' => '', - 'id_cat' => 23, - 'contenu' => 'Ne manquez pas cet évènement.', - 'status' => Class_Article::STATUS_DRAFT, - ]); - } - - /** @test */ - public function statusShouldNotBeUpdatable() { - $this->assertEquals(3, Class_Article::find(5)->getStatus()); - } -} - - - -abstract class CmsControllerWorkflowTestCase extends CmsControllerWithPermissionTestCase { - protected - $mock_transport; - - public function setUp() { - parent::setUp(); - $this->mock_transport = new MockMailTransport(); - Zend_Mail::setDefaultTransport($this->mock_transport); - Class_Profil::getCurrentProfil()->setMailSite('laurent@afi-sa.fr'); - - $this->fixture('Class_AdminVar', ['id' => 'WORKFLOW', 'valeur' => '1']); - $this->fixture('Class_AdminVar', - ['id' => 'WORKFLOW_TEXT_MAIL_ARTICLE_VALIDATED', - 'valeur' => 'L\'article TITRE_ARTICLE a été validé par SAVED_BY_ARTICLE. URL_ARTICLE']); - $this->fixture('Class_AdminVar', - ['id' => 'WORKFLOW_TEXT_MAIL_ARTICLE_PENDING', - 'valeur' => 'Un nouvel article de AUTHOR_ARTICLE est à valider. TITRE_ARTICLE URL_ARTICLE']); - $this->fixture('Class_AdminVar', - ['id' => 'WORKFLOW_TEXT_MAIL_ARTICLE_REFUSED', - 'valeur' => 'L\'article a été refusé.']); - } -} - - - - -abstract class CmsControllerWorkflowPermissionsTestCase extends CmsControllerWorkflowTestCase { - public function setUp() { - parent::setUp(); - $this->fixture('Class_AdminVar', - ['id' => 'WORKFLOW', - 'valeur' => '[{"id":"12", "label":"À valider urgemment"}]']); - - $this->fixture('Class_Article', - ['id' => 18, - 'id_user' => '', - 'titre' => 'News', - 'contenu' => 'September News', - 'description' => '', - 'status' => '1', - 'categorie' => Class_ArticleCategorie::find(34)]); - } -} - - - - -class CmsControllerWorkflowWithoutPermissionsTest extends CmsControllerWorkflowPermissionsTestCase { - public function setUp() { - parent::setUp(); - Class_Users::getIdentity() - ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL) - ->addUserGroup($this->fixture('Class_UserGroup', - ['id' => 46, - 'libelle' => 'Modérateurs', - 'group_type' => Class_UserGroup::TYPE_MANUAL, - 'users' => [], - 'rights' => [], - 'role_level' => ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL, - 'permissions' => []])); - - - $this->dispatch('/admin/cms/edit/id/18', true); - } - - - /** @test */ - public function dynamicStatusShouldBeDisabled() { - $this->assertXPath('//input[@name="status"][@value="12"][@disabled="disabled"]'); - } -} - - - -class CmsControllerWorkflowWithPermissionsTest extends CmsControllerWorkflowPermissionsTestCase { - public function setUp() { - parent::setUp(); - Class_Users::getIdentity() - ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL) - ->addUserGroup($this->fixture('Class_UserGroup', - ['id' => 46, - 'libelle' => 'Modérateurs', - 'group_type' => Class_UserGroup::TYPE_MANUAL, - 'users' => [], - 'rights' => [], - 'role_level' => ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL])); - - Class_Permission::findDynamicWorkflow(12) - ->permitTo(Class_UserGroup::find(46), Class_ArticleCategorie::find(34)); - - $this->dispatch('/admin/cms/edit/id/18', true); - } - - - /** @test */ - public function dynamicStatusShouldBeEnabled() { - $this->assertNotXPath('//input[@name="status"][@value="12"][@disabled="disabled"]'); - $this->assertXPath('//input[@name="status"][@value="12"]'); - } -} - - - -class CmsControllerNewsAddActionPostWithWorkflowTest - extends CmsControllerWorkflowTestCase { - - protected - $_basePostDatas = ['titre' => 'Katsuhiro Otomo en dédicace !', - 'debut' => '', - 'fin' => '', - 'events_debut' => '', - 'events_fin' => '', - 'description' => '', - 'id_cat' => 23, - 'contenu' => 'Ne manquez pas cet évènement.']; - - public function setUp() { - parent::setUp(); - - $this->fixture('Class_Article', - ['id' => 18, - 'id_user' => '', - 'titre' => 'News', - 'contenu' => 'September News', - 'description' => '', - 'status' =>'', - 'auteur' => $this->fixture('Class_Users', - ['id' => 1, - 'login' => 'l', - 'password' => 'l', - 'nom' => 'Batman', - 'mail' => 'batman@afi-sa.fr']), - 'categorie' => Class_ArticleCategorie::find(34)]); - } - - - protected function postArticleValidated() { - $data = $this->_basePostDatas; - $data['status'] = Class_Article::STATUS_VALIDATED; - $this->postDispatch('/admin/cms/edit/id/18', $data); - } - - /** @test */ - public function statusShouldBeUpdated() { - $this->postArticleValidated(); - $this->assertEquals(Class_Article::STATUS_VALIDATED, - Class_Article::findFirstBy(['order' => 'id desc'])->getStatus()); - } - - - /** @test */ - public function validatedNewsShouldSendMailToAuthor() { - $this->postArticleValidated(); - $this->assertEquals('batman@afi-sa.fr', - $this->mock_transport->getSentMails()[0]->getRecipients()[0]); - } - - - /** @test */ - public function sentMailToAuthorWhenNewsIsValidatedShouldContainsDefaultBody() { - $this->postArticleValidated(); - $this->assertEquals('L\'article Katsuhiro Otomo en dédicace ! a été validé par Mario Super. http://localhost'.BASE_URL.'/cms/articleview/id/18',quoted_printable_decode($this->mock_transport->getSentMails()[0]->getBodyText()->getContent())); - } - - - /** @test */ - public function sentMailToAuthorWhenNewsIsValidatedShouldContainsDefaultSubject() { - $this->postArticleValidated(); - $this->assertEquals('[Bokeh] Validation de l\'article Katsuhiro Otomo en dédicace !',quoted_printable_decode($this->mock_transport->getSentMails()[0]->getSubject())); - } - - - /** @test */ - public function statusAValiderUpdatedToSameStatusShouldNotSendMail() { - Class_Article::find(18)->setStatus(Class_Article::STATUS_VALIDATION_PENDING)->save(); - $data = $this->_basePostDatas; - $data['status'] = Class_Article::STATUS_VALIDATION_PENDING; - - $this->postDispatch('admin/cms/edit/id/18', $data); - $this->assertEquals([],$this->mock_transport->getSentMails()); - } - - - /** @test */ - public function newArticleSavedWithStatusAValiderShouldSendMail() { - $data = $this->_basePostDatas; - $data['status'] = Class_Article::STATUS_VALIDATION_PENDING; - - $this->postDispatch('/admin/cms/add/id_cat/23', - $data); - $this->assertEquals(['laurent@afi-sa.fr', 'bernard@afi-sa.fr'],$this->mock_transport->getSentMails()[0]->getRecipients()); - } - - - /** @test */ - public function newArticleSavedWithStatusAValiderShouldSendDeduplicatedMails() { - $data = $this->_basePostDatas; - $data['status'] = Class_Article::STATUS_VALIDATION_PENDING; - - $this->_group_testing->addUser($this->_laurent)->save(); - Class_Permission::validateArticle()->permitTo($this->_group_testing, - $this->_cat_a_la_une); - $this->postDispatch('/admin/cms/add/id_cat/23', - $data); - $this->assertEquals(['<laurent@afi-sa.fr>', '<bernard@afi-sa.fr>', '<admin@afi-sa.fr>', 'append' => true], - $this->mock_transport->getSentMails()[0]->getHeaders()['To']); - } - - - - /** @test */ - public function withoutValidationRightsNewArticleSavedWithStatusAValiderShouldNotSendMail() { - $data = $this->_basePostDatas; - $data['status'] = Class_Article::STATUS_VALIDATION_PENDING; - - Class_Permission::validateArticle()->denyTo($this->_group_admin, - $this->_cat_a_la_une); - - Class_Permission::validateArticle()->permitTo($this->_group_admin, - $this->_cat_atelier); - $this->postDispatch('/admin/cms/add/id_cat/23', - $data); - $this->assertEmpty($this->mock_transport->getSentMails()); - } - - - /** @test */ - public function statusBrouillonUpdatedToAValiderShouldSendMail() { - Class_Article::find(18)->setStatus(Class_Article::STATUS_DRAFT)->save(); - $data = $this->_basePostDatas; - $data['status'] = Class_Article::STATUS_VALIDATION_PENDING; - $this->postDispatch('/admin/cms/edit/id/18', $data); - $this->assertEquals(['laurent@afi-sa.fr', 'bernard@afi-sa.fr'],$this->mock_transport->getSentMails()[0]->getRecipients()); - } - - - /** @test */ - public function statusDraftToValidationPendingShouldSendByNoReplayAtAfiSaDotFr() { - Class_Article::find(18)->setStatus(Class_Article::STATUS_DRAFT)->save(); - $data = $this->_basePostDatas; - $data['status'] = Class_Article::STATUS_VALIDATION_PENDING; - $this->postDispatch('/admin/cms/edit/id/18', $data); - $this->assertEquals('no-reply@afi-sa.fr' ,$this->mock_transport->getSentMails()[0]->getFrom()); - } - - - - public function postArticleAValider() { - Class_Article::find(18)->setStatus(Class_Article::STATUS_DRAFT)->save(); - $data = $this->_basePostDatas; - $data['status'] = Class_Article::STATUS_VALIDATION_PENDING; - $this->postDispatch('/admin/cms/edit/id/18', $data); - } - - - /** @test */ - public function sentMailToAdminWhenValidationPendingShouldContainsDefaultText() { - $this->postArticleAValider(); - $this->assertEquals('Un nouvel article de Batman est à valider. Katsuhiro Otomo en dédicace ! http://localhost'.BASE_URL.'/cms/articleview/id/18',quoted_printable_decode($this->mock_transport->getSentMails()[0]->getBodyText()->getContent())); - } - - - /** @test */ - public function sentMailToAdminWhenValidationPendingShouldContainsDefaultTitle() { - $this->postArticleAValider(); - $this->assertEquals('[Bokeh] Validation d\'article en attente: Katsuhiro Otomo en dédicace !',quoted_printable_decode($this->mock_transport->getSentMails()[0]->getSubject())); - } - - - /** @test */ - public function domainesShouldBeUpdated() { - $data = $this->_basePostDatas; - $data['domaine_ids'] = '11;12'; - - $this->postDispatch('/admin/cms/add/id/23', $data); - $this->assertEquals('11;12', - Class_Article::findFirstBy(['order' => 'id desc'])->getDomaineIds()); - } - - - /** @test */ - public function withUnknownStatusShouldNotBeUpdated() { - $data = $this->_basePostDatas; - $data['status'] = 999999999; - $this->postDispatch('/admin/cms/add/id_cat/23', $data); - $this->assertEquals(Class_Article::STATUS_DRAFT, - Class_Article::findFirstBy(['order' => 'id desc'])->getStatus()); - } -} - - - - -class CmsControllerNewsAddActionPostWithDynamicWorkflowTest extends CmsControllerWorkflowTestCase { - public function setUp() { - parent::setUp(); - $this->fixture('Class_AdminVar', - ['id' => 'WORKFLOW', - 'valeur' => '[{"id":"12", "label":"A lire"}]']); - - - $this->fixture('Class_AdminVar', - ['id' => 'WORKFLOW_TEXT_MAIL_ARTICLE_PENDING', - 'valeur' => 'Un nouvel article de AUTHOR_ARTICLE est passé dans l\'état "STATUS_ARTICLE" et vous devez vérifier pour l\'état "NEXT_STATUS_ARTICLE". TITRE_ARTICLE URL_ARTICLE']); - } - - - protected function _postDataTo($datas, $url) { - $datas = array_merge(['titre' => 'Katsuhiro Otomo en dédicace !', - 'debut' => '', - 'fin' => '', - 'events_debut' => '', - 'events_fin' => '', - 'description' => '', - 'id_cat' => $this->_cat_a_la_une->getId(), - 'contenu' => 'Ne manquez pas cet évènement.'], - $datas); - - $this->postDispatch($url, $datas); - } - - - /** @test */ - public function newArticleSavedWithDynamicStatusALireShouldSendMailToAdmin() { - $this->_postDataTo(['status' => 12], '/admin/cms/add/id_cat/23'); - - $this->assertEquals(['laurent@afi-sa.fr', 'bernard@afi-sa.fr'], - $this->mock_transport->getSentMails()[0]->getRecipients()); - } - - - /** @test */ - public function newArticleSavedWithStatusPendingShouldNotSendMail() { - $this->_postDataTo(['status' => Class_Article::STATUS_VALIDATION_PENDING], - '/admin/cms/add/id_cat/23'); - - $this->assertEmpty($this->mock_transport->getSentMails()); - } - - - /** @test */ - public function newArticleSavedWithStatusPendingShouldSendMailToGroupTestingWithRights() { - Class_Permission::findDynamicWorkflow(12) - ->permitTo($this->_group_testing, $this->_cat_a_la_une); - - $this->_postDataTo(['status' => Class_Article::STATUS_VALIDATION_PENDING], - '/admin/cms/add/id_cat/23'); - - $this->assertEquals(['admin@afi-sa.fr'], - $this->mock_transport->getSentMails()[0]->getRecipients()); - - return quoted_printable_decode($this->mock_transport->getSentMails()[0]->getBodyText()->getContent()); - } - - - /** - * @depends newArticleSavedWithStatusPendingShouldSendMailToGroupTestingWithRights - * @test - */ - public function sentMailShouldContainsStatuses($content) { - $this->assertEquals('Un nouvel article de Mario Super est passé dans l\'état "À valider" et vous devez vérifier pour l\'état "A lire". Katsuhiro Otomo en dédicace ! http://localhost'.BASE_URL.'/cms/articleview/id/5', - $content); - } - -} - - - - -class CmsControllerWorkflowArticleRefusedTest extends CmsControllerWorkflowTestCase { - public function setUp() { - parent::setUp(); - $this->concert - ->setStatus(Class_Article::STATUS_DRAFT) - ->setAuteur(Class_Users::newInstanceWithId(1,['mail'=>'bernard@afi-sa.fr'])); - } - - - public function postArticleRefuser() { - $datas = [ - 'titre' => 'Katsuhiro Otomo en dédicace !', - 'debut' => '', - 'fin' => '', - 'events_debut' => '', - 'events_fin' => '', - 'description' => '', - 'id_cat' => 23, - 'contenu' => 'Ne manquez pas cet évènement.', - 'status' => Class_Article::STATUS_REFUSED - ]; - - $this->postDispatch('/admin/cms/edit/id/4', - $datas); - } - - - /** @test */ - public function refusedMailFromShouldBeNoReplyAtAfiSaDotFr() { - $this->concert->getAuteur()->setMail('tom@acme.com'); - $this->postArticleRefuser(); - $this->assertEquals('no-reply@afi-sa.fr', - $this->mock_transport->getSentMails()[0]->getFrom()); - } - - - /** @test */ - public function statusBrouillonUpdatedToRefuserShouldSendMail() { - $this->concert->getAuteur()->setMail('tom@acme.com'); - $this->postArticleRefuser(); - $this->assertEquals(['tom@acme.com'], - $this->mock_transport->getSentMails()[0]->getRecipients()); - } - - /** @test */ - public function statusBrouillonUpdatedToRefuserAndAuteurNotSetShouldNotifyMessagePasDAuteur() { - $this->concert->setAuteur(null); - $this->postArticleRefuser(); - $this->assertFlashMessengerContentContains('Mail non envoyé: article sans auteur'); - } - - - /** @test */ - public function statusBrouillonUpdatedToRefuserAndAuteurWithOutMailShouldNotifyMessagePasDeMail() { - $this->concert->getAuteur()->setMail('')->setLogin('Russe'); - $this->postArticleRefuser(); - $this->assertFlashMessengerContentContains('Mail non envoyé: Russe sans mail.'); - } - - - /** @test */ - public function sentMailToUserWhenRefusedShouldContainsDefaultTitle() { - $this->postArticleRefuser(); - $this->assertEquals('[Bokeh] Refus de l\'article Katsuhiro Otomo en dédicace !',quoted_printable_decode($this->mock_transport->getSentMails()[0]->getSubject())); - } - - - /** @test */ - public function sentMailToUserWhenRefusedShouldContainsDefaultBody() { - $this->postArticleRefuser(); - $this->assertEquals('L\'article a été refusé.',quoted_printable_decode($this->mock_transport->getSentMails()[0]->getBodyText()->getContent())); - } - - -} - - - -abstract class CmsControllerNewsAddActionPostWithWorkflowTestCase - extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - $this->fixture('Class_AdminVar', - ['id' => 'WORKFLOW', - 'valeur' => '[{"id":10, "label":"A valider service COM"}]']); - Class_Users::getIdentity()->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::MODO_BIB); - } -} - - - - -class CmsControllerNewsAddActionPostWithCustomStatusesWorkflowTest - extends CmsControllerNewsAddActionPostWithWorkflowTestCase { - public function setUp() { - parent::setUp(); - $this->postDispatch('admin/cms/add/id_cat/23', - ['titre' => 'Nothing else matters', - 'contenu' => 'So close, no matter how faaaaaaar.', - 'status' => 10, - 'debut' => '', - 'fin' => '', - 'events_debut' => '', - 'events_fin' => '']); - } - - - /** @test */ - public function statusShouldBe10() { - $this->assertEquals(10, - Class_Article::findFirstBy(['order' => 'id desc'])->getStatus()); - } -} - - - -class CmsControllerNewsAddActionWithCustomStatusesWorkflowTest - extends CmsControllerNewsAddActionPostWithWorkflowTestCase { - public function setUp() { - parent::setUp(); - $this->dispatch('admin/cms/add/id_cat/23', true); - } - - - /** @test */ - public function workflowInputsShouldAppear() { - $this->assertXpathCount('//input[@name="status"]', 6); - } - - - /** @test */ - public function customStatusShouldBeAtThirdPosition() { - $this->assertXPath('//td/label[3]//input[@name="status"][@value="10"]', - $this->_response->getBody()); - } - - - /** @test */ - public function withUserRedacteurBibStatusValideShouldBeDisabled() { - $this->assertXpath('//input[@name="status"][@value="3"][@disabled="disabled"]'); - } - - - /** @test */ - public function withUserAdminStatusValideShouldNotBeDisabled() { - Class_Users::getIdentity()->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::ADMIN_BIB); - $this->bootstrap(); - $this->dispatch('admin/cms/add/id_cat/23'); - $this->assertNotXpath('//input[@name="status"][@value="3"][@disabled="disabled"]'); - } -} - - - -class CmsControllerNewsAddActionWithSimpleWorkflowTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - Class_AdminVar::newInstanceWithId('WORKFLOW') - ->setValeur('1'); - Class_Users::getIdentity()->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::MODO_BIB); - $this->dispatch('admin/cms/add/id_cat/23', true); - } - - - /** @test */ - public function workflowInputsShouldAppear() { - $this->assertXpathCount('//input[@name="status"]', 5); - } -} - - -class CmsControllerArticleEditActionWithFormTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - - $this->articleWithForm = $this->fixture('Class_Article', - ['id' => 5, - 'categorie' => $this->cat_evenements, - 'titre' => 'Mon article avec formulaire', - 'auteur' => $this->fixture('Class_Users', - ['id' => 2, - 'Nom' => 'Tom et Jerry', - 'password'=>'toto', - 'login'=>'tom']), - 'description' => 'Mon article avec formulaire', - 'contenu' => '<form action="/formulaire/add/id_article/5" method="POST" name="mon form">', - 'debut' => '2011-03-20', - 'fin' => '2011-03-28', - 'events_debut' => '2011-03-27 21:00', - 'events_fin' => '2011-03-28 22:30', - 'cacher_titre' => 1, - 'langue' => 'fr', - 'tags' => 'concert;jazz', - 'avis' => true, - 'indexation' => false, - 'date_creation' => '2010-12-25 10:23:23', - 'date_maj' => '2010-12-26 11:12:34', - 'domaine_ids' => [11,12], - 'avis_users' => []]); - - - Class_AdminVar::getLoader()->newInstanceWithId('CMS_FORMULAIRES')->setValeur('1'); - $this->dispatch('/admin/cms/edit/id/5'); - } - - - /** @test */ - public function emailShouldBePresentOnFourthPosition() { - $this->assertXPath("//table//tr[5]//input[@name='destination_email'][@type='email']", - $this->_response->getBody()); - } - - - /** @test */ - public function articleShouldContainsCategorySelector() { - $this->assertXPath('//table/tr[4]//select[@name="id_cat"]',$this->_response->getBody()); - } - - - /** @test */ - public function articleShouldContainsPublication() { - $this->assertXPath('//table/tr[6]//input[@name="debut"]',$this->_response->getBody()); - } - -} - - - - -class CmsControllerArticleEditActionWithFormAndEmailFilledTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - - $this->articleWithForm = $this->fixture('Class_Article', - ['id' => 5, - 'categorie' => $this->cat_evenements, - 'titre' => 'Mon article avec formulaire', - 'auteur' => $this->fixture('Class_Users', - ['id' => 2, - 'Nom' => 'Tom et Jerry', - 'password'=>'toto', - 'login'=>'tom']), - 'description' => 'Mon article avec formulaire', - 'contenu' => '<form action="/formulaire/add/id_article/5" method="POST" name="mon form">', - 'debut' => '2011-03-20', - 'fin' => '2011-03-28', - 'events_debut' => '2011-03-27 21:00', - 'events_fin' => '2011-03-28 22:30', - 'cacher_titre' => 1, - 'langue' => 'fr', - 'tags' => 'concert;jazz', - 'avis' => true, - 'indexation' => false, - 'date_creation' => '2010-12-25 10:23:23', - 'date_maj' => '2010-12-26 11:12:34', - 'domaine_ids' => [11,12], - 'avis_users' => [], - 'destination_email' => 'william@dlaton.com']); - - - Class_AdminVar::getLoader()->newInstanceWithId('CMS_FORMULAIRES')->setValeur('1'); - $this->dispatch('/admin/cms/edit/id/5'); - } - - - /** @test */ - public function emailFieldShouldBeFilled() { - Class_Article::find(5)->setDestinationEmail('william@dalton.com')->save(); - $this->dispatch('/admin/cms/edit/id/5'); - $this->assertXpath('//input[@name="destination_email"][@value="william@dalton.com"]'); - } -} - - - -class CmsControllerArticleConcertEditActionWithoutWorkflowTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - Class_AdminVar::getLoader()->newInstanceWithId('WORKFLOW')->setValeur('0'); - $this->dispatch('/admin/cms/edit/id/4'); - } - - /** @test */ - public function workflowInputsShouldNotAppear() { - $this->assertNotXpath('//input[@name="status"]'); - } -} - - - -abstract class CmsControllerArticleConcertEditActionWithWorkflowAndModoTestCase - extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - Class_Users::getIdentity()->beModoPortail()->save(); - $this->fixture('Class_AdminVar', ['id' => 'WORKFLOW', 'valeur' => '1']); - } - - - protected function assertStatusXpath($value, $predicates='') { - $this->assertXpath(sprintf('//input[@name="status"][@value="%d"]%s', - $value, $predicates), - $this->_response->getBody()); - } - - - protected function assertCurrentStatus($id) { - $this->assertStatusXpath($id, '[@checked="checked"]'); - } - - - protected function assertDisabledStatus($id) { - $this->assertStatusXpath($id, '[@disabled="disabled"]'); - } - - - protected function assertEnabledStatus($id) { - $this->assertStatusXpath($id, '[not(@disabled="disabled")]'); - } -} - - - -class CmsControllerArticleConcertEditActionWithWorkflowTest - extends CmsControllerArticleConcertEditActionWithWorkflowAndModoTestCase { - public function setUp() { - parent::setUp(); - $this->concert->setStatus(Class_Article::STATUS_VALIDATED); - $this->dispatch('/admin/cms/edit/id/4', true); - } - - - /** @test */ - public function workflowInputsShouldAppear() { - $this->assertXpathCount('//input[@name="status"]', 5); - } - - - /** @test */ - public function checkedRadioShouldBeValidatedStatus() { - $this->assertCurrentStatus(Class_Article::STATUS_VALIDATED); - } - - - /** @test */ - public function validatedStatusShouldBeDisabled() { - $this->assertDisabledStatus(Class_Article::STATUS_VALIDATED); - } -} - - - -class CmsControllerArticleConcertEditActionWithWorkflowValidatePermissionTest - extends CmsControllerArticleConcertEditActionWithWorkflowAndModoTestCase { - public function setUp() { - parent::setUp(); - $this->concert->setStatus(Class_Article::STATUS_VALIDATED); - $group = $this->fixture('Class_UserGroup', - ['id' => 677, 'libelle' => 'Testing permitted group']); - Class_Users::getIdentity()->addUserGroup($group); - Class_Permission::getWorkflow(Class_Article::STATUS_VALIDATED) - ->permitTo($group, Class_Article::find(4)->getCategorie()); - $this->dispatch('/admin/cms/edit/id/4', true); - } - - - /** @test */ - public function validatedStatusShouldNotBeDisabled() { - $this->assertEnabledStatus(Class_Article::STATUS_VALIDATED); - } -} - - - -class CmsControllerArticleConcertEditActionWithWorkflowStatusRefusedTest - extends CmsControllerArticleConcertEditActionWithWorkflowAndModoTestCase { - - public function setUp() { - parent::setUp(); - $this->concert->setStatus(Class_Article::STATUS_REFUSED); - $this->dispatch('/admin/cms/edit/id/4', true); - } - - - /** @test */ - public function checkedRadioShouldBeRefusedStatus() { - $this->assertCurrentStatus(Class_Article::STATUS_REFUSED); - } - - - /** @test */ - public function rejectCommentShouldBePresent() { - $this->assertXPath('//textarea[@name="refus_message"]'); - } - - - /** @test */ - public function javascriptToggleRejectCommentShouldBePresent() { - $this->assertXPathContentContains('//script', '$("#refus_message").hide();'); - } - - - /** @test */ - public function customFieldsFieldsetShouldNotBePresent() { - $this->assertNotXPathContentContains('//form//fieldset//legend', 'Champs personnalisés'); - } -} - - - - -class CmsControllerArticleAddActionInvalidDatePostTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - - $this->postDispatch('/admin/cms/add/id_cat/23', - ['titre' => '', - 'debut' => '', - 'fin' => '', - 'events_debut' => '', - 'events_fin' => '', - 'description' => '', - 'contenu' => '', - 'id_cat' => 23]); - } - - - /** @test */ - function actionShouldBeAdd() { - $this->assertAction('add'); - } - - - /** @test */ - function shouldNotRedirect() { - $this->assertNotRedirect(); - } - - - /** @test */ - function articleShouldNotBeSaved() { - $this->assertNull(Class_Article::find(5)); - } - - - /** @test */ - function errorShouldContainsVousDevezCompleterLeChampContenu() { - $this->assertXPathContentContains('//ul[@class="errors"]', "Vous devez compléter le champ 'Contenu'"); - } -} - - - -class CmsControllerArticleIndexActionTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - $this->dispatch('admin/cms', true); - } - - /** @test */ - function actionShouldBeIndex() { - $this->assertController('cms'); - $this->assertAction('index'); - } - - - /** @test */ - public function titreShouldBeMiseAJourDesArticles() { - $this->assertXPathContentContains('//h1', 'Mise à jour des articles'); - } - - - /** @test */ - public function articleConcertShouldHaveLinkForEdit() { - $this->assertXPath('//a[contains(@href, "admin/cms/edit/id/4")]'); - } - - - /** @test */ - public function articleConcertShouldHaveLinkForDuplicate() { - $this->assertXPath('//a[contains(@href, "admin/cms/newsduplicate/id/4")]'); - } -} - - - -class CmsControllerArticleIndexActionWithSimpleWorkflowTest extends CmsControllerTestCase { - public function setUp() { - parent::setUp(); - Class_AdminVar::newInstanceWithId('WORKFLOW') - ->setValeur('1'); - $this->dispatch('admin/cms', true); - } - - - /** @test */ - public function searchStatusShouldBePresent() { - $this->assertXPath('//div[@class="treeViewSearchStatus"][contains(@style, "float")]'); - } -} - - - -class CmsControllerArticleIndexActionWithCustomWorkflowTest extends CmsControllerTestCase { - public function setUp() { - parent::setUp(); - Class_AdminVar::newInstanceWithId('WORKFLOW') - ->setValeur('[{"id":89, "label":"Testing test test"}]'); - $this->dispatch('admin/cms', true); - } - - - /** @test */ - public function searchStatusShouldBePresent() { - $this->assertXPath('//div[@class="treeViewSearchStatus"][not(contains(@style, "float"))]'); - } -} - - - - -class CmsControllerArticleTraductionFREditTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - $this->dispatch('/admin/cms/edit/id/4/lang/fr'); - } - - - /** @test */ - function pageTitleShouldBeModifierUnArticle() { - $this->assertXPathContentContains('//h1', 'Modifier un article'); - } -} - - - -class CmsControllerArticleWithUnknownLangueTraductionEditTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - - $this->fixture('Class_Article', - ['id' => 8, - 'id_cat' => 23, - 'langue' => null, - 'titre' => 'Langue non spécifiée', - 'contenu' => 'unknown']); - - $this->dispatch('/admin/cms/edit/id/8/lang/fr'); - } - - - /** @test */ - function pageTitleShouldBeModifierUnArticle() { - $this->assertXPathContentContains('//h1', 'Modifier un article'); - } - - - /** @test */ - function titreShouldBeLangueNonSpecifiee() { - $this->assertInputValueEquals('titre', "Langue non spécifiée"); - } - -} - - - -class CmsControllerArticleNewTraductionEditTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - $this->dispatch('/admin/cms/edit/id/4/lang/ro'); - } - - - /** @test */ - function actionShouldBeEdit() { - $this->assertController('cms'); - $this->assertAction('edit'); - } - - - /** @test */ - function pageTitleShouldBeTraduireUnArticle() { - $this->assertXPathContentContains('//h1', 'Traduire un article'); - } - - - - /** @test */ - function formActionShouldContainsEditUrl() { - $this->assertXPath("//form[contains(@action, 'admin/cms/edit/id/4/lang/ro')]"); - } - - - /** @test */ - function contenuShouldContainsOriginal() { - $this->assertTextAreaContains('contenu', 'à Bonlieu'); - } - - - /** @test */ - function romaniaFlagShouldBeVisibleAndSelected() { - $this->assertXPath('//img[contains(@class, "selected")][contains(@src, "ro.png")]'); - } - - - /** @test */ - function titreOriginalShouldBeVisible() { - $this->assertXPathContentContains('//div[@class="art_original"]', 'Erik Truffaz en concert'); - } - - - /** @test */ - function contenuOriginalShouldContainsABonlieu() { - $this->assertXPathContentContains('//div[@class="art_original"]', 'à Bonlieu'); - } - - - /** @test */ - function descriptionOriginalShouldContainsVenezNombreux() { - $this->assertXPath('//div[@class="art_original"][contains(text(), "Venez nombreux ici: ")]//img[@src="' . BASE_URL . '/images/bonlieu.jpg"]'); - } -} - - - -class CmsControllerArticleTraductionEditWithoutDescriptionTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - $this->concert->setDescription(''); - $this->dispatch('/admin/cms/edit/id/4/lang/ro'); - } - - - /** @test */ - function descriptionOriginalShouldNotBeVisible() { - $this->assertNotXPathContentContains('//div[@class="art_original"]', - 'Venez nombreux ici: <img src="'.BASE_URL.'/images/bonlieu.jpg" />'); - } -} - - - -class CmsControllerArticleExistingTraductionEditTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - - $this->concert->setTraductions(array(Class_Article::getLoader() - ->newInstanceWithId(41) - ->setParentId(4) - ->setTitre('Erik Truffaz live') - ->setDescription('Waiting for you !') - ->setContenu('at Bonlieu') - ->setLangue('en'))); - - $this->dispatch('/admin/cms/edit/id/4/lang/en'); - } - - - /** @test */ - function contenuShouldContainsAtBonlieu() { - $this->assertTextAreaContains('contenu', 'at Bonlieu'); - } - - - /** @test */ - function contenuOriginalShouldContainsABonlieu() { - $this->assertXPathContentContains('//div[@class="art_original"]', 'à Bonlieu'); - } - - - /** @test */ - function permalinkShouldContainsArticleUrl() { - $this->assertXPathContentContains('//div//span', "cms/articleview/id/41"); - } - - - /** @test */ - function previewShouldContainsArticleUrl() { - $this->assertXPath('//a[@data-prettyphoto="true"][contains(@href, "cms/articleview/id/41")]'); - } -} - - - - -class CmsControllerArticleNewTraductionPostTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - - $this->postDispatch('/admin/cms/edit/id/4/lang/ro', - ['titre' => 'Erik în concert', - 'description' => 'Mulţi vin', - 'contenu' => 'la Bonlieu']); - - $this->article_roumain = Class_Article::findFirstBy(['order' => 'id desc']); - } - - - /** @test */ - function concertContenuShouldNotHaveBeenChanged() { - $this->assertEquals('Erik Truffaz en concert', $this->concert->getTitre()); - } - - - /** @test */ - function titreShouldBeTranslatedOne() { - $this->assertEquals('Erik în concert', $this->article_roumain->getTitre()); - } - - - /** @test */ - function contenuShouldBeTranslatedOne() { - $this->assertEquals('la Bonlieu', $this->article_roumain->getContenu()); - } - - - /** @test */ - function descriptionShouldBeTranslatedOne() { - $this->assertEquals('Mulţi vin', $this->article_roumain->getDescription()); - } -} - - - - -class CmsControllerDeleteArticleTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - - $this->dispatch('/admin/cms/delete/id/4', true); - } - - - /** @test */ - public function forceDeleteButtonShouldBePresent() { - $this->assertXPath('//div[contains(@onclick, "cms/force-delete/id/4")]'); - } - - - /** @test */ - public function returnButtonShouldBePresent() { - $this->assertXPath('//div[contains(@onclick, "cms/index/id_cat/34")]'); - } - - - /** @test */ - public function warningShouldBePresent() { - $this->assertXPathContentContains('//p[@class="error"]', 'Toutes les données'); - } - - - /** @test */ - public function datasSummaryShouldBePresent() { - $this->assertXPathContentContains('//li', 'Nombre d\'avis abonnés : 0'); - } -} - - - -class CmsControllerForceDeleteArticleTest extends CmsControllerWithPermissionTestCase { - public function setUp() { - parent::setUp(); - $this->dispatch('/admin/cms/force-delete/id/4', true); - } - - - /** @test */ - public function deleteShouldHaveBeenCalledOnConcert() { - $this->assertNull(Class_Article::find(4)); - } - - - /** @test */ - public function redirectToAdminCmsOnCategorieEvenements() { - $this->assertRedirectTo('/admin/cms/index/id_cat/34', $this->getResponseLocation()); - } -} - - - - -class CmsControllerCategorieEvenementTest extends CmsControllerWithPermissionTestCase { - - /** @test */ - public function deleteShouldRedirectToAdminCmsParentCategorie() { - $this->dispatch('/admin/cms-category/delete/id/34'); - - $this->assertRedirectTo('/admin/cms/index/id_cat/23'); - - $this->assertEquals($this->cat_evenements, - $this->categorie_wrapper->getFirstAttributeForLastCallOn('delete')); - } - - - /** @test */ - function addCategorieShouldDisplayCatEvenementsAsTitle() { - $this->dispatch('/admin/cms-category/add/id/34'); - $this->assertXPathContentContains('//p', 'Localisation: Annecy'); - } - - - /** @test */ - public function addCategorieCancelButtonShouldLinkToIndexIdCat34() { - $this->dispatch('/admin/cms-category/add/id/34'); - $this->assertXPath("//div[contains(@onclick, '/admin/cms/index/id_cat/34')]", - $this->_response->getBody()); - } - - - /** @test */ - public function editCategorieShouldDisplayAllCat() { - $this->dispatch('/admin/cms-category/edit/id/34'); - $this->assertXPath('//input[@value="Evènements"]', $this->_response->getBody()); - $this->assertXPathContentContains('//select[@name="id_cat_mere"]//option[@value="23"]', "A la Une"); - } - - - /** @test */ - public function editCategorieCancelButtonShouldLinkToIndexIdCat34() { - $this->dispatch('/admin/cms-category/edit/id/34'); - $this->assertXPath("//div[contains(@onclick, '/admin/cms/index/id_cat/34')]"); - } - - - /** @test */ - public function postAddCategorieShouldRedirectWithIdCat() { - $this->postDispatch('/admin/cms-category/add/id/34', - ['libelle' => 'concerts', - 'id_cat_mere' => 34]); - - - $this->assertEquals('/admin/cms/index/id_cat/35', $this->getResponseLocation()); - - $new_cat = $this->categorie_wrapper->getFirstAttributeForLastCallOn('save'); - $this->assertEquals('concerts', $new_cat->getLibelle()); - $this->assertEquals(34, $new_cat->getIdCatMere()); - } - - - /** @test */ - public function postEditCategoriePostShouldRedirectWithIdCat() { - Class_ArticleCategorie::getLoader()->newInstanceWithId(254); - - $this - ->getRequest() - ->setMethod('POST') - ->setPost(array('libelle' => 'Actualite', - 'id_cat_mere' => 254)); - $this->dispatch('/admin/cms-category/edit/id/34'); - $this->assertEquals('/admin/cms/index/id_cat/34', $this->getResponseLocation()); - $this->assertEquals('Actualite', $this->cat_evenements->getLibelle()); - $this->assertEquals(254, $this->cat_evenements->getIdCatMere()); - $this->assertTrue($this->categorie_wrapper->methodHasBeenCalled('save')); - } -} - - -class CmsControllerCategorieNotFoundTest extends CmsControllerTestCase { - /** @test */ - function deleteShouldRedirectToAdminCms() { - $this->dispatch('/admin/cms/delete/id/999'); - $this->assertRedirect('admin/cms'); - } - - - /** @test */ - function addCategorieShouldDisplayAnnecy() { - $this->dispatch('/admin/cms-category/add'); - $this->assertXPathContentContains('//p', 'Localisation: Annecy'); - } - -} - - -class CmsControllerNewsAddToCatALaUneInNewsModuleActionTest extends CmsControllerWithPermissionTestCase { - public function setup() { - parent::setup(); - - $cfg_accueil_jeunesse = ['modules' => ['10' => ['division' => '2', - 'type_module' => 'NEWS']], - - 'options' => []]; - - $this->profil_jeunesse = Class_Profil::getCurrentProfil() - ->setBrowser('opac') - ->setTitreSite(null) - ->setLibelle('Profil Jeunesse') - ->setCfgAccueil($cfg_accueil_jeunesse); - - Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Profil') - ->whenCalled('save') - ->answers(true); - - $this->postDispatch('/admin/cms/add/id_module/10/id_cat/34', - ['titre' => 'Erik Truffaz - Ladyland quartet en concert', - 'debut' => '', - 'fin' => '', - 'events_debut' => '', - 'events_fin' => '', - 'auteur' => Class_Users::newInstanceWithId(1, ['login' => 'tom']), - 'id_cat' => 34, - 'contenu' => 'Ici: <img src="../../images/bonlieu.jpg" />', - 'description' => 'Affiche: <img src="http://localhost' . BASE_URL . '/images/concert.jpg" />']); - } - - - /** @test **/ - public function boiteNewsShouldDisplayArticleConcert() { - $this->assertEquals(Class_Article::findFirstBy(['order' => 'id desc'])->getId(), - Class_Profil::getCurrentProfil()->getModuleAccueilPreferences(10, 'NEWS')['id_items']); - } - - - /** @test **/ - public function profilShouldHaveBeenSaved() { - $this->assertTrue(Class_Profil::methodHasBeenCalled('save')); - } -} - - - - -class CmsControllerWithOptionPublicationDirecteWorkflowTest -extends CmsControllerWithPermissionTestCase { - public function setup() { - parent::setup(); - Class_AdminVar::newInstanceWithId('WORKFLOW') - ->setValeur('1'); - $referent = $this->fixture('Class_Users', - ['id' => 23, - 'pseudo' => 'referenctL', - 'nom' => 'referent', - 'login' => 'referent', - 'password' => '123', - 'user_groups' => [Class_UserGroup::find(22)]]); - - $referent->changeRoleTo(ZendAfi_Acl_AdminControllerRoles::ADMIN_PORTAIL) - ->save(); - - $group = $this->fixture('Class_UserGroup', - ['id' => 280, - 'libelle' => 'Referent', - 'users' => [$this->invite], - 'rights' => [Class_UserGroup::RIGHT_USER_PUBLICATION_DIRECTE]]); - - ZendAfi_Auth::getInstance()->logUser($referent); - - $this->dispatch('admin/cms/add/id_cat/23'); - } - - - /** @test */ - public function withUserPublicationDirecteStatusValideShouldNotBeDisabled() { - $this->assertXpath('//input[@name="status"][@value="3"]'); - $this->assertNotXpath('//input[@name="status"][@value="3"][@disabled="disabled"]'); - } -} - - - -class CmsControllerCategoriesActionTest extends AbstractControllerTestCase { - protected $json = [['id' => 0, - 'label' => 'Portail', - 'categories'=> [['id' => 5, - 'label'=> 'Annecy News', - 'categories' => [], - 'items' => []]], - 'items' => []], - ['id' => 1, - 'label' => 'Annecy', - 'categories' => [['id' => 5, - 'label'=> 'Annecy News', - 'categories' => [], - 'items' => []]], - 'items'=> []], - ['id' => 2, - 'label' => 'Valleiry', - 'categories' => [], - 'items'=> []]]; - - public function setup() { - parent::setup(); - - $this->fixture('Class_Bib', - ['id' => 1, - 'libelle' => 'Annecy']); - - $this->fixture('Class_Bib', - ['id' => 2, - 'libelle' => 'Valleiry']); - - $this->fixture('Class_ArticleCategorie', - ['id' => 5, - 'libelle' => 'Annecy News', - 'sous_categories' => []]); - - $this->fixture('Class_Article', - ['id' => 1, - 'id_cat'=>1, - 'titre' => 'Welcome To Work', - 'contenu' => 'take a ticket']); - - Class_Bib::find(1)->setArticleCategories([Class_ArticleCategorie::find(5)]); - - $this->dispatch('admin/cms/categories', true); - } - - - /** @test */ - public function expectedJsonShouldBeEqual() { - $this->assertJSONStringEqualsJSONString(json_encode($this->json), $this->_response->getBody()); - } -} - - - - -class CmsControllerEditArticleWithDate30December2014Test extends CmsControllertestCase { - - public function setup() { - parent::setup(); - $this->concert->setFin('2014-12-30'); - - Class_Users::getIdentity()->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::SUPER_ADMIN); - - $this->dispatch('/admin/cms/edit/id/4'); - } - - - /** @test */ - public function inputFinShouldContains30_12_2014() { - $this->assertXPath('//input[@name="fin"][@value="30/12/2014"]'); - } +<?php +/** + * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved. + * + * BOKEH is free software; you can redistribute it and/or modify + * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by + * the Free Software Foundation. + * + * There are special exceptions to the terms and conditions of the AGPL as it + * is applied to this software (see README file). + * + * BOKEH is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE + * along with BOKEH; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +require_once 'AdminAbstractControllerTestCase.php'; + + +abstract class CmsControllerTestCase extends Admin_AbstractControllerTestCase { + protected + $concert, /** @var Class_Article */ + $lieu_bonlieu, + $lieu_arcadium, + $_admin_bib, + $_laurent, + $_bernard, + $_group_testing, + $_group_admin, + $_cat_a_la_une, + $_cat_atelier; + + + public function setUp() { + parent::setUp(); + $_SERVER['SCRIPT_NAME'] = ''; + + Storm_Model_Loader::defaultToVolatile(); + $this->setupBib(); + + $this->_group_testing = $this->fixture('Class_UserGroup', ['id' => 22, + 'libelle' => 'Testing group']); + + + $this->_group_admin = $this->fixture('Class_UserGroup', ['id' => 24, + 'libelle' => 'Admin group']); + + $this->_laurent = $this->fixture('Class_Users', ['id'=>20, + 'login' => 'laurent', + 'mail' => 'laurent@afi-sa.fr', + 'bib' => $this->annecy, + 'password' => 'toto', + 'role_level' => ZendAfi_Acl_AdminControllerRoles::ADMIN_PORTAIL, + 'user_groups' => [$this->_group_admin]]); + + $this->_admin_bib = $this->fixture('Class_Users',['id' => 10, + 'login' => 'AdminBibConnected', + 'nom' => 'Super', + 'prenom' => 'Mario', + 'bib' => $this->annecy, + 'role' => 'admin_bib', + 'mail' => 'admin@afi-sa.fr', + 'password' => 'toto', + 'role_level' => ZendAfi_Acl_AdminControllerRoles::ADMIN_BIB, + 'user_groups' => [$this->_group_testing]]); + + $this->_bernard = $this->fixture('Class_Users',['id' =>30, + 'login' => 'bernie', + 'bib' => $this->annecy, + 'mail' => 'bernard@afi-sa.fr', + 'password' => 'bernie', + 'role_level' => ZendAfi_Acl_AdminControllerRoles::ADMIN_PORTAIL, + 'user_groups' => [$this->_group_admin]]); + + + ZendAfi_Auth::getInstance()->logUser($this->_admin_bib); + + $this + ->setupLieux() + ->setupDomaines() + ->setupArticles() + ->setupPermissions(); + + $this->fixture('Class_AdminVar', ['id' => 'LANGUES', 'valeur' => 'en;ro']); + $this->fixture('Class_AdminVar', ['id' => 'ARTICLES_LIST_MODE', 'valeur' => '']); + } + + + public function tearDown() { + Storm_Model_Loader::defaultToDb(); + parent::tearDown(); + } + + + public function setupLieux() { + $this->lieu_bonlieu = $this->fixture('Class_Lieu', ['id' => 3, + 'libelle' => 'Bonlieu', + 'adresse' => '1, rue Jean Jaures', + 'code_postal' => '74000', + 'ville' => 'Annecy', + 'pays' => 'France' + ]); + + $this->lieu_arcadium = $this->fixture('Class_Lieu', ['id' => 10 , + 'libelle' => 'Arcadium', + 'adresse' => '32 bd du Fier', + 'code_postal' => '74000', + 'ville' => 'Annecy', + 'pays' => 'France']); + + return $this; + } + + + public function setupDomaines() { + // /!\ disabling afterSave call to saveThesaurus which make direct SQL queries + $this->onLoaderOfModel('Class_Catalogue') + ->whenCalled('saveThesaurus') + ->answers(null); + + $this->domaine_art = $this->fixture('Class_Catalogue', + ['id' => 11, 'libelle' => 'Art']); + + $this->domaine_histoire = $this->fixture('Class_Catalogue', + ['id' => 10, + 'libelle' => 'Histoire', + 'sous_domaines' => [$this->domaine_art]]); + + $domaine_a_la_une = $this->fixture('Class_Catalogue', + ['id' => 66, 'libelle' => 'A la Une']); + $this->fixture('Class_Catalogue', + ['id' => 78, + 'libelle' => 'Root', + 'sous_domaines' => [$domaine_a_la_une]]); + return $this; + } + + + public function setupBib() { + $this->annecy = $this->fixture('Class_Bib',['id' => 1, + 'id_zone' => 4, + 'libelle' => 'Annecy' + ]); + + + $this->cran_gevrier = $this->fixture('Class_Bib',['id' => 3, + 'id_zone' => 4, + 'libelle' => 'Cran-Gevrier', + 'article_categories' => []]); + } + + + public function setupArticles() { + $this->root_category = $this->fixture('Class_ArticleCategorie', + ['id' => 1, 'libelle' => 'Root']); + + $this->_cat_atelier = $this->fixture('Class_ArticleCategorie', + ['id' => 33, + 'libelle' => 'Atelier', + 'parent_categorie' => $this->root_category]); + + $this->_cat_a_la_une = $this->fixture('Class_ArticleCategorie', + ['id' => 23, + 'libelle' => 'A la Une', + 'parent_categorie' => $this->root_category]); + + $this->cat_evenements = $this->fixture('Class_ArticleCategorie', + ['id' => 34, + 'libelle' => 'Evènements', + 'parent_categorie' => $this->_cat_a_la_une, + 'sous_categories' => []]); + $this->_cat_a_la_une->setSousCategories([$this->cat_evenements]); + + $this->annecy + ->setArticleCategories([$this->root_category]) + ->assertSave(); + + $this->concert = $this->fixture('Class_Article', + ['id' => 4, + 'categorie' => $this->cat_evenements, + 'titre' => 'Erik Truffaz en concert', + 'auteur' => $this->fixture('Class_Users', + ['id' => 2, + 'Nom' => 'Tom et Jerry', + 'password'=>'toto', + 'login'=>'tom']), + 'description' => 'Venez nombreux ici: <img src="'.BASE_URL.'/images/bonlieu.jpg" />', + 'contenu' => 'à Bonlieu. <img src="'.BASE_URL.'/images/truffaz.jpg" />', + 'debut' => '2011-03-20', + 'fin' => '2011-03-28', + 'events_debut' => '2011-03-27 21:00', + 'events_fin' => '2011-03-28 22:30', + 'cacher_titre' => 1, + 'langue' => 'fr', + 'tags' => 'concert;jazz', + 'avis' => true, + 'indexation' => false, + 'date_creation' => '2010-12-25 10:23:23', + 'date_maj' => '2010-12-26 11:12:34', + 'domaine_ids' => [11,12], + 'avis_users' => []]); + + $this->cat_evenements->setArticles([$this->concert]); + + $this->categorie_wrapper = $this->onLoaderOfModel('Class_ArticleCategorie'); + + $this->cat_evenements->setBib($this->annecy); + + return $this; + } + + + function setupPermissions() { + $cnt = 1; + foreach ([['CATEGORY', 'ARTICLE', 'Sur la catégorie', 1, 'Créer des sous-catégories'], + ['ARTICLE', 'ARTICLE', 'Sur la catégorie', 2, 'Créer des articles'], + ['PENDING', 'ARTICLE', 'Nouveaux statuts autorisés', 1, 'À valider'], + ['VALIDATED', 'ARTICLE', 'Nouveaux statuts autorisés', 101, 'Validé'], + ['REFUSED', 'ARTICLE', 'Nouveaux statuts autorisés', 102, 'Refusé'], + ['ARCHIVED', 'ARTICLE', 'Nouveaux statuts autorisés', 103, 'Archivé']] as $permission) + $this->fixture('Class_Permission', + ['id' => $cnt++, + 'code' => $permission[0], + 'module' => $permission[1], + 'type' => $permission[2], + 'sorting' => $permission[3], + 'description' => $permission[4]]); + } + + + function assertInputValueEquals($input_name, $value) { + $this->assertXPath(sprintf('//input[@name="%s"][@value="%s"]', + $input_name, $value)); + } + + + function assertCheckboxIsChecked($input_name) { + $this->assertXPath(sprintf('//input[@type="checkbox"][@name="%s"][@checked="checked"]', + $input_name)); + } + + + function assertCheckboxIsNotChecked($input_name) { + $this->assertXPath(sprintf('//input[@type="checkbox"][@name="%s"]', $input_name)); + } + + + function assertTextAreaContains($name, $content) { + $this->assertXPathContentContains(sprintf('//textarea[@name="%s"]', $name), + $content, $this->_response->getBody()); + } + + + function assertNotTextAreaContains($name, $content) { + $this->assertNotXPathContentContains(sprintf('//textarea[@name="%s"]', $name), + $content); + } +} + + + +abstract class CmsControllerWithPermissionTestCase extends CmsControllerTestCase { + protected $_current_id = 1; + + public function setUp() { + parent::setUp(); + Class_Permission::createArticle()->permitTo($this->_group_testing, $this->_cat_a_la_une); + Class_Permission::createArticleCategory()->permitTo($this->_group_testing, $this->_cat_a_la_une); + + Class_Permission::validateArticle()->permitTo($this->_group_admin, + $this->_cat_a_la_une); + + + } +} + + + +class CmsControllerArticleEditWithoutLanguesTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + Class_Exemplaire::beVolatile(); + Class_AdminVar::getLoader() + ->newInstanceWithId('LANGUES') + ->setValeur(''); + + $this->dispatch('/admin/cms/edit/id/4'); + } + + + /** @test */ + public function traductionsSelectorShouldNotBeVisible() { + $this->assertNotXPath('//div[@class="traduction_navigator"]'); + } +} + + + +class CmsControllerArticleConcertAsAdminPortailEditActionTest extends CmsControllerWithPermissionTestCase { + protected function _loginHook($account) { + $account->ROLE = "admin_portail"; + $account->ROLE_LEVEL = ZendAfi_Acl_AdminControllerRoles::ADMIN_PORTAIL; + } + + public function setUp() { + parent::setUp(); + Class_Users::getLoader() + ->getIdentity() + ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::ADMIN_PORTAIL); + Class_Exemplaire::beVolatile(); + $this->dispatch('/admin/cms/edit/id/4', true); + } + + + /** @test */ + public function newsFormShouldBePresent() { + $this->assertXPath('//form[@id="form"]'); + } + + + /** @test */ + public function articleShouldcontainsAuteurTomEtJerry() { + $this->assertXPathContentContains('//td','Tom et Jerry'); + } + + /** @test */ + public function contentHeadShouldContainsLastEditOn26December() { + $this->assertXPathContentContains('//div[@class="content_edit_head"]//dl/dd[preceding-sibling::dt[contains(text(), "Modifié le")]]', + '26 décembre 2010 11:12:34'); + } + + + /** @test */ + public function contentHeadShouldContainsCretedOn25December() { + $this->assertXPathContentContains('//div[@class="content_edit_head"]//dl/dd[preceding-sibling::dt[contains(text(), "Créé le")]]', + '25 décembre 2010 10:23:23'); + } + + + /** @test */ + function categorieSelectShouldContainsOptGroupAnnecy() { + $this->assertXPath('//select[@name="id_cat"]//optgroup[@label="Annecy"]'); + } + + + /** @test */ + function categorieSelectShouldContainsOptGroupPortail() { + $this->assertXPath('//select[@name="id_cat"]//optgroup[@label="Portail"]'); + } + + + /** @test */ + function categorieSelectShouldContainsOptGroupCranGevrier() { + $this->assertXPath('//select[@name="id_cat"]//optgroup[@label="Cran-Gevrier"]'); + } + + + /** @test */ + public function selectIdLieuShouldContainsAucunAndBeSelected() { + $this->assertXPath('//select[@name="id_lieu"]//option[@selected="selected"][@label="Aucun"][@value="0"]'); + } + + + /** @test */ + public function selectIdLieuShouldContainsBonlieu() { + $this->assertXPath('//select[@name="id_lieu"]//option[not(@selected)][@label="Bonlieu"][@value="3"]'); + } + + + /** @test */ + public function selectIdLieuShouldContainsArcadium() { + $this->assertXPath('//select[@name="id_lieu"]//option[@label="Arcadium"][@value="10"]'); + } + + + /** @test */ + public function datePickerForDebutShouldContains20_03_2011() { + $this->assertInputValueEquals('debut', '20/03/2011'); + } + + + /** @test */ + public function datePickerForFinShouldContains28_03_2011() { + $this->assertInputValueEquals('fin', '28/03/2011'); + } + + + /** @test */ + public function datePickerForFinShouldHaveMaxLength10() { + $this->assertXPath('//input[@name="fin"][@maxlength="10"]'); + } + + + /** @test */ + public function datePickerJavascriptForDebutShouldBeDateOnlyTrue() { + $this->assertXPathContentContains('//script', + 'input#debut").appendDtpicker({"dateFormat":"DD\/MM\/YYYY","locale":"fr","firstDayOfWeek":1,"minuteInterval":15,"closeOnSelected":"true","autodateOnStart":false,"dateOnly":true}'); + } + + + /** @test */ + public function datePickerForEventDebutShouldContains27_03_2011_at_21_00() { + $this->assertInputValueEquals('events_debut', '27/03/2011 21:00'); + } + + + /** @test */ + public function datePickerForEventFinShouldContains28_03_2011_at_22_30() { + $this->assertInputValueEquals('events_fin', '28/03/2011 22:30'); + } + + + /** @test */ + public function datePickerForEventFinShouldHaveMaxLength16() { + $this->assertXPath('//input[@name="events_fin"][@maxlength="16"]'); + } + + + /** @test */ + public function datePickerJavascriptForEventDebutShouldBeDateOnlyFalse() { + $this->assertXPathContentContains('//script', + 'input#events_debut").appendDtpicker({"dateFormat":"DD\/MM\/YYYY hh:mm","locale":"fr","firstDayOfWeek":1,"minuteInterval":15,"closeOnSelected":"true","autodateOnStart":false,"dateOnly":false}'); + } + + + /** @test */ + public function boutonValiderClickShouldNotBeAjax() { + $this->assertNotXPath('//td//div[contains(@onclick, "initializeAjaxFormSubmit")]'); + } +} + + + + +class CmsControllerArticleConcertAsReferentEditActionTest extends CmsControllerArticleConcertAsAdminPortailEditActionTest { + + protected $_referent; + protected $_referent_membership; + protected $modo; + + public function setUp() { + parent::setUp(); + $this->modo = Class_Users::newInstanceWithId(22, ['login' => 'modo', + 'role_level' =>ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL ]); + $this->modo->save(); + ZendAfi_Auth::getInstance()->logUser($this->modo); + $this->_referent = Class_UserGroup::newInstanceWithId(280) + ->setLibelle('Referent') + ->setRights([Class_UserGroup::RIGHT_USER_DOMAINES_SUPPRESSION_LIMIT, + Class_UserGroup::RIGHT_USER_MODO]) + ->setUsers([$this->modo]); + + $this->_referent->save(); + + $this->dispatch('/admin/cms/edit/id/4', true); + } + + +} + + + + +class CmsControllerArticleWithoutCategoryAddActionTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + $this->dispatch('/admin/cms/add/id_cat/99999'); + } + + /** @test */ + function answerShouldRedirectToAdminCms() { + $this->assertRedirectTo('/admin/cms/index', $this->getResponseLocation()); + } +} + + + + +class CmsControllerArticleDuplicateActionTest extends CmsControllerWithPermissionTestCase { + protected + $_admin_bib, + $_concert; + + public function setUp() { + parent::setUp(); + + $this->_admin_bib = $this->fixture('Class_Users', + ['id' => 10, + 'login' => 'AdminBibConnected', + 'bib' => $this->fixture('Class_Bib', + ['id' => 2, + 'id_zone' => 4, + 'libelle' => 'Annecy']), + 'role' => 'admin_bib', + 'mail' => 'admin@afi-sa.fr', + 'password' => 'toto', + 'role_level' => ZendAfi_Acl_AdminControllerRoles::ADMIN_BIB]); + ZendAfi_Auth::getInstance()->logUser($this->_admin_bib); + $this->setupArticle(); + $this->dispatch('/admin/cms/newsduplicate/id/8080', true); + } + + + public function setupArticle() { + $this->fixture('Class_Article', + ['id' => 8080, + 'titre' => 'Concert', + 'categorie' => $this->fixture('Class_ArticleCategorie', + ['id' => 23, + 'libelle' => 'A la Une']), + 'auteur' => $this->_admin_bib, + 'description' => 'Venez nombreux ici: <img src="'.BASE_URL.'/images/bonlieu.jpg" />', + 'contenu' => 'à Bonlieu. <img src="'.BASE_URL.'/images/truffaz.jpg" />', + 'debut' => '2011-03-20', + 'fin' => '2011-03-28', + 'events_debut' => '2011-03-27', + 'events_fin' => '2011-03-28', + 'cacher_titre' => 1, + 'langue' => 'fr', + 'tags' => 'concert;jazz', + 'avis' => true]); + } + + + /** @test */ + function contenuDuplicateShouldContainsVenezNombreux() { + $this->assertXPathContentContains('//textarea','Venez nombreux ici'); + } + + + /** @test */ + function eventsFinDuplicateShouldContains20110328() { + $this->assertXPath('//input[@name="events_fin"][@value="28/03/2011 00:00"]'); + } + + + /** @test */ + public function formActionShouldBeAddIdCat23() { + $this->assertXPath('//form[contains(@action, "/admin/cms/add/id_cat/23")]'); + } + + + /** @test */ + public function titreShouldBeDupliquerLArticleConcert() { + $this->assertXPathContentContains('//h1', 'Dupliquer l\'article: Concert'); + } +} + + + + +class CmsControllerArticleConcertEditActionTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + $this->dispatch('/admin/cms/edit/id/4', true); + } + + + /** + * @group integration + * @test + */ + public function pageShouldBeHtml5Valid() { + $this->assertHTML5(); + } + + + /** @test */ + public function fermerShouldRedirectToCategoriesAnchor() { + $this->assertXPath("//div[contains(@onclick, '/admin/cms/index/id/4')]"); + } + + /** @test */ + function linkTraductionEnShouldBeFlagEn() { + $this->assertXPath('//a[contains(@href, "/admin/cms/edit/id/4/lang/en")]//img[contains(@src, "en.png")]',$this->_response->getBody()); + } + + + /** @test */ + function linkTraductionEnShouldNotHaveDataPopup() { + $this->assertXPath('//a[contains(@href, "/admin/cms/edit/id/4/lang/en")][not(@data-popup)]'); + } + + + /** @test */ + function linkTraductionFrShouldBeSelectedFlagFr() { + $this->assertXPath('//a[contains(@href, "/admin/cms/edit/id/4/lang/fr")]//img[contains(@class,"selected")][contains(@src, "fr.png")]'); + } + + + /** @test */ + function pageTitleShouldBeModifierUnArticle() { + $this->assertXPathContentContains('//h1', 'Modifier un article'); + } + + + /** @test */ + function titreShouldBeErikTruffazEnConcert() { + $this->assertInputValueEquals('titre', "Erik Truffaz en concert"); + } + + + /** @test */ + function titreShouldAccept200CharsAsDefinedInClassArticle() { + $this->assertXPath('//input[@name="titre"][@maxlength="255"]'); + } + + + /** @test */ + function eventDebutShouldBe27_03_2011() { + $this->assertInputValueEquals('events_debut', '27/03/2011 21:00'); + } + + + /** @test */ + function eventFinShouldBe28_03_2011() { + $this->assertInputValueEquals('events_fin', '28/03/2011 22:30'); + } + + + /** @test */ + function debutShouldBe20_03_2011() { + $this->assertInputValueEquals('debut', '20/03/2011'); + } + + + /** @test */ + function finShouldBe28_03_2011() { + $this->assertInputValueEquals('fin', '28/03/2011'); + } + + + /** @test */ + function formActionShouldContainsEditUrl() { + $this->assertXPath("//form[@id='form'][@method='post'][contains(@action, 'admin/cms/edit/id/4')]"); + } + + + /** @test */ + function cacherTitreShouldBeChecked() { + $this->assertCheckboxIsChecked('cacher_titre'); + } + + + /** @test */ + function contenuShouldContainsABonlieu() { + $this->assertTextAreaContains('contenu', 'à Bonlieu'); + } + + + /** @test */ + function contenuShouldContainsAndFixedImageURL() { + $this->assertTextAreaContains('contenu', 'http://localhost' . BASE_URL . '/images/truffaz.jpg'); + } + + + + /** @test */ + function descriptionShouldContainsVenezNombreux() { + $this->assertTextAreaContains('description', + 'Venez nombreux ici'); + } + + /** @test */ + function descriptionShouldContainsAndFixedImageURL() { + $this->assertTextAreaContains('description', + 'http://localhost' . BASE_URL . '/images/bonlieu.jpg'); + } + + + /** @test */ + function tagsShouldContainsConcertJazz() { + $this->assertTextAreaContains('tags', 'concert;jazz'); + } + + /** @test */ + function avisShouldBeChecked() { + $this->assertCheckboxIsChecked('avis'); + } + + + /** @test */ + function indexationShouldNotBeChecked() { + $this->assertCheckboxIsNotChecked('indexation'); + } + + + /** @test */ + function categorieSelectShouldHaveEvenementsSelected() { + $this->assertXPathContentContains('//select[@name="id_cat"]//option[@selected="selected"]', + 'Evènements'); + } + + + /** @test */ + function categorieSelectShouldContainsOptGroupAnnecy() { + $this->assertXPath('//select[@name="id_cat"]//optgroup[@label="Annecy"]'); + } + + + /** @test */ + function categorieSelectShouldNotContainsOptGroupPortail() { + $this->assertNotXPath('//select[@name="id_cat"]//optgroup[@label="Portail"]'); + } + + + /** @test */ + function categorieSelectShouldNotContainsOptGroupCranGevrier() { + $this->assertNotXPath('//select[@name="id_cat"]//optgroup[@label="Cran-Gevrier"]'); + } + + + /** @test */ + public function permalinkShouldContainsArticleAbsoluteUrl() { + $this->assertXPathContentContains('//div//span', "cms/articleview/id/4"); + } + + + /** @test */ + function previewShouldContainsArticleUrl() { + $this->assertXPath('//a[@data-prettyphoto="true"][contains(@href, "/cms/articleview/id/4")]'); + } + + + /** @test */ + function previewTitleShouldBeVisualisationDeLArticle() { + $this->assertXPath('//a[@data-prettyphoto="true"][contains(@title, "Visualisation de l\'article: Erik Truffaz en concert")]'); + } + + + /** @test */ + public function checkBoxShouldCheckedDomaineArtEtHistoire() { + $this->assertXPath("//input[@name='domaine_ids'][@value='11-12']"); + } + + /** @test */ + public function emailShouldNotBePresent() { + $this->assertNotXPath("//input[@name='destination_email']"); + } +} + + + + +class CmsControllerArticleConcertEditRenderPopupActionTest extends CmsControllerWithPermissionTestCase { + protected + $_json, + $_xpath; + + + public function setUp() { + parent::setUp(); + $this->dispatch('/admin/cms/edit/id/4/render/popup', true); + $this->_json = json_decode($this->_response->getBody()); + $this->_xpath = new Storm_Test_XPath(); + } + + + /** @test */ + public function prettyPhotoShouldBeLoaded() { + $this->_xpath->assertXPath($this->_json->content, '//script[contains(@src, "jquery.prettyPhoto")]'); + } + + + /** @test */ + public function linkToEditLangEnShouldHaveDataPopup() { + $this->_xpath->assertXPath($this->_json->content, '//a[contains(@href, "edit/id/4/lang/en")][@data-popup="true"]'); + } + + + /** @test */ + public function boutonRetourShouldCloseThePopup() { + $this->_xpath->assertXPath($this->_json->content, + '//div[@class="bouton"][contains(@onclick, "opacDialogClose")][not(contains(@onclick, "window.replace"))]//td[text()="Fermer"]'); + } + + + /** + * @test + * @pagetitles + */ + public function jsonTitleShouldBeModifierUnArticle() { + $this->assertEquals('Modifier un article: Erik Truffaz en concert', $this->_json->title); + } + + + /** @test */ + public function contentShouldContainsFormEditArticle() { + $this->assertContains('form id="form"', $this->_json->content); + } + + + /** @test */ + public function fullDayValueShouldNotBeChecked() { + $xpath = new Storm_Test_XPath(); + $xpath->assertXPath($this->_json->content, + '//input[@type="checkbox"][@name="all_day"][not(@checked)]', $this->_json->content); + } + + + /** @test */ + public function datePickerScriptShouldBeInSetTimeoutForAjaxLoading() { + $this->assertContains('setTimeout(function(){$.datepicker.setDefaults', $this->_json->content); + } + + /** @test */ + public function headerContentTypeShouldBeApplicationJSon() { + $this->assertHeader('Content-Type', 'application/json'); + } + + + /** @test */ + public function boutonValiderShouldSubmitFormUsingAjax() { + $this->_xpath->assertXPath($this->_json->content, + '//td//div[contains(@onclick, "initializeAjaxFormSubmit")]'); + } + + + /** @test */ + public function tagPreviewArticleShouldNotHaveRenderPopupInLink() { + $this->_xpath->assertXPath($this->_json->content, + '//a[contains(@href, "cms/articleview/id/4?iframe=true")]'); + } + + + /** @test */ + public function contentShouldNotContainsJQuery() { + $this->_xpath->assertNotXPath($this->_json->content, + '//script[contains(@src, "'.JQUERY.'")]'); + } + + + /** @test */ + public function contentShouldNotContainsJQueryUI() { + $this->_xpath->assertNotXPath($this->_json->content, + '//script[contains(@src, "'.JQUERYUI.'")]', + $this->_json->content); + } + +} + + + + +class CmsControllerArticleConcertEditArticleWithQuotesActionTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + $this->concert->setTitre('"Erik Truffaz" en concert'); + } + + + /** @test */ + function titleShouldBeEscaped() { + $this->dispatch('/admin/cms/edit/id/4'); + $this->assertContains('value=""Erik Truffaz" en concert"', $this->_response->getBody()); + } + + + /** @test */ + function traductionTitleShouldBeEscaped() { + $this->dispatch('/admin/cms/edit/id/4/lang/ro'); + $this->assertContains('value=""Erik Truffaz" en concert"', $this->_response->getBody()); + } +} + + + + +class CmsControllerArticleConcertEditActionPostTest extends CmsControllerWithPermissionTestCase { + protected $_tomorrow, $_storm_default_to_volatile = true; + + public function setUp() { + parent::setUp(); + + $_SERVER['SCRIPT_NAME'] = '/tom'; + + $filesystem = new Storm_FileSystem_Volatile(); + $thumbnail_paths = PATH_TEMP .'vignettes_titre/'; + $filesystem + ->mkdir($thumbnail_paths) + ->cd($thumbnail_paths); + + Class_Article::setFileWriter($this->mock() + ->whenCalled('fileExists') + ->with('/tom/images/bonlieu.jpg') + ->answers(false) + + ->whenCalled('fileExists') + ->with('./images/bonlieu.jpg') + ->answers(true) + + ->beStrict()); + + Class_WebService_Vignette::setFileSystem($filesystem); + + $image = $this->mock() + ->whenCalled('thumbnailImage') + ->with(160, 220, true, true) + ->answers(null) + + ->whenCalled('writeImage') + ->with(PATH_TEMP . 'vignettes_titre/ERIKTRUFFAZLADYLANDQUARTETENCONCERT-4-TOM----8.jpg') + ->answers(null) + + ->beStrict(); + + $image_factory = $this->mock() + ->whenCalled('newImage') + ->with('./images/bonlieu.jpg') + ->answers($image); + Class_Notice_Thumbnail_ProviderAbstract::setDefaultImageFactory($image_factory); + + + $this->_tomorrow = new DateTime('tomorrow'); + + $this->fixture('Class_Notice', + ['id' => 123910, + 'alpha_titre' => 'LANGUE NON SPECIFIEE', + 'type_doc' => Class_TypeDoc::ARTICLE]); + + $this->fixture('Class_Article', + ['id' => 4, + 'id_notice' => 123910, + 'auteur' => null, + 'id_lieu' => 3, + 'domaine_ids' => ['11', '12'], + 'id_cat' => 23, + 'langue' => null, + 'titre' => 'Langue non spécifiée', + 'description' => '', + 'contenu' => ' ', + 'date_creation' => '2010-12-25']); + + + $this->fixture('Class_NoticeDomain', + ['id' => 1, + 'domain_id' => 10, + 'panier_id' => 0, + 'record_alpha_key' => 'ERIKTRUFFAZLADYLANDQUARTETENCONCERT-4-TOM----8']); + + + $post_datas= ['titre' => 'Erik Truffaz - Ladyland quartet en concert', + 'auteur' => $this->fixture('Class_Users', + ['id' => 1, + 'login' => 'tom', + 'password' => 'pwd']), + 'indexation' => 1, + 'id_cat' => 34, + 'debut' => '01/03/2011', + 'fin' => $this->_tomorrow->format('d-m-Y'), + 'events_debut' => '02/03/2011 08:35', + 'events_fin' => '05/03/2011 10:42', + 'contenu' => 'Ici: <img src="../../images/bonlieu.jpg" />', + 'description' => 'Affiche: <img src="' . Class_Url::siteUrl() . '/images/concert.jpg" />', + 'id_lieu' => 3, + 'domaine_ids' => ['10'], + 'id_items' => ['1']]; + + $this->postDispatch('/admin/cms/edit/id/4',$post_datas); + } + + + public function tearDown() { + Class_WebService_Vignette::setFileSystem(null); + Class_Notice_Thumbnail_ProviderAbstract::setDefaultImageFactory(null); + parent::tearDown(); + } + + + /** @test */ + public function erikTruffazShouldBeIndexed() { + $this->assertNotNull(Class_Notice::findFirstBy(['alpha_titre' =>'ERIK TRUFFAZ LADYLAND QUARTET EN CONCERT'])); + } + + + /** @test */ + public function clefAlphaShouldBeAsExpected() { + $this->assertEquals('ERIKTRUFFAZLADYLANDQUARTETENCONCERT-4-TOM----8', + Class_Article::find(4)->getAlphaKey()); + } + + + /** @test */ + public function erikTruffazShouldBeLinkedToExpectedDomain() { + $this->assertEquals(10, Class_NoticeDomain::findFirstBy(['record_alpha_key' => 'ERIKTRUFFAZLADYLANDQUARTETENCONCERT-4-TOM----8'])->getDomainId()); + } + + + /** @test */ + public function erikTruffazShouldBeLinkedToExpectedDomainByFacet() { + $this->assertContains('Q10', Class_Notice::findFirstBy(['alpha_titre' =>'ERIK TRUFFAZ LADYLAND QUARTET EN CONCERT'])->getFacettes()); + } + + + /** @test */ + public function articleShouldNotHaveIdItems() { + $this->assertTrue(Class_Article::find(4)->isAttributeEmpty('id_items')); + } + + + + /** @test */ + function titreShouldBeUpdatedToErikTruffazLadyland() { + $this->assertEquals('Erik Truffaz - Ladyland quartet en concert', + Class_Article::find(4)->getTitre()); + } + + + /** @test */ + function dateDebutShouldBe2011_03_01() { + $this->assertContains('2011-03-01', Class_Article::find(4)->getDebut()); + } + + + /** @test */ + function dateFinShouldBe2011_03_26() { + $this->assertContains($this->_tomorrow->format('Y-m-d'), Class_Article::find(4)->getFin()); + } + + + /** @test */ + function eventDebutShouldBe2011_03_02_at_08_35() { + $this->assertContains('2011-03-02 08:35', Class_Article::find(4)->getEventsDebut()); + } + + + /** @test */ + function eventFinShouldBe2011_03_05_at_10_42() { + $this->assertContains('2011-03-05 10:42', Class_Article::find(4)->getEventsFin()); + } + + + /** @test */ + function dateMAJShouldBeToday() { + $today = new Zend_Date(); + $this->assertContains($today->toString('yyyy-MM-dd'), + Class_Article::find(4)->getDateMaj()); + } + + + /** @test */ + function dateCreationShouldBe2010_12_25() { + $this->assertContains('2010-12-25', + Class_Article::find(4)->getDateCreation()); + } + + + /** @test */ + function contenuShouldHaveFixedImageURL() { + $this->assertEquals('Ici: <img src="' . Class_Url::baseUrl() . '/images/bonlieu.jpg" />', + Class_Article::find(4)->getContenu()); + } + + + /** @test */ + function descriptionShouldHaveRelativeImageURL() { + $this->assertEquals('Affiche: <img src="' . Class_Url::baseUrl() . '/images/concert.jpg" />', + Class_Article::find(4)->getDescription()); + } + + + /** @test */ + function derniereModificationShouldBeNow() { + $this->assertContains( date('Y-m-d'), + Class_Article::find(4)->getDateMaj()); + } + + + /** @test */ + public function articleAuteurShouldBeTom() { + $this->assertEquals(Class_Article::find(4)->getNomCompletAuteur(), 'tom'); + } + + + /** @test */ + function categorieShouldBeEvenements() { + $this->assertEquals($this->cat_evenements, Class_Article::find(4)->getCategorie()); + } + + + /** @test */ + public function lieuShouldBeBonlieu() { + $this->assertEquals($this->lieu_bonlieu, Class_Article::find(4)->getLieu()); + } + + + /** @test */ + public function domainesShouldBeOnlyHistoire() { + $this->assertEquals(['10'], Class_Article::find(4)->getDomaineIdsAsArray()); + } + + + /** @test */ + public function flashMessengerShouldNotContainsPopup() { + $this->assertNotFlashMessengerPopup(); + } + + + /** @test */ + public function articleRecordThumbnailShouldBeSet() { + $this->assertContains('temp/vignettes_titre/ERIKTRUFFAZLADYLANDQUARTETENCONCERT-4-TOM----8.jpg', Class_Article::find(4)->getNotice()->getUrlVignette()); + } +} + + + +class CmsControllerArticleConcertEditActionPostRenderPopupTest extends CmsControllerWithPermissionTestCase { + protected + $_data, + $_xpath, + $_json; + + public function setUp() { + parent::setUp(); + + $this->_data = ['titre' => 'Erik Truffaz - Ladyland quartet en concert', + 'auteur' => Class_Users::newInstanceWithId(1, ['login' => 'tom']), + 'id_cat' => 34, + 'contenu' => 'Ici: <img src="../../images/bonlieu.jpg" />', + 'description' => '', + 'debut' => '', + 'fin' => '', + 'events_debut' => '', + 'events_fin' => '', + 'id_items' => ['1']]; + + $_SERVER['HTTP_REFERER'] = 'opac/index'; + $this->postDispatch('/admin/cms/edit/id/4/render/popup', $this->_data); + $this->_json = json_decode($this->_response->getBody()); + $this->_xpath = new Storm_Test_XPath(); + } + + + /** @test */ + public function responseShouldBeARedirectWithJavascript() { + $this->_xpath->assertXPathContentContains($this->_json->content, + '//script', + 'window.location="opac/index"'); + } + + + /** @test */ + public function responseShouldContainsVeuillezPatienter() { + $this->_xpath->assertXPathContentContains($this->_json->content, + '//p', + 'Veuillez patienter'); + } + + + /** @test */ + public function flashMessengerShouldNotContainsPopup() { + $this->assertNotFlashMessengerPopup(); + } +} + + + + + +class CmsControllerArticleConcertEditActionPostWithWrongDataRenderPopupTest extends CmsControllerWithPermissionTestCase { + protected + $_data, + $_json, + $_xpath; + + public function setUp() { + parent::setUp(); + + $this->_data = ['titre' => '', + 'id_cat' => 34, + 'contenu' => 'Ici: <img src="../../images/bonlieu.jpg" />', + 'debut' => '', + 'fin' => '', + 'events_debut' => '', + 'events_fin' => '', + 'description' => '', + 'id_items' => ['1']]; + + $_SERVER['HTTP_REFERER'] = 'opac/cms/viewarticle/id/4'; + $this->postDispatch('/admin/cms/edit/id/4/render/popup', $this->_data); + + $this->_json = json_decode($this->_response->getBody()); + $this->_xpath = new Storm_Test_XPath(); + } + + + /** @test */ + public function responseShouldNotBeARedirect() { + $this->assertNotRedirect(); + } + + + /** + * @test + * @pagetitles + */ + public function responseTitleShouldBeModifierUnArticle() { + $this->assertEquals('Modifier un article: Erik Truffaz en concert', $this->_json->title); + } + + + /** @test */ + public function boutonValiderShouldSubmitFormUsingAjax() { + $this->_xpath->assertXPath($this->_json->content, + '//td//div[contains(@onclick, "initializeAjaxFormSubmit")]', + $this->_json->content); + } + + + /** @test */ + function errorShouldContainsVousDevezCompleterLeChampTitre() { + $this->_xpath->assertXPathContentContains($this->_json->content, + '//ul[@class="errors"]', + "le champ 'Titre'"); + } + + + public function flashMessengerShouldContainsPopupWithCmsEditUrl() { + $this->assertFlashMessengerContainsPopup('http://localhost'.BASE_URL.'/admin/cms/edit/id/4/render/popup'); + } +} + + + + +class CmsControllerArticleConcertEditActionPostWithErrorTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + + $this->postDispatch('/admin/cms/edit/id/4', + ['titre' => '', + 'debut' => '01/04/2011', + 'fin' => '26/03/2011', + 'events_debut' => '', + 'events_fin' => '01/04/2011', + 'description' => '', + 'contenu' => '', + 'id_cat' => 23]); + } + + + /** @test */ + public function actionShouldBeEdit() { + $this->assertAction('edit'); + } + + + /** @test */ + public function shouldNotRedirect() { + $this->assertNotRedirect(); + } + + + /** @test */ + public function currentTitleShouldBeDifferentFromDatabaseOne() { + $this->assertTrue(Class_Article::find(4)->hasChangedAttribute('titre')); + } + + + /** @test */ + public function errorShouldContainsDateDebutError() { + $this->assertXPathContentContains('//ul[@class="errors"]', + "La date de début de publication doit être plus récente que la date de fin", + $this->_response->getBody()); + } + + + /** @test */ + public function errorShouldContainsVousDevezCompleterLeChampTitre() { + $this->assertXPathContentContains('//ul[@class="errors"]', "Vous devez compléter le champ 'Titre'"); + } +} + + + + +class CmsControllerArticleAddActionPostTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + + $data = ['titre' => 'Marcus Miller en <br/>concert !', + 'debut' => '', + 'fin' => '', + 'events_debut' => '', + 'auteur' => $this->fixture('Class_Users', + ['id' => 1, + 'login' => 'tom', + 'mail' => 'tom@afi-sa.fr', + 'password' => 'pwd']), + + 'events_fin' => '', + 'description' => '', + 'id_cat' => 23, + 'contenu' => 'Youpi!!', + 'domaine_ids' => ['11','12']]; + $this->mock_transport = new MockMailTransport(); + Zend_Mail::setDefaultTransport($this->mock_transport); + Class_Profil::getCurrentProfil()->setMailSite('laurent@afi-sa.fr'); + Class_AdminVar::newInstanceWithId('WORKFLOW')->setValeur('0'); + $this->postDispatch('/admin/cms/add/id_cat/23', $data); + $this->new_article = Class_Article::findFirstBy(['order' => 'id desc']); + } + + + + + /** @test */ + public function MailShouldNotBeSendToUserIfWorkflowIsNotActive() { + $this->assertEquals([],$this->mock_transport->getSentMails()); + } + + /** @test */ + function contenuShouldEqualsYoupii() { + $this->assertEquals('Youpi!!', $this->new_article->getContenu()); + } + + + /** @test */ + function redirectToEditNewArticle() { + $this->assertRedirectTo('/admin/cms/edit/id/5/id_cat/23', $this->getResponseLocation()); + } + + + /** @test */ + function dateMAJShouldBeToday() { + $today = new Zend_Date(); + $this->assertContains($today->toString('yyyy-MM-dd'), + $this->new_article->getDateMaj()); + } + + + /** @test */ + function dateCreationShouldBeToday() { + $today = new Zend_Date(); + $this->assertContains($today->toString('yyyy-MM-dd'), + $this->new_article->getDateCreation()); + } + + + /** @test */ + function categorieShouldBeALaUne() { + $this->assertEquals('A la Une', $this->new_article->getCategorie()->getLibelle()); + } + + + /** @test */ + public function domainesShouldBeArtAndMusique() { + $this->assertEquals(['11','12'],$this->new_article->getDomaineIdsAsArray()); + } + + + /** @test */ + public function titreShouldBeMarcusMillerEnConcert() { + $this->assertEquals('Marcus Miller en concert !', $this->new_article->getTitre()); + } +} + + + +class CmsControllerNewsAddToCatALaUneActionTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + $this->dispatch('admin/cms/add/id_cat/23',true); + } + + /** @test */ + public function formActionShouldContainsAddUrl() { + $this->assertXPath("//form[@id='form'][@method='post'][contains(@action, 'admin/cms/add/id_cat/23')]"); + } + + /** @test */ + public function pageTitleShouldBeAjouterUnArticle() { + $this->assertXPathContentContains('//h1', 'Ajouter un article'); + } + + /** @test */ + public function titreCacheOptionShouldBePresent() { + $this->assertXPathContentContains('//form[@id="form"]//tr[2]//td[1]', + 'Titre caché'); + $this->assertXPath('//form[@id="form"]//tr[2]//td[2]//input[@name="cacher_titre"]'); + + } + + /** @test */ + public function cacherTitreShouldNotBeChecked() { + $this->assertCheckboxIsNotChecked('cacher_titre'); + } + + /** @test */ + public function finShouldBeEmpty() { + $this->assertInputValueEquals('fin', ''); + } + + /** @test */ + public function avisShouldNotBeChecked() { + $this->assertCheckboxIsNotChecked('avis'); + } + + /** @test */ + public function indexationShouldBeChecked() { + $this->assertCheckboxIsChecked('indexation'); + } + + /** @test */ + public function categorieSelectShouldHaveALaUneSelected() { + $this->assertXPathContentContains('//select[@name="id_cat"]//option[@selected="selected"]', + 'A la Une'); + } + + /** @test */ + public function selectIdLieuShouldContainsBonlieu() { + $this->assertXPath('//select[@name="id_lieu"]//option[not(@selected)][@label="Bonlieu"][@value="3"]'); + } + + + /** @test */ + public function checkBoxShouldCheckedDomaineALaUne() { + $this->assertXPath("//input[@name='domaine_ids'][@value='66']"); + } +} + + + + +class CmsControllerNewsAddActionWithoutWorkflowTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + Class_AdminVar::newInstanceWithId('WORKFLOW')->setValeur(''); + $this->dispatch('admin/cms/add/id_cat/23'); + } + + /** @test */ + public function workflowInputsShouldNotAppear() { + $this->assertNotXpath('//input[@name="status"]'); + } + + /** @test */ + public function auteurShouldBeDisplayByDefault() { + $this->assertXPathContentContains('//td','Mario Super',$this->_response->getBody()); + } +} + + + + +class CmsControllerArticleVisibilityTest extends CmsControllerWithPermissionTestCase { + /** @test */ + function makeVisibleShouldRedirectToCategorieEvenements() { + $this->dispatch('admin/cms/makevisible/id/4'); + $this->assertRedirectTo('/admin/cms/index/id/4'); + $this->assertTrue($this->concert->isVisible()); + } + + + /** @test */ + function makeInvisibleShouldRedirectToCategorieEvenements() { + $this->dispatch('admin/cms/makeinvisible/id/4'); + $this->assertRedirectTo('/admin/cms/index/id/4'); + $this->assertFalse($this->concert->isVisible()); + } +} + + + + +class CmsControllerNewsAddActionPostWithoutWorkflowTest extends CmsControllerWithPermissionTestCase { + /** @var Class_Article */ + protected $_article; + + public function setUp() { + parent::setUp(); + + $this->fixture('Class_AdminVar', ['id' => 'WORKFLOW', 'valeur' => 0]); + + $this->postDispatch('/admin/cms/add/id_cat/23', + ['titre' => 'Katsuhiro Otomo en dédicace !', + 'debut' => '', + 'fin' => '', + 'events_debut' => '', + 'events_fin' => '', + 'description' => '', + 'id_cat' => 23, + 'contenu' => 'Ne manquez pas cet évènement.', + 'status' => Class_Article::STATUS_DRAFT, + ]); + } + + /** @test */ + public function statusShouldNotBeUpdatable() { + $this->assertEquals(3, Class_Article::find(5)->getStatus()); + } +} + + + +abstract class CmsControllerWorkflowTestCase extends CmsControllerWithPermissionTestCase { + protected + $mock_transport; + + public function setUp() { + parent::setUp(); + $this->mock_transport = new MockMailTransport(); + Zend_Mail::setDefaultTransport($this->mock_transport); + Class_Profil::getCurrentProfil()->setMailSite('laurent@afi-sa.fr'); + + $this->fixture('Class_AdminVar', ['id' => 'WORKFLOW', 'valeur' => '1']); + $this->fixture('Class_AdminVar', + ['id' => 'WORKFLOW_TEXT_MAIL_ARTICLE_VALIDATED', + 'valeur' => 'L\'article TITRE_ARTICLE a été validé par SAVED_BY_ARTICLE. URL_ARTICLE']); + $this->fixture('Class_AdminVar', + ['id' => 'WORKFLOW_TEXT_MAIL_ARTICLE_PENDING', + 'valeur' => 'Un nouvel article de AUTHOR_ARTICLE est à valider. TITRE_ARTICLE URL_ARTICLE']); + $this->fixture('Class_AdminVar', + ['id' => 'WORKFLOW_TEXT_MAIL_ARTICLE_REFUSED', + 'valeur' => 'L\'article a été refusé.']); + } +} + + + + +abstract class CmsControllerWorkflowPermissionsTestCase extends CmsControllerWorkflowTestCase { + public function setUp() { + parent::setUp(); + $this->fixture('Class_AdminVar', + ['id' => 'WORKFLOW', + 'valeur' => '[{"id":"12", "label":"À valider urgemment"}]']); + + $this->fixture('Class_Article', + ['id' => 18, + 'id_user' => '', + 'titre' => 'News', + 'contenu' => 'September News', + 'description' => '', + 'status' => '1', + 'categorie' => Class_ArticleCategorie::find(34)]); + } +} + + + + +class CmsControllerWorkflowWithoutPermissionsTest extends CmsControllerWorkflowPermissionsTestCase { + public function setUp() { + parent::setUp(); + Class_Users::getIdentity() + ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL) + ->addUserGroup($this->fixture('Class_UserGroup', + ['id' => 46, + 'libelle' => 'Modérateurs', + 'group_type' => Class_UserGroup::TYPE_MANUAL, + 'users' => [], + 'rights' => [], + 'role_level' => ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL, + 'permissions' => []])); + + + $this->dispatch('/admin/cms/edit/id/18', true); + } + + + /** @test */ + public function dynamicStatusShouldBeDisabled() { + $this->assertXPath('//input[@name="status"][@value="12"][@disabled="disabled"]'); + } +} + + + +class CmsControllerWorkflowWithPermissionsTest extends CmsControllerWorkflowPermissionsTestCase { + public function setUp() { + parent::setUp(); + Class_Users::getIdentity() + ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL) + ->addUserGroup($this->fixture('Class_UserGroup', + ['id' => 46, + 'libelle' => 'Modérateurs', + 'group_type' => Class_UserGroup::TYPE_MANUAL, + 'users' => [], + 'rights' => [], + 'role_level' => ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL])); + + Class_Permission::findDynamicWorkflow(12) + ->permitTo(Class_UserGroup::find(46), Class_ArticleCategorie::find(34)); + + $this->dispatch('/admin/cms/edit/id/18', true); + } + + + /** @test */ + public function dynamicStatusShouldBeEnabled() { + $this->assertNotXPath('//input[@name="status"][@value="12"][@disabled="disabled"]'); + $this->assertXPath('//input[@name="status"][@value="12"]'); + } +} + + + +class CmsControllerNewsAddActionPostWithWorkflowTest + extends CmsControllerWorkflowTestCase { + + protected + $_basePostDatas = ['titre' => 'Katsuhiro Otomo en dédicace !', + 'debut' => '', + 'fin' => '', + 'events_debut' => '', + 'events_fin' => '', + 'description' => '', + 'id_cat' => 23, + 'contenu' => 'Ne manquez pas cet évènement.']; + + public function setUp() { + parent::setUp(); + + $this->fixture('Class_Article', + ['id' => 18, + 'id_user' => '', + 'titre' => 'News', + 'contenu' => 'September News', + 'description' => '', + 'status' =>'', + 'auteur' => $this->fixture('Class_Users', + ['id' => 1, + 'login' => 'l', + 'password' => 'l', + 'nom' => 'Batman', + 'mail' => 'batman@afi-sa.fr']), + 'categorie' => Class_ArticleCategorie::find(34)]); + } + + + protected function postArticleValidated() { + $data = $this->_basePostDatas; + $data['status'] = Class_Article::STATUS_VALIDATED; + $this->postDispatch('/admin/cms/edit/id/18', $data); + } + + /** @test */ + public function statusShouldBeUpdated() { + $this->postArticleValidated(); + $this->assertEquals(Class_Article::STATUS_VALIDATED, + Class_Article::findFirstBy(['order' => 'id desc'])->getStatus()); + } + + + /** @test */ + public function validatedNewsShouldSendMailToAuthor() { + $this->postArticleValidated(); + $this->assertEquals('batman@afi-sa.fr', + $this->mock_transport->getSentMails()[0]->getRecipients()[0]); + } + + + /** @test */ + public function sentMailToAuthorWhenNewsIsValidatedShouldContainsDefaultBody() { + $this->postArticleValidated(); + $this->assertEquals('L\'article Katsuhiro Otomo en dédicace ! a été validé par Mario Super. http://localhost'.BASE_URL.'/cms/articleview/id/18',quoted_printable_decode($this->mock_transport->getSentMails()[0]->getBodyText()->getContent())); + } + + + /** @test */ + public function sentMailToAuthorWhenNewsIsValidatedShouldContainsDefaultSubject() { + $this->postArticleValidated(); + $this->assertEquals('[Bokeh] Validation de l\'article Katsuhiro Otomo en dédicace !',quoted_printable_decode($this->mock_transport->getSentMails()[0]->getSubject())); + } + + + /** @test */ + public function statusAValiderUpdatedToSameStatusShouldNotSendMail() { + Class_Article::find(18)->setStatus(Class_Article::STATUS_VALIDATION_PENDING)->save(); + $data = $this->_basePostDatas; + $data['status'] = Class_Article::STATUS_VALIDATION_PENDING; + + $this->postDispatch('admin/cms/edit/id/18', $data); + $this->assertEquals([],$this->mock_transport->getSentMails()); + } + + + /** @test */ + public function newArticleSavedWithStatusAValiderShouldSendMail() { + $data = $this->_basePostDatas; + $data['status'] = Class_Article::STATUS_VALIDATION_PENDING; + + $this->postDispatch('/admin/cms/add/id_cat/23', + $data); + $this->assertEquals(['laurent@afi-sa.fr', 'bernard@afi-sa.fr'],$this->mock_transport->getSentMails()[0]->getRecipients()); + } + + + /** @test */ + public function newArticleSavedWithStatusAValiderShouldSendDeduplicatedMails() { + $data = $this->_basePostDatas; + $data['status'] = Class_Article::STATUS_VALIDATION_PENDING; + + $this->_group_testing->addUser($this->_laurent)->save(); + Class_Permission::validateArticle()->permitTo($this->_group_testing, + $this->_cat_a_la_une); + $this->postDispatch('/admin/cms/add/id_cat/23', + $data); + $this->assertEquals(['<laurent@afi-sa.fr>', '<bernard@afi-sa.fr>', '<admin@afi-sa.fr>', 'append' => true], + $this->mock_transport->getSentMails()[0]->getHeaders()['To']); + } + + + + /** @test */ + public function withoutValidationRightsNewArticleSavedWithStatusAValiderShouldNotSendMail() { + $data = $this->_basePostDatas; + $data['status'] = Class_Article::STATUS_VALIDATION_PENDING; + + Class_Permission::validateArticle()->denyTo($this->_group_admin, + $this->_cat_a_la_une); + + Class_Permission::validateArticle()->permitTo($this->_group_admin, + $this->_cat_atelier); + $this->postDispatch('/admin/cms/add/id_cat/23', + $data); + $this->assertEmpty($this->mock_transport->getSentMails()); + } + + + /** @test */ + public function statusBrouillonUpdatedToAValiderShouldSendMail() { + Class_Article::find(18)->setStatus(Class_Article::STATUS_DRAFT)->save(); + $data = $this->_basePostDatas; + $data['status'] = Class_Article::STATUS_VALIDATION_PENDING; + $this->postDispatch('/admin/cms/edit/id/18', $data); + $this->assertEquals(['laurent@afi-sa.fr', 'bernard@afi-sa.fr'],$this->mock_transport->getSentMails()[0]->getRecipients()); + } + + + /** @test */ + public function statusDraftToValidationPendingShouldSendByNoReplayAtAfiSaDotFr() { + Class_Article::find(18)->setStatus(Class_Article::STATUS_DRAFT)->save(); + $data = $this->_basePostDatas; + $data['status'] = Class_Article::STATUS_VALIDATION_PENDING; + $this->postDispatch('/admin/cms/edit/id/18', $data); + $this->assertEquals('no-reply@afi-sa.fr' ,$this->mock_transport->getSentMails()[0]->getFrom()); + } + + + + public function postArticleAValider() { + Class_Article::find(18)->setStatus(Class_Article::STATUS_DRAFT)->save(); + $data = $this->_basePostDatas; + $data['status'] = Class_Article::STATUS_VALIDATION_PENDING; + $this->postDispatch('/admin/cms/edit/id/18', $data); + } + + + /** @test */ + public function sentMailToAdminWhenValidationPendingShouldContainsDefaultText() { + $this->postArticleAValider(); + $this->assertEquals('Un nouvel article de Batman est à valider. Katsuhiro Otomo en dédicace ! http://localhost'.BASE_URL.'/cms/articleview/id/18',quoted_printable_decode($this->mock_transport->getSentMails()[0]->getBodyText()->getContent())); + } + + + /** @test */ + public function sentMailToAdminWhenValidationPendingShouldContainsDefaultTitle() { + $this->postArticleAValider(); + $this->assertEquals('[Bokeh] Validation d\'article en attente: Katsuhiro Otomo en dédicace !',quoted_printable_decode($this->mock_transport->getSentMails()[0]->getSubject())); + } + + + /** @test */ + public function domainesShouldBeUpdated() { + $data = $this->_basePostDatas; + $data['domaine_ids'] = '11;12'; + + $this->postDispatch('/admin/cms/add/id/23', $data); + $this->assertEquals('11;12', + Class_Article::findFirstBy(['order' => 'id desc'])->getDomaineIds()); + } + + + /** @test */ + public function withUnknownStatusShouldNotBeUpdated() { + $data = $this->_basePostDatas; + $data['status'] = 999999999; + $this->postDispatch('/admin/cms/add/id_cat/23', $data); + $this->assertEquals(Class_Article::STATUS_DRAFT, + Class_Article::findFirstBy(['order' => 'id desc'])->getStatus()); + } +} + + + + +class CmsControllerNewsAddActionPostWithDynamicWorkflowTest extends CmsControllerWorkflowTestCase { + public function setUp() { + parent::setUp(); + $this->fixture('Class_AdminVar', + ['id' => 'WORKFLOW', + 'valeur' => '[{"id":"12", "label":"A lire"}]']); + + + $this->fixture('Class_AdminVar', + ['id' => 'WORKFLOW_TEXT_MAIL_ARTICLE_PENDING', + 'valeur' => 'Un nouvel article de AUTHOR_ARTICLE est passé dans l\'état "STATUS_ARTICLE" et vous devez vérifier pour l\'état "NEXT_STATUS_ARTICLE". TITRE_ARTICLE URL_ARTICLE']); + } + + + protected function _postDataTo($datas, $url) { + $datas = array_merge(['titre' => 'Katsuhiro Otomo en dédicace !', + 'debut' => '', + 'fin' => '', + 'events_debut' => '', + 'events_fin' => '', + 'description' => '', + 'id_cat' => $this->_cat_a_la_une->getId(), + 'contenu' => 'Ne manquez pas cet évènement.'], + $datas); + + $this->postDispatch($url, $datas); + } + + + /** @test */ + public function newArticleSavedWithDynamicStatusALireShouldSendMailToAdmin() { + $this->_postDataTo(['status' => 12], '/admin/cms/add/id_cat/23'); + + $this->assertEquals(['laurent@afi-sa.fr', 'bernard@afi-sa.fr'], + $this->mock_transport->getSentMails()[0]->getRecipients()); + } + + + /** @test */ + public function newArticleSavedWithStatusPendingShouldNotSendMail() { + $this->_postDataTo(['status' => Class_Article::STATUS_VALIDATION_PENDING], + '/admin/cms/add/id_cat/23'); + + $this->assertEmpty($this->mock_transport->getSentMails()); + } + + + /** @test */ + public function newArticleSavedWithStatusPendingShouldSendMailToGroupTestingWithRights() { + + Class_Permission::findDynamicWorkflow(12) + ->permitTo($this->_group_testing, $this->_cat_a_la_une); + + + $this->_postDataTo(['status' => Class_Article::STATUS_VALIDATION_PENDING], + '/admin/cms/add/id_cat/23'); + + $this->assertEquals(['admin@afi-sa.fr'], + $this->mock_transport->getSentMails()[0]->getRecipients()); + + return quoted_printable_decode($this->mock_transport->getSentMails()[0]->getBodyText()->getContent()); + } + + + /** + * @depends newArticleSavedWithStatusPendingShouldSendMailToGroupTestingWithRights + * @test + */ + public function sentMailShouldContainsStatuses($content) { + $this->assertEquals('Un nouvel article de Mario Super est passé dans l\'état "À valider" et vous devez vérifier pour l\'état "A lire". Katsuhiro Otomo en dédicace ! http://localhost'.BASE_URL.'/cms/articleview/id/5', + $content); + } + +} + + + + +class CmsControllerWorkflowArticleRefusedTest extends CmsControllerWorkflowTestCase { + public function setUp() { + parent::setUp(); + $this->concert + ->setStatus(Class_Article::STATUS_DRAFT) + ->setAuteur(Class_Users::newInstanceWithId(1,['mail'=>'bernard@afi-sa.fr'])); + } + + + public function postArticleRefuser() { + $datas = [ + 'titre' => 'Katsuhiro Otomo en dédicace !', + 'debut' => '', + 'fin' => '', + 'events_debut' => '', + 'events_fin' => '', + 'description' => '', + 'id_cat' => 23, + 'contenu' => 'Ne manquez pas cet évènement.', + 'status' => Class_Article::STATUS_REFUSED + ]; + + $this->postDispatch('/admin/cms/edit/id/4', + $datas); + } + + + /** @test */ + public function refusedMailFromShouldBeNoReplyAtAfiSaDotFr() { + $this->concert->getAuteur()->setMail('tom@acme.com'); + $this->postArticleRefuser(); + $this->assertEquals('no-reply@afi-sa.fr', + $this->mock_transport->getSentMails()[0]->getFrom()); + } + + + /** @test */ + public function statusBrouillonUpdatedToRefuserShouldSendMail() { + $this->concert->getAuteur()->setMail('tom@acme.com'); + $this->postArticleRefuser(); + $this->assertEquals(['tom@acme.com'], + $this->mock_transport->getSentMails()[0]->getRecipients()); + } + + /** @test */ + public function statusBrouillonUpdatedToRefuserAndAuteurNotSetShouldNotifyMessagePasDAuteur() { + $this->concert->setAuteur(null); + $this->postArticleRefuser(); + $this->assertFlashMessengerContentContains('Mail non envoyé: article sans auteur'); + } + + + /** @test */ + public function statusBrouillonUpdatedToRefuserAndAuteurWithOutMailShouldNotifyMessagePasDeMail() { + $this->concert->getAuteur()->setMail('')->setLogin('Russe'); + $this->postArticleRefuser(); + $this->assertFlashMessengerContentContains('Mail non envoyé: Russe sans mail.'); + } + + + /** @test */ + public function sentMailToUserWhenRefusedShouldContainsDefaultTitle() { + $this->postArticleRefuser(); + $this->assertEquals('[Bokeh] Refus de l\'article Katsuhiro Otomo en dédicace !',quoted_printable_decode($this->mock_transport->getSentMails()[0]->getSubject())); + } + + + /** @test */ + public function sentMailToUserWhenRefusedShouldContainsDefaultBody() { + $this->postArticleRefuser(); + $this->assertEquals('L\'article a été refusé.',quoted_printable_decode($this->mock_transport->getSentMails()[0]->getBodyText()->getContent())); + } + + +} + + + +abstract class CmsControllerNewsAddActionPostWithWorkflowTestCase + extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + $this->fixture('Class_AdminVar', + ['id' => 'WORKFLOW', + 'valeur' => '[{"id":10, "label":"A valider service COM"}]']); + Class_Users::getIdentity()->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::MODO_BIB); + } +} + + + + +class CmsControllerNewsAddActionPostWithCustomStatusesWorkflowTest + extends CmsControllerNewsAddActionPostWithWorkflowTestCase { + public function setUp() { + parent::setUp(); + $this->postDispatch('admin/cms/add/id_cat/23', + ['titre' => 'Nothing else matters', + 'contenu' => 'So close, no matter how faaaaaaar.', + 'status' => 10, + 'debut' => '', + 'fin' => '', + 'events_debut' => '', + 'events_fin' => '']); + } + + + /** @test */ + public function statusShouldBe10() { + $this->assertEquals(10, + Class_Article::findFirstBy(['order' => 'id desc'])->getStatus()); + } +} + + + +class CmsControllerNewsAddActionWithCustomStatusesWorkflowTest + extends CmsControllerNewsAddActionPostWithWorkflowTestCase { + public function setUp() { + parent::setUp(); + $this->dispatch('admin/cms/add/id_cat/23', true); + } + + + /** @test */ + public function workflowInputsShouldAppear() { + $this->assertXpathCount('//input[@name="status"]', 6); + } + + + /** @test */ + public function customStatusShouldBeAtThirdPosition() { + $this->assertXPath('//td/label[3]//input[@name="status"][@value="10"]', + $this->_response->getBody()); + } + + + /** @test */ + public function withUserRedacteurBibStatusValideShouldBeDisabled() { + $this->assertXpath('//input[@name="status"][@value="3"][@disabled="disabled"]'); + } + + + /** @test */ + public function withUserAdminStatusValideShouldNotBeDisabled() { + Class_Users::getIdentity()->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::ADMIN_BIB); + $this->bootstrap(); + $this->dispatch('admin/cms/add/id_cat/23'); + $this->assertNotXpath('//input[@name="status"][@value="3"][@disabled="disabled"]'); + } +} + + + +class CmsControllerNewsAddActionWithSimpleWorkflowTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + Class_AdminVar::newInstanceWithId('WORKFLOW') + ->setValeur('1'); + Class_Users::getIdentity()->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::MODO_BIB); + $this->dispatch('admin/cms/add/id_cat/23', true); + } + + + /** @test */ + public function workflowInputsShouldAppear() { + $this->assertXpathCount('//input[@name="status"]', 5); + } +} + + +class CmsControllerArticleEditActionWithFormTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + + $this->articleWithForm = $this->fixture('Class_Article', + ['id' => 5, + 'categorie' => $this->cat_evenements, + 'titre' => 'Mon article avec formulaire', + 'auteur' => $this->fixture('Class_Users', + ['id' => 2, + 'Nom' => 'Tom et Jerry', + 'password'=>'toto', + 'login'=>'tom']), + 'description' => 'Mon article avec formulaire', + 'contenu' => '<form action="/formulaire/add/id_article/5" method="POST" name="mon form">', + 'debut' => '2011-03-20', + 'fin' => '2011-03-28', + 'events_debut' => '2011-03-27 21:00', + 'events_fin' => '2011-03-28 22:30', + 'cacher_titre' => 1, + 'langue' => 'fr', + 'tags' => 'concert;jazz', + 'avis' => true, + 'indexation' => false, + 'date_creation' => '2010-12-25 10:23:23', + 'date_maj' => '2010-12-26 11:12:34', + 'domaine_ids' => [11,12], + 'avis_users' => []]); + + + Class_AdminVar::getLoader()->newInstanceWithId('CMS_FORMULAIRES')->setValeur('1'); + $this->dispatch('/admin/cms/edit/id/5'); + } + + + /** @test */ + public function emailShouldBePresentOnFourthPosition() { + $this->assertXPath("//table//tr[5]//input[@name='destination_email'][@type='email']", + $this->_response->getBody()); + } + + + /** @test */ + public function articleShouldContainsCategorySelector() { + $this->assertXPath('//table/tr[4]//select[@name="id_cat"]',$this->_response->getBody()); + } + + + /** @test */ + public function articleShouldContainsPublication() { + $this->assertXPath('//table/tr[6]//input[@name="debut"]',$this->_response->getBody()); + } + +} + + + + +class CmsControllerArticleEditActionWithFormAndEmailFilledTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + + $this->articleWithForm = $this->fixture('Class_Article', + ['id' => 5, + 'categorie' => $this->cat_evenements, + 'titre' => 'Mon article avec formulaire', + 'auteur' => $this->fixture('Class_Users', + ['id' => 2, + 'Nom' => 'Tom et Jerry', + 'password'=>'toto', + 'login'=>'tom']), + 'description' => 'Mon article avec formulaire', + 'contenu' => '<form action="/formulaire/add/id_article/5" method="POST" name="mon form">', + 'debut' => '2011-03-20', + 'fin' => '2011-03-28', + 'events_debut' => '2011-03-27 21:00', + 'events_fin' => '2011-03-28 22:30', + 'cacher_titre' => 1, + 'langue' => 'fr', + 'tags' => 'concert;jazz', + 'avis' => true, + 'indexation' => false, + 'date_creation' => '2010-12-25 10:23:23', + 'date_maj' => '2010-12-26 11:12:34', + 'domaine_ids' => [11,12], + 'avis_users' => [], + 'destination_email' => 'william@dlaton.com']); + + + Class_AdminVar::getLoader()->newInstanceWithId('CMS_FORMULAIRES')->setValeur('1'); + $this->dispatch('/admin/cms/edit/id/5'); + } + + + /** @test */ + public function emailFieldShouldBeFilled() { + Class_Article::find(5)->setDestinationEmail('william@dalton.com')->save(); + $this->dispatch('/admin/cms/edit/id/5'); + $this->assertXpath('//input[@name="destination_email"][@value="william@dalton.com"]'); + } +} + + + +class CmsControllerArticleConcertEditActionWithoutWorkflowTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + Class_AdminVar::getLoader()->newInstanceWithId('WORKFLOW')->setValeur('0'); + $this->dispatch('/admin/cms/edit/id/4'); + } + + /** @test */ + public function workflowInputsShouldNotAppear() { + $this->assertNotXpath('//input[@name="status"]'); + } +} + + + +abstract class CmsControllerArticleConcertEditActionWithWorkflowAndModoTestCase + extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + Class_Users::getIdentity()->beModoPortail()->save(); + $this->fixture('Class_AdminVar', ['id' => 'WORKFLOW', 'valeur' => '1']); + } + + + protected function assertStatusXpath($value, $predicates='') { + $this->assertXpath(sprintf('//input[@name="status"][@value="%d"]%s', + $value, $predicates), + $this->_response->getBody()); + } + + + protected function assertCurrentStatus($id) { + $this->assertStatusXpath($id, '[@checked="checked"]'); + } + + + protected function assertDisabledStatus($id) { + $this->assertStatusXpath($id, '[@disabled="disabled"]'); + } + + + protected function assertEnabledStatus($id) { + $this->assertStatusXpath($id, '[not(@disabled="disabled")]'); + } +} + + + +class CmsControllerArticleConcertEditActionWithWorkflowTest + extends CmsControllerArticleConcertEditActionWithWorkflowAndModoTestCase { + public function setUp() { + parent::setUp(); + $this->concert->setStatus(Class_Article::STATUS_VALIDATED); + $this->dispatch('/admin/cms/edit/id/4', true); + } + + + /** @test */ + public function workflowInputsShouldAppear() { + $this->assertXpathCount('//input[@name="status"]', 5); + } + + + /** @test */ + public function checkedRadioShouldBeValidatedStatus() { + $this->assertCurrentStatus(Class_Article::STATUS_VALIDATED); + } + + + /** @test */ + public function validatedStatusShouldBeDisabled() { + $this->assertDisabledStatus(Class_Article::STATUS_VALIDATED); + } +} + + + +class CmsControllerArticleConcertEditActionWithWorkflowValidatePermissionTest + extends CmsControllerArticleConcertEditActionWithWorkflowAndModoTestCase { + public function setUp() { + parent::setUp(); + $this->concert->setStatus(Class_Article::STATUS_VALIDATED); + $group = $this->fixture('Class_UserGroup', + ['id' => 677, 'libelle' => 'Testing permitted group']); + Class_Users::getIdentity()->addUserGroup($group); + Class_Permission::getWorkflow(Class_Article::STATUS_VALIDATED) + ->permitTo($group, Class_Article::find(4)->getCategorie()); + $this->dispatch('/admin/cms/edit/id/4', true); + } + + + /** @test */ + public function validatedStatusShouldNotBeDisabled() { + $this->assertEnabledStatus(Class_Article::STATUS_VALIDATED); + } +} + + + +class CmsControllerArticleConcertEditActionWithWorkflowStatusRefusedTest + extends CmsControllerArticleConcertEditActionWithWorkflowAndModoTestCase { + + public function setUp() { + parent::setUp(); + $this->concert->setStatus(Class_Article::STATUS_REFUSED); + $this->dispatch('/admin/cms/edit/id/4', true); + } + + + /** @test */ + public function checkedRadioShouldBeRefusedStatus() { + $this->assertCurrentStatus(Class_Article::STATUS_REFUSED); + } + + + /** @test */ + public function rejectCommentShouldBePresent() { + $this->assertXPath('//textarea[@name="refus_message"]'); + } + + + /** @test */ + public function javascriptToggleRejectCommentShouldBePresent() { + $this->assertXPathContentContains('//script', '$("#refus_message").hide();'); + } + + + /** @test */ + public function customFieldsFieldsetShouldNotBePresent() { + $this->assertNotXPathContentContains('//form//fieldset//legend', 'Champs personnalisés'); + } +} + + + + +class CmsControllerArticleAddActionInvalidDatePostTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + + $this->postDispatch('/admin/cms/add/id_cat/23', + ['titre' => '', + 'debut' => '', + 'fin' => '', + 'events_debut' => '', + 'events_fin' => '', + 'description' => '', + 'contenu' => '', + 'id_cat' => 23]); + } + + + /** @test */ + function actionShouldBeAdd() { + $this->assertAction('add'); + } + + + /** @test */ + function shouldNotRedirect() { + $this->assertNotRedirect(); + } + + + /** @test */ + function articleShouldNotBeSaved() { + $this->assertNull(Class_Article::find(5)); + } + + + /** @test */ + function errorShouldContainsVousDevezCompleterLeChampContenu() { + $this->assertXPathContentContains('//ul[@class="errors"]', "Vous devez compléter le champ 'Contenu'"); + } +} + + + +class CmsControllerArticleIndexActionTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + $this->dispatch('admin/cms', true); + } + + /** @test */ + function actionShouldBeIndex() { + $this->assertController('cms'); + $this->assertAction('index'); + } + + + /** @test */ + public function titreShouldBeMiseAJourDesArticles() { + $this->assertXPathContentContains('//h1', 'Mise à jour des articles'); + } + + + /** @test */ + public function articleConcertShouldHaveLinkForEdit() { + $this->assertXPath('//a[contains(@href, "admin/cms/edit/id/4")]'); + } + + + /** @test */ + public function articleConcertShouldHaveLinkForDuplicate() { + $this->assertXPath('//a[contains(@href, "admin/cms/newsduplicate/id/4")]'); + } +} + + + +class CmsControllerArticleIndexActionWithSimpleWorkflowTest extends CmsControllerTestCase { + public function setUp() { + parent::setUp(); + Class_AdminVar::newInstanceWithId('WORKFLOW') + ->setValeur('1'); + $this->dispatch('admin/cms', true); + } + + + /** @test */ + public function searchStatusShouldBePresent() { + $this->assertXPath('//div[@class="treeViewSearchStatus"][contains(@style, "float")]'); + } +} + + + +class CmsControllerArticleIndexActionWithCustomWorkflowTest extends CmsControllerTestCase { + public function setUp() { + parent::setUp(); + Class_AdminVar::newInstanceWithId('WORKFLOW') + ->setValeur('[{"id":89, "label":"Testing test test"}]'); + $this->dispatch('admin/cms', true); + } + + + /** @test */ + public function searchStatusShouldBePresent() { + $this->assertXPath('//div[@class="treeViewSearchStatus"][not(contains(@style, "float"))]'); + } +} + + + + +class CmsControllerArticleTraductionFREditTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + $this->dispatch('/admin/cms/edit/id/4/lang/fr'); + } + + + /** @test */ + function pageTitleShouldBeModifierUnArticle() { + $this->assertXPathContentContains('//h1', 'Modifier un article'); + } +} + + + +class CmsControllerArticleWithUnknownLangueTraductionEditTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + + $this->fixture('Class_Article', + ['id' => 8, + 'id_cat' => 23, + 'langue' => null, + 'titre' => 'Langue non spécifiée', + 'contenu' => 'unknown']); + + $this->dispatch('/admin/cms/edit/id/8/lang/fr'); + } + + + /** @test */ + function pageTitleShouldBeModifierUnArticle() { + $this->assertXPathContentContains('//h1', 'Modifier un article'); + } + + + /** @test */ + function titreShouldBeLangueNonSpecifiee() { + $this->assertInputValueEquals('titre', "Langue non spécifiée"); + } + +} + + + +class CmsControllerArticleNewTraductionEditTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + $this->dispatch('/admin/cms/edit/id/4/lang/ro'); + } + + + /** @test */ + function actionShouldBeEdit() { + $this->assertController('cms'); + $this->assertAction('edit'); + } + + + /** @test */ + function pageTitleShouldBeTraduireUnArticle() { + $this->assertXPathContentContains('//h1', 'Traduire un article'); + } + + + + /** @test */ + function formActionShouldContainsEditUrl() { + $this->assertXPath("//form[contains(@action, 'admin/cms/edit/id/4/lang/ro')]"); + } + + + /** @test */ + function contenuShouldContainsOriginal() { + $this->assertTextAreaContains('contenu', 'à Bonlieu'); + } + + + /** @test */ + function romaniaFlagShouldBeVisibleAndSelected() { + $this->assertXPath('//img[contains(@class, "selected")][contains(@src, "ro.png")]'); + } + + + /** @test */ + function titreOriginalShouldBeVisible() { + $this->assertXPathContentContains('//div[@class="art_original"]', 'Erik Truffaz en concert'); + } + + + /** @test */ + function contenuOriginalShouldContainsABonlieu() { + $this->assertXPathContentContains('//div[@class="art_original"]', 'à Bonlieu'); + } + + + /** @test */ + function descriptionOriginalShouldContainsVenezNombreux() { + $this->assertXPath('//div[@class="art_original"][contains(text(), "Venez nombreux ici: ")]//img[@src="' . BASE_URL . '/images/bonlieu.jpg"]'); + } +} + + + +class CmsControllerArticleTraductionEditWithoutDescriptionTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + $this->concert->setDescription(''); + $this->dispatch('/admin/cms/edit/id/4/lang/ro'); + } + + + /** @test */ + function descriptionOriginalShouldNotBeVisible() { + $this->assertNotXPathContentContains('//div[@class="art_original"]', + 'Venez nombreux ici: <img src="'.BASE_URL.'/images/bonlieu.jpg" />'); + } +} + + + +class CmsControllerArticleExistingTraductionEditTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + + $this->concert->setTraductions(array(Class_Article::getLoader() + ->newInstanceWithId(41) + ->setParentId(4) + ->setTitre('Erik Truffaz live') + ->setDescription('Waiting for you !') + ->setContenu('at Bonlieu') + ->setLangue('en'))); + + $this->dispatch('/admin/cms/edit/id/4/lang/en'); + } + + + /** @test */ + function contenuShouldContainsAtBonlieu() { + $this->assertTextAreaContains('contenu', 'at Bonlieu'); + } + + + /** @test */ + function contenuOriginalShouldContainsABonlieu() { + $this->assertXPathContentContains('//div[@class="art_original"]', 'à Bonlieu'); + } + + + /** @test */ + function permalinkShouldContainsArticleUrl() { + $this->assertXPathContentContains('//div//span', "cms/articleview/id/41"); + } + + + /** @test */ + function previewShouldContainsArticleUrl() { + $this->assertXPath('//a[@data-prettyphoto="true"][contains(@href, "cms/articleview/id/41")]'); + } +} + + + + +class CmsControllerArticleNewTraductionPostTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + + $this->postDispatch('/admin/cms/edit/id/4/lang/ro', + ['titre' => 'Erik în concert', + 'description' => 'Mulţi vin', + 'contenu' => 'la Bonlieu']); + + $this->article_roumain = Class_Article::findFirstBy(['order' => 'id desc']); + } + + + /** @test */ + function concertContenuShouldNotHaveBeenChanged() { + $this->assertEquals('Erik Truffaz en concert', $this->concert->getTitre()); + } + + + /** @test */ + function titreShouldBeTranslatedOne() { + $this->assertEquals('Erik în concert', $this->article_roumain->getTitre()); + } + + + /** @test */ + function contenuShouldBeTranslatedOne() { + $this->assertEquals('la Bonlieu', $this->article_roumain->getContenu()); + } + + + /** @test */ + function descriptionShouldBeTranslatedOne() { + $this->assertEquals('Mulţi vin', $this->article_roumain->getDescription()); + } +} + + + + +class CmsControllerDeleteArticleTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + + $this->dispatch('/admin/cms/delete/id/4', true); + } + + + /** @test */ + public function forceDeleteButtonShouldBePresent() { + $this->assertXPath('//div[contains(@onclick, "cms/force-delete/id/4")]'); + } + + + /** @test */ + public function returnButtonShouldBePresent() { + $this->assertXPath('//div[contains(@onclick, "cms/index/id_cat/34")]'); + } + + + /** @test */ + public function warningShouldBePresent() { + $this->assertXPathContentContains('//p[@class="error"]', 'Toutes les données'); + } + + + /** @test */ + public function datasSummaryShouldBePresent() { + $this->assertXPathContentContains('//li', 'Nombre d\'avis abonnés : 0'); + } +} + + + +class CmsControllerForceDeleteArticleTest extends CmsControllerWithPermissionTestCase { + public function setUp() { + parent::setUp(); + $this->dispatch('/admin/cms/force-delete/id/4', true); + } + + + /** @test */ + public function deleteShouldHaveBeenCalledOnConcert() { + $this->assertNull(Class_Article::find(4)); + } + + + /** @test */ + public function redirectToAdminCmsOnCategorieEvenements() { + $this->assertRedirectTo('/admin/cms/index/id_cat/34', $this->getResponseLocation()); + } +} + + + + +class CmsControllerCategorieEvenementTest extends CmsControllerWithPermissionTestCase { + + /** @test */ + public function deleteShouldRedirectToAdminCmsParentCategorie() { + $this->dispatch('/admin/cms-category/delete/id/34'); + + $this->assertRedirectTo('/admin/cms/index/id_cat/23'); + + $this->assertEquals($this->cat_evenements, + $this->categorie_wrapper->getFirstAttributeForLastCallOn('delete')); + } + + + /** @test */ + function addCategorieShouldDisplayCatEvenementsAsTitle() { + $this->dispatch('/admin/cms-category/add/id/34'); + $this->assertXPathContentContains('//p', 'Localisation: Annecy'); + } + + + /** @test */ + public function addCategorieCancelButtonShouldLinkToIndexIdCat34() { + $this->dispatch('/admin/cms-category/add/id/34'); + $this->assertXPath("//div[contains(@onclick, '/admin/cms/index/id_cat/34')]", + $this->_response->getBody()); + } + + + /** @test */ + public function editCategorieShouldDisplayAllCat() { + $this->dispatch('/admin/cms-category/edit/id/34'); + $this->assertXPath('//input[@value="Evènements"]', $this->_response->getBody()); + $this->assertXPathContentContains('//select[@name="id_cat_mere"]//option[@value="23"]', "A la Une"); + } + + + /** @test */ + public function editCategorieCancelButtonShouldLinkToIndexIdCat34() { + $this->dispatch('/admin/cms-category/edit/id/34'); + $this->assertXPath("//div[contains(@onclick, '/admin/cms/index/id_cat/34')]"); + } + + + /** @test */ + public function postAddCategorieShouldRedirectWithIdCat() { + $this->postDispatch('/admin/cms-category/add/id/34', + ['libelle' => 'concerts', + 'id_cat_mere' => 34]); + + + $this->assertEquals('/admin/cms/index/id_cat/35', $this->getResponseLocation()); + + $new_cat = $this->categorie_wrapper->getFirstAttributeForLastCallOn('save'); + $this->assertEquals('concerts', $new_cat->getLibelle()); + $this->assertEquals(34, $new_cat->getIdCatMere()); + } + + + /** @test */ + public function postEditCategoriePostShouldRedirectWithIdCat() { + Class_ArticleCategorie::getLoader()->newInstanceWithId(254); + + $this + ->getRequest() + ->setMethod('POST') + ->setPost(array('libelle' => 'Actualite', + 'id_cat_mere' => 254)); + $this->dispatch('/admin/cms-category/edit/id/34'); + $this->assertEquals('/admin/cms/index/id_cat/34', $this->getResponseLocation()); + $this->assertEquals('Actualite', $this->cat_evenements->getLibelle()); + $this->assertEquals(254, $this->cat_evenements->getIdCatMere()); + $this->assertTrue($this->categorie_wrapper->methodHasBeenCalled('save')); + } +} + + +class CmsControllerCategorieNotFoundTest extends CmsControllerTestCase { + /** @test */ + function deleteShouldRedirectToAdminCms() { + $this->dispatch('/admin/cms/delete/id/999'); + $this->assertRedirect('admin/cms'); + } + + + /** @test */ + function addCategorieShouldDisplayAnnecy() { + $this->dispatch('/admin/cms-category/add'); + $this->assertXPathContentContains('//p', 'Localisation: Annecy'); + } + +} + + +class CmsControllerNewsAddToCatALaUneInNewsModuleActionTest extends CmsControllerWithPermissionTestCase { + public function setup() { + parent::setup(); + + $cfg_accueil_jeunesse = ['modules' => ['10' => ['division' => '2', + 'type_module' => 'NEWS']], + + 'options' => []]; + + $this->profil_jeunesse = Class_Profil::getCurrentProfil() + ->setBrowser('opac') + ->setTitreSite(null) + ->setLibelle('Profil Jeunesse') + ->setCfgAccueil($cfg_accueil_jeunesse); + + Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Profil') + ->whenCalled('save') + ->answers(true); + + $this->postDispatch('/admin/cms/add/id_module/10/id_cat/34', + ['titre' => 'Erik Truffaz - Ladyland quartet en concert', + 'debut' => '', + 'fin' => '', + 'events_debut' => '', + 'events_fin' => '', + 'auteur' => Class_Users::newInstanceWithId(1, ['login' => 'tom']), + 'id_cat' => 34, + 'contenu' => 'Ici: <img src="../../images/bonlieu.jpg" />', + 'description' => 'Affiche: <img src="http://localhost' . BASE_URL . '/images/concert.jpg" />']); + } + + + /** @test **/ + public function boiteNewsShouldDisplayArticleConcert() { + $this->assertEquals(Class_Article::findFirstBy(['order' => 'id desc'])->getId(), + Class_Profil::getCurrentProfil()->getModuleAccueilPreferences(10, 'NEWS')['id_items']); + } + + + /** @test **/ + public function profilShouldHaveBeenSaved() { + $this->assertTrue(Class_Profil::methodHasBeenCalled('save')); + } +} + + + + +class CmsControllerWithOptionPublicationDirecteWorkflowTest +extends CmsControllerWithPermissionTestCase { + public function setup() { + parent::setup(); + Class_AdminVar::newInstanceWithId('WORKFLOW') + ->setValeur('1'); + $referent = $this->fixture('Class_Users', + ['id' => 23, + 'pseudo' => 'referenctL', + 'nom' => 'referent', + 'login' => 'referent', + 'password' => '123', + 'user_groups' => [Class_UserGroup::find(22)]]); + + $referent->changeRoleTo(ZendAfi_Acl_AdminControllerRoles::ADMIN_PORTAIL) + ->save(); + + $group = $this->fixture('Class_UserGroup', + ['id' => 280, + 'libelle' => 'Referent', + 'users' => [$this->invite], + 'rights' => [Class_UserGroup::RIGHT_USER_PUBLICATION_DIRECTE]]); + + ZendAfi_Auth::getInstance()->logUser($referent); + + $this->dispatch('admin/cms/add/id_cat/23'); + } + + + /** @test */ + public function withUserPublicationDirecteStatusValideShouldNotBeDisabled() { + $this->assertXpath('//input[@name="status"][@value="3"]'); + $this->assertNotXpath('//input[@name="status"][@value="3"][@disabled="disabled"]'); + } +} + + + +class CmsControllerCategoriesActionTest extends AbstractControllerTestCase { + protected $json = [['id' => 0, + 'label' => 'Portail', + 'categories'=> [['id' => 5, + 'label'=> 'Annecy News', + 'categories' => [], + 'items' => []]], + 'items' => []], + ['id' => 1, + 'label' => 'Annecy', + 'categories' => [['id' => 5, + 'label'=> 'Annecy News', + 'categories' => [], + 'items' => []]], + 'items'=> []], + ['id' => 2, + 'label' => 'Valleiry', + 'categories' => [], + 'items'=> []]]; + + public function setup() { + parent::setup(); + + $this->fixture('Class_Bib', + ['id' => 1, + 'libelle' => 'Annecy']); + + $this->fixture('Class_Bib', + ['id' => 2, + 'libelle' => 'Valleiry']); + + $this->fixture('Class_ArticleCategorie', + ['id' => 5, + 'libelle' => 'Annecy News', + 'sous_categories' => []]); + + $this->fixture('Class_Article', + ['id' => 1, + 'id_cat'=>1, + 'titre' => 'Welcome To Work', + 'contenu' => 'take a ticket']); + + Class_Bib::find(1)->setArticleCategories([Class_ArticleCategorie::find(5)]); + + $this->dispatch('admin/cms/categories', true); + } + + + /** @test */ + public function expectedJsonShouldBeEqual() { + $this->assertJSONStringEqualsJSONString(json_encode($this->json), $this->_response->getBody()); + } +} + + + + +class CmsControllerEditArticleWithDate30December2014Test extends CmsControllertestCase { + + public function setup() { + parent::setup(); + $this->concert->setFin('2014-12-30'); + + Class_Users::getIdentity()->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::SUPER_ADMIN); + + $this->dispatch('/admin/cms/edit/id/4'); + } + + + /** @test */ + public function inputFinShouldContains30_12_2014() { + $this->assertXPath('//input[@name="fin"][@value="30/12/2014"]'); + } } \ No newline at end of file