Files
sterivein/tests/phpunit/Thelia/Tests/Action/FolderTest.php
2020-11-19 15:36:28 +01:00

320 lines
11 KiB
PHP

<?php
/*************************************************************************************/
/* This file is part of the Thelia package. */
/* */
/* Copyright (c) OpenStudio */
/* email : dev@thelia.net */
/* web : http://www.thelia.net */
/* */
/* For the full copyright and license information, please view the LICENSE.txt */
/* file that was distributed with this source code. */
/*************************************************************************************/
namespace Thelia\Tests\Action;
use Propel\Runtime\ActiveQuery\Criteria;
use Thelia\Action\Folder;
use Thelia\Core\Event\Folder\FolderCreateEvent;
use Thelia\Core\Event\Folder\FolderDeleteEvent;
use Thelia\Core\Event\Folder\FolderToggleVisibilityEvent;
use Thelia\Core\Event\Folder\FolderUpdateEvent;
use Thelia\Core\Event\UpdatePositionEvent;
use Thelia\Core\Event\UpdateSeoEvent;
use Thelia\Model\FolderQuery;
use Thelia\Tests\TestCaseWithURLToolSetup;
use Thelia\Model\Folder as FolderModel;
/**
* Class FolderTest
* @package Thelia\Tests\Action
* @author Manuel Raynaud <manu@raynaud.io>
*/
class FolderTest extends TestCaseWithURLToolSetup
{
use RewrittenUrlTestTrait;
use I18nTestTrait;
/** @var int folder id used in position tests */
protected static $folderIdForPositionTest = null;
public function getUpdateEvent(&$folder)
{
if (!$folder instanceof FolderModel) {
$folder = $this->getRandomFolder();
}
$event = new FolderUpdateEvent($folder->getId());
$event
->setVisible(1)
->setLocale($folder->getLocale())
->setTitle($folder->getTitle())
->setChapo($folder->getChapo())
->setDescription($folder->getDescription())
->setPostscriptum($folder->getPostscriptum())
->setParent($folder->getParent())
;
return $event;
}
public function getUpdateSeoEvent(&$folder)
{
if (!$folder instanceof FolderModel) {
$folder = $this->getRandomFolder();
}
$event = new UpdateSeoEvent($folder->getId());
$event
->setLocale($folder->getLocale())
->setMetaTitle($folder->getMetaTitle())
->setMetaDescription($folder->getMetaDescription())
->setMetaKeywords($folder->getMetaKeywords());
return $event;
}
public function processUpdateSeoAction($event)
{
$contentAction = new Folder();
return $contentAction->updateSeo($event, null, $this->getMockEventDispatcher());
}
/**
* @param FolderUpdateEvent $event
* @return FolderModel
*/
public function processUpdateAction($event)
{
$contentAction = new Folder();
$contentAction->update($event, null, $this->getMockEventDispatcher());
return $event->getFolder();
}
/**
* test folder creation
* @covers Thelia\Action\Folder::create
*/
public function testCreateFolder()
{
$event = new FolderCreateEvent();
$event
->setParent(0)
->setVisible(1)
->setLocale('en_US')
->setTitle('folder creation test');
$folderAction = new Folder();
$folderAction->create($event, null, $this->getMockEventDispatcher());
$folder = $event->getFolder();
$this->assertInstanceOf('Thelia\Model\Folder', $folder);
$this->assertEquals('folder creation test', $folder->getTitle());
$this->assertEquals(1, $folder->getVisible());
$this->assertEquals(0, $folder->getParent());
}
/**
* test update creation
* @covers Thelia\Action\Folder::update
*/
public function testUpdateFolder()
{
$folder = $this->getRandomFolder();
$visible = !$folder->getVisible();
$event = new FolderUpdateEvent($folder->getId());
$event
->setLocale('en_US')
->setTitle('test update folder')
->setVisible($visible)
->setChapo('test folder update chapo')
->setDescription('update folder description')
->setPostscriptum('update folder postscriptum')
->setParent(0)
;
$folderAction = new Folder();
$folderAction->update($event, null, $this->getMockEventDispatcher());
$updatedFolder = $event->getFolder();
$this->assertInstanceOf('Thelia\Model\Folder', $updatedFolder);
$this->assertEquals('test update folder', $updatedFolder->getTitle());
$this->assertEquals('test folder update chapo', $updatedFolder->getChapo());
$this->assertEquals('update folder description', $updatedFolder->getDescription());
$this->assertEquals('update folder postscriptum', $updatedFolder->getPostscriptum());
$this->assertEquals(0, $updatedFolder->getParent());
$this->assertEquals($visible, $updatedFolder->getVisible());
}
/**
* test folder removal
* @covers Thelia\Action\Folder::delete
*/
public function testDeleteFolder()
{
$folder = $this->getRandomFolder();
$event = new FolderDeleteEvent($folder->getId());
$folderAction = new Folder();
$folderAction->delete($event, null, $this->getMockEventDispatcher());
$deletedFolder = $event->getFolder();
$this->assertInstanceOf('Thelia\Model\Folder', $deletedFolder);
$this->assertTrue($deletedFolder->isDeleted());
}
/**
* test folder toggle visibility
* @covers Thelia\Action\Folder::toggleVisibility
*/
public function testToggleVisibility()
{
$folder = $this->getRandomFolder();
$visible = $folder->getVisible();
$event = new FolderToggleVisibilityEvent($folder);
$folderAction = new Folder();
$folderAction->toggleVisibility($event, null, $this->getMockEventDispatcher());
$updatedFolder = $event->getFolder();
$this->assertInstanceOf('Thelia\Model\Folder', $updatedFolder);
$this->assertEquals(!$visible, $updatedFolder->getVisible());
}
public function testUpdatePositionUp()
{
$folder = FolderQuery::create()
->filterByParent($this->getFolderIdForPositionTest())
->filterByPosition(1, Criteria::GREATER_THAN)
->findOne();
if (null === $folder) {
$this->fail('use fixtures before launching test, there is no folder in database');
}
$newPosition = $folder->getPosition()-1;
$event = new UpdatePositionEvent($folder->getId(), UpdatePositionEvent::POSITION_UP);
$folderAction = new Folder();
$folderAction->updatePosition($event, null, $this->getMockEventDispatcher());
$updatedFolder = FolderQuery::create()->findPk($folder->getId());
$this->assertEquals($newPosition, $updatedFolder->getPosition(), sprintf("new position is %d, new position expected is %d for folder %d", $newPosition, $updatedFolder->getPosition(), $updatedFolder->getId()));
}
public function testUpdatePositionDown()
{
$nextFolder = FolderQuery::create()
->filterByParent($this->getFolderIdForPositionTest())
->filterByPosition(2)
->findOne();
if (null === $nextFolder) {
$this->fail('use fixtures before launching test, there is not enough folder in database');
}
$folder = FolderQuery::create()
->filterByPosition(1)
->filterByParent($nextFolder->getParent())
->findOne();
if (null === $folder) {
$this->fail('use fixtures before launching test, there is not enough folder in database');
}
$newPosition = $folder->getPosition()+1;
$event = new UpdatePositionEvent($folder->getId(), UpdatePositionEvent::POSITION_DOWN);
$folderAction = new Folder();
$folderAction->updatePosition($event, null, $this->getMockEventDispatcher());
$updatedFolder = FolderQuery::create()->findPk($folder->getId());
$this->assertEquals($newPosition, $updatedFolder->getPosition(), sprintf("new position is %d, new position expected is %d for folder %d", $newPosition, $updatedFolder->getPosition(), $updatedFolder->getId()));
}
public function testUpdatePositionWithSpecificPosition()
{
$folder = FolderQuery::create()
->filterByParent($this->getFolderIdForPositionTest())
->filterByPosition(1, Criteria::GREATER_THAN)
->findOne();
if (null === $folder) {
$this->fail('use fixtures before launching test, there is no folder in database');
}
$event = new UpdatePositionEvent($folder->getId(), UpdatePositionEvent::POSITION_ABSOLUTE, 1);
$folderAction = new Folder();
$folderAction->updatePosition($event, null, $this->getMockEventDispatcher());
$updatedFolder = FolderQuery::create()->findPk($folder->getId());
$this->assertEquals(1, $updatedFolder->getPosition(), sprintf("new position is 1, new position expected is %d for folder %d", $updatedFolder->getPosition(), $updatedFolder->getId()));
}
/**
* generates a folder and its sub folders to be used in Position tests
*
* @return int the parent folder id
*/
protected function getFolderIdForPositionTest()
{
if (null === self::$folderIdForPositionTest) {
$folder = new FolderModel();
$folder->setParent(0);
$folder->setVisible(1);
$folder->setPosition(1);
$this->setI18n($folder);
$folder->save();
for ($i = 0; $i < 4; $i++) {
$subFolder = new FolderModel();
$subFolder->setParent($folder->getId());
$subFolder->setVisible(1);
$subFolder->setPosition($i + 1);
$this->setI18n($subFolder);
$subFolder->save();
}
self::$folderIdForPositionTest = $folder->getId();
}
return self::$folderIdForPositionTest;
}
/**
* @return \Thelia\Model\Folder
*/
protected function getRandomFolder()
{
$folder = FolderQuery::create()
->addAscendingOrderByColumn('RAND()')
->findOne();
if (null === $folder) {
$this->fail('use fixtures before launching test, there is no folder in database');
}
return $folder;
}
}