mirror of
https://github.com/predis/predis.git
synced 2026-10-19 10:15:35 +00:00
b7f411a252
Right now we don't have integration tests since the returned values from Redis may not always be predictable, but the current tests should suffice.
396 lines
13 KiB
PHP
396 lines
13 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\Iterator\Scan;
|
|
|
|
use \PHPUnit_Framework_TestCase as StandardTestCase;
|
|
|
|
use Predis\Client;
|
|
use Predis\Profile\ServerProfile;
|
|
|
|
/**
|
|
* @group realm-iterators
|
|
*/
|
|
class SetIteratorTest extends StandardTestCase
|
|
{
|
|
/**
|
|
* @group disconnected
|
|
* @expectedException Predis\NotSupportedException
|
|
* @expectedExceptionMessage The specified server profile does not support the `SSCAN` command.
|
|
*/
|
|
public function testThrowsExceptionOnInvalidServerProfile()
|
|
{
|
|
$client = $this->getMock('Predis\ClientInterface');
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.0')));
|
|
|
|
$iterator = new SetIterator($client, 'key:set');
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testIterationOnSingleFetch()
|
|
{
|
|
$client = $this->getMock('Predis\Client', array('getProfile', 'sscan'));
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.8')));
|
|
$client->expects($this->once())
|
|
->method('sscan')
|
|
->with('key:set', 0, array())
|
|
->will($this->returnValue(array(0, array('member:1st', 'member:2nd', 'member:3rd'))));
|
|
|
|
$iterator = new SetIterator($client, 'key:set');
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('member:1st', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(1, $iterator->key());
|
|
$this->assertSame('member:2nd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(2, $iterator->key());
|
|
$this->assertSame('member:3rd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertFalse($iterator->valid());
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testIterationOnMultipleFetches()
|
|
{
|
|
$client = $this->getMock('Predis\Client', array('getProfile', 'sscan'));
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.8')));
|
|
$client->expects($this->at(1))
|
|
->method('sscan')
|
|
->with('key:set', 0, array())
|
|
->will($this->returnValue(array(2, array('member:1st', 'member:2nd'))));
|
|
$client->expects($this->at(2))
|
|
->method('sscan')
|
|
->with('key:set', 2, array())
|
|
->will($this->returnValue(array(0, array('member:3rd'))));
|
|
|
|
$iterator = new SetIterator($client, 'key:set');
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('member:1st', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(1, $iterator->key());
|
|
$this->assertSame('member:2nd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(2, $iterator->key());
|
|
$this->assertSame('member:3rd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertFalse($iterator->valid());
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testIterationWithMultipleFetchesAndHoles()
|
|
{
|
|
$client = $this->getMock('Predis\Client', array('getProfile', 'sscan'));
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.8')));
|
|
$client->expects($this->at(1))
|
|
->method('sscan')
|
|
->with('key:set', 0, array())
|
|
->will($this->returnValue(array(2, array('member:1st', 'member:2nd'))));
|
|
$client->expects($this->at(2))
|
|
->method('sscan')
|
|
->with('key:set', 2, array())
|
|
->will($this->returnValue(array(5, array())));
|
|
$client->expects($this->at(3))
|
|
->method('sscan')
|
|
->with('key:set', 5, array())
|
|
->will($this->returnValue(array(0, array('member:3rd'))));
|
|
|
|
$iterator = new SetIterator($client, 'key:set');
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('member:1st', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(1, $iterator->key());
|
|
$this->assertSame('member:2nd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(2, $iterator->key());
|
|
$this->assertSame('member:3rd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertFalse($iterator->valid());
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testIterationWithOptionMatch()
|
|
{
|
|
$client = $this->getMock('Predis\Client', array('getProfile', 'sscan'));
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.8')));
|
|
$client->expects($this->at(1))
|
|
->method('sscan')
|
|
->with('key:set', 0, array('MATCH' => 'member:*'))
|
|
->will($this->returnValue(array(0, array('member:1st', 'member:2nd'))));
|
|
|
|
$iterator = new SetIterator($client, 'key:set', 'member:*');
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('member:1st', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(1, $iterator->key());
|
|
$this->assertSame('member:2nd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertFalse($iterator->valid());
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testIterationWithOptionMatchOnMultipleFetches()
|
|
{
|
|
$client = $this->getMock('Predis\Client', array('getProfile', 'sscan'));
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.8')));
|
|
$client->expects($this->at(1))
|
|
->method('sscan')
|
|
->with('key:set', 0, array('MATCH' => 'member:*'))
|
|
->will($this->returnValue(array(1, array('member:1st'))));
|
|
$client->expects($this->at(2))
|
|
->method('sscan')
|
|
->with('key:set', 1, array('MATCH' => 'member:*'))
|
|
->will($this->returnValue(array(0, array('member:2nd'))));
|
|
|
|
$iterator = new SetIterator($client, 'key:set', 'member:*');
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('member:1st', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(1, $iterator->key());
|
|
$this->assertSame('member:2nd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertFalse($iterator->valid());
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testIterationWithOptionCount()
|
|
{
|
|
$client = $this->getMock('Predis\Client', array('getProfile', 'sscan'));
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.8')));
|
|
$client->expects($this->at(1))
|
|
->method('sscan')
|
|
->with('key:set', 0, array('COUNT' => 2))
|
|
->will($this->returnValue(array(0, array('member:1st', 'member:2nd'))));
|
|
|
|
$iterator = new SetIterator($client, 'key:set', null, 2);
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('member:1st', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(1, $iterator->key());
|
|
$this->assertSame('member:2nd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertFalse($iterator->valid());
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testIterationWithOptionCountOnMultipleFetches()
|
|
{
|
|
$client = $this->getMock('Predis\Client', array('getProfile', 'sscan'));
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.8')));
|
|
$client->expects($this->at(1))
|
|
->method('sscan')
|
|
->with('key:set', 0, array('COUNT' => 1))
|
|
->will($this->returnValue(array(1, array('member:1st'))));
|
|
$client->expects($this->at(2))
|
|
->method('sscan')
|
|
->with('key:set', 1, array('COUNT' => 1))
|
|
->will($this->returnValue(array(0, array('member:2nd'))));
|
|
|
|
$iterator = new SetIterator($client, 'key:set', null, 1);
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('member:1st', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(1, $iterator->key());
|
|
$this->assertSame('member:2nd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertFalse($iterator->valid());
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testIterationWithOptionsMatchAndCount()
|
|
{
|
|
$client = $this->getMock('Predis\Client', array('getProfile', 'sscan'));
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.8')));
|
|
$client->expects($this->at(1))
|
|
->method('sscan')
|
|
->with('key:set', 0, array('MATCH' => 'member:*', 'COUNT' => 2))
|
|
->will($this->returnValue(array(0, array('member:1st', 'member:2nd'))));
|
|
|
|
$iterator = new SetIterator($client, 'key:set', 'member:*', 2);
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('member:1st', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(1, $iterator->key());
|
|
$this->assertSame('member:2nd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertFalse($iterator->valid());
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testIterationWithOptionsMatchAndCountOnMultipleFetches()
|
|
{
|
|
$client = $this->getMock('Predis\Client', array('getProfile', 'sscan'));
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.8')));
|
|
$client->expects($this->at(1))
|
|
->method('sscan')
|
|
->with('key:set', 0, array('MATCH' => 'member:*', 'COUNT' => 1))
|
|
->will($this->returnValue(array(1, array('member:1st'))));
|
|
$client->expects($this->at(2))
|
|
->method('sscan')
|
|
->with('key:set', 1, array('MATCH' => 'member:*', 'COUNT' => 1))
|
|
->will($this->returnValue(array(0, array('member:2nd'))));
|
|
|
|
$iterator = new SetIterator($client, 'key:set', 'member:*', 1);
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('member:1st', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(1, $iterator->key());
|
|
$this->assertSame('member:2nd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertFalse($iterator->valid());
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testIterationRewindable()
|
|
{
|
|
$client = $this->getMock('Predis\Client', array('getProfile', 'sscan'));
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.8')));
|
|
$client->expects($this->exactly(2))
|
|
->method('sscan')
|
|
->with('key:set', 0, array())
|
|
->will($this->returnValue(array(0, array('member:1st', 'member:2nd'))));
|
|
|
|
$iterator = new SetIterator($client, 'key:set');
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('member:1st', $iterator->current());
|
|
|
|
$iterator->rewind();
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('member:1st', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(1, $iterator->key());
|
|
$this->assertSame('member:2nd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertFalse($iterator->valid());
|
|
}
|
|
}
|