ateliers55/tests/unit/Grav/Common/GPM/GPMTest.php

330 lines
13 KiB
PHP

<?php
use 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'));
}
}