mirror of
https://github.com/predis/predis.git
synced 2026-10-21 11:16:15 +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 KeyspaceIteratorTest extends StandardTestCase
|
|
{
|
|
/**
|
|
* @group disconnected
|
|
* @expectedException Predis\NotSupportedException
|
|
* @expectedExceptionMessage The specified server profile does not support the `SCAN` command.
|
|
*/
|
|
public function testThrowsExceptionOnInvalidServerProfile()
|
|
{
|
|
$client = $this->getMock('Predis\ClientInterface');
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.0')));
|
|
|
|
$iterator = new KeyspaceIterator($client);
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testIterationOnSingleFetch()
|
|
{
|
|
$client = $this->getMock('Predis\Client', array('getProfile', 'scan'));
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.8')));
|
|
$client->expects($this->once())
|
|
->method('scan')
|
|
->with(0, array())
|
|
->will($this->returnValue(array(0, array('key:1st', 'key:2nd', 'key:3rd'))));
|
|
|
|
$iterator = new KeyspaceIterator($client);
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('key:1st', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(1, $iterator->key());
|
|
$this->assertSame('key:2nd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(2, $iterator->key());
|
|
$this->assertSame('key:3rd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertFalse($iterator->valid());
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testIterationOnMultipleFetches()
|
|
{
|
|
$client = $this->getMock('Predis\Client', array('getProfile', 'scan'));
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.8')));
|
|
$client->expects($this->at(1))
|
|
->method('scan')
|
|
->with(0, array())
|
|
->will($this->returnValue(array(2, array('key:1st', 'key:2nd'))));
|
|
$client->expects($this->at(2))
|
|
->method('scan')
|
|
->with(2, array())
|
|
->will($this->returnValue(array(0, array('key:3rd'))));
|
|
|
|
$iterator = new KeyspaceIterator($client);
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('key:1st', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(1, $iterator->key());
|
|
$this->assertSame('key:2nd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(2, $iterator->key());
|
|
$this->assertSame('key:3rd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertFalse($iterator->valid());
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testIterationWithMultipleFetchesAndHoles()
|
|
{
|
|
$client = $this->getMock('Predis\Client', array('getProfile', 'scan'));
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.8')));
|
|
$client->expects($this->at(1))
|
|
->method('scan')
|
|
->with(0, array())
|
|
->will($this->returnValue(array(2, array('key:1st', 'key:2nd'))));
|
|
$client->expects($this->at(2))
|
|
->method('scan')
|
|
->with(2, array())
|
|
->will($this->returnValue(array(5, array())));
|
|
$client->expects($this->at(3))
|
|
->method('scan')
|
|
->with(5, array())
|
|
->will($this->returnValue(array(0, array('key:3rd'))));
|
|
|
|
$iterator = new KeyspaceIterator($client);
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('key:1st', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(1, $iterator->key());
|
|
$this->assertSame('key:2nd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(2, $iterator->key());
|
|
$this->assertSame('key:3rd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertFalse($iterator->valid());
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testIterationWithOptionMatch()
|
|
{
|
|
$client = $this->getMock('Predis\Client', array('getProfile', 'scan'));
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.8')));
|
|
$client->expects($this->at(1))
|
|
->method('scan')
|
|
->with(0, array('MATCH' => 'key:*'))
|
|
->will($this->returnValue(array(0, array('key:1st', 'key:2nd'))));
|
|
|
|
$iterator = new KeyspaceIterator($client, 'key:*');
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('key:1st', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(1, $iterator->key());
|
|
$this->assertSame('key:2nd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertFalse($iterator->valid());
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testIterationWithOptionMatchOnMultipleFetches()
|
|
{
|
|
$client = $this->getMock('Predis\Client', array('getProfile', 'scan'));
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.8')));
|
|
$client->expects($this->at(1))
|
|
->method('scan')
|
|
->with(0, array('MATCH' => 'key:*'))
|
|
->will($this->returnValue(array(1, array('key:1st'))));
|
|
$client->expects($this->at(2))
|
|
->method('scan')
|
|
->with(1, array('MATCH' => 'key:*'))
|
|
->will($this->returnValue(array(0, array('key:2nd'))));
|
|
|
|
$iterator = new KeyspaceIterator($client, 'key:*');
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('key:1st', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(1, $iterator->key());
|
|
$this->assertSame('key:2nd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertFalse($iterator->valid());
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testIterationWithOptionCount()
|
|
{
|
|
$client = $this->getMock('Predis\Client', array('getProfile', 'scan'));
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.8')));
|
|
$client->expects($this->at(1))
|
|
->method('scan')
|
|
->with(0, array('COUNT' => 2))
|
|
->will($this->returnValue(array(0, array('key:1st', 'key:2nd'))));
|
|
|
|
$iterator = new KeyspaceIterator($client, null, 2);
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('key:1st', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(1, $iterator->key());
|
|
$this->assertSame('key:2nd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertFalse($iterator->valid());
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testIterationWithOptionCountOnMultipleFetches()
|
|
{
|
|
$client = $this->getMock('Predis\Client', array('getProfile', 'scan'));
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.8')));
|
|
$client->expects($this->at(1))
|
|
->method('scan')
|
|
->with(0, array('COUNT' => 1))
|
|
->will($this->returnValue(array(1, array('key:1st'))));
|
|
$client->expects($this->at(2))
|
|
->method('scan')
|
|
->with(1, array('COUNT' => 1))
|
|
->will($this->returnValue(array(0, array('key:2nd'))));
|
|
|
|
$iterator = new KeyspaceIterator($client, null, 1);
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('key:1st', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(1, $iterator->key());
|
|
$this->assertSame('key:2nd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertFalse($iterator->valid());
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testIterationWithOptionsMatchAndCount()
|
|
{
|
|
$client = $this->getMock('Predis\Client', array('getProfile', 'scan'));
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.8')));
|
|
$client->expects($this->at(1))
|
|
->method('scan')
|
|
->with(0, array('MATCH' => 'key:*', 'COUNT' => 2))
|
|
->will($this->returnValue(array(0, array('key:1st', 'key:2nd'))));
|
|
|
|
$iterator = new KeyspaceIterator($client, 'key:*', 2);
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('key:1st', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(1, $iterator->key());
|
|
$this->assertSame('key:2nd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertFalse($iterator->valid());
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testIterationWithOptionsMatchAndCountOnMultipleFetches()
|
|
{
|
|
$client = $this->getMock('Predis\Client', array('getProfile', 'scan'));
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.8')));
|
|
$client->expects($this->at(1))
|
|
->method('scan')
|
|
->with(0, array('MATCH' => 'key:*', 'COUNT' => 1))
|
|
->will($this->returnValue(array(1, array('key:1st'))));
|
|
$client->expects($this->at(2))
|
|
->method('scan')
|
|
->with(1, array('MATCH' => 'key:*', 'COUNT' => 1))
|
|
->will($this->returnValue(array(0, array('key:2nd'))));
|
|
|
|
$iterator = new KeyspaceIterator($client, 'key:*', 1);
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('key:1st', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(1, $iterator->key());
|
|
$this->assertSame('key:2nd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertFalse($iterator->valid());
|
|
}
|
|
|
|
/**
|
|
* @group disconnected
|
|
*/
|
|
public function testIterationRewindable()
|
|
{
|
|
$client = $this->getMock('Predis\Client', array('getProfile', 'scan'));
|
|
|
|
$client->expects($this->any())
|
|
->method('getProfile')
|
|
->will($this->returnValue(ServerProfile::get('2.8')));
|
|
$client->expects($this->exactly(2))
|
|
->method('scan')
|
|
->with(0, array())
|
|
->will($this->returnValue(array(0, array('key:1st', 'key:2nd'))));
|
|
|
|
$iterator = new KeyspaceIterator($client);
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('key:1st', $iterator->current());
|
|
|
|
$iterator->rewind();
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(0, $iterator->key());
|
|
$this->assertSame('key:1st', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertTrue($iterator->valid());
|
|
$this->assertSame(1, $iterator->key());
|
|
$this->assertSame('key:2nd', $iterator->current());
|
|
|
|
$iterator->next();
|
|
$this->assertFalse($iterator->valid());
|
|
}
|
|
}
|