Skip to content
Snippets Groups Projects
ExternalAgendasTest.php 20.91 KiB
<?php
/**
 * Copyright (c) 2012-2014, 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
 */

abstract class ExternalAgendasAdminTestCase extends Admin_AbstractControllerTestCase {
  protected $_storm_default_to_volatile = true;

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

    $this->events_category = $this->fixture('Class_ArticleCategorie',
                                            ['id' => 1,
                                             'libelle' => 'Events',
                                             'bib' => $this->valleiry]);

    $this->others_category = $this->fixture('Class_ArticleCategorie',
                                            ['id' => 2,
                                             'libelle' => 'Others',
                                             'bib' => $this->valleiry]);

    $this->fixture('Class_Lieu',
                   ['id' => 22,
                    'libelle' => 'Wonderful location']);

    $this->fixture('Class_ExternalAgenda',
                   ['id' => 124,
                    'label' => 'Personal Agenda',
                    'url' => 'http://my.server.com/calendar.ics',
                    'status' => Class_Article::STATUS_DRAFT,
                    'category' => $this->events_category]);


    Class_WebService_ICalendar::setDefaultHttpClient($this->mock()
                                                     ->whenCalled('open_url')
                                                     ->with('http://my.server.com/calendar.ics')
                                                     ->answers(file_get_contents(__DIR__.'/ical-event-first.ics'))
                                                     ->beStrict());
  }

  public function __call($method, $args) { /** in order to stub Class_ExternalAgenda::import($this) */}


  public function tearDown() {
    Class_WebService_ICalendar::setDefaultHttpClient(null);
    parent::tearDown();
  }
}


class ExternalAgendasAdminIndexTest extends ExternalAgendasAdminTestCase {
  public function setUp() {
    parent::setUp();

    Class_ExternalAgenda::find(124)->import($this);

    $this->dispatch('/admin/external-agendas', true);
  }


  /** @test */
  public function pageTitleShouldBeGestionDesAgendasExternes() {
    $this->assertXPathContentContains('//h1', 'Gestion des agendas externes');
  }


  /** @test */
  public function adminMenuShouldContainsLinkToExternalAgenda() {
    $this->assertXPathContentContains('//div[@class="menuGaucheAdmin"]//a[contains(@href, "/admin/external-agendas")]',
                                      'Agendas externes');
  }


  /** @test */
  public function pageShouldContainsButtonAddAgenda() {
    $this->assertXPathContentContains('//div[contains(@onclick, "admin/external-agendas/add")]',
                                      'Ajouter un agenda');
  }


  /** @test */
  public function pageShouldContainsPersonalLabel() {
    $this->assertXPathContentContains('//table[@id="agendas"]//td', 'Personal Agenda');
  }


  /** @test */
  public function pageShouldContainsPersonalUrl() {
    $this->assertXPathContentContains('//table[@id="agendas"]//td', 'http://my.server.com/calendar.ics');
  }


  /** @test */
  public function pageShouldContainsPersonalEditLink() {
    $this->assertXPath('//a[contains(@href, "/external-agendas/edit/id/124")]');
  }


  /** @test */
  public function pageShouldContainsPersonalDeleteLink() {
    $this->assertXPath('//a[contains(@href, "/external-agendas/delete/id/124")]');
  }


  /** @test */
  public function pageShouldContainsPersonalImportLink() {
    $this->assertXPath('//a[contains(@href, "/external-agendas/import/id/124")]');
  }


  /** @test */
  public function personalCalendarShouldNumberOfEventsShouldBeNine() {
    $this->assertXPathContentContains('//table[@id="agendas"]//td', '9');
  }
}



abstract class ExternalAgendasAdminAddTestCase extends ExternalAgendasAdminTestCase {
  /** @test */
  public function titleShouldBeAjouterUnNouvelAgenda() {
    $this->assertXPathContentContains('//h1', 'Ajouter un nouvel agenda');
  }


  /** @test */
  public function formShouldContainsInputForLabel() {
    $this->assertXPath('//form//input[@name="label"]');
  }


  /** @test */
  public function formShouldContainsInputForUrl() {
    $this->assertXPath('//form//input[@name="url"][@type="url"]');
  }


