| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 | <?php
namespace Gedmo\Tree;
use Doctrine\Common\EventManager;
use Tool\BaseTestCaseMongoODM;
use Doctrine\Common\Util\Debug;
use Tree\Fixture\RootCategory;
use Tree\Fixture\Mock\TreeListenerMock;
/**
 * These are tests for Tree behavior
 *
 * @author Gustavo Falco <comfortablynumb84@gmail.com>
 * @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
 * @package Gedmo.Tree
 * @link http://www.gediminasm.org
 * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
 */
class MaterializedPathODMMongoDBTreeLockingTest extends BaseTestCaseMongoODM
{
    const ARTICLE = "Tree\\Fixture\\Document\\Article";
    protected $config;
    protected $listener;
    protected function setUp()
    {
        parent::setUp();
        $this->listener = new TreeListenerMock;
        $evm = new EventManager;
        $evm->addEventSubscriber($this->listener);
        $this->getMockDocumentManager($evm);
        $meta = $this->dm->getClassMetadata(self::ARTICLE);
        $this->config = $this->listener->getConfiguration($this->dm, $meta->name);
    }
    /**
     * @test
     */
    public function modifyingANodeWhileItsTreeIsLockedShouldThrowAnException()
    {
        // By default, TreeListenerMock disables the release of the locks
        // for testing purposes
        $this->setExpectedException('Gedmo\Exception\TreeLockingException');
        $article = $this->createArticle();
        $article->setTitle('1');
        $article2 = $this->createArticle();
        $article2->setTitle('2');
        $article2->setParent($article);
        $this->dm->persist($article);
        $this->dm->persist($article2);
        $this->dm->flush();
        $this->dm->refresh($article);
        $this->dm->refresh($article2);
        $article2->setTitle('New title');
        $this->dm->flush();
    }
    /**
     * @test
     */
    public function modifyingANodeWhileItsTreeIsNotLockedShouldNotThrowException()
    {
        $article = $this->createArticle();
        $article->setTitle('1');
        $article2 = $this->createArticle();
        $article2->setTitle('2');
        $article2->setParent($article);
        // These tree will be locked after flush, simulating concurrency
        $this->dm->persist($article);
        $this->dm->persist($article2);
        $this->dm->flush();
        $this->dm->clear();
        // These one will release the lock as normal
        $this->listener->setReleaseLocks(true);
        
        $article3 = $this->createArticle();
        $article3->setTitle('3');
        $this->dm->persist($article3);
        $this->dm->flush();
        // This should NOT throw an exception
        $article3->setTitle('New title');
        $this->dm->flush();
        
        // But this should throw it, because the root of its tree ($article) is still locked
        $this->setExpectedException('Gedmo\Exception\TreeLockingException');
        
        $repo = $this->dm->getRepository(self::ARTICLE);
        $article2 = $repo->findOneByTitle('2');
        $article2->setTitle('New title 2');
        $this->dm->flush();
    }
    public function createArticle()
    {
        $class = self::ARTICLE;
        return new $class;
    }
}
 |