InteractsWithRedis.php
TLDR
The InteractsWithRedis
trait is part of the Illuminate\Foundation\Testing\Concerns
namespace and provides methods for setting up and tearing down a Redis connection for testing purposes.
Methods
setUpRedis
Sets up the Redis connection for testing. It checks if the Redis extension is installed and if the default connection settings fail, it skips the test. It creates a RedisManager instance based on the provided settings and flushes the Redis database before the test.
tearDownRedis
Tears down the Redis connection. It flushes the Redis database for the phpredis
driver and disconnects from the Redis connection for each driver.
redisDriverProvider
Returns an array with the supported Redis drivers (predis
and phpredis
).
ifRedisAvailable($callback)
Runs a test if Redis is available. It sets up the Redis connection, executes the provided callback function, and tears down the Redis connection.
<?php
namespace Illuminate\Foundation\Testing\Concerns;
use Exception;
use Illuminate\Foundation\Application;
use Illuminate\Redis\RedisManager;
use Illuminate\Support\Env;
trait InteractsWithRedis
{
/**
* Indicate connection failed if redis is not available.
*
* @var bool
*/
private static $connectionFailedOnceWithDefaultsSkip = false;
/**
* Redis manager instance.
*
* @var array<string, \Illuminate\Redis\RedisManager>
*/
private $redis;
/**
* Setup redis connection.
*
* @return void
*/
public function setUpRedis()
{
if (! extension_loaded('redis')) {
$this->markTestSkipped('The redis extension is not installed. Please install the extension to enable '.__CLASS__);
}
if (static::$connectionFailedOnceWithDefaultsSkip) {
$this->markTestSkipped('Trying default host/port failed, please set environment variable REDIS_HOST & REDIS_PORT to enable '.__CLASS__);
}
$app = $this->app ?? new Application;
$host = Env::get('REDIS_HOST', '127.0.0.1');
$port = Env::get('REDIS_PORT', 6379);
foreach (static::redisDriverProvider() as $driver) {
$this->redis[$driver[0]] = new RedisManager($app, $driver[0], [
'cluster' => false,
'options' => [
'prefix' => 'test_',
],
'default' => [
'host' => $host,
'port' => $port,
'database' => 5,
'timeout' => 0.5,
'name' => 'default',
],
]);
}
try {
$this->redis['phpredis']->connection()->flushdb();
} catch (Exception) {
if ($host === '127.0.0.1' && $port === 6379 && Env::get('REDIS_HOST') === null) {
static::$connectionFailedOnceWithDefaultsSkip = true;
$this->markTestSkipped('Trying default host/port failed, please set environment variable REDIS_HOST & REDIS_PORT to enable '.__CLASS__);
}
}
}
/**
* Teardown redis connection.
*
* @return void
*/
public function tearDownRedis()
{
if (isset($this->redis['phpredis'])) {
$this->redis['phpredis']->connection()->flushdb();
}
foreach (static::redisDriverProvider() as $driver) {
if (isset($this->redis[$driver[0]])) {
$this->redis[$driver[0]]->connection()->disconnect();
}
}
}
/**
* Get redis driver provider.
*
* @return array
*/
public static function redisDriverProvider()
{
return [
['predis'],
['phpredis'],
];
}
/**
* Run test if redis is available.
*
* @param callable $callback
* @return void
*/
public function ifRedisAvailable($callback)
{
$this->setUpRedis();
$callback();
$this->tearDownRedis();
}
}