Skip to content
Snippets Groups Projects
ArticlesMultipleTimingsAdminTest.php 15 KiB
Newer Older
<?php
/**
 * Copyright (c) 2012-2021, 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
 */


class ArticlesMultipleTimingsAdminVarTest extends Admin_AbstractControllerTestCase {

Sebastien ANDRE's avatar
Sebastien ANDRE committed
  protected bool $_storm_mock_zend_adapter = true;

  public function setUp() {
    parent::setUp();
    $this->dispatch('/admin/index/adminvar');
  }


  /** @test */
  public function pageShouldContainsLinkToAdminVarENABLE_ARTICLES_TIMINGS() {
    $this->assertXPathContentContains('//a/@href',
                                      '/admin/index/adminvaredit/cle/ENABLE_ARTICLES_TIMINGS');
  }
}




Sebastien ANDRE's avatar
Sebastien ANDRE committed
class ArticlesMultipleTimingsAdminActivationCmsControllerTest
  extends Admin_AbstractControllerTestCase {
Sebastien ANDRE's avatar
Sebastien ANDRE committed
  protected bool $_storm_mock_zend_adapter = true;

  public function setUp() {
    parent::setUp();
    $this->fixture(Class_Article::class,
                   ['id' => 2,
                    'titre' => 'Heure du conte',
                    'contenu' => 'Tous les mercredis']);

  }


  /** @test */
  public function with_ENABLE_ARTICLES_TIMINGS_setDivHeaderActionsShouldContainsLinkToEventTimings() {
    Class_AdminVar::set('ENABLE_ARTICLES_TIMINGS', 1);
    $this->dispatch('/admin/cms/edit/id/2');
    $this->assertXPath('//div[@class="header_actions"]//a[contains(@href,"/admin/cms/event-timings/article_id/2")]/img[@title="Horaires de l\'événement : Heure du conte"]');
  }


  /** @test */
  public function without_ENABLE_ARTICLES_TIMINGS_setDivHeaderActionsShouldNotContainsLinkToEventTimings() {
    Class_AdminVar::set('ENABLE_ARTICLES_TIMINGS', 0);
    $this->dispatch('/admin/cms/edit/id/2');
    $this->assertNotXPathContentContains('//div[@class="header_actions"]//a/@href',
                                         '/admin/cms/event-timings');
  }
}




abstract class ArticlesMultipleTimingsAdminTestCase extends Admin_AbstractControllerTestCase {

Sebastien ANDRE's avatar
Sebastien ANDRE committed
  protected bool $_storm_mock_zend_adapter = true;

  public function setUp() {
    parent::setUp();
    $this->fixture(Class_Article::class,
                   ['id' => 2,
                    'titre' => 'Heure du conte',
                    'contenu' => 'Tous les mercredis'])
         ->addEventTiming($this->fixture(Class_Article_EventTiming::class,
                                         ['id' => 1,
                                          'start' => '2021-07-07 10:00:00',
                                          'end' => '2021-07-07 11:00:00']))
         ->addEventTiming($this->fixture(Class_Article_EventTiming::class,
                                         ['id' => 2,
                                          'start' => '2021-07-14 10:00:00',
                                          'end' => '2021-07-14 11:00:00']));


    Class_AdminVar::set('ENABLE_ARTICLES_TIMINGS', 1);
  }
}





Sebastien ANDRE's avatar
Sebastien ANDRE committed
class ArticlesMultipleTimingsAdminCmsControllerEventTimingIndexArticleNotFoundTest
  extends ArticlesMultipleTimingsAdminTestCase {

  public function setUp() {
    parent::setUp();
    $this->dispatch('/admin/cms/event-timings/article_id/666');
  }

  /** @test */
  public function responseShouldRedirectToIndex() {
    $this->assertRedirectTo('/admin/cms');
  }
}




