Blame | Last modification | View Log | RSS feed
<?php/*** CookieComponentTest file** CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)** Licensed under The MIT License* For full copyright and license information, please see the LICENSE.txt* Redistributions of files must retain the above copyright notice** @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)* @link http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests* @package Cake.Test.Case.Controller.Component* @since CakePHP(tm) v 1.2.0.5435* @license http://www.opensource.org/licenses/mit-license.php MIT License*/App::uses('Component', 'Controller');App::uses('Controller', 'Controller');App::uses('CookieComponent', 'Controller/Component');/*** CookieComponentTestController class** @package Cake.Test.Case.Controller.Component*/class CookieComponentTestController extends Controller {/*** components property** @var array*/public $components = array('Cookie');/*** beforeFilter method** @return void*/public function beforeFilter() {$this->Cookie->name = 'CakeTestCookie';$this->Cookie->time = 10;$this->Cookie->path = '/';$this->Cookie->domain = '';$this->Cookie->secure = false;$this->Cookie->key = 'somerandomhaskey';}}/*** CookieComponentTest class** @package Cake.Test.Case.Controller.Component*/class CookieComponentTest extends CakeTestCase {/*** Controller property** @var CookieComponentTestController*/public $Controller;/*** start** @return void*/public function setUp() {parent::setUp();$_COOKIE = array();$this->Controller = new CookieComponentTestController(new CakeRequest(), new CakeResponse());$this->Controller->constructClasses();$this->Cookie = $this->Controller->Cookie;$this->Cookie->name = 'CakeTestCookie';$this->Cookie->time = 10;$this->Cookie->path = '/';$this->Cookie->domain = '';$this->Cookie->secure = false;$this->Cookie->key = 'somerandomhaskey';$this->Cookie->startup($this->Controller);}/*** end** @return void*/public function tearDown() {parent::tearDown();$this->Cookie->destroy();}/*** sets up some default cookie data.** @return void*/protected function _setCookieData() {$this->Cookie->write(array('Encrytped_array' => array('name' => 'CakePHP', 'version' => '1.2.0.x', 'tag' => 'CakePHP Rocks!')));$this->Cookie->write(array('Encrytped_multi_cookies.name' => 'CakePHP'));$this->Cookie->write(array('Encrytped_multi_cookies.version' => '1.2.0.x'));$this->Cookie->write(array('Encrytped_multi_cookies.tag' => 'CakePHP Rocks!'));$this->Cookie->write(array('Plain_array' => array('name' => 'CakePHP', 'version' => '1.2.0.x', 'tag' => 'CakePHP Rocks!')), null, false);$this->Cookie->write(array('Plain_multi_cookies.name' => 'CakePHP'), null, false);$this->Cookie->write(array('Plain_multi_cookies.version' => '1.2.0.x'), null, false);$this->Cookie->write(array('Plain_multi_cookies.tag' => 'CakePHP Rocks!'), null, false);}/*** test that initialize sets settings from components array** @return void*/public function testSettings() {$settings = array('time' => '5 days','path' => '/');$Cookie = new CookieComponent(new ComponentCollection(), $settings);$this->assertEquals($Cookie->time, $settings['time']);$this->assertEquals($Cookie->path, $settings['path']);}/*** testCookieName** @return void*/public function testCookieName() {$this->assertEquals('CakeTestCookie', $this->Cookie->name);}/*** testReadEncryptedCookieData** @return void*/public function testReadEncryptedCookieData() {$this->_setCookieData();$data = $this->Cookie->read('Encrytped_array');$expected = array('name' => 'CakePHP', 'version' => '1.2.0.x', 'tag' => 'CakePHP Rocks!');$this->assertEquals($expected, $data);$data = $this->Cookie->read('Encrytped_multi_cookies');$expected = array('name' => 'CakePHP', 'version' => '1.2.0.x', 'tag' => 'CakePHP Rocks!');$this->assertEquals($expected, $data);}/*** testReadPlainCookieData** @return void*/public function testReadPlainCookieData() {$this->_setCookieData();$data = $this->Cookie->read('Plain_array');$expected = array('name' => 'CakePHP', 'version' => '1.2.0.x', 'tag' => 'CakePHP Rocks!');$this->assertEquals($expected, $data);$data = $this->Cookie->read('Plain_multi_cookies');$expected = array('name' => 'CakePHP', 'version' => '1.2.0.x', 'tag' => 'CakePHP Rocks!');$this->assertEquals($expected, $data);}/*** test read() after switching the cookie name.** @return void*/public function testReadWithNameSwitch() {$_COOKIE = array('CakeTestCookie' => array('key' => 'value'),'OtherTestCookie' => array('key' => 'other value'));$this->assertEquals('value', $this->Cookie->read('key'));$this->Cookie->name = 'OtherTestCookie';$this->assertEquals('other value', $this->Cookie->read('key'));}/*** test a simple write()** @return void*/public function testWriteSimple() {$this->Cookie->write('Testing', 'value');$result = $this->Cookie->read('Testing');$this->assertEquals('value', $result);}/*** test that two write() calls use the expiry.** @return void*/public function testWriteMultipleShareExpiry() {$this->Cookie->write('key1', 'value1', false);$this->Cookie->write('key2', 'value2', false);$name = $this->Cookie->name . '[key1]';$result = $this->Controller->response->cookie($name);$this->assertWithinMargin(time() + 10, $result['expire'], 2, 'Expiry time is wrong');$name = $this->Cookie->name . '[key2]';$result = $this->Controller->response->cookie($name);$this->assertWithinMargin(time() + 10, $result['expire'], 2, 'Expiry time is wrong');}/*** test write with distant future cookies** @return void*/public function testWriteFarFuture() {$this->Cookie->write('Testing', 'value', false, '+90 years');$future = new DateTime('now');$future->modify('+90 years');$expected = array('name' => $this->Cookie->name . '[Testing]','value' => 'value','path' => '/','domain' => '','secure' => false,'httpOnly' => false);$result = $this->Controller->response->cookie($this->Cookie->name . '[Testing]');$this->assertEquals($future->format('U'), $result['expire'], '', 3);unset($result['expire']);$this->assertEquals($expected, $result);}/*** test write with httpOnly cookies** @return void*/public function testWriteHttpOnly() {$this->Cookie->httpOnly = true;$this->Cookie->secure = false;$this->Cookie->write('Testing', 'value', false);$expected = array('name' => $this->Cookie->name . '[Testing]','value' => 'value','expire' => time() + 10,'path' => '/','domain' => '','secure' => false,'httpOnly' => true);$result = $this->Controller->response->cookie($this->Cookie->name . '[Testing]');$this->assertEquals($expected, $result);}/*** test delete with httpOnly** @return void*/public function testDeleteHttpOnly() {$this->Cookie->httpOnly = true;$this->Cookie->secure = false;$this->Cookie->delete('Testing', false);$expected = array('name' => $this->Cookie->name . '[Testing]','value' => '','expire' => time() - 42000,'path' => '/','domain' => '','secure' => false,'httpOnly' => true);$result = $this->Controller->response->cookie($this->Cookie->name . '[Testing]');$this->assertEquals($expected, $result);}/*** testWritePlainCookieArray** @return void*/public function testWritePlainCookieArray() {$this->Cookie->write(array('name' => 'CakePHP', 'version' => '1.2.0.x', 'tag' => 'CakePHP Rocks!'), null, false);$this->assertEquals('CakePHP', $this->Cookie->read('name'));$this->assertEquals('1.2.0.x', $this->Cookie->read('version'));$this->assertEquals('CakePHP Rocks!', $this->Cookie->read('tag'));$this->Cookie->delete('name');$this->Cookie->delete('version');$this->Cookie->delete('tag');}/*** test writing values that are not scalars** @return void*/public function testWriteArrayValues() {$this->Cookie->secure = false;$this->Cookie->write('Testing', array(1, 2, 3), false);$expected = array('name' => $this->Cookie->name . '[Testing]','value' => '[1,2,3]','path' => '/','domain' => '','secure' => false,'httpOnly' => false);$result = $this->Controller->response->cookie($this->Cookie->name . '[Testing]');$this->assertWithinMargin($result['expire'], time() + 10, 1);unset($result['expire']);$this->assertEquals($expected, $result);}/*** Test that writing mixed arrays results in the correct data.** @return void*/public function testWriteMixedArray() {$this->Cookie->encrypt = false;$this->Cookie->write('User', array('name' => 'mark'), false);$this->Cookie->write('User.email', 'mark@example.com', false);$expected = array('name' => $this->Cookie->name . '[User]','value' => '{"name":"mark","email":"mark@example.com"}','path' => '/','domain' => '','secure' => false,'httpOnly' => false);$result = $this->Controller->response->cookie($this->Cookie->name . '[User]');unset($result['expire']);$this->assertEquals($expected, $result);$this->Cookie->write('User.email', 'mark@example.com', false);$this->Cookie->write('User', array('name' => 'mark'), false);$expected = array('name' => $this->Cookie->name . '[User]','value' => '{"name":"mark"}','path' => '/','domain' => '','secure' => false,'httpOnly' => false);$result = $this->Controller->response->cookie($this->Cookie->name . '[User]');unset($result['expire']);$this->assertEquals($expected, $result);}/*** testReadingCookieValue** @return void*/public function testReadingCookieValue() {$this->_setCookieData();$data = $this->Cookie->read();$expected = array('Encrytped_array' => array('name' => 'CakePHP','version' => '1.2.0.x','tag' => 'CakePHP Rocks!'),'Encrytped_multi_cookies' => array('name' => 'CakePHP','version' => '1.2.0.x','tag' => 'CakePHP Rocks!'),'Plain_array' => array('name' => 'CakePHP','version' => '1.2.0.x','tag' => 'CakePHP Rocks!'),'Plain_multi_cookies' => array('name' => 'CakePHP','version' => '1.2.0.x','tag' => 'CakePHP Rocks!'));$this->assertEquals($expected, $data);}/*** testDeleteCookieValue** @return void*/public function testDeleteCookieValue() {$this->_setCookieData();$this->Cookie->delete('Encrytped_multi_cookies.name');$data = $this->Cookie->read('Encrytped_multi_cookies');$expected = array('version' => '1.2.0.x', 'tag' => 'CakePHP Rocks!');$this->assertEquals($expected, $data);$this->Cookie->delete('Encrytped_array');$data = $this->Cookie->read('Encrytped_array');$this->assertNull($data);$this->Cookie->delete('Plain_multi_cookies.name');$data = $this->Cookie->read('Plain_multi_cookies');$expected = array('version' => '1.2.0.x', 'tag' => 'CakePHP Rocks!');$this->assertEquals($expected, $data);$this->Cookie->delete('Plain_array');$data = $this->Cookie->read('Plain_array');$this->assertNull($data);}/*** testReadingCookieArray** @return void*/public function testReadingCookieArray() {$this->_setCookieData();$data = $this->Cookie->read('Encrytped_array.name');$expected = 'CakePHP';$this->assertEquals($expected, $data);$data = $this->Cookie->read('Encrytped_array.version');$expected = '1.2.0.x';$this->assertEquals($expected, $data);$data = $this->Cookie->read('Encrytped_array.tag');$expected = 'CakePHP Rocks!';$this->assertEquals($expected, $data);$data = $this->Cookie->read('Encrytped_multi_cookies.name');$expected = 'CakePHP';$this->assertEquals($expected, $data);$data = $this->Cookie->read('Encrytped_multi_cookies.version');$expected = '1.2.0.x';$this->assertEquals($expected, $data);$data = $this->Cookie->read('Encrytped_multi_cookies.tag');$expected = 'CakePHP Rocks!';$this->assertEquals($expected, $data);$data = $this->Cookie->read('Plain_array.name');$expected = 'CakePHP';$this->assertEquals($expected, $data);$data = $this->Cookie->read('Plain_array.version');$expected = '1.2.0.x';$this->assertEquals($expected, $data);$data = $this->Cookie->read('Plain_array.tag');$expected = 'CakePHP Rocks!';$this->assertEquals($expected, $data);$data = $this->Cookie->read('Plain_multi_cookies.name');$expected = 'CakePHP';$this->assertEquals($expected, $data);$data = $this->Cookie->read('Plain_multi_cookies.version');$expected = '1.2.0.x';$this->assertEquals($expected, $data);$data = $this->Cookie->read('Plain_multi_cookies.tag');$expected = 'CakePHP Rocks!';$this->assertEquals($expected, $data);}/*** testReadingCookieDataOnStartup** @return void*/public function testReadingCookieDataOnStartup() {$data = $this->Cookie->read('Encrytped_array');$this->assertNull($data);$data = $this->Cookie->read('Encrytped_multi_cookies');$this->assertNull($data);$data = $this->Cookie->read('Plain_array');$this->assertNull($data);$data = $this->Cookie->read('Plain_multi_cookies');$this->assertNull($data);$_COOKIE['CakeTestCookie'] = array('Encrytped_array' => $this->_encrypt(array('name' => 'CakePHP', 'version' => '1.2.0.x', 'tag' => 'CakePHP Rocks!')),'Encrytped_multi_cookies' => array('name' => $this->_encrypt('CakePHP'),'version' => $this->_encrypt('1.2.0.x'),'tag' => $this->_encrypt('CakePHP Rocks!')),'Plain_array' => '{"name":"CakePHP","version":"1.2.0.x","tag":"CakePHP Rocks!"}','Plain_multi_cookies' => array('name' => 'CakePHP','version' => '1.2.0.x','tag' => 'CakePHP Rocks!'));$this->Cookie->startup(new CookieComponentTestController());$data = $this->Cookie->read('Encrytped_array');$expected = array('name' => 'CakePHP', 'version' => '1.2.0.x', 'tag' => 'CakePHP Rocks!');$this->assertEquals($expected, $data);$data = $this->Cookie->read('Encrytped_multi_cookies');$expected = array('name' => 'CakePHP', 'version' => '1.2.0.x', 'tag' => 'CakePHP Rocks!');$this->assertEquals($expected, $data);$data = $this->Cookie->read('Plain_array');$expected = array('name' => 'CakePHP', 'version' => '1.2.0.x', 'tag' => 'CakePHP Rocks!');$this->assertEquals($expected, $data);$data = $this->Cookie->read('Plain_multi_cookies');$expected = array('name' => 'CakePHP', 'version' => '1.2.0.x', 'tag' => 'CakePHP Rocks!');$this->assertEquals($expected, $data);$this->Cookie->destroy();unset($_COOKIE['CakeTestCookie']);}/*** testReadingCookieDataWithoutStartup** @return void*/public function testReadingCookieDataWithoutStartup() {$data = $this->Cookie->read('Encrytped_array');$expected = null;$this->assertEquals($expected, $data);$data = $this->Cookie->read('Encrytped_multi_cookies');$expected = null;$this->assertEquals($expected, $data);$data = $this->Cookie->read('Plain_array');$expected = null;$this->assertEquals($expected, $data);$data = $this->Cookie->read('Plain_multi_cookies');$expected = null;$this->assertEquals($expected, $data);$_COOKIE['CakeTestCookie'] = array('Encrytped_array' => $this->_encrypt(array('name' => 'CakePHP', 'version' => '1.2.0.x', 'tag' => 'CakePHP Rocks!')),'Encrytped_multi_cookies' => array('name' => $this->_encrypt('CakePHP'),'version' => $this->_encrypt('1.2.0.x'),'tag' => $this->_encrypt('CakePHP Rocks!')),'Plain_array' => '{"name":"CakePHP","version":"1.2.0.x","tag":"CakePHP Rocks!"}','Plain_multi_cookies' => array('name' => 'CakePHP','version' => '1.2.0.x','tag' => 'CakePHP Rocks!'));$data = $this->Cookie->read('Encrytped_array');$expected = array('name' => 'CakePHP', 'version' => '1.2.0.x', 'tag' => 'CakePHP Rocks!');$this->assertEquals($expected, $data);$data = $this->Cookie->read('Encrytped_multi_cookies');$expected = array('name' => 'CakePHP', 'version' => '1.2.0.x', 'tag' => 'CakePHP Rocks!');$this->assertEquals($expected, $data);$data = $this->Cookie->read('Plain_array');$expected = array('name' => 'CakePHP', 'version' => '1.2.0.x', 'tag' => 'CakePHP Rocks!');$this->assertEquals($expected, $data);$data = $this->Cookie->read('Plain_multi_cookies');$expected = array('name' => 'CakePHP', 'version' => '1.2.0.x', 'tag' => 'CakePHP Rocks!');$this->assertEquals($expected, $data);$this->Cookie->destroy();unset($_COOKIE['CakeTestCookie']);}/*** Test Reading legacy cookie values.** @return void*/public function testReadLegacyCookieValue() {$_COOKIE['CakeTestCookie'] = array('Legacy' => array('value' => $this->_oldImplode(array(1, 2, 3))));$result = $this->Cookie->read('Legacy.value');$expected = array(1, 2, 3);$this->assertEquals($expected, $result);}/*** Test reading empty values.*/public function testReadEmpty() {$_COOKIE['CakeTestCookie'] = array('JSON' => '{"name":"value"}','Empty' => '','String' => '{"somewhat:"broken"}','Array' => '{}');$this->assertEquals(array('name' => 'value'), $this->Cookie->read('JSON'));$this->assertEquals('value', $this->Cookie->read('JSON.name'));$this->assertEquals('', $this->Cookie->read('Empty'));$this->assertEquals('{"somewhat:"broken"}', $this->Cookie->read('String'));$this->assertEquals(array(), $this->Cookie->read('Array'));}/*** test that no error is issued for non array data.** @return void*/public function testNoErrorOnNonArrayData() {$this->Cookie->destroy();$_COOKIE['CakeTestCookie'] = 'kaboom';$this->assertNull($this->Cookie->read('value'));}/*** testCheck method** @return void*/public function testCheck() {$this->Cookie->write('CookieComponentTestCase', 'value');$this->assertTrue($this->Cookie->check('CookieComponentTestCase'));$this->assertFalse($this->Cookie->check('NotExistingCookieComponentTestCase'));}/*** testCheckingSavedEmpty method** @return void*/public function testCheckingSavedEmpty() {$this->Cookie->write('CookieComponentTestCase', 0);$this->assertTrue($this->Cookie->check('CookieComponentTestCase'));$this->Cookie->write('CookieComponentTestCase', '0');$this->assertTrue($this->Cookie->check('CookieComponentTestCase'));$this->Cookie->write('CookieComponentTestCase', false);$this->assertTrue($this->Cookie->check('CookieComponentTestCase'));$this->Cookie->write('CookieComponentTestCase', null);$this->assertFalse($this->Cookie->check('CookieComponentTestCase'));}/*** testCheckKeyWithSpaces method** @return void*/public function testCheckKeyWithSpaces() {$this->Cookie->write('CookieComponent Test', "test");$this->assertTrue($this->Cookie->check('CookieComponent Test'));$this->Cookie->delete('CookieComponent Test');$this->Cookie->write('CookieComponent Test.Test Case', "test");$this->assertTrue($this->Cookie->check('CookieComponent Test.Test Case'));}/*** testCheckEmpty** @return void*/public function testCheckEmpty() {$this->assertFalse($this->Cookie->check());}/*** test that deleting a top level keys kills the child elements too.** @return void*/public function testDeleteRemovesChildren() {$_COOKIE['CakeTestCookie'] = array('User' => array('email' => 'example@example.com', 'name' => 'mark'),'other' => 'value');$this->assertEquals('mark', $this->Cookie->read('User.name'));$this->Cookie->delete('User');$this->assertNull($this->Cookie->read('User.email'));$this->Cookie->destroy();}/*** Test deleting recursively with keys that don't exist.** @return void*/public function testDeleteChildrenNotExist() {$this->assertNull($this->Cookie->delete('NotFound'));$this->assertNull($this->Cookie->delete('Not.Found'));}/*** Helper method for generating old style encoded cookie values.** @return string.*/protected function _oldImplode(array $array) {$string = '';foreach ($array as $key => $value) {$string .= ',' . $key . '|' . $value;}return substr($string, 1);}/*** Implode method to keep keys are multidimensional arrays** @param array $array Map of key and values* @return string String in the form key1|value1,key2|value2*/protected function _implode(array $array) {return json_encode($array);}/*** encrypt method** @param array|string $value* @return string*/protected function _encrypt($value) {if (is_array($value)) {$value = $this->_implode($value);}return "Q2FrZQ==." . base64_encode(Security::cipher($value, $this->Cookie->key));}}