Skip to content
Extraits de code Groupes Projets
DependencyTest.php 11,5 ko
Newer Older
  • Learn to ignore specific revisions
  •  * Piwik - free/libre analytics platform
    
     *
     * @link http://piwik.org
     * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
    
    
    use Piwik\Plugin\Dependency;
    use Piwik\Plugin\Manager as PluginManager;
    
    use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
    
    use Piwik\Version;
    
    /**
    
    class DependencyTest extends IntegrationTestCase
    
    {
        /**
         * @var Dependency
         */
        private $dependency;
    
        public function setUp()
        {
            parent::setUp();
            $this->dependency = new Dependency();
        }
    
        public function test_getMissingDependencies_shouldReturnEmptyArray_IfNoInputGiven()
        {
            $this->assertMissingDependency(null, array());
            $this->assertMissingDependency(array(), array());
        }
    
        public function test_getMissingDependencies_EmptyVersion_ShouldBeIgnored()
        {
            $this->assertMissingDependency(array('php' => ''), array());
        }
    
        public function test_getMissingDependencies_multipleConditions()
        {
            $this->assertMissingDependency(array('php' => '<5.2', 'piwik' => '<2.0'), array(
                $this->missingPhp('<5.2'),
                $this->missingPiwik('<2.0')
            ));
    
            $this->assertMissingDependency(array('php' => '<5.2', 'piwik' => '<9.0'), array(
                $this->missingPhp('<5.2')
            ));
    
            $this->assertMissingDependency(array('php' => '<9.2', 'piwik' => '<2.0'), array(
                $this->missingPiwik('<2.0')
            ));
    
            $this->assertMissingDependency(array('php' => '<9.2', 'piwik' => '<9.0'), array());
        }
    
        public function test_getMissingDependencies_multipleConditions_differentConditions()
        {
            $this->assertMissingDependency(array('php' => '<5.2', 'piwik' => '>2.0'), array(
                $this->missingPhp('<5.2')
            ));
    
            $this->assertMissingDependency(array('php' => '>=5.3', 'piwik' => '<2.0'), array(
                $this->missingPiwik('<2.0')
            ));
    
            $this->assertMissingDependency(array('php' => '!=' . PHP_VERSION, 'piwik' => '<>' . Version::VERSION), array(
                $this->missingPhp('!=' . PHP_VERSION),
                $this->missingPiwik('<>' . Version::VERSION)
            ));
        }
    
    
    Thomas Steur's avatar
    Thomas Steur a validé
        public function test_getMissingVersion_AND_Condition()
    
        {
            $this->assertMissingDependency(array('php' => '<2.0,>=9.0', 'piwik' => '<2.0'), array(
                $this->missingPhp('<2.0,>=9.0', '<2.0, >=9.0'),
                $this->missingPiwik('<2.0')
            ));
        }
    
        public function test_getMissingDependencies_detectsPHPVersion()
        {
            $this->assertMissingDependency(array('php' => '>=2.1'), array());
            $this->assertMissingDependency(array('php' => '>=' . PHP_VERSION), array());
            $this->assertMissingDependency(array('php' => '>' . PHP_VERSION), array(
                $this->missingPhp('>' . PHP_VERSION)
            ));
            $this->assertMissingDependency(array('php' => '>=9.2'), array(
                $this->missingPhp('>=9.2')
            ));
        }
    
        public function test_getMissingDependencies_detectsPiwikVersion()
        {
            $this->assertMissingDependency(array('piwik' => '>=2.1'), array());
            $this->assertMissingDependency(array('piwik' => '>=' . Version::VERSION), array());
            $this->assertMissingDependency(array('piwik' => '>' . Version::VERSION), array(
                $this->missingPiwik('>' . Version::VERSION)
            ));
            $this->assertMissingDependency(array('piwik' => '>=9.2'), array(
                $this->missingPiwik('>=9.2')
            ));
        }
    
        public function test_getMissingDependencies_detectUnknownDependencyName()
        {
            $this->assertMissingDependency(array('unkNowN' => '>99.99'), array(
                $this->buildMissingDependecy('unkNowN', '', '>99.99')
            ));
            $this->assertMissingDependency(array('unkNowN' => '>=0.01'), array(
                $this->buildMissingDependecy('unkNowN', '', '>=0.01')
            ));
        }
    
        public function test_getMissingDependencies_detectsPluginVersion()
        {
    
            PluginManager::getInstance()->loadAllPluginsAndGetTheirInfo();
    
    
            $this->assertMissingDependency(array('Annotations' => '>=2.1'), array());
            $this->assertMissingDependency(array('Annotations' => '>=' . Version::VERSION), array());
            $this->assertMissingDependency(array('Annotations' => '>' . Version::VERSION), array(
                $this->buildMissingDependecy('Annotations', Version::VERSION, '>' . Version::VERSION)
            ));
            $this->assertMissingDependency(array('Annotations' => '>=9.2'), array(
                $this->buildMissingDependecy('Annotations', Version::VERSION, '>=9.2')
            ));
        }
    
        public function test_getMissingDependencies_setPiwikVersion()
        {
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $this->assertMissingDependency(array('piwik' => '>=9.2'), array($this->missingPiwik('>=9.2')));
    
    
            $this->dependency->setPiwikVersion('9.2');
    
    Thomas Steur's avatar
    Thomas Steur a validé
    
            $this->assertMissingDependency(array('piwik' => '>=9.2'), array());
        }
    
        public function test_getMissingVersion_EmptyCurrentAndRequiredVersion_ShouldBeIgnored()
        {
            $this->assertMissingVersion(null, null, array());
            $this->assertMissingVersion('', '', array());
        }
    
        public function test_getMissingVersion_EmptyCurrentVersion_ShouldBeDeclaredAsMissing()
        {
    
            $this->assertMissingVersion('', '>=5.5', array('>=5.5'));
    
    Thomas Steur's avatar
    Thomas Steur a validé
        }
    
        public function test_getMissingVersion_EmptyRequiredVersion_ShouldBeIgnored()
        {
            $this->assertMissingVersion('5.5', '', array());
        }
    
    
        public function test_getMissingVersion_shouldIgnoreAnyWhitespace()
        {
            $this->assertMissingVersion('5.5 ', '5.5', array());
            $this->assertMissingVersion(' 5.5 ', '5.5', array());
            $this->assertMissingVersion('5.5', ' 5.5', array());
            $this->assertMissingVersion('5.5', ' 5.5 ', array());
        }
    
    
    Thomas Steur's avatar
    Thomas Steur a validé
        public function test_getMissingVersion_NoComparisonDefined_ShouldUseGreatherThanOrEqualByDefault()
        {
            $this->assertMissingVersion('5.4', '5.2', array());
            $this->assertMissingVersion('5.4', '5.4', array());
            $this->assertMissingVersion('5.4', '9.2', array('>=9.2'));
        }
    
        public function test_getMissingVersion_GreatherThanOrEqual()
        {
            $this->assertMissingVersion('5.4', '>=5.2', array());
            $this->assertMissingVersion('5.4', '>=5.4', array());
            $this->assertMissingVersion('5.4', '>=9.2', array('>=9.2'));
        }
    
        public function test_getMissingVersion_GreatherThan()
        {
            $this->assertMissingVersion('5.4', '>5.2', array());
            $this->assertMissingVersion('5.4', '>5.4', array('>5.4'));
            $this->assertMissingVersion('5.4', '>9.2', array('>9.2'));
        }
    
        public function test_getMissingVersion_LowerThanOrEqual()
        {
            $this->assertMissingVersion('5.4', '<=5.2', array('<=5.2'));
            $this->assertMissingVersion('5.4', '<=5.4', array());
            $this->assertMissingVersion('5.4', '<=9.2', array());
        }
    
        public function test_getMissingVersion_lowerThan()
        {
            $this->assertMissingVersion('5.4', '<5.2', array('<5.2'));
            $this->assertMissingVersion('5.4', '<5.4', array('<5.4'));
            $this->assertMissingVersion('5.4', '<9.2', array());
        }
    
        public function test_getMissingVersion_notEqual()
        {
            $this->assertMissingVersion('5.4', '<>5.2', array());
            $this->assertMissingVersion('5.4', '<>5.4', array('<>5.4'));
            $this->assertMissingVersion('5.4', '<>9.2', array());
        }
    
        public function test_getMissingVersion_notEqualUsingBang()
        {
            $this->assertMissingVersion('5.4', '!=5.2', array());
            $this->assertMissingVersion('5.4', '!=5.4', array('!=5.4'));
            $this->assertMissingVersion('5.4', '!=9.2', array());
        }
    
        public function test_getMissingVersion_exact()
        {
            $this->assertMissingVersion('5.4', '==5.2', array('==5.2'));
            $this->assertMissingVersion('5.4', '==5.4', array());
            $this->assertMissingVersion('5.4', '==9.2', array('==9.2'));
        }
    
        public function test_getMissingVersion_AND_Condition_returnsOnlyNonMatchingVersions()
        {
            $this->assertMissingVersion('5.4', '<5.2,>9.0', array('<5.2', '>9.0'));
            $this->assertMissingVersion('5.4', '>5.2,<9.0', array());
            $this->assertMissingVersion('5.4', '>5.2,<9.0,<2.0', array('<2.0'));
            $this->assertMissingVersion('5.4', '>5.2,<9.0,<2.0,>=9.0', array('<2.0', '>=9.0'));
            $this->assertMissingVersion('5.4', '<2.0,>=9.0', array('<2.0', '>=9.0'));
    
        public function test_getMissingVersion_AND_Condition_shouldIgnoreAnyWhitespace()
        {
            $this->assertMissingVersion('5.2', '5.5 , 5.4,   5.3', array('>=5.5', '>=5.4', '>=5.3'));
            $this->assertMissingVersion('5.5', '5.5 , 5.4,   5.3', array());
            $this->assertMissingVersion(' 5.2 ', '5.5 , 5.4,   5.3', array('>=5.5', '>=5.4', '>=5.3'));
            $this->assertMissingVersion(' 5.2 ', '>5.5 , <5.4,   ==5.3', array('>5.5', '==5.3'));
            $this->assertMissingVersion(' 5.2 ', '>5.5 , !=5.4,   ==5.3', array('>5.5', '==5.3'));
        }
    
    
        public function test_getMissingVersion()
        {
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $this->assertMissingVersion('5.2', '<5.2,>9.0', array('<5.2', '>9.0'));
            $this->assertMissingVersion('5.2', '<=5.2,>9.0', array('>9.0'));
            $this->assertMissingVersion('5.1', '<5.2,>9.0', array('>9.0'));
            $this->assertMissingVersion('9.1', '<5.2,>9.0', array('<5.2'));
            $this->assertMissingVersion('5.2', '>=5.2,<=9.0', array());
            $this->assertMissingVersion('9.0', '>=5.2,<=9.0', array());
            $this->assertMissingVersion('6.4', '>=5.2,<=9.0', array());
    
        /**
         * @dataProvider getHasDepenedencyToDisabledPluginProvider
         */
        public function test_hasDependencyToDisabledPlugin($expectedHasDependency, $requires)
        {
            $this->assertSame($expectedHasDependency, $this->dependency->hasDependencyToDisabledPlugin($requires));
        }
    
        public function getHasDepenedencyToDisabledPluginProvider()
        {
            return array(
                array($expected = false, $requires = null),
                array($expected = false, $requires = array()),
                array($expected = false, $requires = array('php' => '<5.2', 'piwik' => '<2.0')),
                array($expected = false, $requires = array('php' => '<5.2', 'piwik' => '<2.0', 'CoreHome' => '2.15.0')),
                array($expected = false, $requires = array('CoreHome' => '<2.0', 'Actions' => '>=2.15.0')),
                array($expected = true, $requires = array('php' => '<5.2', 'piwik' => '<2.0', 'FooBar' => '2.15.0')),
            );
        }
    
    
        private function missingPiwik($requiredVersion, $causedBy = null)
        {
            return $this->buildMissingDependecy('piwik', Version::VERSION, $requiredVersion, $causedBy);
        }
    
        private function missingPhp($requiredVersion, $causedBy = null)
        {
            return $this->buildMissingDependecy('php', PHP_VERSION, $requiredVersion, $causedBy);
        }
    
        private function buildMissingDependecy($name, $currentVersion, $requiredVersion, $causedBy = null)
        {
            if (is_null($causedBy)) {
                $causedBy = $requiredVersion;
            }
    
            return array(
                'requirement'     => $name,
                'actualVersion'   => $currentVersion,
                'requiredVersion' => $requiredVersion,
                'causedBy'        => $causedBy
            );
        }
    
        private function assertMissingDependency($requires, $expectedMissing)
        {
            $missing = $this->dependency->getMissingDependencies($requires);
    
            $this->assertEquals($expectedMissing, $missing);
        }
    
    
    Thomas Steur's avatar
    Thomas Steur a validé
        private function assertMissingVersion($currentVersion, $requiredVersion, $expectedMissing)
        {
            $missing = $this->dependency->getMissingVersions($currentVersion, $requiredVersion);
    
            $this->assertEquals($expectedMissing, $missing);
        }