lithium\test\Controller
Extends
lithium\core\ObjectDeprecated
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']);
}
}