Skip to content
Snippets Groups Projects
AbonneControllerMultimediaTest.php 20.7 KiB
Newer Older
llaffont's avatar
llaffont committed
<?php
/**
 * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
 *
 * AFI-OPAC 2.0 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).
 *
 * AFI-OPAC 2.0 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 AFI-OPAC 2.0; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
 */

require_once 'AbstractControllerTestCase.php';

class AbonneControllerMultimediaAuthenticateTest extends AbstractControllerTestCase{
llaffont's avatar
llaffont committed
	public function setUp() {
		parent::setUp();
		Zend_Auth::getInstance()->clearIdentity();
		$laurent= Class_Users::getLoader()->newInstanceWithId(8)
									->setLogin("laurent")
									->setPassword("afi")
									->setNom('laffont')
									->setPrenom('laurent')
									->setRoleLevel(4)
									->setIdabon('bca2')
									->setNaissance('1978-02-17');
		
		$baptiste= Class_Users::getLoader()->newInstanceWithId(9)
									->setLogin("baptiste")
									->setPassword("afi")
									->setRoleLevel(2)
									->setNaissance('2005-02-17')
									->setDateFin('3000-01-01');
		
		$mireille= Class_Users::getLoader()->newInstanceWithId(10)
									->setLogin("mireille")
									->setPassword("afi")
									->setDateFin('1999-01-01');
		
		$arnaud= Class_Users::getLoader()->newInstanceWithId(11)
									->setLogin("arnaud")
									->setPassword("lelache");
		
		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Users')
						->whenCalled('findFirstBy')
						->with(array('login'=> 'laurent'))
						->answers($laurent)
						
						->whenCalled('findFirstBy')
						->with(array('login'=> 'baptiste'))
						->answers($baptiste)
						
						->whenCalled('findFirstBy')
						->with(array('login'=> 'mireille'))
						->answers($mireille)
						
						->whenCalled('findFirstBy')
						->with(array('login'=> 'arnaud'))
						->answers($arnaud)
						
						->whenCalled('findFirstBy')
						->answers(null);

		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_UserGroupMembership')
				->whenCalled('findAllBy')
				->with(array('role' => 'user', 'model' => $laurent))
				->answers(array(Class_UserGroupMembership::getLoader()
						->newInstance()
						->setUserGroup(Class_UserGroup::getLoader()
							->newInstanceWithId(1)
							->setLibelle('Devs agiles'))))

				->whenCalled('findAllBy')
				->with(array('role' => 'user', 'model' => $baptiste))
				->answers(array(Class_UserGroupMembership::getLoader()
						->newInstance()
						->setUserGroup(Class_UserGroup::getLoader()
							->newInstanceWithId(2)
							->setLibelle('Devs Oldschool'))))

				->whenCalled('findAllBy')
				->with(array('role' => 'user', 'model' => $arnaud))
				->answers(array(Class_UserGroupMembership::getLoader()
						->newInstance()
						->setUserGroup(Class_UserGroup::getLoader()
							->newInstanceWithId(3)
							->setLibelle('Patrons'))));
llaffont's avatar
llaffont committed
	/** @test */
	public function responseShouldNotBeARedirect() {
		$json = $this->getJson('/abonne/authenticate/login/laurent/password/afi');
		$this->assertNotRedirect();
	}


	/** @test */
	public function withoutPosteShouldReturnErrorMissingParameter() {
		$json = $this->getJson('/abonne/authenticate/login/laurent/password');
		$this->assertEquals('MissingParameter', $json->error);
	}


llaffont's avatar
llaffont committed
	/** @test */
	public function getAbonneZorkShouldReturnErrorUserNotFound() {
		$json= $this->getJson('/abonne/authenticate/login/zork/password/toto/poste/1');
llaffont's avatar
llaffont committed
		$this->assertEquals("UserNotFound", $json->error);
		
	}
	

	/** @test */
	public function authenticateAbonneLaurentPasswordXXXShouldReturnWrongPassword() {
		$json=$this->getJson('/abonne/authenticate/login/laurent/password/xxx/poste/1');
		$this->assertEquals("PasswordIsWrong", $json->error);	
llaffont's avatar
llaffont committed
	}

	
	/** @test */
	public function rightAuthenticationShouldNotReturnError() {
		$json = $this->getJson('/abonne/authenticate/login/laurent/password/afi/poste/1');
		$this->assertFalse(property_exists($json, 'error'));
llaffont's avatar
llaffont committed
		return $json;
	}
	
	
	/**
	 * @test 
	 * @depends rightAuthenticationShouldNotReturnError
	 */
	public function laurentIdShoudBe8($json) {
		$this->assertEquals('8', $json->id);
llaffont's avatar
llaffont committed
	}
	
	
	/**
	 * @test 
	 * @depends rightAuthenticationShouldNotReturnError
	 */
	public function laurentLoginShoudBelaurent($json) {
		$this->assertEquals('laurent', $json->login);
llaffont's avatar
llaffont committed
	}
	
	
	/**
	 * @test 
	 * @depends rightAuthenticationShouldNotReturnError
	 */
	public function laurentPasswordShoudBeAfi($json) {
		$this->assertEquals('afi',$json->password);
	}
	
	/**
	 * @test 
	 * @depends rightAuthenticationShouldNotReturnError
	 */
	public function laurentNomShoudBelaffont($json) {
		$this->assertEquals('laffont', $json->nom);
llaffont's avatar
llaffont committed
	}
	
	
	/**
	 * @test 
	 * @depends rightAuthenticationShouldNotReturnError
	 */
	public function laurentPrenomShoudBelaurent($json) {
		$this->assertEquals('laurent', $json->prenom);
llaffont's avatar
llaffont committed
	}
	
	
	/**
	 * @test 
	 * @depends rightAuthenticationShouldNotReturnError
	 */
	public function laurentDateNaissanceShoudBe1978_02_17($json) {
		$this->assertEquals('1978/02/17', $json->date_naissance);
llaffont's avatar
llaffont committed
	}
	
	
	/**
	 * @test 
	 * @depends rightAuthenticationShouldNotReturnError
	 */
	public function laurentGroupeShoudBeAdulteAbonneAdminAndAgile($json) {
		$this->assertEquals(array('adulte','abonne','admin_bib', 'Devs agiles'), $json->groupes);
	/** @test */
	public function baptisteGroupesShouldBeMineurAbonneAndOldSchool(){
		$json = $this->getJson('/abonne/authenticate/login/baptiste/password/afi/poste/1');
		$this->assertEquals(array('mineur','abonne_sigb', 'Devs Oldschool'), $json->groupes);	
	/** @test */
llaffont's avatar
llaffont committed
		public function mireilleAuthenticateShouldReturnSubscriptionExpired(){
		$json=$this->getJson('/abonne/authenticate/login/mireille/password/afi/poste/1');
llaffont's avatar
llaffont committed
		$this->assertEquals('SubscriptionExpired',$json->error);	
	}
	

	/** @test */
	public function arnaudGroupesShouldBeInviteAndPatrons() {
		$json=$this->getJson('/abonne/authenticate/login/arnaud/password/lelache/poste/1');
		$this->assertEquals(array('invite', 'Patrons'), $json->groupes);	
	}


	protected function getJson($url) {
		$this->dispatch($url);
		return json_decode($this->_response->getBody());
abstract class AbonneControllerMultimediaHoldTestCase extends AbstractControllerTestCase {
	protected $_session;
	public function setUp() {
		parent::setUp();
		$this->_session = new Zend_Session_Namespace('abonneController');
		$bean = new stdClass();
		$bean->location = 0;
		$bean->day = '';
		$bean->time = '';
		$bean->duration = 0;
		$bean->device = 0;
		$this->_session->holdBean = $this->_bean = $bean;
	}


	protected function _prepareLocationInSession() {
		Class_Multimedia_Location::getLoader()
				->newInstanceWithId(123)
				->setSlotSize(30)
				->setMaxSlots(4)
				->setHoldDelayMin(0)
				->setHoldDelayMax(60)
				->setDays('3,4')
				->setOpenHour('08:30')
				->setCloseHour('17:45');

	protected function _prepareDayInSession() {
		$this->_bean->day = '2012-09-09';
	}


	protected function _prepareTimeAndDurationInSession() {
		$this->_bean->time = '9:45';
		$this->_bean->duration = 45;
	}

	
	protected function _assertCurrentTimelineStep($step) {
		$this->_assertTimeLineStepWithClass($step, 'selected');
	}


	protected function _assertPassedTimelineStep($step) {
		$this->_assertTimeLineStepWithClass($step, 'passed');
	}


	protected function _assertTimeLineStepWithClass($step, $class) {
		$this->assertXPathContentContains('//div[@class="timeline"]//li[@class="' . $class . '"]',
			                                $step);
	}
class AbonneControllerMultimediaHoldLocationTest extends AbonneControllerMultimediaHoldTestCase {
	public function setUp() {
		parent::setUp();
		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Multimedia_Location')
				->whenCalled('findAllBy')
				->answers(array(
						Class_Multimedia_Location::getLoader()->newInstanceWithId(1)
						->setLibelle('Salle 1'),
						Class_Multimedia_Location::getLoader()->newInstanceWithId(2)
						->setLibelle('Salle 2')));
		$this->dispatch('/abonne/multimedia-hold-location', true);
	}


	/** @test */
	public function currentTimelineStepShouldBeLieu() {
		$this->_assertCurrentTimelineStep('Lieu');
	}
		

	/** @test */
	public function locationSalle1ShouldBePresent() {
		$this->assertXPathContentContains('//a[contains(@href, "/multimedia-hold-location/location/1")]', 'Salle 1');
	}


	/** @test */
	public function locationSalle2ShouldBePresent() {
		$this->assertXPathContentContains('//a[contains(@href, "/multimedia-hold-location/location/2")]', 'Salle 2');
	}
}


class AbonneControllerMultimediaHoldLocationChoiceTest extends AbonneControllerMultimediaHoldTestCase {
	public function setUp() {
		parent::setUp();
		$this->dispatch('/abonne/multimedia-hold-location/location/1', true);
	}


	/** @test */
	public function shouldRedirectToNextStep() {
		$this->assertRedirectTo('/abonne/multimedia-hold-day');
	}


	/** @test */
	public function beanShouldHaveLocationSet() {
		$this->assertEquals(1, $this->_session->holdBean->location);
class AbonneControllerMultimediaHoldDayTest extends AbonneControllerMultimediaHoldTestCase {
	public function setUp() {
		parent::setUp();
		$this->_prepareLocationInSession();
		$this->dispatch('/abonne/multimedia-hold-day', true);
	/** @test */
	public function currentTimelineStepShouldBeJour() {
		$this->_assertCurrentTimelineStep('Jour');
	}


	/** @test */
	public function timelineStepShouldBePassed() {
		$this->_assertPassedTimelineStep('Lieu');
	}


	/** @test */
	public function calendarShouldBePresent() {
		$this->assertXPath('//div[@class="calendar"]');
	}
}


class AbonneControllerMultimediaHoldDayChoiceTest extends AbonneControllerMultimediaHoldTestCase {
	public function setUp() {
		parent::setUp();
		$this->_prepareLocationInSession();
		$this->dispatch('/abonne/multimedia-hold-day/day/2012-09-09', true);
	}


	/** @test */
	public function shouldRedirectToNextStep() {
		$this->assertRedirectTo('/abonne/multimedia-hold-hours');
	}


	/** @test */
	public function beanShouldHaveDaySet() {
		$this->assertEquals('2012-09-09', $this->_session->holdBean->day);
	}
}


class AbonneControllerMultimediaHoldHoursTest extends AbonneControllerMultimediaHoldTestCase {
	public function setUp() {
		parent::setUp();
		$this->_prepareLocationInSession();
		$this->_prepareDayInSession();
		$this->dispatch('/abonne/multimedia-hold-hours', true);
	/** @test */
	public function currentTimelineStepShouldBeHoraires() {
		$this->_assertCurrentTimelineStep('Horaires');
	}
		

	/** @test */
	public function listOfStartTimesShouldBePresent() {
		$this->assertXPathCount('//select[@id="time"]/option', 19);
	}


	/** @test */
	public function startingAt10ShouldBePossible() {
		$this->assertXPathContentContains('//option[@value="10:00"]', '10h00');
	}


	/** @test */
	public function oneHourDurationOptionShouldBePresent() {
		$this->assertXPathContentContains('//option[@value="60"]', '1h');
	}


	/** @test */
	public function oneHourAndAHalfDurationLinkShouldBePresent() {
		$this->assertXPathContentContains('//option[@value="90"]', '1h30mn');
	}
}


class AbonneControllerMultimediaHoldHoursChoiceTest extends AbonneControllerMultimediaHoldTestCase {
	public function setUp() {
		parent::setUp();
		$this->_prepareLocationInSession();
		$this->_prepareDayInSession();
		$this->dispatch('/abonne/multimedia-hold-hours/time/' . urlencode('9:45') . '/duration/45', true);
	}


	/** @test */
	public function shouldRedirectToNextStep() {
		$this->assertRedirectTo('/abonne/multimedia-hold-device');
	}


	/** @test */
	public function beanShouldHaveTimeAndDurationSet() {
		$this->assertEquals('9:45', $this->_session->holdBean->time);
		$this->assertEquals('45', $this->_session->holdBean->duration);
class AbonneControllerMultimediaHoldHoursChooseAlreadyHeldTest extends AbonneControllerMultimediaHoldTestCase {
	public function setUp() {
		parent::setUp();
		$this->_prepareLocationInSession();
		$this->_prepareDayInSession();
		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Multimedia_DeviceHold')
				->whenCalled('countBetweenTimesForUser')
				->answers(1);
		$this->dispatch('/abonne/multimedia-hold-hours/time/' . urlencode('9:45') . '/duration/45', true);
	}


	/** @test */
	public function errorMessageShouldBePresent() {
		$this->assertXPathContentContains('//div[@class="error"]', 'Vous avez déjà une réservation dans ce créneau horaire');
	}
}


class AbonneControllerMultimediaHoldDeviceTest extends AbonneControllerMultimediaHoldTestCase {
	public function setUp() {
		parent::setUp();
		$this->_prepareLocationInSession();
		$this->_prepareDayInSession();
		$this->_prepareTimeAndDurationInSession();
		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Multimedia_DeviceGroup')
				->whenCalled('findAllBy')
				->answers(array(Class_Multimedia_DeviceGroup::getLoader()
						->newInstanceWithId(3)));

		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Multimedia_Device')
				->whenCalled('findAllBy')
				->answers(array(Class_Multimedia_Device::getLoader()
						->newInstanceWithId(1)
						->setLibelle('Poste 1')
						->setOs('Ubuntu Lucid')
						->setDisabled(0)));

		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Multimedia_DeviceHold')
				->whenCalled('countBy')
				->answers(0);
				
		$this->dispatch('/abonne/multimedia-hold-device', true);
	/** @test */
	public function currentTimelineStepShouldBePoste() {
		$this->_assertCurrentTimelineStep('Poste');
	}


	/** @test */
	public function posteUnShouldBeHoldable() {
		$this->assertXPathContentContains(
			'//a[contains(@href, "multimedia-hold-device/device/1")]',
			'Poste 1', $this->_response->getBody());
	}
}


class AbonneControllerMultimediaHoldDeviceChoiceTest extends AbonneControllerMultimediaHoldTestCase {
	public function setUp() {
		parent::setUp();
		$this->_prepareLocationInSession();
		$this->_prepareDayInSession();
		$this->_prepareTimeAndDurationInSession();
		$this->dispatch('/abonne/multimedia-hold-device/device/1', true);
	}


	/** @test */
	public function shouldRedirectToNextStep() {
		$this->assertRedirectTo('/abonne/multimedia-hold-confirm');
	}


	/** @test */
	public function beanShouldHaveDeviceSet() {
		$this->assertEquals(1, $this->_session->holdBean->device);
	}
}


class AbonneControllerMultimediaHoldConfirmTest extends AbonneControllerMultimediaHoldTestCase {
	public function setUp() {
		parent::setUp();
		$this->_prepareLocationInSession();
		$this->_prepareDayInSession();
		$this->_prepareTimeAndDurationInSession();
		$this->_bean->device = 23;
		Class_Multimedia_Device::getLoader()->newInstanceWithId(23)
				->setLibelle('Poste 1')
				->setOs('Ubuntu Lucid');
		$this->dispatch('/abonne/multimedia-hold-confirm', true);
	}


	/** @test */
	public function currentTimelineStepShouldBeConfirmation() {
		$this->_assertCurrentTimelineStep('Confirmation');
	}

		
	/** @test */
	public function locationShouldBeAntibes() {
		$this->assertXPathContentContains('//li', 'Lieu : Antibes');
	}


	/** @test */
	public function dayShouldBeSeptemberNine2012() {
		$this->assertXPathContentContains('//li', 'Jour : 09 septembre 2012');
	}


	/** @test */
	public function startTimeShouldBe9h45() {
		$this->assertXPathContentContains('//li', 'À partir de : 9h45');
	}


	/** @test */
	public function durationShouldBeFortyFiveMinutes() {
		$this->assertXPathContentContains('//li', 'Durée : 45mn');
	}


	/** @test */
	public function deviceShouldBePoste1() {
		$this->assertXPathContentContains('//li', 'Poste : Poste 1 - Ubuntu Lucid');
	}


	/** @test */
	public function confirmationLinkShouldBePresent() {
		$this->assertXPathContentContains('//a[contains(@href, "multimedia-hold-confirm/validate/1")]', 'Confirmer');


class AbonneControllerMultimediaHoldConfirmValidatedTest extends AbonneControllerMultimediaHoldTestCase {
	public function setUp() {
		parent::setUp();
		$this->_prepareLocationInSession();
		$this->_prepareDayInSession();
		$this->_prepareTimeAndDurationInSession();
		$this->_bean->device = 23;
		Class_Multimedia_Device::getLoader()->newInstanceWithId(23)
				->setLibelle('Poste 1')
				->setOs('Ubuntu Lucid');

		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Multimedia_DeviceHold')
				->whenCalled('save')
				->willDo(function ($model) {$model->setId(455);return true;});
		$this->dispatch('/abonne/multimedia-hold-confirm/validate/1', true);
	}


	/** @test */
	public function shouldRedirectToHoldView() {
		$this->assertRedirectTo('/abonne/multimedia-hold-view/id/455');
	}
}


class AbonneControllerMultimediaHoldViewTest extends AbonneControllerMultimediaHoldTestCase {
	public function setUp() {
		parent::setUp();
		Class_Multimedia_DeviceHold::getLoader()->newInstanceWithId(455)
				->setUser(Class_Users::getLoader()->getIdentity())
				->setDevice(Class_Multimedia_Device::getLoader()->newInstanceWithId(34)
					->setLibelle('Poste 34')
					->setOs('Archlinux')
					->setGroup(Class_Multimedia_DeviceGroup::getLoader()->newInstanceWithId(1)
						->setLibelle('Groupe 1')
						->setLocation(Class_Multimedia_Location::getLoader()->newInstanceWithId(1)
							->setLibelle('Antibes'))))
				->setStart(strtotime('2012-12-28 14:30:00'))
				->setEnd(strtotime('2012-12-28 16:00:00'));
		$this->dispatch('/abonne/multimedia-hold-view/id/455', true);
	}


	/** @test */
	public function locationShouldBeAntibes() {
		$this->assertXPathContentContains('//li', 'Lieu : Antibes');
	}


	/** @test */
	public function dayShouldBeSeptemberNine2012() {
		$this->assertXPathContentContains('//li', 'Jour : 28 décembre 2012');
	}


	/** @test */
	public function startTimeShouldBe14h30() {
		$this->assertXPathContentContains('//li', 'À partir de : 14h30');
	}


	/** @test */
	public function durationShouldBeNinetyMinutes() {
		$this->assertXPathContentContains('//li', 'Durée : 90mn');
	}


	/** @test */
	public function deviceShouldBePoste34() {
		$this->assertXPathContentContains('//li', 'Poste : Poste 34 - Archlinux');
	}


	/** @test */
	public function cancelationLinkShouldBePresent() {
		$this->assertXPath('//a[contains(@href, "multimedia-hold-view/id/455/delete/1")]');
	}
class AbonneControllerMultimediaHoldViewDeleteTest extends AbonneControllerMultimediaHoldTestCase {
	protected $_wrapper;
	
	public function setUp() {
		parent::setUp();
		Class_Multimedia_DeviceHold::getLoader()->newInstanceWithId(455)
				->setUser(Class_Users::getLoader()->getIdentity());
		$this->_wrapper = Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Multimedia_DeviceHold')
				->whenCalled('delete')
				->answers(null);
		$this->dispatch('/abonne/multimedia-hold-view/id/455/delete/1', true);
	}


	/** @test */
	public function deleteShouldHaveBeenCalled() {
		$this->assertTrue($this->_wrapper->methodHasBeenCalled('delete'));
	}

		
	/** @test */
	public function shouldRedirectToFicheAbonne() {
		$this->assertRedirectTo('/abonne/fiche');
	}
}


class AbonneControllerMultimediaHoldViewOfAnotherUserTest extends AbonneControllerMultimediaHoldTestCase {
	public function setUp() {
		parent::setUp();
		Class_Multimedia_DeviceHold::getLoader()->newInstanceWithId(455)
				->setUser(Class_Users::getLoader()->newInstanceWithId(999));
		$this->dispatch('/abonne/multimedia-hold-view/id/455', true);
	}


	/** @test */
	public function shouldRedirectToFicheAbonne() {
		$this->assertRedirectTo('/abonne/fiche');
	}
}


class AbonneControllerMultimediaHoldFicheAbonneTest extends AbstractControllerTestCase {
	public function setUp() {
		parent::setUp();
		Class_AdminVar::getLoader()->newInstanceWithId('MULTIMEDIA_KEY')
				->setValeur('aaaaaaaaaaaaaaabbaabba');
		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Multimedia_DeviceHold')
				->whenCalled('getFutureHoldsOfUser')
				->with(Class_Users::getLoader()->getIdentity())
				->answers(array(Class_Multimedia_DeviceHold::getLoader()->newInstanceWithId(12)
					->setStart(strtotime('2012-28-12 14:00:00'))
					->setEnd(strtotime('2012-28-12 15:00:00'))
					->setDevice(Class_Multimedia_Device::getLoader()->newInstanceWithId(34)
						->setLibelle('Poste 1')
						->setOs('Archlinux')
						->setGroup(Class_Multimedia_DeviceGroup::getLoader()->newInstanceWithId(3)
							->setLocation(Class_Multimedia_Location::getLoader()->newInstanceWithId(2)
								->setLibelle('Antibes'))))));
		$this->dispatch('/abonne/fiche', true);
	}


	/** @test */
	public function addHoldLinkShouldBePresent() {
		$this->assertXPath('//a[contains(@href, "multimedia-hold-location")]');
	}


	/** @test */
	public function viewHoldLinkShouldBePresent() {
		$this->assertXPath('//a[contains(@href, "multimedia-hold-view/id/12")]');
	}