<?php
/**
* Lithium: the most rad php framework
*
* @copyright Copyright 2010, Union of Rad, Inc. (http://union-of-rad.org)
* @license http://opensource.org/licenses/bsd-license.php The BSD License
*/
namespace app\tests\cases\extensions\adapter\session;
use app\extensions\adapter\session\Model;
class ModelTest extends \lithium\test\Unit {
protected $_model = 'IDlib\tests\cases\extensions\adapter\session\MockSessionModel';
public function setUp() {
if (session_id()) {
$this->_destroySession(session_id());
}
/* Garbage collection */
$this->_gc_divisor = ini_get('session.gc_divisor');
ini_set('session.gc_divisor', '1');
}
public function tearDown() {
/* Revert to original garbage collection probability */
ini_set('session.gc_divisor', $this->_gc_divisor);
}
protected function _destroySession($name) {
if (session_id()) {
$settings = session_get_cookie_params();
setcookie(
$name, '', time() - 1000, $settings['path'], $settings['domain'],
$settings['secure'], $settings['httponly']
);
session_destroy();
}
$_SESSION = array();
}
public function testEnabled() {
$Model = new Model(array('init' => false));
$this->assertFalse($Model::enabled());
session_start();
$this->assertTrue($Model::enabled());
}
public function testInit() {
$id = session_id();
$this->assertTrue(empty($id));
$ModelAdapter = new Model(array('init' => false));
$id = session_id();
$this->assertTrue(empty($id));
$this->assertFalse($ModelAdapter::enabled());
$this->expectException("/A valid model is required to use the Model session adapter./");
$ModelAdapter = new Model();
}
public function testInitWithModel() {
$modelAdapter = new Model(array('model' => $this->_model));
$key = 'foo';
$closure = $modelAdapter->read($key);
$this->assertTrue(is_callable($closure));
$result = $closure($modelAdapter, compact('key'), null);
$this->assertNull($result);
$value = 'bar';
$closure = $modelAdapter->write($key, $value);
$this->assertTrue($closure($modelAdapter, compact('key', 'value'), null));
$closure = $modelAdapter->read($key);
$result = $closure($modelAdapter, compact('key'), null);
$this->assertEqual($value, $result);
}
public function testDefaultConfiguration() {
$result = ini_get('session.cookie_secure');
$this->assertFalse($result);
$result = ini_get('session.cookie_httponly');
$this->assertFalse($result);
}
public function testCustomConfiguration() {
$config = array('cookie_secure' => true, 'model' => $this->_model);
$ModelAdapter = new Model($config);
$result = ini_get('session.cookie_secure');
$this->assertTrue($result);
$result = ini_get('session.cookie_httponly');
$this->assertFalse($result);
}
public function testIsStarted() {
$ModelAdapter = new Model(array('model' => $this->_model));
$result = $ModelAdapter->isStarted();
$this->assertTrue($result);
}
public function testKey() {
$ModelAdapter = new Model(array('model' => $this->_model));
$result = $ModelAdapter->key();
$this->assertEqual(session_id(), $result);
$this->_destroySession(session_name());
$result = $ModelAdapter->key();
$this->assertNull($result);
}
public function testWriteAndRead() {
$ModelAdapter = new Model(array('model' => $this->_model));
$key = 'write';
$value = 'value to be written';
$closure = $ModelAdapter->write($key, $value);
$this->assertTrue(is_callable($closure));
$params = compact('key', 'value');
$result = $closure($ModelAdapter, $params, null);
$this->assertTrue($result);
$closure = $ModelAdapter->read($key);
$this->assertTrue(is_callable($closure));
$params = compact('key');
$result = $closure($ModelAdapter, $params, null);
$this->assertEqual($value, $result);
}
public function testReadAll() {
$ModelAdapter = new Model(array('model' => $this->_model));
$key = 'write';
$value = 'value to be written';
$closure = $ModelAdapter->write($key, $value);
$this->assertTrue(is_callable($closure));
$params = compact('key', 'value');
$result = $closure($ModelAdapter, $params, null);
$this->assertTrue($result);
$closure = $ModelAdapter->read();
$this->assertTrue(is_callable($closure));
$params = array('key' => null);
$result = $closure($ModelAdapter, $params, null);
$expected = array($key => $value);
$this->assertTrue(isset($result[$key]));
$this->assertEqual($expected[$key], $result[$key]);
}
public function testCheck() {
$ModelAdapter = new Model(array('model' => $this->_model));
$key = 'check';
$value = 'value to be checked';
$closure = $ModelAdapter->write($key, $value);
$this->assertTrue(is_callable($closure));
$params = compact('key', 'value');
$result = $closure($ModelAdapter, $params, null);
$this->assertTrue($result);
$closure = $ModelAdapter->check($key);
$this->assertTrue(is_callable($closure));
$params = compact('key');
$result = $closure($ModelAdapter, $params, null);
$this->assertTrue($result);
$key = 'does_not_exist';
$closure = $ModelAdapter->check($key);
$this->assertTrue(is_callable($closure));
$params = compact('key');
$result = $closure($ModelAdapter, $params, null);
$this->assertFalse($result);
}
public function testWriteAndDelete() {
$ModelAdapter = new Model(array('model' => $this->_model));
$key = 'write';
$value = 'value to be written';
$closure = $ModelAdapter->write($key, $value);
$this->assertTrue(is_callable($closure));
$params = compact('key', 'value');
$result = $closure($ModelAdapter, $params, null);
$this->assertTrue($result);
$closure = $ModelAdapter->delete($key);
$this->assertTrue(is_callable($closure));
$params = compact('key');
$result = $closure($ModelAdapter, $params, null);
$this->assertTrue($result);
$key = 'non-existent';
$closure = $ModelAdapter->delete($key);
$this->assertTrue(is_callable($closure));
$params = compact('key');
$result = $closure($ModelAdapter, $params, null);
$this->assertFalse($result);
}
}
class MockSessionModel extends \lithium\data\Model {
}
?>