1
0
mirror of https://github.com/danog/psalm.git synced 2024-12-11 08:49:52 +01:00
psalm/tests/Config/PluginListTest.php
2022-01-19 19:29:16 +01:00

190 lines
5.3 KiB
PHP

<?php
namespace Psalm\Tests\Config;
use InvalidArgumentException;
use Prophecy\PhpUnit\ProphecyTrait;
use Prophecy\Prophecy\ObjectProphecy;
use Psalm\Config;
use Psalm\Internal\PluginManager\ComposerLock;
use Psalm\Internal\PluginManager\ConfigFile;
use Psalm\Internal\PluginManager\PluginList;
use Psalm\Internal\RuntimeCaches;
use Psalm\Tests\TestCase;
/** @group PluginManager */
class PluginListTest extends TestCase
{
use ProphecyTrait;
/** @var ObjectProphecy<ConfigFile> */
private $config_file;
/** @var ObjectProphecy<Config> */
private $config;
/** @var ObjectProphecy<ComposerLock> */
private $composer_lock;
public function setUp(): void
{
RuntimeCaches::clearAll();
$this->config = $this->prophesize(Config::class);
$this->config->getPluginClasses()->willReturn([]);
$this->config_file = $this->prophesize(ConfigFile::class);
$this->config_file->getConfig()->willReturn($this->config->reveal());
$this->composer_lock = $this->prophesize(ComposerLock::class);
$this->composer_lock->getPlugins()->willReturn([]);
}
/**
* @test
*/
public function pluginsPresentInConfigAreEnabled(): void
{
$this->config->getPluginClasses()->willReturn([
['class' => 'a\b\c', 'config' => null],
['class' => 'c\d\e', 'config' => null],
]);
$plugin_list = new PluginList($this->config_file->reveal(), $this->composer_lock->reveal());
$this->assertSame([
'a\b\c' => null,
'c\d\e' => null,
], $plugin_list->getEnabled());
}
/**
* @test
*/
public function pluginsPresentInPackageLockOnlyAreAvailable(): void
{
$this->config->getPluginClasses()->willReturn([
['class' => 'a\b\c', 'config' => null],
]);
$this->composer_lock->getPlugins()->willReturn([
'vendor/package' => 'a\b\c',
'another-vendor/another-package' => 'c\d\e',
]);
$plugin_list = new PluginList($this->config_file->reveal(), $this->composer_lock->reveal());
$this->assertSame([
'c\d\e' => 'another-vendor/another-package',
], $plugin_list->getAvailable());
}
/**
* @test
*/
public function pluginsPresentInPackageLockAndConfigHavePluginPackageName(): void
{
$this->config->getPluginClasses()->willReturn([
['class' => 'a\b\c', 'config' => null],
]);
$this->composer_lock->getPlugins()->willReturn([
'vendor/package' => 'a\b\c',
]);
$plugin_list = new PluginList($this->config_file->reveal(), $this->composer_lock->reveal());
$this->assertSame([
'a\b\c' => 'vendor/package',
], $plugin_list->getEnabled());
}
/**
* @test
*/
public function canFindPluginClassByClassName(): void
{
$plugin_list = new PluginList($this->config_file->reveal(), $this->composer_lock->reveal());
$this->assertSame('a\b\c', $plugin_list->resolvePluginClass('a\b\c'));
}
/**
* @test
*/
public function canFindPluginClassByPackageName(): void
{
$this->composer_lock->getPlugins()->willReturn([
'vendor/package' => 'a\b\c',
]);
$plugin_list = new PluginList($this->config_file->reveal(), $this->composer_lock->reveal());
$this->assertSame('a\b\c', $plugin_list->resolvePluginClass('vendor/package'));
}
/**
* @test
*/
public function canShowAvailablePluginsWithoutAConfigFile(): void
{
$this->composer_lock->getPlugins()->willReturn([
'vendor/package' => 'a\b\c',
'another-vendor/another-package' => 'c\d\e',
]);
$plugin_list = new PluginList(null, $this->composer_lock->reveal());
$this->assertSame([
'a\b\c' => 'vendor/package',
'c\d\e' => 'another-vendor/another-package',
], $plugin_list->getAvailable());
}
/**
* @test
*/
public function enabledPackageIsEnabled(): void
{
$this->config->getPluginClasses()->willReturn([
['class' => 'a\b\c', 'config' => null],
]);
$plugin_list = new PluginList($this->config_file->reveal(), $this->composer_lock->reveal());
$this->assertTrue($plugin_list->isEnabled('a\b\c'));
}
/**
* @test
*/
public function errorsOutWhenTryingToResolveUnknownPlugin(): void
{
$plugin_list = new PluginList($this->config_file->reveal(), $this->composer_lock->reveal());
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessageMatches('/unknown plugin/i');
$plugin_list->resolvePluginClass('vendor/package');
}
/**
* @test
*/
public function pluginsAreEnabledInConfigFile(): void
{
$plugin_list = new PluginList($this->config_file->reveal(), $this->composer_lock->reveal());
$this->config_file->addPlugin('a\b\c')->shouldBeCalled();
$plugin_list->enable('a\b\c');
}
/**
* @test
*/
public function pluginsAreDisabledInConfigFile(): void
{
$plugin_list = new PluginList($this->config_file->reveal(), $this->composer_lock->reveal());
$this->config_file->removePlugin('a\b\c')->shouldBeCalled();
$plugin_list->disable('a\b\c');
}
}