diff --git a/system/Commands/Cache/ClearCache.php b/system/Commands/Cache/ClearCache.php index e1180c28c6bd..32f9466a4939 100644 --- a/system/Commands/Cache/ClearCache.php +++ b/system/Commands/Cache/ClearCache.php @@ -13,7 +13,6 @@ namespace CodeIgniter\Commands\Cache; -use CodeIgniter\Cache\CacheFactory; use CodeIgniter\CLI\BaseCommand; use CodeIgniter\CLI\CLI; use Config\Cache; @@ -69,22 +68,21 @@ public function run(array $params) $handler = $params[0] ?? $config->handler; if (! array_key_exists($handler, $config->validHandlers)) { - CLI::error($handler . ' is not a valid cache handler.'); + CLI::error(lang('Cache.invalidHandler', [$handler])); - return; + return EXIT_ERROR; } $config->handler = $handler; - $cache = CacheFactory::getHandler($config); - if (! $cache->clean()) { - // @codeCoverageIgnoreStart + if (! service('cache', $config)->clean()) { CLI::error('Error while clearing the cache.'); - return; - // @codeCoverageIgnoreEnd + return EXIT_ERROR; } CLI::write(CLI::color('Cache cleared.', 'green')); + + return EXIT_SUCCESS; } } diff --git a/system/Language/en/Cache.php b/system/Language/en/Cache.php index b877c9bbaabd..63512cd525d5 100644 --- a/system/Language/en/Cache.php +++ b/system/Language/en/Cache.php @@ -14,6 +14,7 @@ // Cache language settings return [ 'unableToWrite' => 'Cache unable to write to "{0}".', + 'invalidHandler' => 'Cache driver "{0}" is not a valid cache handler.', 'invalidHandlers' => 'Cache config must have an array of $validHandlers.', 'noBackup' => 'Cache config must have a handler and backupHandler set.', 'handlerNotFound' => 'Cache config has an invalid handler or backup handler specified.', diff --git a/tests/system/Commands/ClearCacheTest.php b/tests/system/Commands/ClearCacheTest.php index e27978e40919..caa37f74f7d9 100644 --- a/tests/system/Commands/ClearCacheTest.php +++ b/tests/system/Commands/ClearCacheTest.php @@ -14,6 +14,7 @@ namespace CodeIgniter\Commands; use CodeIgniter\Cache\CacheFactory; +use CodeIgniter\Cache\Handlers\FileHandler; use CodeIgniter\Test\CIUnitTestCase; use CodeIgniter\Test\StreamFilterTrait; use Config\Services; @@ -31,15 +32,27 @@ protected function setUp(): void { parent::setUp(); + $this->resetServices(); + // Make sure we are testing with the correct handler (override injections) Services::injectMock('cache', CacheFactory::getHandler(config('Cache'))); } + protected function tearDown(): void + { + parent::tearDown(); + + $this->resetServices(); + } + public function testClearCacheInvalidHandler(): void { command('cache:clear junk'); - $this->assertStringContainsString('junk is not a valid cache handler.', $this->getStreamFilterBuffer()); + $this->assertSame( + "Cache driver \"junk\" is not a valid cache handler.\n", + preg_replace('/\e\[[^m]+m/', '', $this->getStreamFilterBuffer()), + ); } public function testClearCacheWorks(): void @@ -52,4 +65,22 @@ public function testClearCacheWorks(): void $this->assertNull(cache('foo')); $this->assertStringContainsString('Cache cleared.', $this->getStreamFilterBuffer()); } + + public function testClearCacheFails(): void + { + $cache = $this->getMockBuilder(FileHandler::class) + ->setConstructorArgs([config('Cache')]) + ->onlyMethods(['clean']) + ->getMock(); + $cache->expects($this->once())->method('clean')->willReturn(false); + + Services::injectMock('cache', $cache); + + command('cache:clear'); + + $this->assertSame( + "Error while clearing the cache.\n", + preg_replace('/\e\[[^m]+m/', '', $this->getStreamFilterBuffer()), + ); + } } diff --git a/user_guide_src/source/changelogs/v4.7.3.rst b/user_guide_src/source/changelogs/v4.7.3.rst index 1947048fe142..be42d6379b8d 100644 --- a/user_guide_src/source/changelogs/v4.7.3.rst +++ b/user_guide_src/source/changelogs/v4.7.3.rst @@ -18,6 +18,8 @@ BREAKING Message Changes *************** +- The ``Cache.invalidHandler`` message string was added. + ******* Changes *******