  /** @test */
  public function formShouldContainsRootCategorySelector() {
    $this->assertXPathContentContains('//form//select[@name="cat_id"]/optgroup[@label="Valleiry"]/option[@value="1"]',
                                      'Events');
  }


  /** @test */
  public function categorySelectorShouldContainsNoneOption() {
    $this->assertXPathContentContains('//select[@name="cat_id"]//option[@value="0"]',
                                      'Aucune');
  }


  /** @test */
  public function formShouldContainsLocationSelector() {
    $this->assertXPathContentContains('//select[@name="id_lieu"]/option[@value="0"]', 'Aucun');
  }
}



class ExternalAgendasAdminAddWithWorkflowTest extends  ExternalAgendasAdminAddTestCase {
  public function setUp() {
    parent::setUp();
    Class_AdminVar::set('WORKFLOW', 1);

    $this->dispatch('/admin/external-agendas/add', true);
  }


  /** @test */
  public function formShouldContainsWorkflowOptions() {
    $this->assertXPath('//input[@type="radio"][@name="status"][@value="1"]');
  }
}



class ExternalAgendasAdminAddWithoutWorkflowTest extends  ExternalAgendasAdminAddTestCase {
  public function setUp() {
    parent::setUp();
    Class_AdminVar::set('WORKFLOW', '');

    $this->dispatch('/admin/external-agendas/add', true);
  }


  /** @test */
  public function formShouldNotContainsWorkflowOptions() {
    $this->assertNotXPath('//input[@type="radio"][@name="status"][@value="1"]');
  }
}



class ExternalAgendasAdminAddWithWorkflowInvalidPostTest extends ExternalAgendasAdminAddTestCase {
  public function setUp() {
    parent::setUp();
    Class_AdminVar::set('WORKFLOW', 1);

    $this->postDispatch('/admin/external-agendas/add', ['label' => '',
                                                        'url' => '',
                                                        'cat_id' => 0,
                                                        'id_lieu' => 0,
                                                        'status' => 1]);
  }


  /** @test */
  public function agendaShouldNotBeSaved() {
    $this->assertEquals(1, Class_ExternalAgenda::count());
  }


  /** @test */
  public function pageShouldDisplayRequiredLabelError() {
    $this->assertXPathContentContains('//input[@name="label"]/following-sibling::ul/li',
                                      'Une valeur est requise');
  }


  /** @test */
  public function pageShouldDisplayRequiredUrlError() {
    $this->assertXPathContentContains('//input[@name="url"]/following-sibling::ul/li',
                                      'Une valeur est requise');
  }


  /** @test */
  public function pageShouldDisplayRequiredCategoryError() {
    $this->assertXPathContentContains('//select[@name="cat_id"]/following-sibling::ul/li',
                                      'Une catégorie est requise');
  }
}




class ExternalAgendasAdminAddWithWorkflowValidPostTest extends ExternalAgendasAdminTestCase {
  protected $agenda;

  public function setUp() {
    parent::setUp();
    Class_AdminVar::set('WORKFLOW', 1);

    $this->postDispatch('/admin/external-agendas/add', ['label' => 'Extra Agenda',
                                                        'url' => 'http://external.agenda.com/export?type=ics',
                                                        'cat_id' => 1,
                                                        'id_lieu' => 0,
                                                        'status' => Class_Article::STATUS_VALIDATED]);

    $this->agenda = Class_ExternalAgenda::findFirstBy(['label' => 'Extra Agenda']);
  }


  /** @test */
  public function agendaShouldBeSaved() {
    $this->assertNotNull($this->agenda);
  }


  /** @test */
  public function agendaLabelShouldBeExtraAgenda() {
    $this->assertEquals('Extra Agenda', $this->agenda->getLabel());
  }


  /** @test */
  public function agendaUrlShouldBeExternalDotAgendaDotCom() {
    $this->assertEquals('http://external.agenda.com/export?type=ics', $this->agenda->getUrl());
  }


  /** @test */
  public function agendaCategorieShouldBeEvents() {
    $this->assertEquals('Events', $this->agenda->getCategory()->getLibelle());
  }


