1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
<?php
declare(strict_types=1);
namespace ProxyManagerTest\Autoloader;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use ProxyManager\Autoloader\Autoloader;
use ProxyManager\FileLocator\FileLocatorInterface;
use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
use ProxyManager\Inflector\ClassNameInflectorInterface;
use function class_exists;
use function file_put_contents;
use function spl_autoload_register;
use function spl_autoload_unregister;
use function sprintf;
use function sys_get_temp_dir;
use function uniqid;
/**
* Tests for {@see \ProxyManager\Autoloader\Autoloader}
*
* @covers \ProxyManager\Autoloader\Autoloader
* @group Coverage
*/
final class AutoloaderTest extends TestCase
{
private $autoloader;
/** @var FileLocatorInterface&MockObject */
private $fileLocator;
/** @var ClassNameInflectorInterface&MockObject */
private $classNameInflector;
/**
* @covers \ProxyManager\Autoloader\Autoloader::__construct
*/
protected function setUp(): void
{
$this->fileLocator = $this->createMock(FileLocatorInterface::class);
$this->classNameInflector = $this->createMock(ClassNameInflectorInterface::class);
$this->autoloader = new Autoloader($this->fileLocator, $this->classNameInflector);
}
/**
* @covers \ProxyManager\Autoloader\Autoloader::__invoke
*/
public function testWillNotAutoloadUserClasses(): void
{
/** @var class-string $className */
$className = 'Foo\\' . UniqueIdentifierGenerator::getIdentifier('Bar');
$this
->classNameInflector
->expects(self::once())
->method('isProxyClassName')
->with($className)
->willReturn(false);
self::assertFalse($this->autoloadWithoutFurtherAutoloaders($className));
}
/**
* @covers \ProxyManager\Autoloader\Autoloader::__invoke
*/
public function testWillNotAutoloadNonExistingClass(): void
{
/** @var class-string $className */
$className = 'Foo\\' . UniqueIdentifierGenerator::getIdentifier('Bar');
$this
->classNameInflector
->expects(self::once())
->method('isProxyClassName')
->with($className)
->willReturn(true);
$this
->fileLocator
->expects(self::once())
->method('getProxyFileName')
->willReturn(__DIR__ . '/non-existing');
self::assertFalse($this->autoloadWithoutFurtherAutoloaders($className));
}
/**
* @covers \ProxyManager\Autoloader\Autoloader::__invoke
*/
public function testWillNotAutoloadExistingClass(): void
{
self::assertFalse($this->autoloadWithoutFurtherAutoloaders(self::class));
}
/**
* @covers \ProxyManager\Autoloader\Autoloader::__invoke
*/
public function testWillAutoloadExistingFile(): void
{
$namespace = 'Foo';
$className = UniqueIdentifierGenerator::getIdentifier('Bar');
/** @var class-string $fqcn */
$fqcn = $namespace . '\\' . $className;
$fileName = sys_get_temp_dir() . '/foo_' . uniqid('file', true) . '.php';
file_put_contents($fileName, '<?php namespace ' . $namespace . '; class ' . $className . '{}');
$this
->classNameInflector
->expects(self::once())
->method('isProxyClassName')
->with($fqcn)
->willReturn(true);
$this
->fileLocator
->expects(self::once())
->method('getProxyFileName')
->willReturn($fileName);
self::assertTrue($this->autoloadWithoutFurtherAutoloaders($fqcn));
self::assertTrue(class_exists($fqcn, false));
}
/** @psalm-param class-string $className */
private function autoloadWithoutFurtherAutoloaders(string $className): bool
{
$failingAutoloader = function (string $className): void {
$this->fail(sprintf('Fallback autoloading was triggered to load "%s"', $className));
};
spl_autoload_register($failingAutoloader);
$result = $this->autoloader->__invoke($className);
spl_autoload_unregister($failingAutoloader);
return $result;
}
}
|