Skip to content
ConfigurationTest.php 6.93 KiB
Newer Older
<?php

namespace Higidi\Lock\Tests\Unit\Configuration;

use Higidi\Lock\Configuration\Configuration;
use Higidi\Lock\Strategy\MutexAdapterStrategy;
use Nimut\TestingFramework\TestCase\UnitTestCase;
use NinjaMutex\Lock\LockInterface;
use NinjaMutex\Mutex;
use TYPO3\CMS\Core\Locking\LockingStrategyInterface;
use TYPO3\CMS\Core\Locking\SimpleLockStrategy;
use TYPO3\CMS\Core\SingletonInterface;

/**
 * Test case for "\Higidi\Lock\Configuration\Configuration".
 *
 * @covers \Higidi\Lock\Configuration\Configuration
 */
class ConfigurationTest extends UnitTestCase
{
    /**
     * @var bool
     */
    protected $backupGlobals = true;

    /**
     * @test
     */
    public function itIsASingleton()
    {
        $sut = new Configuration();

        $this->assertInstanceOf(SingletonInterface::class, $sut);
    }

    /**
     * @test
     */
    public function itCanBeEnabledByInitializingGlobalsConfigurationArray()
    {
        $GLOBALS['TYPO3_CONF_VARS']['SYS']['locking'] = [];

        $sut = new Configuration();

        $this->assertTrue($sut->isActive());
    }

    /**
     * @return array
     */
    public function activeStatusDataProvider()
    {
        return [
            'disabled' => [false],
            'enabled' => [true],
        ];
    }

    /**
     * @test
     * @dataProvider activeStatusDataProvider
     *
     * @param bool $active
     */
    public function itIsPossibleToActivateOrDeactivateViaGlobalsConfigurationArray($active)
    {
        $GLOBALS['TYPO3_CONF_VARS']['SYS']['locking'] = [
            'active' => $active,
        ];

        $sut = new Configuration();

        $this->assertSame($active, $sut->isActive());
    }

    /**
     * @test
     * @dataProvider activeStatusDataProvider
     *
     * @param bool $active
     */
    public function itIsPossibleToActivateOrDeactivateViaConfigurationArray($active)
    {
        $configuration = [
            'active' => $active,
        ];

        $sut = new Configuration($configuration);

        $this->assertSame($active, $sut->isActive());
    }

    /**
     * @test
     */
    public function itIsPossibleToSetStrategyViaGlobalsConfigurationArray()
    {
        $strategy = $this->prophesize(LockingStrategyInterface::class)->reveal();
        $className = get_class($strategy);

        $GLOBALS['TYPO3_CONF_VARS']['SYS']['locking'] = [
            'strategy' => $className,
        ];

        $sut = new Configuration();

        $this->assertSame($className, $sut->getStrategy());
    }

    /**
     * @test
     */
    public function itIsPossibleToSetStrategyViaConfigurationArray()
    {
        $strategy = $this->prophesize(LockingStrategyInterface::class)->reveal();
        $className = get_class($strategy);

        $configuration = [
            'active' => true,
            'strategy' => $className,
        ];

        $sut = new Configuration($configuration);

        $this->assertSame($className, $sut->getStrategy());
    }

    /**
     * @test
     */
    public function itIsPossibleToSetMutexViaGlobalsConfigurationArray()
    {
        $mutex = $this->prophesize(Mutex::class)->reveal();
        $className = get_class($mutex);

        $GLOBALS['TYPO3_CONF_VARS']['SYS']['locking'] = [
            'mutex' => $className,
        ];

        $sut = new Configuration();

        $this->assertSame($className, $sut->getMutex());
    }

    /**
     * @test
     */
    public function itIsPossibleToSetMutexViaConfigurationArray()
    {
        $mutex = $this->prophesize(Mutex::class)->reveal();
        $className = get_class($mutex);

        $configuration = [
            'active' => true,
            'mutex' => $className,
        ];

        $sut = new Configuration($configuration);

        $this->assertSame($className, $sut->getMutex());
    }

    /**
     * @test
     */
    public function itIsPossibleToSetLockImplementationViaGlobalsConfigurationArray()
    {
        $lockImplementation = $this->prophesize(LockInterface::class)->reveal();
        $className = get_class($lockImplementation);

        $GLOBALS['TYPO3_CONF_VARS']['SYS']['locking'] = [
            'lockImplementation' => $className,
        ];

        $sut = new Configuration();

        $this->assertSame($className, $sut->getLockImplementation());
    }

    /**
     * @test
     */
    public function itIsPossibleToSetLockImplementationViaConfigurationArray()
    {
        $lockImplementation = $this->prophesize(LockInterface::class)->reveal();
        $className = get_class($lockImplementation);

        $configuration = [
            'active' => true,
            'lockImplementation' => $className,
        ];

        $sut = new Configuration($configuration);

        $this->assertSame($className, $sut->getLockImplementation());
    }

    /**
     * @test
     */
    public function itIsDisabledByDefault()
    {
        $sut = new Configuration();
        $active = $sut->isActive();

        $this->assertFalse($active);
    }

    /**
     * @test
     */
    public function itCanBeEnabled()
    {
        $sut = new Configuration();
        $this->assertFalse($sut->isActive());

        $sut->setActive(true);
        $this->assertTrue($sut->isActive());
    }

    /**
     * @test
     */
    public function itHasAsDefaultStrategyTheSimpleLockingStrategy()
    {
        $sut = new Configuration();
        $className = $sut->getStrategy();

        $this->assertSame(SimpleLockStrategy::class, $className);
    }

    /**
     * @test
     * @expectedException \Higidi\Lock\Configuration\Exception\InvalidStrategyException
     * @expectedExceptionCode 1510177679
     */
    public function itThrowsAnInvalidStrategyExceptionIfStrategyDoNotImplementTheLockingStrategyInterface()
    {
        $configuration = [
            'strategy' => \stdClass::class,
        ];

        new Configuration($configuration);
    }

    /**
     * @test
     */
    public function itDetectsTheMutexAdapterStrategy()
    {
        $strategy = $this->prophesize(MutexAdapterStrategy::class)->reveal();
        $className = get_class($strategy);
        $configuration = [
            'active' => true,
            'strategy' => $className,
        ];
        $sut = new Configuration($configuration);

        $this->assertTrue($sut->isMutexStrategy());
    }

    /**
     * @test
     */
    public function itHasADefaultMutex()
    {
        $sut = new Configuration();
        $className = $sut->getMutex();

        $this->assertSame(Mutex::class, $className);
    }

    /**
     * @test
     * @expectedException \Higidi\Lock\Configuration\Exception\InvalidMutexException
     * @expectedExceptionCode 1510177680
     */
    public function itThrowsAnInvalidMutexExceptionIfMutexDoNotExtendTheBaseMutex()
    {
        $configuration = [
            'mutex' => \stdClass::class,
        ];

        new Configuration($configuration);

    /**
     * @test
     */
    public function itHasNullAsDefaultLockImplementation()
    {
        $sut = new Configuration();

        $this->assertNull($sut->getLockImplementation());
    }