lithium\test\Controller

class

The Test Controller for running the html version of the test suite

Source

class Controller extends \lithium\core\ObjectDeprecated {

	/**
	 * Saved context.
	 *
	 * @var array
	 */
	protected $_context = [];

	/**
	 * Magic method to make Controller callable.
	 *
	 * @see lithium\action\Dispatcher::_callable()
	 * @param \lithium\action\Request $request
	 * @param array $dispatchParams Array of params after being parsed by router.
	 * @param array $options Some basic options for this controller.
	 * @return string
	 * @filter
	 */
	public function __invoke($request, $dispatchParams, array $options = []) {
		$dispatchParamsDefaults = ['args' => []];
		$dispatchParams += $dispatchParamsDefaults;
		$defaults = ['format' => 'html', 'timeout' => 0];
		$options += (array) $request->query + $defaults;
		$params = compact('request', 'dispatchParams', 'options');

		return Filters::run($this, __FUNCTION__, $params, function($params) {
			$request = $params['request'];
			$options = $params['options'];
			$params = $params['dispatchParams'];
			set_time_limit((integer) $options['timeout']);
			$group = join('\\', (array) $params['args']);

			if ($group === "all") {
				$group = Group::all();
				$options['title'] = 'All Tests';
			}

			$this->_saveCtrlContext();
			$report = Dispatcher::run($group, $options);
			$this->_restoreCtrlContext();

			$filters = Libraries::locate('test.filter');
			$menu = Libraries::locate('tests', null, [
				'filter' => '/cases|integration|functional/',
				'exclude' => '/mocks/'
			]);
			sort($menu);
			$menu = Set::expand(array_combine($menu, $menu), ['separator' => "\\"]);
			$result = compact('request', 'report', 'filters', 'menu');
			return $report->render('layout', $result);
		});
	}

	protected function _saveCtrlContext() {
		$this->_context['scope'] = Router::scope(false);
		$this->_context['routes'] = Router::get();
		$this->_context['scopes'] = Router::attached();
		Router::reset();
	}

	protected function _restoreCtrlContext() {
		Router::reset();
		foreach ($this->_context['routes'] as $scope => $routes) {
			Router::scope($scope, function() use ($routes) {
				foreach ($routes as $route) {
					Router::connect($route);
				}
			});
		}
		foreach ($this->_context['scopes'] as $scope => $attachment) {
			Router::attach($scope, $attachment);
		}
		Router::scope($this->_context['scope']);
	}
}