  /** @test */
  public function agendaShouldNotHaveLocation() {
    $this->assertFalse($this->agenda->hasLocation());
  }


  /** @test */
  public function agendaStatusShouldBeValidated() {
    $this->assertEquals(Class_Article::STATUS_VALIDATED, $this->agenda->getStatus());
  }
}




class ExternalAgendasAdminEditWithWorkflowTest extends ExternalAgendasAdminTestCase {
  public function setUp() {
    parent::setUp();
    Class_AdminVar::set('WORKFLOW', 1);

    $this->fixture('Class_ExternalAgenda',
                   ['id' => 34,
                    'label' => 'Extra Agenda',
                    'url' => 'http://external.agenda.com/export?type=ics',
                    'cat_id' => 1,
                    'id_lieu' => 0,
                    'status' => Class_Article::STATUS_VALIDATED]);

    $this->dispatch('/admin/external-agendas/edit/id/34', true);
  }


  /** @test */
  public function titleShouldBeAjouterUnNouvelAgenda() {
    $this->assertXPathContentContains('//h1', 'Modifier un agenda');
  }


  /** @test */
  public function formShouldContainsInputForLabel() {
    $this->assertXPath('//form//input[@name="label"][@value="Extra Agenda"]');
  }


  /** @test */
  public function formShouldContainsInputForUrl() {
    $this->assertXPath('//form//input[@name="url"][@type="url"][@value="http://external.agenda.com/export?type=ics"]');
  }


  /** @test */
  public function formShouldContainsRootCategorySelector() {
    $this->assertXPathContentContains('//form//select[@name="cat_id"]/optgroup[@label="Valleiry"]/option[@value="1"][@selected="selected"]',
                                      'Events');
  }


  /** @test */
  public function categorySelectorShouldContainsNoneOption() {
    $this->assertXPathContentContains('//select[@name="cat_id"]//option[@value="0"]',
                                      'Aucune');
  }


  /** @test */
  public function formShouldContainsLocationSelector() {
    $this->assertXPathContentContains('//select[@name="id_lieu"]/option[@value="0"][@selected="selected"]', 'Aucun');
  }


  /** @test */
  public function formShouldContainsWorkflowOptions() {
    $this->assertXPath('//input[@type="radio"][@name="status"][@value="' . Class_Article::STATUS_VALIDATED . '"][@checked="checked"]');
  }
}




class ExternalAgendasAdminEditWithWorkflowPostTest extends ExternalAgendasAdminTestCase {
  protected $agenda;

  public function setUp() {
    parent::setUp();
    Class_AdminVar::set('WORKFLOW', 1);

    $this->fixture('Class_ExternalAgenda',
                   ['id' => 34,
                    'label' => 'Extra Agenda',
                    'url' => 'http://external.agenda.com/export?type=ics',
                    'cat_id' => 1,
                    'id_lieu' => 0,
                    'status' => Class_Article::STATUS_VALIDATED]);

    $this->postDispatch('/admin/external-agendas/edit/id/34',
                        ['label' => 'Wonderful Agenda',
                         'url' => 'http://external.agenda.com/export?type=ics&sort=asc',
                         'cat_id' => 2,
                         'id_lieu' => 22,
                         'status' => Class_Article::STATUS_DRAFT]);

    $this->agenda = Class_ExternalAgenda::find(34);
  }


  /** @test */
  public function agendaLabelShouldBecomeWonderfulAgenda() {
    $this->assertEquals('Wonderful Agenda', $this->agenda->getLabel());
  }


  /** @test */
  public function agendaUrlShouldBecomeExternalDotAgendaDotCom() {
    $this->assertEquals('http://external.agenda.com/export?type=ics&sort=asc', $this->agenda->getUrl());
  }


  /** @test */
  public function agendaCategorieShouldBecomeOthers() {
    $this->assertEquals('Others', $this->agenda->getCategory()->getLibelle());
  }

  /** @test */
  public function agendaLocationShouldBecomeWonderful() {
    $this->assertEquals('Wonderful location', $this->agenda->getLocation()->getLibelle());
  }


