From 263bcbbd2292c8196b8ff89f5d14c25062b43053 Mon Sep 17 00:00:00 2001 From: Mitchell Macpherson Date: Tue, 24 Nov 2020 01:57:17 +1100 Subject: [PATCH 1/2] Remove poorly designed bool/flag method argument --- src/Binder/LogOutputBinder.php | 18 +++++-- ...bleConsoleLogger.php => ConsoleLogger.php} | 8 +-- src/Factories/ConsoleLoggerFactory.php | 24 +++++++++ .../FilterableConsoleLoggerFactory.php | 19 ------- ...terface.php => ConsoleLoggerInterface.php} | 6 +-- .../ConsoleLoggerFactoryInterface.php | 15 ++++++ ...ilterableConsoleLoggerFactoryInterface.php | 13 ----- src/Providers/ConsoleLoggServiceProvider.php | 6 +-- .../Factories/ConsoleLoggerFactorySpy.php | 51 +++++++++++++++++++ .../FilterableConsoleLoggerFactorySpy.php | 50 ------------------ tests/Unit/Binder/LogOutputBinderTest.php | 8 +-- .../Console/FilterableConsoleLoggerTest.php | 14 ++--- .../FilterableConsoleLoggerFactoryTest.php | 23 +++------ .../LogManagerResolverListenerTest.php | 4 +- .../ConsoleLoggServiceProviderTest.php | 12 ++--- 15 files changed, 140 insertions(+), 131 deletions(-) rename src/Console/{FilterableConsoleLogger.php => ConsoleLogger.php} (65%) create mode 100644 src/Factories/ConsoleLoggerFactory.php delete mode 100644 src/Factories/FilterableConsoleLoggerFactory.php rename src/Interfaces/Console/{FilterableConsoleLoggerInterface.php => ConsoleLoggerInterface.php} (54%) create mode 100644 src/Interfaces/Factories/ConsoleLoggerFactoryInterface.php delete mode 100644 src/Interfaces/Factories/FilterableConsoleLoggerFactoryInterface.php create mode 100644 tests/Doubles/Spies/Factories/ConsoleLoggerFactorySpy.php delete mode 100644 tests/Doubles/Spies/Factories/FilterableConsoleLoggerFactorySpy.php diff --git a/src/Binder/LogOutputBinder.php b/src/Binder/LogOutputBinder.php index 154d213..85cf6b2 100644 --- a/src/Binder/LogOutputBinder.php +++ b/src/Binder/LogOutputBinder.php @@ -5,7 +5,8 @@ namespace DevThis\ConsoleLogg\Binder; use DevThis\ConsoleLogg\Interfaces\Binder\LogOutputBindedInterface; -use DevThis\ConsoleLogg\Interfaces\Factories\FilterableConsoleLoggerFactoryInterface; +use DevThis\ConsoleLogg\Interfaces\Console\ConsoleLoggerInterface; +use DevThis\ConsoleLogg\Interfaces\Factories\ConsoleLoggerFactoryInterface; use Illuminate\Contracts\Config\Repository; use Illuminate\Log\LogManager; use Symfony\Component\Console\Output\OutputInterface; @@ -18,7 +19,7 @@ class LogOutputBinder implements LogOutputBindedInterface { /** - * @var FilterableConsoleLoggerFactoryInterface + * @var ConsoleLoggerFactoryInterface */ private $consoleLoggerFactory; @@ -32,7 +33,7 @@ class LogOutputBinder implements LogOutputBindedInterface */ private $isFiltered; - public function __construct(FilterableConsoleLoggerFactoryInterface $consoleLoggerFactory, Repository $config) + public function __construct(ConsoleLoggerFactoryInterface $consoleLoggerFactory, Repository $config) { $this->isFiltered = $config->get('console-logg.filtered') === true; $this->consoleLoggerFactory = $consoleLoggerFactory; @@ -43,7 +44,7 @@ public function attach(OutputInterface $output, LogManager $logManager): void $this->defaultDriver = $logManager->getDefaultDriver(); $logManager->setDefaultDriver('console-logg'); - $consoleLogger = $this->consoleLoggerFactory->create($output, $this->isFiltered); + $consoleLogger = $this->createConsoleLogger($output); $logManager->extend( 'console-logg', @@ -58,4 +59,13 @@ public function detach(LogManager $logManager): void $logManager->forgetChannel('console-logg'); $logManager->setDefaultDriver($this->defaultDriver); } + + private function createConsoleLogger(OutputInterface $output): ConsoleLoggerInterface + { + if ($this->isFiltered === true) { + return $this->consoleLoggerFactory->createFilterable($output); + } + + return $this->consoleLoggerFactory->create($output); + } } diff --git a/src/Console/FilterableConsoleLogger.php b/src/Console/ConsoleLogger.php similarity index 65% rename from src/Console/FilterableConsoleLogger.php rename to src/Console/ConsoleLogger.php index 5f8548c..d83a223 100644 --- a/src/Console/FilterableConsoleLogger.php +++ b/src/Console/ConsoleLogger.php @@ -4,10 +4,10 @@ namespace DevThis\ConsoleLogg\Console; -use DevThis\ConsoleLogg\Interfaces\Console\FilterableConsoleLoggerInterface; -use Symfony\Component\Console\Logger\ConsoleLogger; +use DevThis\ConsoleLogg\Interfaces\Console\ConsoleLoggerInterface; +use Symfony\Component\Console\Logger\ConsoleLogger as SymfonyConsoleLogger; -class FilterableConsoleLogger extends ConsoleLogger implements FilterableConsoleLoggerInterface +class ConsoleLogger extends SymfonyConsoleLogger implements ConsoleLoggerInterface { /** * @var bool @@ -31,7 +31,7 @@ public function log($level, $message, array $context = []): void /** * @inheritDoc */ - public function setFiltering(bool $isFiltered): FilterableConsoleLoggerInterface + public function setFiltering(bool $isFiltered): ConsoleLoggerInterface { $this->filtering = $isFiltered; diff --git a/src/Factories/ConsoleLoggerFactory.php b/src/Factories/ConsoleLoggerFactory.php new file mode 100644 index 0000000..4cc06d0 --- /dev/null +++ b/src/Factories/ConsoleLoggerFactory.php @@ -0,0 +1,24 @@ +setFiltering(true); + } +} diff --git a/src/Factories/FilterableConsoleLoggerFactory.php b/src/Factories/FilterableConsoleLoggerFactory.php deleted file mode 100644 index c92a733..0000000 --- a/src/Factories/FilterableConsoleLoggerFactory.php +++ /dev/null @@ -1,19 +0,0 @@ -setFiltering($isFiltered ?? false); - } -} diff --git a/src/Interfaces/Console/FilterableConsoleLoggerInterface.php b/src/Interfaces/Console/ConsoleLoggerInterface.php similarity index 54% rename from src/Interfaces/Console/FilterableConsoleLoggerInterface.php rename to src/Interfaces/Console/ConsoleLoggerInterface.php index ad21b07..c3006f6 100644 --- a/src/Interfaces/Console/FilterableConsoleLoggerInterface.php +++ b/src/Interfaces/Console/ConsoleLoggerInterface.php @@ -6,7 +6,7 @@ use Psr\Log\LoggerInterface; -interface FilterableConsoleLoggerInterface extends LoggerInterface +interface ConsoleLoggerInterface extends LoggerInterface { public function isFiltered(): bool; @@ -14,7 +14,7 @@ public function isFiltered(): bool; * Sets the state for whether log filtering (by context) is enabled * 'logg' => true should * - * @return \DevThis\ConsoleLogg\Interfaces\Console\FilterableConsoleLoggerInterface + * @return \DevThis\ConsoleLogg\Interfaces\Console\ConsoleLoggerInterface */ - public function setFiltering(bool $isFiltered): FilterableConsoleLoggerInterface; + public function setFiltering(bool $isFiltered): ConsoleLoggerInterface; } diff --git a/src/Interfaces/Factories/ConsoleLoggerFactoryInterface.php b/src/Interfaces/Factories/ConsoleLoggerFactoryInterface.php new file mode 100644 index 0000000..6653b36 --- /dev/null +++ b/src/Interfaces/Factories/ConsoleLoggerFactoryInterface.php @@ -0,0 +1,15 @@ +app->singleton(LogOutputBindedInterface::class, LogOutputBinder::class); $this->app->singleton(LogManagerResolverListenerInterface::class, LogManagerResolverListener::class); - $this->app->singleton(FilterableConsoleLoggerFactoryInterface::class, FilterableConsoleLoggerFactory::class); + $this->app->singleton(ConsoleLoggerFactoryInterface::class, ConsoleLoggerFactory::class); // sorry for this hack :( $this->app['config']['logging.channels.console-logg'] = ['driver' => 'console-logg']; diff --git a/tests/Doubles/Spies/Factories/ConsoleLoggerFactorySpy.php b/tests/Doubles/Spies/Factories/ConsoleLoggerFactorySpy.php new file mode 100644 index 0000000..3dadbe3 --- /dev/null +++ b/tests/Doubles/Spies/Factories/ConsoleLoggerFactorySpy.php @@ -0,0 +1,51 @@ +lastOutput = $output; + + return $this->lastCreated = parent::create($output); + } + + public function createFilterable(OutputInterface $output): ConsoleLoggerInterface + { + $this->lastOutput = $output; + + return $this->lastCreated = parent::createFilterable($output); + } + + public function getLastCreated(): ?ConsoleLoggerInterface + { + return $this->lastCreated; + } + + public function getLastIsFilteredValue(): ?bool + { + return $this->lastIsFiltered; + } + + public function getLastOutput(): OutputInterface + { + return $this->lastOutput; + } +} diff --git a/tests/Doubles/Spies/Factories/FilterableConsoleLoggerFactorySpy.php b/tests/Doubles/Spies/Factories/FilterableConsoleLoggerFactorySpy.php deleted file mode 100644 index 8ec836a..0000000 --- a/tests/Doubles/Spies/Factories/FilterableConsoleLoggerFactorySpy.php +++ /dev/null @@ -1,50 +0,0 @@ -lastIsFiltered = $isFiltered; - $this->lastOutput = $output; - - return $this->lastCreated = parent::create($output, $isFiltered); - } - - public function getLastCreated(): ?FilterableConsoleLoggerInterface - { - return $this->lastCreated; - } - - public function getLastIsFilteredValue(): ?bool - { - return $this->lastIsFiltered; - } - - public function getLastOutput(): OutputInterface - { - return $this->lastOutput; - } -} diff --git a/tests/Unit/Binder/LogOutputBinderTest.php b/tests/Unit/Binder/LogOutputBinderTest.php index 1d471e1..e2706ad 100644 --- a/tests/Unit/Binder/LogOutputBinderTest.php +++ b/tests/Unit/Binder/LogOutputBinderTest.php @@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\Console\Output\NullOutput; use Tests\Doubles\Fakes\vendor\Illuminate\ApplicationFake; -use Tests\Doubles\Spies\Factories\FilterableConsoleLoggerFactorySpy; +use Tests\Doubles\Spies\Factories\ConsoleLoggerFactorySpy; use Tests\Doubles\Spies\vendor\Illuminate\LogManagerSpy; use Tests\Doubles\Stubs\vendor\Illuminate\RepositoryStub; @@ -21,7 +21,7 @@ class LogOutputBinderTest extends TestCase public function testAttachSetsDefaultDriver(): void { $config = new RepositoryStub(); - $filterableConsoleLoggerFactory = new FilterableConsoleLoggerFactorySpy(); + $filterableConsoleLoggerFactory = new ConsoleLoggerFactorySpy(); $logOutputBinder = new LogOutputBinder($filterableConsoleLoggerFactory, $config); $output = new NullOutput(); $app = new ApplicationFake(['config' => ['logging.default' => ['driver' => 'the-default']]]); @@ -36,7 +36,7 @@ public function testAttachSetsDefaultDriver(): void public function testAttachedConsoleLoggerRespectsFilteredOption(): void { $config = new RepositoryStub(); - $filterableConsoleLoggerFactory = new FilterableConsoleLoggerFactorySpy(); + $filterableConsoleLoggerFactory = new ConsoleLoggerFactorySpy(); $logOutputBinder = new LogOutputBinder($filterableConsoleLoggerFactory, $config); $output = new NullOutput(); $defaultDriver = ['driver' => 'the-default']; @@ -54,7 +54,7 @@ public function testAttachedConsoleLoggerRespectsFilteredOption(): void public function testDefaultDriverAfterDetachIsNotConsoleLogg(): void { $config = new RepositoryStub(); - $filterableConsoleLoggerFactory = new FilterableConsoleLoggerFactorySpy(); + $filterableConsoleLoggerFactory = new ConsoleLoggerFactorySpy(); $logOutputBinder = new LogOutputBinder($filterableConsoleLoggerFactory, $config); $output = new NullOutput(); $defaultDriver = ['driver' => 'the-default']; diff --git a/tests/Unit/Console/FilterableConsoleLoggerTest.php b/tests/Unit/Console/FilterableConsoleLoggerTest.php index 7296c58..ca10db5 100644 --- a/tests/Unit/Console/FilterableConsoleLoggerTest.php +++ b/tests/Unit/Console/FilterableConsoleLoggerTest.php @@ -4,7 +4,7 @@ namespace Tests\Unit\Console; -use DevThis\ConsoleLogg\Console\FilterableConsoleLogger; +use DevThis\ConsoleLogg\Console\ConsoleLogger; use PHPUnit\Framework\TestCase; use Psr\Log\LogLevel; use Symfony\Component\Console\Output\BufferedOutput; @@ -12,7 +12,7 @@ use Symfony\Component\Console\Output\OutputInterface; /** - * @covers \DevThis\ConsoleLogg\Console\FilterableConsoleLogger + * @covers \DevThis\ConsoleLogg\Console\ConsoleLogger */ class FilterableConsoleLoggerTest extends TestCase { @@ -93,7 +93,7 @@ public function getInputsForFilteredOptionsTest(): iterable public function testDefaultIsFilteredIsFalse(): void { $output = new BufferedOutput(); - $filterableConsoleLogger = new FilterableConsoleLogger( + $filterableConsoleLogger = new ConsoleLogger( $output, [LogLevel::NOTICE => OutputInterface::VERBOSITY_NORMAL,] ); @@ -109,7 +109,7 @@ public function testDefaultIsFilteredIsFalse(): void public function testFilteringRespectsBeingEnabled(): void { $output = new NullOutput(); - $filterableConsoleLogger = new FilterableConsoleLogger($output); + $filterableConsoleLogger = new ConsoleLogger($output); $filterableConsoleLogger->setFiltering(true); self::assertTrue($filterableConsoleLogger->isFiltered()); @@ -118,7 +118,7 @@ public function testFilteringRespectsBeingEnabled(): void public function testIsFilteredIsFalseByDefault(): void { $output = new NullOutput(); - $filterableConsoleLogger = new FilterableConsoleLogger($output); + $filterableConsoleLogger = new ConsoleLogger($output); self::assertFalse($filterableConsoleLogger->isFiltered()); } @@ -126,7 +126,7 @@ public function testIsFilteredIsFalseByDefault(): void public function testIsFilteredIsTruthfulWhenFalse(): void { $output = new NullOutput(); - $filterableConsoleLogger = new FilterableConsoleLogger($output); + $filterableConsoleLogger = new ConsoleLogger($output); $filterableConsoleLogger->setFiltering(false); self::assertFalse($filterableConsoleLogger->isFiltered()); @@ -138,7 +138,7 @@ public function testIsFilteredIsTruthfulWhenFalse(): void public function testLogRespectsFilteredOption(array $logs, bool $isFiltered, string $expectation): void { $output = new BufferedOutput(); - $filterableConsoleLogger = (new FilterableConsoleLogger( + $filterableConsoleLogger = (new ConsoleLogger( $output, [ LogLevel::EMERGENCY => OutputInterface::VERBOSITY_NORMAL, diff --git a/tests/Unit/Factories/FilterableConsoleLoggerFactoryTest.php b/tests/Unit/Factories/FilterableConsoleLoggerFactoryTest.php index c785db3..e74b517 100644 --- a/tests/Unit/Factories/FilterableConsoleLoggerFactoryTest.php +++ b/tests/Unit/Factories/FilterableConsoleLoggerFactoryTest.php @@ -4,13 +4,12 @@ namespace Tests\Unit\Factories; -use DevThis\ConsoleLogg\Console\FilterableConsoleLogger; use PHPUnit\Framework\TestCase; use Symfony\Component\Console\Output\NullOutput; -use Tests\Doubles\Spies\Factories\FilterableConsoleLoggerFactorySpy; +use Tests\Doubles\Spies\Factories\ConsoleLoggerFactorySpy; /** - * @covers \DevThis\ConsoleLogg\Factories\FilterableConsoleLoggerFactory + * @covers \DevThis\ConsoleLogg\Factories\ConsoleLoggerFactory */ class FilterableConsoleLoggerFactoryTest extends TestCase { @@ -25,11 +24,6 @@ public function getInputsForTestingArguments(): iterable 'isFiltered' => false, 'filteredExpectation' => false ]; - - yield 'is filtered provided null' => [ - 'isFiltered' => null, - 'filteredExpectation' => null - ]; } /** @@ -40,16 +34,13 @@ public function getInputsForTestingArguments(): iterable * * @dataProvider getInputsForTestingArguments */ - public function testCreateRespectsArguments(?bool $isFiltered, ?bool $filteredExpectation): void + public function testCreateRespectsArguments(bool $isFiltered, bool $filteredExpectation): void { - $factory = new FilterableConsoleLoggerFactorySpy(); + $factory = new ConsoleLoggerFactorySpy(); $output = new NullOutput(); - $consoleLogger = $factory->create($output, $isFiltered); - // feels bad using a spy, but it's impossible to gauge this without - self::assertSame($output, $factory->getLastOutput()); - self::assertSame($filteredExpectation, $factory->getLastIsFilteredValue()); - // weak assertion but still valid because we only know it returns the interface, not concrete - self::assertInstanceOf(FilterableConsoleLogger::class, $consoleLogger); + $consoleLogger = $isFiltered === true ? $factory->createFilterable($output) : $factory->create($output); + + self::assertSame($filteredExpectation, $consoleLogger->isFiltered()); } } diff --git a/tests/Unit/Listeners/LogManagerResolverListenerTest.php b/tests/Unit/Listeners/LogManagerResolverListenerTest.php index fabad34..08629f9 100644 --- a/tests/Unit/Listeners/LogManagerResolverListenerTest.php +++ b/tests/Unit/Listeners/LogManagerResolverListenerTest.php @@ -16,7 +16,7 @@ use Tests\Doubles\Fakes\vendor\Illuminate\ApplicationFake; use Tests\Doubles\Fakes\vendor\Illuminate\EventDispatcherFake; use Tests\Doubles\Spies\Binder\LogOutputBinderFake; -use Tests\Doubles\Spies\Factories\FilterableConsoleLoggerFactorySpy; +use Tests\Doubles\Spies\Factories\ConsoleLoggerFactorySpy; use Tests\Doubles\Stubs\vendor\Illuminate\LogManagerStub; use Tests\Doubles\Stubs\vendor\Illuminate\RepositoryStub; @@ -69,7 +69,7 @@ public function testCliServerSkips(): void public function testEventDispatcherListensTo(string $eventClass): void { $eventDispatcher = new EventDispatcherFake(); - $filterableConsoleFactory = new FilterableConsoleLoggerFactorySpy(); + $filterableConsoleFactory = new ConsoleLoggerFactorySpy(); $config = new RepositoryStub(); $logOutputBinder = new LogOutputBinder($filterableConsoleFactory, $config); $logManagerResolverListener = new LogManagerResolverListener($eventDispatcher, $logOutputBinder); diff --git a/tests/Unit/Providers/ConsoleLoggServiceProviderTest.php b/tests/Unit/Providers/ConsoleLoggServiceProviderTest.php index 6af50c3..a4a198f 100644 --- a/tests/Unit/Providers/ConsoleLoggServiceProviderTest.php +++ b/tests/Unit/Providers/ConsoleLoggServiceProviderTest.php @@ -5,9 +5,9 @@ namespace Tests\Unit\Providers; use DevThis\ConsoleLogg\Binder\LogOutputBinder; -use DevThis\ConsoleLogg\Factories\FilterableConsoleLoggerFactory; +use DevThis\ConsoleLogg\Factories\ConsoleLoggerFactory; use DevThis\ConsoleLogg\Interfaces\Binder\LogOutputBindedInterface; -use DevThis\ConsoleLogg\Interfaces\Factories\FilterableConsoleLoggerFactoryInterface; +use DevThis\ConsoleLogg\Interfaces\Factories\ConsoleLoggerFactoryInterface; use DevThis\ConsoleLogg\Interfaces\Listener\LogManagerResolverListenerInterface; use DevThis\ConsoleLogg\Listeners\LogManagerResolverListener; use DevThis\ConsoleLogg\Providers\ConsoleLoggServiceProvider; @@ -58,8 +58,8 @@ public function testRegisterBindings(): void self::assertSame(LogOutputBinder::class, $app->get(LogOutputBindedInterface::class)); self::assertSame(LogManagerResolverListener::class, $app->get(LogManagerResolverListenerInterface::class)); self::assertSame( - FilterableConsoleLoggerFactory::class, - $app->get(FilterableConsoleLoggerFactoryInterface::class) + ConsoleLoggerFactory::class, + $app->get(ConsoleLoggerFactoryInterface::class) ); } @@ -73,8 +73,8 @@ public function testRegisterDoesNothingForNonConsole(): void self::assertNotSame(LogOutputBinder::class, $app->get(LogOutputBindedInterface::class)); self::assertNotSame(LogManagerResolverListener::class, $app->get(LogManagerResolverListenerInterface::class)); self::assertNotSame( - FilterableConsoleLoggerFactory::class, - $app->get(FilterableConsoleLoggerFactoryInterface::class) + ConsoleLoggerFactory::class, + $app->get(ConsoleLoggerFactoryInterface::class) ); } From e12a900ceb3ca2c6bd55fc7134fb3a0f3e99643c Mon Sep 17 00:00:00 2001 From: Mitchell Macpherson Date: Tue, 24 Nov 2020 02:15:17 +1100 Subject: [PATCH 2/2] Add another test to cover all branches --- .../Illuminate/RepositoryFilterableStub.php | 35 +++++++++++++++++++ tests/Unit/Binder/LogOutputBinderTest.php | 26 ++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 tests/Doubles/Stubs/vendor/Illuminate/RepositoryFilterableStub.php diff --git a/tests/Doubles/Stubs/vendor/Illuminate/RepositoryFilterableStub.php b/tests/Doubles/Stubs/vendor/Illuminate/RepositoryFilterableStub.php new file mode 100644 index 0000000..8f0a0db --- /dev/null +++ b/tests/Doubles/Stubs/vendor/Illuminate/RepositoryFilterableStub.php @@ -0,0 +1,35 @@ + [ + 'logging.default' => ['driver' => 'the-default'], + 'logging.channels.console-logg' => ['driver' => 'console-logg'] + ] + ] + ); + $logManager = new LogManager($app); + $logOutputBinder->attach($output, $logManager); + + /** @var ConsoleLoggerInterface|mixed $driver */ + $driver = $logManager->driver()->getLogger(); + + self::assertInstanceOf(ConsoleLoggerInterface::class, $driver); + self::assertTrue($driver->isFiltered()); + } + public function testDefaultDriverAfterDetachIsNotConsoleLogg(): void { $config = new RepositoryStub(); pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy