merged branch Baachi/test-refactoring (PR #5379)
Commits
-------
f2d8a8a
Refactor the unit test for the "MongoDbSessionHandler"
Discussion
----------
[HttpFoundation] Refactor the unit test for the "MongoDbSessionHandler"
Bug fix: no
Feature addition: yes
Backwards compatibility break: no
Symfony2 tests pass: yes
Fixes the following tickets: -
Todo: -
License of the code: MIT
Documentation PR: -
---------------------------------------------------------------------------
by drak at 2012-08-29T19:49:49Z
Big +1 from me. Exactly how these kind of tests should be written.
This commit is contained in:
commit
24ae90deee
|
@ -18,35 +18,35 @@ use Symfony\Component\HttpFoundation\Session\Storage\Handler\MongoDbSessionHandl
|
|||
*/
|
||||
class MongoDbSessionHandlerTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
private static $mongo;
|
||||
/**
|
||||
* @var \PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
private $mongo;
|
||||
|
||||
public static function setUpBeforeClass()
|
||||
{
|
||||
if (class_exists('\Mongo')) {
|
||||
try {
|
||||
self::$mongo = new \Mongo();
|
||||
} catch (\Exception $e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $options;
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
if (null === self::$mongo) {
|
||||
$this->markTestSkipped('MongoDbSessionHandler requires the php "mongo" extension and a mongodb server on localhost');
|
||||
if (!class_exists('\Mongo')) {
|
||||
$this->markTestSkipped('MongoDbSessionHandler requires the php "mongo" extension');
|
||||
}
|
||||
|
||||
$this->options = array('database' => 'sf2-test', 'collection' => 'session-test');
|
||||
$this->options = array('database' => 'sf2-test', 'collection' => 'session-test');
|
||||
$this->mongo = $this->getMockBuilder('Mongo')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->storage = new MongoDbSessionHandler(self::$mongo, $this->options);
|
||||
}
|
||||
$this->options = array(
|
||||
'id_field' => 'sess_id',
|
||||
'data_field' => 'sess_data',
|
||||
'time_field' => 'sess_time',
|
||||
'database' => 'sf2-test',
|
||||
'collection' => 'session-test'
|
||||
);
|
||||
|
||||
protected function tearDown()
|
||||
{
|
||||
if (null !== self::$mongo) {
|
||||
self::$mongo->dropDB($this->options['database']);
|
||||
}
|
||||
$this->storage = new MongoDbSessionHandler($this->mongo, $this->options);
|
||||
}
|
||||
|
||||
public function testOpenMethodAlwaysReturnTrue()
|
||||
|
@ -61,39 +61,136 @@ class MongoDbSessionHandlerTest extends \PHPUnit_Framework_TestCase
|
|||
|
||||
public function testWrite()
|
||||
{
|
||||
$database = $this->getMockBuilder('MongoDB')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$collection = $this->getMockBuilder('MongoCollection')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->mongo->expects($this->once())
|
||||
->method('selectDB')
|
||||
->with($this->options['database'])
|
||||
->will($this->returnValue($database));
|
||||
|
||||
$database->expects($this->once())
|
||||
->method('selectCollection')
|
||||
->with($this->options['collection'])
|
||||
->will($this->returnValue($collection));
|
||||
|
||||
$that = $this;
|
||||
$data = array();
|
||||
|
||||
$collection->expects($this->once())
|
||||
->method('update')
|
||||
->will($this->returnCallback(function($citeria, $updateData, $options) use ($that, &$data) {
|
||||
$that->assertEquals(array($that->options['id_field'] => 'foo'), $citeria);
|
||||
$that->assertEquals(array('upsert' => true), $options);
|
||||
|
||||
$data = $updateData['$set'];
|
||||
}));
|
||||
|
||||
$this->assertTrue($this->storage->write('foo', 'bar'));
|
||||
$this->assertEquals('bar', $this->storage->read('foo'));
|
||||
|
||||
$this->assertEquals('foo', $data[$this->options['id_field']]);
|
||||
$this->assertEquals('bar', $data[$this->options['data_field']]->bin);
|
||||
}
|
||||
|
||||
public function testReplaceSessionData()
|
||||
{
|
||||
$database = $this->getMockBuilder('MongoDB')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$collection = $this->getMockBuilder('MongoCollection')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->mongo->expects($this->once())
|
||||
->method('selectDB')
|
||||
->with($this->options['database'])
|
||||
->will($this->returnValue($database));
|
||||
|
||||
$database->expects($this->once())
|
||||
->method('selectCollection')
|
||||
->with($this->options['collection'])
|
||||
->will($this->returnValue($collection));
|
||||
|
||||
$data = array();
|
||||
|
||||
$collection->expects($this->exactly(2))
|
||||
->method('update')
|
||||
->will($this->returnCallback(function($citeria, $updateData, $options) use (&$data) {
|
||||
$data = $updateData;
|
||||
}));
|
||||
|
||||
$this->storage->write('foo', 'bar');
|
||||
$this->storage->write('foo', 'foobar');
|
||||
|
||||
$coll = self::$mongo->selectDB($this->options['database'])->selectCollection($this->options['collection']);
|
||||
|
||||
$this->assertEquals('foobar', $this->storage->read('foo'));
|
||||
$this->assertEquals(1, $coll->find(array('sess_id' => 'foo'))->count());
|
||||
$this->assertEquals('foobar', $data['$set'][$this->options['data_field']]->bin);
|
||||
}
|
||||
|
||||
public function testDestroy()
|
||||
{
|
||||
$this->storage->write('foo', 'bar');
|
||||
$this->storage->destroy('foo');
|
||||
$database = $this->getMockBuilder('MongoDB')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->assertEquals('', $this->storage->read('foo'));
|
||||
$collection = $this->getMockBuilder('MongoCollection')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->mongo->expects($this->once())
|
||||
->method('selectDB')
|
||||
->with($this->options['database'])
|
||||
->will($this->returnValue($database));
|
||||
|
||||
$database->expects($this->once())
|
||||
->method('selectCollection')
|
||||
->with($this->options['collection'])
|
||||
->will($this->returnValue($collection));
|
||||
|
||||
$collection->expects($this->once())
|
||||
->method('remove')
|
||||
->with(
|
||||
array($this->options['id_field'] => 'foo'),
|
||||
array('justOne' => true)
|
||||
);
|
||||
|
||||
|
||||
$this->storage->destroy('foo');
|
||||
}
|
||||
|
||||
public function testGc()
|
||||
{
|
||||
$this->storage->write('foo', 'bar');
|
||||
$this->storage->write('bar', 'foo');
|
||||
$database = $this->getMockBuilder('MongoDB')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$coll = self::$mongo->selectDB($this->options['database'])->selectCollection($this->options['collection']);
|
||||
$collection = $this->getMockBuilder('MongoCollection')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->mongo->expects($this->once())
|
||||
->method('selectDB')
|
||||
->with($this->options['database'])
|
||||
->will($this->returnValue($database));
|
||||
|
||||
$database->expects($this->once())
|
||||
->method('selectCollection')
|
||||
->with($this->options['collection'])
|
||||
->will($this->returnValue($collection));
|
||||
|
||||
$that = $this;
|
||||
|
||||
$collection->expects($this->once())
|
||||
->method('remove')
|
||||
->will($this->returnCallback(function($citeria) use($that) {
|
||||
$that->assertInstanceOf('MongoTimestamp', $citeria[$that->options['time_field']]['$lt']);
|
||||
$that->assertGreaterThanOrEqual(time() - -1, $citeria[$that->options['time_field']]['$lt']->sec);
|
||||
}));
|
||||
|
||||
$this->assertEquals(2, $coll->count());
|
||||
$this->storage->gc(-1);
|
||||
$this->assertEquals(0, $coll->count());
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Reference in New Issue