From 452094073488fd2c8c1514273d5408a4f59b55c3 Mon Sep 17 00:00:00 2001
From: Ghislain Loas <ghislo@sandbox.pergame.net>
Date: Wed, 2 Dec 2015 10:20:53 +0100
Subject: [PATCH] Revert "remove f...g empty rows"

This reverts commit f2e8d82493488f47e810c3bccf146a5b8a191860.
---
 .../admin/controllers/CmsControllerTest.php   | 5804 +++++++++--------
 1 file changed, 2903 insertions(+), 2901 deletions(-)

diff --git a/tests/application/modules/admin/controllers/CmsControllerTest.php b/tests/application/modules/admin/controllers/CmsControllerTest.php
index bd13d20a154..d30f338f727 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="&quot;Erik Truffaz&quot; en concert"', $this->_response->getBody());
-  }
-
-
-  /** @test */
-  function traductionTitleShouldBeEscaped() {
-    $this->dispatch('/admin/cms/edit/id/4/lang/ro');
-    $this->assertContains('value="&quot;Erik Truffaz&quot; 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="&quot;Erik Truffaz&quot; en concert"', $this->_response->getBody());
+  }
+
+
+  /** @test */
+  function traductionTitleShouldBeEscaped() {
+    $this->dispatch('/admin/cms/edit/id/4/lang/ro');
+    $this->assertContains('value="&quot;Erik Truffaz&quot; 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
-- 
GitLab