New command: PUBSUB (Redis 2.8).

This commit is contained in:
Daniele Alessandri
2013-11-17 10:48:09 +01:00
parent 1b5e2d0d0d
commit 620adb2fe6
5 changed files with 154 additions and 0 deletions
+59
View File
@@ -0,0 +1,59 @@
<?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\Command;
/**
* @link http://redis.io/commands/pubsub
* @author Daniele Alessandri <suppakilla@gmail.com>
*/
class PubSubPubsub extends AbstractCommand
{
/**
* {@inheritdoc}
*/
public function getId()
{
return 'PUBSUB';
}
/**
* {@inheritdoc}
*/
public function parseResponse($data)
{
switch (strtolower($this->getArgument(0))) {
case 'numsub':
return self::processNumsub($data);
default:
return $data;
}
}
/**
* Returns the processed response to PUBSUB NUMSUB.
*
* @param array List of channels
* @return array
*/
protected static function processNumsub(array $channels)
{
$processed = array();
$count = count($channels);
for ($i = 0; $i < $count; $i++) {
$processed[$channels[$i]] = $channels[++$i];
}
return $processed;
}
}
+3
View File
@@ -249,6 +249,9 @@ class ServerVersion28 extends ServerProfile
/* commands operating on hashes */
'hscan' => 'Predis\Command\HashScan',
/* publish - subscribe */
'pubsub' => 'Predis\Command\PubSubPubsub',
);
}
}
+90
View File
@@ -0,0 +1,90 @@
<?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\Command;
use PHPUnit_Framework_TestCase as StandardTestCase;
/**
* @group commands
* @group realm-pubsub
*/
class PubSubPubsubTest extends CommandTestCase
{
/**
* {@inheritdoc}
*/
protected function getExpectedCommand()
{
return 'Predis\Command\PubSubPubsub';
}
/**
* {@inheritdoc}
*/
protected function getExpectedId()
{
return 'PUBSUB';
}
/**
* @group disconnected
*/
public function testFilterArguments()
{
$arguments = array('channels', 'predis:*');
$expected = array('channels', 'predis:*');
$command = $this->getCommand();
$command->setArguments($arguments);
$this->assertSame($expected, $command->getArguments());
}
/**
* @group disconnected
*/
public function testParseResponse()
{
$response = array('predis:incoming', 'predis:outgoing');
$expected = array('predis:incoming', 'predis:outgoing');
$command = $this->getCommandWithArguments('channels', 'predis:*');
$this->assertSame($expected, $command->parseResponse($response));
}
/**
* @group disconnected
*/
public function testPubsubNumsub()
{
$response = array('predis:incoming', '10', 'predis:outgoing', '8');
$expected = array('predis:incoming' => '10', 'predis:outgoing' => '8');
$command = $this->getCommandWithArguments('numsub', 'predis:incoming', 'predis:outgoing');
$this->assertSame($expected, $command->parseResponse($response));
}
/**
* @group disconnected
*/
public function testPubsubNumpat()
{
$response = 6;
$expected = 6;
$command = $this->getCommandWithArguments('numpat');
$this->assertSame($expected, $command->parseResponse($response));
}
}
@@ -178,6 +178,7 @@ class ServerVersion28Test extends ServerVersionTestCase
137 => 'sscan',
138 => 'zscan',
139 => 'hscan',
140 => 'pubsub',
);
}
}
@@ -178,6 +178,7 @@ class ServerVersionNextTest extends ServerVersionTestCase
137 => 'sscan',
138 => 'zscan',
139 => 'hscan',
140 => 'pubsub',
);
}
}