An error occurred while loading the file. Please try again.
-
Laurent authored06a11c39
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());
}
}