<?php
App::uses('AppController', 'Controller');
/**
 * TransSessionIdController class for testing session.use_trans_sid=1.
 *
 * @package       Cake.Test.Case.Controller
 */
class TransSessionIdController extends AppController {

/**
 * Constructor.
 *
 * @param CakeRequest $request Request object for this controller.
 * @param CakeResponse $response Response object for this controller.
 */
	public function __construct($request = null, $response = null) {
		parent::__construct($request, $response);
		$ini = Configure::read('Session.ini');
		$ini['session.use_cookies'] = 0;
		$ini['session.use_only_cookies'] = 0;
		$ini['session.use_trans_sid'] = 1;
		Configure::write('Session.ini', $ini);
	}

/**
 * For testing redirect URL with session.use_trans_sid=1.
 *
 * @return CakeResponse|null
 */
	public function next() {
		$sessionName = session_name();
		$sessionId = $this->Session->id();
		return $this->redirect(array(
			'controller' => 'trans_session_id',
			'action' => 'next_step',
			'?' => array(
				$sessionName => $sessionId,
			),
		));
	}

}

/**
 * ApplicationControllerTest class for testing controllers by using ControllerTestCase.
 *
 * ApplicationControllerTest extends ControllerTestCase in contrast
 * with ControllerTest that extends CakeTestCase.
 *
 * @package       Cake.Test.Case.Controller
 */
class ApplicationControllerTest extends ControllerTestCase {

/**
 * setupDown method
 *
 * @return void
 */
	public function setUp() : void {
		CakeSession::destroy();
		parent::setUp();
	}

/**
 * tearDown method
 *
 * @return void
 */
	public function tearDown() : void {
		CakeSession::destroy();
		parent::tearDown();
	}

/**
 * Tests the redirect and session config with use_trans_sid=1.
 *
 * @return void
 */
	public function testRedirect() {
		$sessionId = 'o7k64tlhil9pakp89j6d8ovlqk';
		$this->testAction('/trans_session_id/next?CAKEPHP=' . $sessionId);
		$this->assertContains('/trans_session_id/next_step?CAKEPHP=' . $sessionId, $this->headers['Location']);
		$expectedConfig = array(
			'cookie' => 'CAKEPHP',
			'timeout' => 240,
			'ini' => array(
				'session.use_trans_sid' => 1,
				'session.cookie_path' => '/',
				'session.cookie_lifetime' => 14400,
				'session.name' => 'CAKEPHP',
				'session.gc_maxlifetime' => 14400,
				'session.cookie_httponly' => 1,
				'session.use_cookies' => 0,
				'session.use_only_cookies' => 0,
			),
			'defaults' => 'php',
			'cookieTimeout' => 240,
			'cacheLimiter' => 'must-revalidate',
		);
		$actualConfig = Configure::read('Session');
		$this->assertEquals($expectedConfig, $actualConfig);
	}

}