diff --git a/src/AbstractLocator.php b/src/AbstractLocator.php index f2915a7..27b2dbb 100644 --- a/src/AbstractLocator.php +++ b/src/AbstractLocator.php @@ -42,10 +42,12 @@ protected function availableReflections(): \Generator if ($reflection->hasIncludes()) { // We are not analyzing files which has includes, it's not safe to require such reflections - $this->getLogger()->warning( - \sprintf('File `%s` has includes and excluded from analysis', (string) $file), - ['file' => $file] - ); + if ($this->debug) { + $this->getLogger()->warning( + \sprintf('File `%s` has includes and excluded from analysis', (string) $file), + ['file' => $file] + ); + } continue; } @@ -86,16 +88,12 @@ protected function classReflection(string $class): \ReflectionClass $e = $e->getPrevious(); } - $this->getLogger()->error( - \sprintf( - '%s: %s in %s:%s', - $class, - $e->getMessage(), - $e->getFile(), - $e->getLine() - ), - ['error' => $e] - ); + if ($this->debug) { + $this->getLogger()->error( + \sprintf('%s: %s in %s:%s', $class, $e->getMessage(), $e->getFile(), $e->getLine()), + ['error' => $e] + ); + } throw new LocatorException($e->getMessage(), (int) $e->getCode(), $e); } finally { @@ -133,16 +131,12 @@ protected function enumReflection(string $enum): \ReflectionEnum $e = $e->getPrevious(); } - $this->getLogger()->error( - \sprintf( - '%s: %s in %s:%s', - $enum, - $e->getMessage(), - $e->getFile(), - $e->getLine() - ), - ['error' => $e] - ); + if ($this->debug) { + $this->getLogger()->error( + \sprintf('%s: %s in %s:%s', $enum, $e->getMessage(), $e->getFile(), $e->getLine()), + ['error' => $e] + ); + } throw new LocatorException($e->getMessage(), (int) $e->getCode(), $e); } finally { diff --git a/tests/AbstractLocatorTest.php b/tests/AbstractLocatorTest.php new file mode 100644 index 0000000..0a626c1 --- /dev/null +++ b/tests/AbstractLocatorTest.php @@ -0,0 +1,116 @@ +finder = new Finder(); + $this->finder->files()->in([__DIR__ . '/Classes'])->name('*.php'); + } + + public function testHasIncludesMessage(): void + { + $class = $this->getLocator(true); + $ref = new \ReflectionMethod($class, 'availableReflections'); + + $logger = $this->createMock(LoggerInterface::class); + $logger->expects($this->once())->method('warning')->with( + $this->stringContains(' has includes and excluded from analysis') + ); + $class->setLogger($logger); + + \iterator_to_array($ref->invoke($class)); + } + + public function testNoHasIncludesMessageSent(): void + { + $class = $this->getLocator(); + $ref = new \ReflectionMethod($class, 'availableReflections'); + + $logger = $this->createMock(LoggerInterface::class); + $logger->expects($this->never())->method('warning'); + $class->setLogger($logger); + + \iterator_to_array($ref->invoke($class)); + } + + public function testClassReflectionMessage(): void + { + $class = $this->getLocator(true); + $ref = new \ReflectionMethod($class, 'classReflection'); + + $logger = $this->createMock(LoggerInterface::class); + $logger->expects($this->once())->method('error')->with( + $this->stringContains("Class 'foo' can not be loaded") + ); + $class->setLogger($logger); + + try { + $ref->invoke($class, 'foo'); + } catch (LocatorException) { + } + } + + public function testNoClassReflectionMessageSent(): void + { + $class = $this->getLocator(); + $ref = new \ReflectionMethod($class, 'classReflection'); + + $logger = $this->createMock(LoggerInterface::class); + $logger->expects($this->never())->method('error'); + $class->setLogger($logger); + + try { + $ref->invoke($class, 'foo'); + } catch (LocatorException) { + } + } + + public function testEnumReflectionMessage(): void + { + $class = $this->getLocator(true); + $ref = new \ReflectionMethod($class, 'enumReflection'); + + $logger = $this->createMock(LoggerInterface::class); + $logger->expects($this->once())->method('error')->with( + $this->stringContains("Enum 'foo' can not be loaded") + ); + $class->setLogger($logger); + + try { + $ref->invoke($class, 'foo'); + } catch (LocatorException) { + } + } + + public function testNoEnumReflectionMessageSent(): void + { + $class = $this->getLocator(); + $ref = new \ReflectionMethod($class, 'enumReflection'); + + $logger = $this->createMock(LoggerInterface::class); + $logger->expects($this->never())->method('error'); + $class->setLogger($logger); + + try { + $ref->invoke($class, 'foo'); + } catch (LocatorException) { + } + } + + private function getLocator(bool $debug = false): AbstractLocator + { + return new class($this->finder, $debug) extends AbstractLocator {}; + } +} diff --git a/tests/ClassLocatorTest.php b/tests/ClassLocatorTest.php index 92daaab..8f81508 100644 --- a/tests/ClassLocatorTest.php +++ b/tests/ClassLocatorTest.php @@ -1,20 +1,17 @@ assertArrayNotHasKey(ClassA::class, $classes); $this->assertArrayNotHasKey(ClassD::class, $classes); } - - public function testLoggerErrors(): void - { - $tokenizer = $this->getTokenizer(); - - //By class - $locator = $tokenizer->classLocator(); - $logger = new class extends AbstractLogger - { - private $messages = []; - - public function log($level, $message, array $context = []): void - { - $this->messages[] = compact('level', 'message'); - } - - public function getMessages() - { - return $this->messages; - } - }; - - /** - * @var ClassLocator $locator - */ - $locator->setLogger($logger); - - $locator->getClasses(ClassB::class); - - $this->assertStringContainsString( - ' has includes and excluded from analysis', - $logger->getMessages()[0]['message'] - ); - } - - protected function getTokenizer(): Tokenizer - { - $config = new TokenizerConfig([ - 'directories' => [__DIR__], - 'exclude' => ['Excluded'] - ]); - - return new Tokenizer($config); - } } diff --git a/tests/EnumLocatorTest.php b/tests/EnumLocatorTest.php index 2d2382e..9b317e2 100644 --- a/tests/EnumLocatorTest.php +++ b/tests/EnumLocatorTest.php @@ -1,22 +1,19 @@ assertArrayNotHasKey(EnumA::class, $enums); $this->assertArrayNotHasKey(EnumD::class, $enums); } - - public function testLoggerErrors(): void - { - $tokenizer = $this->getTokenizer(); - - //By class - $locator = $tokenizer->enumLocator(); - $logger = new class extends AbstractLogger - { - private $messages = []; - - public function log($level, $message, array $context = []): void - { - $this->messages[] = compact('level', 'message'); - } - - public function getMessages() - { - return $this->messages; - } - }; - - /** - * @var ClassLocator $locator - */ - $locator->setLogger($logger); - - $locator->getEnums(EnumB::class); - - $this->assertStringContainsString( - ' has includes and excluded from analysis', - $logger->getMessages()[0]['message'] - ); - } - - protected function getTokenizer(): Tokenizer - { - $config = new TokenizerConfig([ - 'directories' => [__DIR__], - 'exclude' => ['Excluded'] - ]); - - return new Tokenizer($config); - } } diff --git a/tests/InterfaceLocatorTest.php b/tests/InterfaceLocatorTest.php index 0de5a0e..846447b 100644 --- a/tests/InterfaceLocatorTest.php +++ b/tests/InterfaceLocatorTest.php @@ -1,21 +1,17 @@ assertArrayNotHasKey(InterfaceA::class, $classes); $this->assertArrayNotHasKey(InterfaceD::class, $classes); } - - public function testLoggerErrors(): void - { - $tokenizer = $this->getTokenizer(); - - //By class - $locator = $tokenizer->interfaceLocator(); - $logger = new class extends AbstractLogger - { - private $messages = []; - - public function log($level, $message, array $context = []): void - { - $this->messages[] = compact('level', 'message'); - } - - public function getMessages() - { - return $this->messages; - } - }; - - /** - * @var InterfaceLocator $locator - */ - $locator->setLogger($logger); - - $locator->getInterfaces(InterfaceB::class); - - $this->assertStringContainsString( - ' has includes and excluded from analysis', - $logger->getMessages()[0]['message'] - ); - } - - protected function getTokenizer(): Tokenizer - { - $config = new TokenizerConfig([ - 'directories' => [__DIR__], - 'exclude' => ['Excluded'] - ]); - - return new Tokenizer($config); - } } diff --git a/tests/ScopedClassLocatorTest.php b/tests/ScopedClassLocatorTest.php index 3ee7a98..bb1762b 100644 --- a/tests/ScopedClassLocatorTest.php +++ b/tests/ScopedClassLocatorTest.php @@ -4,13 +4,11 @@ namespace Spiral\Tests\Tokenizer; -use PHPUnit\Framework\TestCase; use Spiral\Core\Container; use Spiral\Tests\Tokenizer\Classes\ClassA; use Spiral\Tests\Tokenizer\Classes\ClassB; use Spiral\Tests\Tokenizer\Classes\ClassC; use Spiral\Tests\Tokenizer\Classes\Inner\ClassD; -use Spiral\Tokenizer\Config\TokenizerConfig; use Spiral\Tokenizer\ScopedClassesInterface; use Spiral\Tokenizer\ScopedClassLocator; use Spiral\Tokenizer\Tokenizer; @@ -24,7 +22,9 @@ protected function setUp(): void parent::setUp(); $this->container = new Container(); - $this->container->bind(Tokenizer::class, $this->getTokenizer()); + $this->container->bind(Tokenizer::class, $this->getTokenizer(['scopes' => [ + 'foo' => ['directories' => [__DIR__ . '/Classes/Inner'], 'exclude' => []], + ]])); $this->container->bindSingleton(ScopedClassesInterface::class, ScopedClassLocator::class); } @@ -57,20 +57,4 @@ public function testGetsClassesForNotExistScope(): void $this->assertArrayNotHasKey('Spiral\Tests\Tokenizer\Classes\Excluded\ClassXX', $classes); $this->assertArrayNotHasKey('Spiral\Tests\Tokenizer\Classes\Bad_Class', $classes); } - - protected function getTokenizer(): Tokenizer - { - $config = new TokenizerConfig([ - 'directories' => [__DIR__], - 'exclude' => ['Excluded'], - 'scopes' => [ - 'foo' => [ - 'directories' => [__DIR__.'/Classes/Inner'], - 'exclude' => [], - ], - ], - ]); - - return new Tokenizer($config); - } } diff --git a/tests/ScopedEnumLocatorTest.php b/tests/ScopedEnumLocatorTest.php index 0b2d1dc..4f48e2b 100644 --- a/tests/ScopedEnumLocatorTest.php +++ b/tests/ScopedEnumLocatorTest.php @@ -4,7 +4,6 @@ namespace Spiral\Tests\Tokenizer; -use PHPUnit\Framework\TestCase; use Spiral\Core\Container; use Spiral\Tests\Tokenizer\Enums\BadEnum; use Spiral\Tests\Tokenizer\Enums\EnumA; @@ -12,7 +11,6 @@ use Spiral\Tests\Tokenizer\Enums\EnumC; use Spiral\Tests\Tokenizer\Enums\Excluded\EnumXX; use Spiral\Tests\Tokenizer\Enums\Inner\EnumD; -use Spiral\Tokenizer\Config\TokenizerConfig; use Spiral\Tokenizer\ScopedEnumLocator; use Spiral\Tokenizer\ScopedEnumsInterface; use Spiral\Tokenizer\Tokenizer; @@ -26,7 +24,9 @@ protected function setUp(): void parent::setUp(); $this->container = new Container(); - $this->container->bind(Tokenizer::class, $this->getTokenizer()); + $this->container->bind(Tokenizer::class, $this->getTokenizer([ + 'scopes' => ['foo' => ['directories' => [__DIR__ . '/Enums/Inner'], 'exclude' => []]], + ])); $this->container->bindSingleton(ScopedEnumsInterface::class, ScopedEnumLocator::class); } @@ -59,20 +59,4 @@ public function testGetsEnumsForNotExistScope(): void $this->assertArrayNotHasKey(BadEnum::class, $classes); $this->assertArrayNotHasKey('Spiral\Tests\Tokenizer\Enums\Bad_Enum', $classes); } - - protected function getTokenizer(): Tokenizer - { - $config = new TokenizerConfig([ - 'directories' => [__DIR__], - 'exclude' => ['Excluded'], - 'scopes' => [ - 'foo' => [ - 'directories' => [__DIR__.'/Enums/Inner'], - 'exclude' => [], - ], - ], - ]); - - return new Tokenizer($config); - } } diff --git a/tests/ScopedInterfaceLocatorTest.php b/tests/ScopedInterfaceLocatorTest.php index 562c52e..ce0a93d 100644 --- a/tests/ScopedInterfaceLocatorTest.php +++ b/tests/ScopedInterfaceLocatorTest.php @@ -4,7 +4,6 @@ namespace Spiral\Tests\Tokenizer; -use PHPUnit\Framework\TestCase; use Spiral\Core\Container; use Spiral\Tests\Tokenizer\Interfaces\BadInterface; use Spiral\Tests\Tokenizer\Interfaces\InterfaceA; @@ -12,7 +11,6 @@ use Spiral\Tests\Tokenizer\Interfaces\InterfaceC; use Spiral\Tests\Tokenizer\Interfaces\Excluded\InterfaceXX; use Spiral\Tests\Tokenizer\Interfaces\Inner\InterfaceD; -use Spiral\Tokenizer\Config\TokenizerConfig; use Spiral\Tokenizer\ScopedInterfaceLocator; use Spiral\Tokenizer\ScopedInterfacesInterface; use Spiral\Tokenizer\Tokenizer; @@ -26,7 +24,9 @@ protected function setUp(): void parent::setUp(); $this->container = new Container(); - $this->container->bind(Tokenizer::class, $this->getTokenizer()); + $this->container->bind(Tokenizer::class, $this->getTokenizer(['scopes' => [ + 'foo' => ['directories' => [__DIR__ . '/Interfaces/Inner'], 'exclude' => []], + ]])); $this->container->bindSingleton(ScopedInterfacesInterface::class, ScopedInterfaceLocator::class); } @@ -59,20 +59,4 @@ public function testGetsInterfacesForNotExistScope(): void $this->assertArrayNotHasKey(BadInterface::class, $classes); $this->assertArrayNotHasKey('Spiral\Tests\Tokenizer\Interfaces\Bad_Interface', $classes); } - - protected function getTokenizer(): Tokenizer - { - $config = new TokenizerConfig([ - 'directories' => [__DIR__], - 'exclude' => ['Excluded'], - 'scopes' => [ - 'foo' => [ - 'directories' => [__DIR__.'/Interfaces/Inner'], - 'exclude' => [], - ], - ], - ]); - - return new Tokenizer($config); - } } diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..8e7d9ab --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,23 @@ + false, + 'directories' => [__DIR__], + 'exclude' => ['Excluded'] + ] + $config); + + return new Tokenizer($config); + } +}