app\tests\cases\extensions\adapter\session \ ModelTest

Test for Model session adapter

Download |
| Newest | Edit
<?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 {
}

?>

Description

This is the test case for the model session adapter. See http://lab.lithify.me/lab/extensions/view/a68f6ad626aaf7be37805f8e72f672e2 for more information.

Details

  • Version: 1
  • Created: 2010-07-23 09:16:24
  • File: app/tests/cases/extensions/adapter/session/ModelTest.php

Maintainers