Files
predis/tests/Predis/Configuration/Option/ConnectionsTest.php
T
Daniele Alessandri 2c732c46c8 Make configuration easier for phpiredis based connections.
The "connections" client option now accepts certain string values that
are mapped to specific and most used configurations for the connection
factory. This is used to make it easier to configure Predis to load our
phpiredis-based connection backends without having to manually pass a
map of URI schemes and fully-qualified class names.

  - "phpiredis-stream" maps `tcp` and `unix` to the connection backend
    based on PHP streams (Predis\Connection\PhpiredisStreamConnection).
  - "phpiredis-socket" maps `tcp` and `unix` to the connection backend
    based on ext-socket (Predis\Connection\PhpiredisStreamConnection).
  - `phpiredis` is simply an alias of `phpiredis-stream`.

An InvalidArgumentException is thrown on unsupported string values.
2020-08-27 15:09:35 +02:00

205 lines
6.7 KiB
PHP

<?php
/*
* This file is part of the Predis package.
*
* (c) Daniele Alessandri <suppakilla@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Predis\Configuration\Option;
use PredisTestCase;
/**
*
*/
class ConnectionsTest extends PredisTestCase
{
/**
* @group disconnected
*/
public function testDefaultOptionValue()
{
$option = new Connections();
$options = $this->getMockBuilder('Predis\Configuration\OptionsInterface')->getMock();
$this->assertInstanceOf('Predis\Connection\Factory', $option->getDefault($options));
}
/**
* @group disconnected
*/
public function testAcceptsNamedArrayWithSchemeToConnectionClassMappings()
{
$options = $this->getMockBuilder('Predis\Configuration\OptionsInterface')->getMock();
$class = get_class($this->getMockBuilder('Predis\Connection\NodeConnectionInterface')->getMock());
$value = array('tcp' => $class, 'redis' => $class);
$default = $this->getMockBuilder('Predis\Connection\FactoryInterface')->getMock();
$default
->expects($this->exactly(2))
->method('define')
->with($this->matchesRegularExpression('/^tcp|redis$/'), $class);
$option = $this->getMockBuilder('Predis\Configuration\Option\Connections')
->setMethods(array('getDefault'))
->getMock();
$option
->expects($this->once())
->method('getDefault')
->with($options)
->will($this->returnValue($default));
$this->assertInstanceOf('Predis\Connection\FactoryInterface', $factory = $option->filter($options, $value));
$this->assertSame($default, $factory);
}
/**
* @group disconnected
* @dataProvider provideSupportedStringValuesForOption
*/
public function testAcceptsStringToConfigurePhpiredisStreamBackend($value, $classFQCN)
{
$options = $this->getMockBuilder('Predis\Configuration\OptionsInterface')->getMock();
$default = $this->getMockBuilder('Predis\Connection\FactoryInterface')->getMock();
$default
->expects($this->exactly(2))
->method('define')
->with($this->matchesRegularExpression('/^tcp|unix$/'), $classFQCN);
$option = $this->getMockBuilder('Predis\Configuration\Option\Connections')
->setMethods(array('getDefault'))
->getMock();
$option
->expects($this->once())
->method('getDefault')
->with($options)
->will($this->returnValue($default));
$factory = $option->filter($options, $value);
$this->assertInstanceOf('Predis\Connection\FactoryInterface', $factory);
$this->assertSame($default, $factory);
}
/**
* @group disconnected
*/
public function testThrowsExceptionOnNotSupportedStringValue()
{
$this->expectException('InvalidArgumentException');
$this->expectExceptionMessageMatches('/^.* does not recognize `unsupported` as a supported configuration string$/');
$option = new Connections();
$options = $this->getMockBuilder('Predis\Configuration\OptionsInterface')->getMock();
$option->filter($options, 'unsupported');
}
/**
* @group disconnected
*/
public function testUsesParametersOptionToSetDefaultParameters()
{
$parameters = array('database' => 5, 'password' => 'mypassword');
$default = $this->getMockBuilder('Predis\Connection\FactoryInterface')->getMock();
$options = $this->getMockBuilder('Predis\Configuration\OptionsInterface')->getMock();
$options
->expects($this->once())
->method('defined')
->with('parameters')
->will($this->returnValue(true));
$options
->expects($this->once())
->method('__get')
->with('parameters')
->will($this->returnValue($parameters));
$option = new Connections();
$factory = $option->getDefault($options);
$this->assertSame($parameters, $factory->getDefaultParameters());
}
/**
* @group disconnected
*/
public function testAcceptsConnectionFactoryInstance()
{
$option = $this->getMockBuilder('Predis\Configuration\Option\Connections')
->setMethods(array('getDefault'))
->getMock();
$option
->expects($this->never())
->method('getDefault');
$options = $this->getMockBuilder('Predis\Configuration\OptionsInterface')->getMock();
$factory = $this->getMockBuilder('Predis\Connection\FactoryInterface')->getMock();
$this->assertSame($factory, $option->filter($options, $factory));
}
/**
* @group disconnected
*/
public function testAcceptsCallableReturningConnectionFactoryInstance()
{
$option = new Connections();
$options = $this->getMockBuilder('Predis\Configuration\OptionsInterface')->getMock();
$callable = $this->getMockBuilder('stdClass')
->setMethods(array('__invoke'))
->getMock();
$callable
->expects($this->once())
->method('__invoke')
->with($this->isInstanceOf('Predis\Configuration\OptionsInterface'))
->will($this->returnValue(
$factory = $this->getMockBuilder('Predis\Connection\FactoryInterface')->getMock()
));
$this->assertSame($factory, $option->filter($options, $callable));
}
/**
* @group disconnected
*/
public function testThrowsExceptionOnInvalidArguments()
{
$this->expectException('InvalidArgumentException');
$this->expectExceptionMessage('Predis\Configuration\Option\Connections expects a valid connection factory');
$option = new Connections();
$options = $this->getMockBuilder('Predis\Configuration\OptionsInterface')->getMock();
$option->filter($options, new \stdClass());
}
// ******************************************************************** //
// ---- HELPER METHODS ------------------------------------------------ //
// ******************************************************************** //
/**
* Test provider for string values supported by this client option.
*
* @return array
*/
public function provideSupportedStringValuesForOption()
{
return array(
array('phpiredis-stream', 'Predis\Connection\PhpiredisStreamConnection'),
array('phpiredis-socket', 'Predis\Connection\PhpiredisSocketConnection'),
array('phpiredis', 'Predis\Connection\PhpiredisStreamConnection'),
);
}
}