Files
piratepoet/tests/unit/Router/RouterTest.php
2017-11-06 18:09:38 +02:00

256 lines
7.2 KiB
PHP

<?php
namespace MailPoet\Test\Router;
use Codeception\Util\Stub;
use MailPoet\Config\AccessControl;
use MailPoet\Router\Router;
require_once('RouterTestMockEndpoint.php');
class RouterTest extends \MailPoetTest {
public $access_control;
public $router_data;
function _before() {
$this->router_data = array(
Router::NAME => '',
'endpoint' => 'router_test_mock_endpoint',
'action' => 'test',
'data' => base64_encode(json_encode(array('data' => 'dummy data')))
);
$this->access_control = new AccessControl();
$this->router = new Router($this->access_control, $this->router_data);
}
function testItCanGetAPIDataFromGetRequest() {
$data = array('data' => 'dummy data');
$url = 'http://example.com/?' . Router::NAME . '&endpoint=view_in_browser&action=view&data='
. base64_encode(json_encode($data));
parse_str(parse_url($url, PHP_URL_QUERY), $_GET);
$router = new Router($this->access_control);
expect($router->api_request)->equals(true);
expect($router->endpoint)->equals('viewInBrowser');
expect($router->endpoint_action)->equals('view');
expect($router->data)->equals($data);
}
function testItContinuesExecutionWhenAPIRequestNotDetected() {
$router_data = $this->router_data;
unset($router_data[Router::NAME]);
$router = Stub::construct(
'\MailPoet\Router\Router',
array($this->access_control, $router_data)
);
$result = $router->init();
expect($result)->null();
}
function testItTerminatesRequestWhenEndpointNotFound() {
$router_data = $this->router_data;
$router_data['endpoint'] = 'invalid_endpoint';
$router = Stub::construct(
'\MailPoet\Router\Router',
array($this->access_control, $router_data),
array(
'terminateRequest' => function($code, $error) {
return array(
$code,
$error
);
}
)
);
$result = $router->init();
expect($result)->equals(
array(
404,
'Invalid router endpoint'
)
);
}
function testItTerminatesRequestWhenEndpointActionNotFound() {
$router_data = $this->router_data;
$router_data['action'] = 'invalid_action';
$router = Stub::construct(
'\MailPoet\Router\Router',
array($this->access_control, $router_data),
array(
'terminateRequest' => function($code, $error) {
return array(
$code,
$error
);
}
)
);
$result = $router->init();
expect($result)->equals(
array(
404,
'Invalid router endpoint action'
)
);
}
function testItValidatesGlobalPermission() {
$router = $this->router;
$permissions = array(
'global' => AccessControl::PERMISSION_MANAGE_SETTINGS,
);
$access_control = Stub::make(
new AccessControl(),
array(
'validatePermission' => Stub::once(function($cap) {
expect($cap)->equals(AccessControl::PERMISSION_MANAGE_SETTINGS);
return false;
})
)
);
$router->access_control = $access_control;
expect($router->validatePermissions(null, $permissions))->false();
$access_control = Stub::make(
new AccessControl(),
array(
'validatePermission' => Stub::once(function($cap) {
expect($cap)->equals(AccessControl::PERMISSION_MANAGE_SETTINGS);
return true;
})
)
);
$router->access_control = $access_control;
expect($router->validatePermissions(null, $permissions))->true();
}
function testItValidatesEndpointActionPermission() {
$router = $this->router;
$permissions = array(
'global' => null,
'actions' => array(
'test' => AccessControl::PERMISSION_MANAGE_SETTINGS
)
);
$access_control = Stub::make(
new AccessControl(),
array(
'validatePermission' => Stub::once(function($cap) {
expect($cap)->equals(AccessControl::PERMISSION_MANAGE_SETTINGS);
return false;
})
)
);
$router->access_control = $access_control;
expect($router->validatePermissions('test', $permissions))->false();
$access_control = Stub::make(
new AccessControl(),
array(
'validatePermission' => Stub::once(function($cap) {
expect($cap)->equals(AccessControl::PERMISSION_MANAGE_SETTINGS);
return true;
})
)
);
$router->access_control = $access_control;
expect($router->validatePermissions('test', $permissions))->true();
}
function testItValidatesPermissionBeforeProcessingEndpointAction() {
$router = Stub::construct(
'\MailPoet\Router\Router',
array($this->access_control, $this->router_data),
array(
'validatePermissions' => function($action, $permissions) {
expect($action)->equals($this->router_data['action']);
expect($permissions)->equals(
array(
'global' => AccessControl::NO_ACCESS_RESTRICTION
)
);
return true;
}
)
);
$result = $router->init();
expect($result)->equals(
array('data' => 'dummy data')
);
}
function testItReturnsForbiddenResponseWhenPermissionFailsValidation() {
$router = Stub::construct(
'\MailPoet\Router\Router',
array($this->access_control, $this->router_data),
array(
'validatePermissions' => false,
'terminateRequest' => function($code, $error) {
return array(
$code,
$error
);
}
)
);
$result = $router->init();
expect($result)->equals(
array(
403,
'You do not have the required permissions.'
)
);
}
function testItCallsEndpointAction() {
$data = array('data' => 'dummy data');
$result = $this->router->init();
expect($result)->equals($data);
}
function testItExecutesUrlParameterConflictResolverAction() {
$this->router->init();
expect((boolean)did_action('mailpoet_conflict_resolver_router_url_query_parameters'))->true();
}
function testItCanEncodeRequestData() {
$data = array('data' => 'dummy data');
$result = Router::encodeRequestData($data);
expect($result)->equals(
rtrim(base64_encode(json_encode($data)), '=')
);
}
function testItReturnsEmptyArrayWhenRequestDataIsAString() {
$encoded_data = 'test';
$result = Router::decodeRequestData($encoded_data);
expect($result)->equals(array());
}
function testItCanDecodeRequestData() {
$data = array('data' => 'dummy data');
$encoded_data = rtrim(base64_encode(json_encode($data)), '=');
$result = Router::decodeRequestData($encoded_data);
expect($result)->equals($data);
}
function testItCanConvertInvalidRequestDataToArray() {
$result = Router::decodeRequestData('some_invalid_data');
expect($result)->equals(array());
}
function testItCanBuildRequest() {
$data = array('data' => 'dummy data');
$encoded_data = rtrim(base64_encode(json_encode($data)), '=');
$result = Router::buildRequest(
'router_test_mock_endpoint',
'test',
$data
);
expect($result)->contains(Router::NAME . '&endpoint=router_test_mock_endpoint&action=test&data=' . $encoded_data);
}
}