  /** @test */
  public function agendaStatusShouldBecomeDraft() {
    $this->assertEquals(Class_Article::STATUS_DRAFT, $this->agenda->getStatus());
  }
}




class ExternalAgendasAdminDeleteTest extends ExternalAgendasAdminTestCase {

  public function setUp() {
    parent::setUp();
    Class_AdminVar::set('WORKFLOW', 1);

    $this->fixture('Class_ExternalAgenda',
                   ['id' => 34,
                    'label' => 'Extra Agenda',
                    'url' => 'http://external.agenda.com/export?type=ics',
                    'cat_id' => 1,
                    'id_lieu' => 0,
                    'status' => Class_Article::STATUS_VALIDATED]);

    $this->dispatch('/admin/external-agendas/delete/id/34', true);
  }


  /** @test */
  public function extraAgendaShouldBeDeleted() {
    $this->assertNull(Class_ExternalAgenda::find(34));
  }
}




class ExternalAgendasAdminImportErrorsTest extends ExternalAgendasAdminTestCase {
  /** @test */
  public function unknownAgendaShouldRedirectToIndex() {
    $this->dispatch('/admin/external-agendas/import/id/999', true);
    $this->assertRedirectTo('/admin/external-agendas/index');
  }
}



class ExternalAgendasAdminImportTest extends ExternalAgendasAdminTestCase {
  public function setUp() {
    parent::setUp();

    Class_AdminVar::set('WORKFLOW', 1);

    $this->dispatch('/admin/external-agendas/import/id/124', true);
    Class_Article::clearCache();
  }


  /** @test */
  public function titleShouldBeMoissonageDesEvenements() {
    $this->assertXPathContentContains('//h1', 'Moissonnage des évènements de l\'agenda "Personal Agenda"');
  }


  /** @test */
  public function pageShouldContainsABackButton() {
    $this->assertXPathContentContains('//div[contains(@onclick, "replace(\'/admin/external-agendas\')")]//td',
                                      'Retour à la liste des agendas');
  }


  /** @test */
  public function pageShouldContainsNineEventsCreated() {
    $this->assertXPathContentContains('//h2', 'Nombre d\'évènements créés : 9');
  }


  /** @test */
  public function firstEventTitleLinkShouldBeEtSiOnPartageaitDesPoesies() {
    $this->assertXPathContentContains('//li/a[@target="_blank"][contains(@href, "admin/cms/edit/id/1")]', 'Et si on partageait des poésies');
  }


  /** @test */
  public function firstArticleContenuShouldContainsAtelierPoesie() {
    $this->assertEquals('<p>Atelier poésie théâtre, animé par la Cie de l\'Interlock.<br><br>De 7 à 12 ans<br><br>Sur inscription.</p><a href="http://www.bm-lille.fr/agenda/et-si-on-partageait-des-poesies/">Voir les détails</a>',
                        Class_Article::find(1)->getContenu());
  }


  /** @test */
  public function firstArticleEventDebutShouldBe2016_02_24_13_30() {
    $this->assertEquals('2016-02-24 13:30',
                        Class_Article::find(1)->getEventsDebut());
  }


  /** @test */
  public function firstArticleLocationShouldBeEmpty() {
    $this->assertEmpty(Class_Article::find(1)->getLieu());
  }


  /** @test */
  public function firstArticleStatusShouldBeDraft() {
    $this->assertTrue(Class_Article::find(1)->isStatusDraft());
  }


  /** @test */
  public function firstArticleCreatedDateShouldBe2016_02_06_09_19() {
    $this->assertEquals('2016-02-06 09:19:32',
                        Class_Article::find(1)->getDateCreation());
  }


  /** @test */
  public function firstArticleLastModifiedDateShouldBe2016_02_06_10_21() {
    $this->assertEquals('2016-02-06 10:21:12',
                        Class_Article::find(1)->getDateMaj());
  }


  /** @test */
  public function firstArticleEventFinShouldBe2016_05_25_12_30() {
    $this->assertEquals('2016-05-25 13:30',
                        Class_Article::find(1)->getEventsFin());
  }


  /** @test */
  public function firstArticleIdOrigineShouldBef568900543c13d9d6b4d7253ba31fc2f() {
    $this->assertEquals(md5('4871-1456317000-1464175800@www.bm-lille.fr'),
                        Class_Article::find(1)->getIdOrigine());
  }