Sebastien ANDRE's avatar
Sebastien ANDRE committed
class ArticlesMultipleTimingsAdminCmsControllerEventTimingIndexTest
  extends ArticlesMultipleTimingsAdminTestCase {

  public function setUp() {
    parent::setUp();
    $this->dispatch('/admin/cms/event-timings/article_id/2');
  }


  /** @test */
  public function pageTitleShouldBeHorairesPourLHeureDuConte() {
    $this->assertXPathContentContains('//h1', 'Horaires de l\'événement : Heure du conte');
  }


  /** @test */
  public function pageShouldContainsButtonToEditAction() {
    $this->assertXPath('//button[contains(@data-url, "/admin/cms/edit/id/2")]',
                       'Retour à l\'article : Heure du conte');
  }


  /** @test */
  public function pageShouldContainsButtonToAddAction() {
    $this->assertXPath('//button[@data-popup="true"][contains(@data-url, "/admin/cms/event-timing-add/article_id/2")]',
                       'Ajouter un horaire pour : Heure du conte');
  }


  /** @test */
  public function pageShouldContainsTableWithRowForFirstEventTiming() {
    $this->assertXPath('//tr/td[text()="2021-07-07 10:00"]/following-sibling::td[text()="2021-07-07 11:00"]');
  }


  /** @test */
  public function pageShouldContainsTableWithRowForSecondEventTiming() {
    $this->assertXPath('//tr/td[text()="2021-07-14 10:00"]/following-sibling::td[text()="2021-07-14 11:00"]');
  }


  /** @test */
  public function tableShouldContainsActionToEditFirstEventTiming() {
    $this->assertXPathContentContains('//tr/td/a[@data-popup="true"]/@href',
                                      '/admin/cms/event-timing-edit/id/1');
  }


  /** @test */
  public function tableShouldContainsActionToEditSecondEventTiming() {
    $this->assertXPathContentContains('//tr/td/a[@data-popup="true"]/@href',
                                      '/admin/cms/event-timing-edit/id/2');
  }


  /** @test */
  public function tableShouldContainsActionToDeleteFirstEventTiming() {
    $this->assertXPathContentContains('//tr/td/a/@href',
                                      '/admin/cms/event-timing-delete/id/1');
  }


  /** @test */
  public function onDeleteShouldAskForConfirmation() {
    $this->assertXPath('//tr/td/a[contains(@href,"delete")][contains(@onclick,"confirm")]');
  }
}




class ArticlesMultipleTimingsAdminDeleteTest extends ArticlesMultipleTimingsAdminTestCase {

  public function setUp() {
    parent::setUp();
    $this->dispatch('/admin/cms/event-timing-delete/id/1');
  }


  /** @test */
  public function eventTimingOneShouldNotExist() {
    $this->assertNull(Class_Article_EventTiming::find(1));
  }


  /** @test */
  public function afterDeleteShouldRedirectToEventTimingForArticle2() {
    $this->assertRedirect('/admin/cms/event-timings/article_id/2');
  }


  /** @test */
  public function deleteShouldTriggerDeleteMessage() {
    $this->assertFlashMessengerContentContains('L\'horaire a été supprimé');
  }
}




Sebastien ANDRE's avatar
Sebastien ANDRE committed
class ArticlesMultipleTimingsAdminCmsDeleteArticleTest
  extends ArticlesMultipleTimingsAdminTestCase {

  public function setUp() {
    parent::setUp();
    $this->dispatch('/admin/cms/force-delete/id/2');
  }


  /** @test */
  public function eventTimingsShouldBeCascadeDeleted() {
    $this->assertEmpty(Class_Article_EventTiming::findAll());
  }


Sebastien ANDRE's avatar
Sebastien ANDRE committed
  /** @test */
  public function articleTwoShouldBeDeleted() {
    $this->assertEmpty(Class_Article::find(2));
  }
}





class ArticlesMultipleTimingsAdminEditTest extends ArticlesMultipleTimingsAdminTestCase {

  public function setUp() {
    parent::setUp();
    $this->dispatch('/admin/cms/event-timing-edit/id/1');
  }


Sebastien ANDRE's avatar
Sebastien ANDRE committed
  /** @test */
  public function editFormShouldHaveTitleHeureDuConteEditerUnHoraire() {
    $this->assertXPathContentContains('//head//title','Heure du conte : modifier un horaire');
  }


  /** @test */
  public function editFormShouldContainStartDateInput() {
    $this->assertXPath('//input[@id="start"][@value="07/07/2021 10:00"]');
  }


  /** @test */
  public function editFormShouldContainEndDateInput() {
    $this->assertXPath('//input[@id="end"][@value="07/07/2021 11:00"]');
  }


