| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329 | <?phpuse Codeception\Util\Fixtures;use Grav\Common\Grav;use Grav\Common\GPM\GPM;define('EXCEPTION_BAD_FORMAT', 1);define('EXCEPTION_INCOMPATIBLE_VERSIONS', 2);/** * Class GpmStub */class GpmStub extends GPM{    /** @var array */    public $data;    /**     * @inheritdoc     */    public function findPackage($search, $ignore_exception = false)    {        return $this->data[$search] ?? false;    }    /**     * @inheritdoc     */    public function findPackages($searches = [])    {        return $this->data;    }}/** * Class InstallCommandTest */class GpmTest extends \Codeception\TestCase\Test{    /** @var Grav $grav */    protected $grav;    /** @var GpmStub */    protected $gpm;    protected function _before(): void    {        $this->grav = Fixtures::get('grav');        $this->gpm = new GpmStub();    }    protected function _after(): void    {    }    public function testCalculateMergedDependenciesOfPackages(): void    {        //////////////////////////////////////////////////////////////////////////////////////////        // First working example        //////////////////////////////////////////////////////////////////////////////////////////        $this->gpm->data = [            'admin' => (object)[                'dependencies' => [                    ['name' => 'grav', 'version' => '>=1.0.10'],                    ['name' => 'form', 'version' => '~2.0'],                    ['name' => 'login', 'version' => '>=2.0'],                    ['name' => 'errors', 'version' => '*'],                    ['name' => 'problems'],                ]            ],            'test' => (object)[                'dependencies' => [                    ['name' => 'errors', 'version' => '>=1.0']                ]            ],            'grav',            'form' => (object)[                'dependencies' => [                    ['name' => 'errors', 'version' => '>=3.2']                ]            ]        ];        $packages = ['admin', 'test'];        $dependencies = $this->gpm->calculateMergedDependenciesOfPackages($packages);        self::assertIsArray($dependencies);        self::assertCount(5, $dependencies);        self::assertSame('>=1.0.10', $dependencies['grav']);        self::assertArrayHasKey('errors', $dependencies);        self::assertArrayHasKey('problems', $dependencies);        //////////////////////////////////////////////////////////////////////////////////////////        // Second working example        //////////////////////////////////////////////////////////////////////////////////////////        $packages = ['admin', 'form'];        $dependencies = $this->gpm->calculateMergedDependenciesOfPackages($packages);        self::assertIsArray($dependencies);        self::assertCount(5, $dependencies);        self::assertSame('>=3.2', $dependencies['errors']);        //////////////////////////////////////////////////////////////////////////////////////////        // Third working example        //////////////////////////////////////////////////////////////////////////////////////////        $this->gpm->data = [            'admin' => (object)[                'dependencies' => [                    ['name' => 'errors', 'version' => '>=4.0'],                ]            ],            'test' => (object)[                'dependencies' => [                    ['name' => 'errors', 'version' => '>=1.0']                ]            ],            'another' => (object)[                'dependencies' => [                    ['name' => 'errors', 'version' => '>=3.2']                ]            ]        ];        $packages = ['admin', 'test', 'another'];        $dependencies = $this->gpm->calculateMergedDependenciesOfPackages($packages);        self::assertIsArray($dependencies);        self::assertCount(1, $dependencies);        self::assertSame('>=4.0', $dependencies['errors']);        //////////////////////////////////////////////////////////////////////////////////////////        // Test alpha / beta / rc        //////////////////////////////////////////////////////////////////////////////////////////        $this->gpm->data = [            'admin' => (object)[                'dependencies' => [                    ['name' => 'package1', 'version' => '>=4.0.0-rc1'],                    ['name' => 'package4', 'version' => '>=3.2.0'],                ]            ],            'test' => (object)[                'dependencies' => [                    ['name' => 'package1', 'version' => '>=4.0.0-rc2'],                    ['name' => 'package2', 'version' => '>=3.2.0-alpha'],                    ['name' => 'package3', 'version' => '>=3.2.0-alpha.2'],                    ['name' => 'package4', 'version' => '>=3.2.0-alpha'],                ]            ],            'another' => (object)[                'dependencies' => [                    ['name' => 'package2', 'version' => '>=3.2.0-beta.11'],                    ['name' => 'package3', 'version' => '>=3.2.0-alpha.1'],                    ['name' => 'package4', 'version' => '>=3.2.0-beta'],                ]            ]        ];        $packages = ['admin', 'test', 'another'];        $dependencies = $this->gpm->calculateMergedDependenciesOfPackages($packages);        self::assertSame('>=4.0.0-rc2', $dependencies['package1']);        self::assertSame('>=3.2.0-beta.11', $dependencies['package2']);        self::assertSame('>=3.2.0-alpha.2', $dependencies['package3']);        self::assertSame('>=3.2.0', $dependencies['package4']);        //////////////////////////////////////////////////////////////////////////////////////////        // Raise exception if no version is specified        //////////////////////////////////////////////////////////////////////////////////////////        $this->gpm->data = [            'admin' => (object)[                'dependencies' => [                    ['name' => 'errors', 'version' => '>=4.0'],                ]            ],            'test' => (object)[                'dependencies' => [                    ['name' => 'errors', 'version' => '>=']                ]            ],        ];        $packages = ['admin', 'test'];        try {            $this->gpm->calculateMergedDependenciesOfPackages($packages);            self::fail('Expected Exception not thrown');        } catch (Exception $e) {            self::assertEquals(EXCEPTION_BAD_FORMAT, $e->getCode());            self::assertStringStartsWith('Bad format for version of dependency', $e->getMessage());        }        //////////////////////////////////////////////////////////////////////////////////////////        // Raise exception if incompatible versions are specified        //////////////////////////////////////////////////////////////////////////////////////////        $this->gpm->data = [            'admin' => (object)[                'dependencies' => [                    ['name' => 'errors', 'version' => '~4.0'],                ]            ],            'test' => (object)[                'dependencies' => [                    ['name' => 'errors', 'version' => '~3.0']                ]            ],        ];        $packages = ['admin', 'test'];        try {            $this->gpm->calculateMergedDependenciesOfPackages($packages);            self::fail('Expected Exception not thrown');        } catch (Exception $e) {            self::assertEquals(EXCEPTION_INCOMPATIBLE_VERSIONS, $e->getCode());            self::assertStringEndsWith('required in two incompatible versions', $e->getMessage());        }        //////////////////////////////////////////////////////////////////////////////////////////        // Test dependencies of dependencies        //////////////////////////////////////////////////////////////////////////////////////////        $this->gpm->data = [            'admin' => (object)[                'dependencies' => [                    ['name' => 'grav', 'version' => '>=1.0.10'],                    ['name' => 'form', 'version' => '~2.0'],                    ['name' => 'login', 'version' => '>=2.0'],                    ['name' => 'errors', 'version' => '*'],                    ['name' => 'problems'],                ]            ],            'login' => (object)[                'dependencies' => [                    ['name' => 'antimatter', 'version' => '>=1.0']                ]            ],            'grav',            'antimatter' => (object)[                'dependencies' => [                    ['name' => 'something', 'version' => '>=3.2']                ]            ]        ];        $packages = ['admin'];        $dependencies = $this->gpm->calculateMergedDependenciesOfPackages($packages);        self::assertIsArray($dependencies);        self::assertCount(7, $dependencies);        self::assertSame('>=1.0.10', $dependencies['grav']);        self::assertArrayHasKey('errors', $dependencies);        self::assertArrayHasKey('problems', $dependencies);        self::assertArrayHasKey('antimatter', $dependencies);        self::assertArrayHasKey('something', $dependencies);        self::assertSame('>=3.2', $dependencies['something']);    }    public function testVersionFormatIsNextSignificantRelease(): void    {        self::assertFalse($this->gpm->versionFormatIsNextSignificantRelease('>=1.0'));        self::assertFalse($this->gpm->versionFormatIsNextSignificantRelease('>=2.3.4'));        self::assertFalse($this->gpm->versionFormatIsNextSignificantRelease('>=2.3.x'));        self::assertFalse($this->gpm->versionFormatIsNextSignificantRelease('1.0'));        self::assertTrue($this->gpm->versionFormatIsNextSignificantRelease('~2.3.x'));        self::assertTrue($this->gpm->versionFormatIsNextSignificantRelease('~2.0'));    }    public function testVersionFormatIsEqualOrHigher(): void    {        self::assertTrue($this->gpm->versionFormatIsEqualOrHigher('>=1.0'));        self::assertTrue($this->gpm->versionFormatIsEqualOrHigher('>=2.3.4'));        self::assertTrue($this->gpm->versionFormatIsEqualOrHigher('>=2.3.x'));        self::assertFalse($this->gpm->versionFormatIsEqualOrHigher('~2.3.x'));        self::assertFalse($this->gpm->versionFormatIsEqualOrHigher('1.0'));    }    public function testCheckNextSignificantReleasesAreCompatible(): void    {        /*         * ~1.0     is equivalent to >=1.0 < 2.0.0         * ~1.2     is equivalent to >=1.2 <2.0.0         * ~1.2.3   is equivalent to >=1.2.3 <1.3.0         */        self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('1.0', '1.2'));        self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('1.2', '1.0'));        self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('1.0', '1.0.10'));        self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('1.1', '1.1.10'));        self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('30.0', '30.10'));        self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('1.0', '1.1.10'));        self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('1.0', '1.8'));        self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('1.0.1', '1.1'));        self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('2.0.0-beta', '2.0'));        self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('2.0.0-rc.1', '2.0'));        self::assertTrue($this->gpm->checkNextSignificantReleasesAreCompatible('2.0', '2.0.0-alpha'));        self::assertFalse($this->gpm->checkNextSignificantReleasesAreCompatible('1.0', '2.2'));        self::assertFalse($this->gpm->checkNextSignificantReleasesAreCompatible('1.0.0-beta.1', '2.0'));        self::assertFalse($this->gpm->checkNextSignificantReleasesAreCompatible('0.9.99', '1.0.0'));        self::assertFalse($this->gpm->checkNextSignificantReleasesAreCompatible('0.9.99', '1.0.10'));        self::assertFalse($this->gpm->checkNextSignificantReleasesAreCompatible('0.9.99', '1.0.10.2'));    }    public function testCalculateVersionNumberFromDependencyVersion(): void    {        self::assertSame('2.0', $this->gpm->calculateVersionNumberFromDependencyVersion('>=2.0'));        self::assertSame('2.0.2', $this->gpm->calculateVersionNumberFromDependencyVersion('>=2.0.2'));        self::assertSame('2.0.2', $this->gpm->calculateVersionNumberFromDependencyVersion('~2.0.2'));        self::assertSame('1', $this->gpm->calculateVersionNumberFromDependencyVersion('~1'));        self::assertNull($this->gpm->calculateVersionNumberFromDependencyVersion(''));        self::assertNull($this->gpm->calculateVersionNumberFromDependencyVersion('*'));        self::assertSame('2.0.2', $this->gpm->calculateVersionNumberFromDependencyVersion('2.0.2'));    }}
 |