  /** @test */
  public function firstArticleRepositoryOrigineShouldBeExternalAgenda124() {
    $this->assertEquals('External_Agenda:124',
                        Class_Article::find(1)->getRepositoryOrigine());
  }


  /** @test */
  public function categoryPathShouldBeEventsSlashAtelier() {
    $this->assertEquals('/Events/Atelier', Class_Article::find(1)->getCategorie()->getPath());
  }


  /** @test */
  public function seventhArticleTitleShouldBeKiliCommaCommaCommaSpaceKiklik() {
    $this->assertEquals('Kili,,, kiklik', Class_Article::find(7)->getTitre());
  }


  /** @test */
  public function ninethArticleContenuShouldContainsUrlAfterDescription() {
    $this->assertContains('</p><a href=', Class_Article::find(9)->getContenu());
  }


  /** @test */
  public function EighthArticleContenuShouldNotHaveUrl() {
    $this->assertNotContains('a href=', Class_Article::find(8)->getContenu());
  }


  /** @test */
  public function EighthArticleCategoryPathShouldBeEvents() {
    $this->assertEquals('/Events', Class_Article::find(8)->getCategorie()->getPath());
  }
}




class ExternalAgendasAdminSecondImportTest extends ExternalAgendasAdminTestCase {
  public function setUp() {
    parent::setUp();

    Class_ExternalAgenda::find(124)
      ->setIdLieu(22)
      ->setStatus(Class_Article::STATUS_VALIDATED)
      ->import($this);

    Class_WebService_ICalendar::setDefaultHttpClient($this->mock()
                                                     ->whenCalled('open_url')
                                                     ->with('http://my.server.com/calendar.ics')
                                                     ->answers(file_get_contents(__DIR__.'/ical-event-second.ics'))
                                                     ->beStrict());

    $this->dispatch('/admin/external-agendas/import/id/124', true);
    Class_Article::clearCache();
  }


  /** @test */
  public function pageShouldContainsTwoEventsCreated() {
    $this->assertXPathContentContains('//h2',
                                      'Nombre d\'évènements créés : 2');
  }


  /** @test */
  public function pageShouldContainsTwoEventsUpdated() {
    $this->assertXPathContentContains('//h2',
                                      'Nombre d\'évènements mis à jour : 2');
  }


  /** @test */
  public function eleventhArticleLocationShouldBeWonderfulLocation() {
    $this->assertEquals('Wonderful location',
                        Class_Article::find(11)->getLieuLibelle());
  }


  /** @test */
  public function eleventhArticleStatusShouldBeValidated() {
    $this->assertTrue(Class_Article::find(11)->isStatusValidated());
  }


  /** @test */
  public function eleventhArticleTitleLinkShouldBeKili() {
    $this->assertXPathContentContains('//li/a[@target="_blank"][contains(@href, "admin/cms/edit/id/11")]',
                                      'Kili... et plus encore');
  }


  /** @test */
  public function shouldNotHaveAtelierDuplicates() {
    $this->assertEquals(1, Class_ArticleCategorie::countBy(['libelle' => 'Atelier']));
  }
}





class ExternalAgendasAdminErmesImportTest extends ExternalAgendasAdminTestCase {
  public function setUp() {
    parent::setUp();

    Class_WebService_ICalendar::setDefaultHttpClient($this->mock()
                                                     ->whenCalled('open_url')
                                                     ->with('http://my.server.com/calendar.ics')
                                                     ->answers(file_get_contents(__DIR__.'/ermes.ics'))
                                                     ->beStrict());

    $this->dispatch('/admin/external-agendas/import/id/124', true);
    Class_Article::clearCache();
  }



  /** @test */
  public function pageShouldContainsFiveEventsCreated() {
    $this->assertXPathContentContains('//h2',
                                      'Nombre d\'évènements créés : 5');
  }


  /** @test */
  public function firstEventDescriptionShouldContainsEntreeLibre() {
    $this->assertContains('entrée libre', Class_Article::find(1)->getContenu());
  }
}