  /** @test */
  public function editFormShouldContainsActionToEventTimingEdit() {
Sebastien ANDRE's avatar
Sebastien ANDRE committed
    $this->assertXPath('//form[contains(@action,"event-timing-edit")]');
Sebastien ANDRE's avatar
Sebastien ANDRE committed
class ArticlesMultipleTimingsAdminEditWithWrongIdTest
  extends ArticlesMultipleTimingsAdminTestCase {

  public function setUp() {
    parent::setup();
    $this->dispatch('/admin/cms/event-timing-edit/id/42');
  }


  /** @test */
  public function withNonExistingEventTimingShouldRedirectToCmsIndex() {
    $this->assertRedirectTo('/admin/cms');
  }
}




class ArticlesMultipleTimingsAdminEditWithParamsTest extends ArticlesMultipleTimingsAdminTestCase {

  protected $_event_time;

  public function setUp() {
    parent::setup();
    $this->postDispatch('/admin/cms/event-timing-edit/id/1',
                        ['start' => '07/07/2021 11:00',
                         'end' => '07/07/2021 12:00']);

    $this->_event_time = Class_Article_EventTiming::find(1);
  }


  /** @test */
  public function eventTimingOneShouldStart2021_07_07_11H00() {
    $this->assertEquals('2021-07-07 11:00', $this->_event_time->getStart());
  }


  /** @test */
  public function eventTimingOneShouldEnd2021_07_07_12H00() {
    $this->assertEquals('2021-07-07 12:00', $this->_event_time->getEnd());
  }


  /** @test */
  public function onSaveShouldNotifyMisAJour() {
    $this->assertFlashMessengerContentContains('Les horaires ont été mis à jour');
  }


  /** @test */
  public function articleShouldStillBeHeureDuConte() {
    $this->assertEquals('Heure du conte', $this->_event_time->getLibelle());
  }


  /** @test */
  public function onSaveShouldRedirectToAdminCmsEventTimingEditIdOne() {
    $this->assertRedirectTo(Class_Url::absolute('/admin/cms/event-timing-edit/id/1/article_id/2'));
  }
}




class ArticlesMultipleTimingsAdminAddDispatchTest
  extends ArticlesMultipleTimingsAdminTestCase {

  public function setUp() {
    parent::setup();
    $this->dispatch('/admin/cms/event-timing-add/article_id/2');
  }


  /** @test */
  public function pageTitleShouldBeAjouterUnHoraire() {
    $this->assertXPathContentContains('//head//title', 'Ajouter un horaire');
  }


  /** @test */
  public function pageInputLabelShouldContainsDateEtHeureDebut() {
    $this->assertXPathContentContains('//form//label[@for="start"]', 'Date et heure de début');
  }


  /** @test */
  public function pageInputLabelShouldContainsDateEtHeureFin() {
    $this->assertXPathContentContains('//form//label[@for="end"]', 'Date et heure de fin');
  }
}





Sebastien ANDRE's avatar
Sebastien ANDRE committed
class ArticlesMultipleTimingsAdminAddPostDispatchTest
  extends ArticlesMultipleTimingsAdminTestCase {

  protected $_event_time;

  public function setUp() {
    parent::setup();
    $this->postDispatch('/admin/cms/event-timing-add/article_id/2',
                        ['start' => '21/07/2021 10:00',
                         'end' => '21/07/2021 11:00']);
    $this->_event_time = Class_Article_EventTiming::find(3);
  }


  /** @test */
  public function eventTimingThreeShouldStart2021_07_21_10H00() {
    $this->assertEquals('2021-07-21 10:00', $this->_event_time->getStart());
  }


  /** @test */
  public function eventTimingThreeShouldEnd2021_07_21_11H00() {
    $this->assertEquals('2021-07-21 11:00', $this->_event_time->getEnd());
  }


  /** @test */
  public function eventTimingThreeShouldBelongToArticle2() {
    $this->assertEquals(Class_Article::find(2), $this->_event_time->getArticle());
  }


  /** @test */
  public function onSaveShouldNotifyNouvelHoraireCrée() {
    $this->assertFlashMessengerContentContains('Un nouvel horaire a été créé');
  }


  /** @test */
  public function onSaveShouldRedirectToAdminCmsEventTimingArticle2Id3() {
    $this->assertRedirectTo(Class_Url::absolute('/admin/cms/event-timing-edit/article_id/2/id/3'));
  }
}





Sebastien ANDRE's avatar
Sebastien ANDRE committed
class ArticlesMultipleTimingsAdminAddPostDispatchWithEndBeforeStartTest
  extends ArticlesMultipleTimingsAdminTestCase {

  public function setUp() {
    parent::setup();
    $this->postDispatch('/admin/cms/event-timing-add/article_id/2',
                        ['start' => '22/07/2021 10:00',
                         'end' => '21/07/2021 11:00']);
  }


  /** @test */
  public function contextShouldExpectation() {
Sebastien ANDRE's avatar
Sebastien ANDRE committed
    $this->assertXPathContentContains('//ul[@class="errors"]/li','La date de début doit être antérieure à la date de fin');
Sebastien ANDRE's avatar
Sebastien ANDRE committed
class ArticlesMultipleTimingsAdminAddPostDispatchWithSingleDateTest
  extends ArticlesMultipleTimingsAdminTestCase {

  public function setUp() {
    parent::setup();
    $this->postDispatch('/admin/cms/event-timing-add/article_id/2',
                        ['start' => '22/07/2021 10:00']);
  }


  /** @test */
  public function contextShouldExpectation() {
    $this->assertXPathContentContains('//ul[@class="errors"]/li','Une valeur est requise');
  }
}




Sebastien ANDRE's avatar
Sebastien ANDRE committed
class ArticlesEventTimingAddPostDispatchWithWrongFormatDateTest
  extends ArticlesMultipleTimingsAdminTestCase {

  public function setUp() {
    parent::setup();
    $this->postDispatch('/admin/cms/event-timing-add/article_id/2',
                        ['start' => 'test']);
  }


  /** @test */
  public function withInvalidDateShouldContainError() {
    $this->assertXPathContentContains('//ul[@class="errors"]/li',"'test' n'est pas une date au format attendu");
  }
}




Sebastien ANDRE's avatar
Sebastien ANDRE committed
class ArticlesMultipleTimingsAdminCmsEditEventTimingAsRedacteurTest
  extends ArticlesMultipleTimingsAdminTestCase {

  public function setUp() {
    parent::setUp();
    $this->fixture(Class_Bib::class,
                   ['id' => 1,
                    'libelle' => 'Spirou' ]);

    $this->fixture(Class_Bib::class,
                   ['id' => 2,
                    'libelle' => 'Fantasio']);

    $article_categorie = $this->fixture(Class_ArticleCategorie::class,
                                        ['id' => 1,
                                         'libelle' => 'Root',
                                         'id_site' => 1]);

    Class_Article::find(2)
      ->setCategorie($article_categorie)
      ->assertSave();

    $redacteur_group = $this->fixture(Class_UserGroup::class,
                                      ['id' => 1,
                                       'libelle' => 'Allowed Group']);

    $redacteur = $this->fixture(Class_Users::class,
                                ['id' => 5,
                                 'login' => 'redac',
                                 'password' => 'chef',
                                 'role_level' => ZendAfi_Acl_AdminControllerRoles::MODO_BIB,
                                 'user_groups' => [$redacteur_group],
                                 'id_site' => 1]);

    $this->fixture(Class_Permission::class,
Sebastien ANDRE's avatar
Sebastien ANDRE committed
                   ['id' => 666,
                    'code' => 'ARTICLE',
                    'module' => 'ARTICLE']);

    Class_Permission::createArticle()->permitTo($redacteur_group, $article_categorie);
    ZendAfi_Auth::getInstance()->logUser($redacteur);
  }


  /** @test */
  public function withUserAllowedToEditArticleShouldDisplayForm() {
    $this->dispatch('/admin/cms/event-timing-edit/id/1');
    $this->assertXPath('//form[contains(@action,"event-timing-edit")]');
  }


  /** @test */
  public function withUserForbiddenShouldRedirect() {
    Class_Users::find(5)->setIdSite(2)->assertSave();
    $this->dispatch('/admin/cms/event-timing-edit/id/1');
    $this->assertRedirectTo('/admin/cms/event-timings/article_id/2');
  }
Sebastien ANDRE's avatar
Sebastien ANDRE committed
}