Refactor lib/Router to use with container for endpoints

[MAILPOET-1605]
This commit is contained in:
Rostislav Wolny
2018-10-17 17:39:32 +02:00
parent 71ad9f50cb
commit fff8176a49
14 changed files with 132 additions and 111 deletions

View File

@ -94,6 +94,11 @@ class Initializer {
)); ));
} }
function compileContainer() {
$this->container = ContainerFactory::getContainer();
$this->container->compile();
}
function checkRequirements() { function checkRequirements() {
$requirements = new RequirementsChecker(); $requirements = new RequirementsChecker();
return $requirements->checkAllRequirements(); return $requirements->checkAllRequirements();
@ -258,7 +263,7 @@ class Initializer {
} }
function setupRouter() { function setupRouter() {
$router = new Router\Router($this->access_control); $router = new Router\Router($this->access_control, $this->container);
$router->init(); $router->init();
} }

View File

@ -6,7 +6,6 @@ require_once(ABSPATH . 'wp-includes/pluggable.php');
class DaemonHttpRunner { class DaemonHttpRunner {
public $settings_daemon_data; public $settings_daemon_data;
public $request_data;
public $timer; public $timer;
public $token; public $token;
@ -15,15 +14,11 @@ class DaemonHttpRunner {
const PING_SUCCESS_RESPONSE = 'pong'; const PING_SUCCESS_RESPONSE = 'pong';
function __construct($request_data = false, $daemon = null) { function __construct(Daemon $daemon = null) {
$this->request_data = $request_data;
$this->settings_daemon_data = CronHelper::getDaemon(); $this->settings_daemon_data = CronHelper::getDaemon();
$this->token = CronHelper::createToken(); $this->token = CronHelper::createToken();
$this->timer = microtime(true); $this->timer = microtime(true);
$this->daemon = $daemon; $this->daemon = $daemon;
if(!$daemon) {
$this->daemon = new Daemon($this->settings_daemon_data);
}
} }
function ping() { function ping() {
@ -31,20 +26,20 @@ class DaemonHttpRunner {
$this->terminateRequest(self::PING_SUCCESS_RESPONSE); $this->terminateRequest(self::PING_SUCCESS_RESPONSE);
} }
function run() { function run($request_data) {
ignore_user_abort(true); ignore_user_abort(true);
if(strpos(@ini_get('disable_functions'), 'set_time_limit') === false) { if(strpos(@ini_get('disable_functions'), 'set_time_limit') === false) {
set_time_limit(0); set_time_limit(0);
} }
$this->addCacheHeaders(); $this->addCacheHeaders();
if(!$this->request_data) { if(!$request_data) {
$error = __('Invalid or missing request data.', 'mailpoet'); $error = __('Invalid or missing request data.', 'mailpoet');
} else { } else {
if(!$this->settings_daemon_data) { if(!$this->settings_daemon_data) {
$error = __('Daemon does not exist.', 'mailpoet'); $error = __('Daemon does not exist.', 'mailpoet');
} else { } else {
if(!isset($this->request_data['token']) || if(!isset($request_data['token']) ||
$this->request_data['token'] !== $this->settings_daemon_data['token'] $request_data['token'] !== $this->settings_daemon_data['token']
) { ) {
$error = 'Invalid or missing token.'; $error = 'Invalid or missing token.';
} }

View File

@ -12,15 +12,16 @@ class ContainerFactory {
private static $container; private static $container;
static function getContainer() { static function getContainer() {
if (!self::$container) { if(!self::$container) {
self::createContainer(); self::createContainer();
} }
return self::$container; return self::$container;
} }
private static function createContainer() { static function createContainer() {
self::$container = new ContainerBuilder(); self::$container = new ContainerBuilder();
$loader = new YamlFileLoader(self::$container, new FileLocator(__DIR__)); $loader = new YamlFileLoader(self::$container, new FileLocator(__DIR__));
$loader->load('services.yml'); $loader->load('services.yml');
return self::$container;
} }
} }

View File

@ -3,3 +3,24 @@ parameters:
services: services:
_defaults: _defaults:
autowire: true autowire: true
MailPoet\Config\AccessControl:
class: MailPoet\Config\AccessControl
MailPoet\Cron\Daemon:
class: MailPoet\Cron\Daemon
MailPoet\Cron\DaemonHttpRunner:
class: MailPoet\Cron\DaemonHttpRunner
MailPoet\Router\Endpoints\CronDaemon:
class: MailPoet\Router\Endpoints\CronDaemon
MailPoet\Router\Endpoints\Subscription:
class: MailPoet\Router\Endpoints\Subscription
MailPoet\Router\Endpoints\Track:
class: MailPoet\Router\Endpoints\Track
MailPoet\Router\Endpoints\ViewInBrowser:
class: MailPoet\Router\Endpoints\ViewInBrowser

View File

@ -23,13 +23,15 @@ class CronDaemon {
'global' => AccessControl::NO_ACCESS_RESTRICTION 'global' => AccessControl::NO_ACCESS_RESTRICTION
); );
function __construct($data) { /** @var DaemonHttpRunner */
$this->data = $data; private $daemon_runner;
function __construct(DaemonHttpRunner $daemon_runner) {
$this->daemon_runner = $daemon_runner;
} }
function run() { function run($data) {
$queue = new DaemonHttpRunner($this->data); $this->daemon_runner->run($data);
$queue->run();
} }
function ping() { function ping() {
@ -37,7 +39,6 @@ class CronDaemon {
} }
function pingResponse() { function pingResponse() {
$queue = new DaemonHttpRunner(); $this->daemon_runner->ping();
$queue->ping();
} }
} }

View File

@ -17,30 +17,25 @@ class Subscription {
self::ACTION_MANAGE, self::ACTION_MANAGE,
self::ACTION_UNSUBSCRIBE self::ACTION_UNSUBSCRIBE
); );
public $data;
public $permissions = array( public $permissions = array(
'global' => AccessControl::NO_ACCESS_RESTRICTION 'global' => AccessControl::NO_ACCESS_RESTRICTION
); );
function __construct($data) { function confirm($data) {
$this->data = $data; $subscription = $this->initSubscriptionPage(UserSubscription\Pages::ACTION_CONFIRM, $data);
}
function confirm() {
$subscription = $this->initSubscriptionPage(UserSubscription\Pages::ACTION_CONFIRM);
$subscription->confirm(); $subscription->confirm();
} }
function manage() { function manage($data) {
$subscription = $this->initSubscriptionPage(UserSubscription\Pages::ACTION_MANAGE); $subscription = $this->initSubscriptionPage(UserSubscription\Pages::ACTION_MANAGE, $data);
} }
function unsubscribe() { function unsubscribe($data) {
$subscription = $this->initSubscriptionPage(UserSubscription\Pages::ACTION_UNSUBSCRIBE); $subscription = $this->initSubscriptionPage(UserSubscription\Pages::ACTION_UNSUBSCRIBE, $data);
$subscription->unsubscribe(); $subscription->unsubscribe();
} }
private function initSubscriptionPage($action) { private function initSubscriptionPage($action, $data) {
return new UserSubscription\Pages($action, $this->data, true, true); return new UserSubscription\Pages($action, $data, true, true);
} }
} }

View File

@ -22,23 +22,18 @@ class Track {
self::ACTION_CLICK, self::ACTION_CLICK,
self::ACTION_OPEN self::ACTION_OPEN
); );
public $data;
public $permissions = array( public $permissions = array(
'global' => AccessControl::NO_ACCESS_RESTRICTION 'global' => AccessControl::NO_ACCESS_RESTRICTION
); );
function __construct($data) { function click($data) {
$this->data = $this->_processTrackData($data);
}
function click() {
$click_event = new Clicks(); $click_event = new Clicks();
return $click_event->track($this->data); return $click_event->track($this->_processTrackData($data));
} }
function open() { function open($data) {
$open_event = new Opens(); $open_event = new Opens();
return $open_event->track($this->data); return $open_event->track($this->_processTrackData($data));
} }
function _processTrackData($data) { function _processTrackData($data) {
@ -82,7 +77,7 @@ class Track {
false; false;
} }
private function terminate($code) { function terminate($code) {
status_header($code); status_header($code);
get_template_part((string)$code); get_template_part((string)$code);
exit; exit;

View File

@ -17,19 +17,18 @@ class ViewInBrowser {
const ENDPOINT = 'view_in_browser'; const ENDPOINT = 'view_in_browser';
const ACTION_VIEW = 'view'; const ACTION_VIEW = 'view';
public $allowed_actions = array(self::ACTION_VIEW); public $allowed_actions = array(self::ACTION_VIEW);
public $data;
public $permissions = array( public $permissions = array(
'global' => AccessControl::NO_ACCESS_RESTRICTION 'global' => AccessControl::NO_ACCESS_RESTRICTION
); );
function __construct($data, AccessControl $access_control) { function __construct(AccessControl $access_control) {
$this->access_control = $access_control; $this->access_control = $access_control;
$this->data = $this->_processBrowserPreviewData($data);
} }
function view() { function view($data) {
$data = $this->_processBrowserPreviewData($data);
$view_in_browser = new NewsletterViewInBrowser(); $view_in_browser = new NewsletterViewInBrowser();
return $this->_displayNewsletter($view_in_browser->view($this->data)); return $this->_displayNewsletter($view_in_browser->view($data));
} }
function _processBrowserPreviewData($data) { function _processBrowserPreviewData($data) {

View File

@ -3,6 +3,7 @@
namespace MailPoet\Router; namespace MailPoet\Router;
use MailPoet\Config\AccessControl; use MailPoet\Config\AccessControl;
use MailPoet\Dependencies\Symfony\Component\DependencyInjection\Container;
use MailPoet\Util\Helpers; use MailPoet\Util\Helpers;
if(!defined('ABSPATH')) exit; if(!defined('ABSPATH')) exit;
@ -12,11 +13,13 @@ class Router {
public $endpoint; public $endpoint;
public $action; public $action;
public $data; public $data;
/** @var Container */
private $container;
const NAME = 'mailpoet_router'; const NAME = 'mailpoet_router';
const RESPONSE_ERROR = 404; const RESPONSE_ERROR = 404;
const RESPONE_FORBIDDEN = 403; const RESPONE_FORBIDDEN = 403;
function __construct(AccessControl $access_control, $api_data = false) { function __construct(AccessControl $access_control, Container $container, $api_data = false) {
$api_data = ($api_data) ? $api_data : $_GET; $api_data = ($api_data) ? $api_data : $_GET;
$this->api_request = isset($api_data[self::NAME]); $this->api_request = isset($api_data[self::NAME]);
$this->endpoint = isset($api_data['endpoint']) ? $this->endpoint = isset($api_data['endpoint']) ?
@ -29,15 +32,19 @@ class Router {
self::decodeRequestData($api_data['data']) : self::decodeRequestData($api_data['data']) :
array(); array();
$this->access_control = $access_control; $this->access_control = $access_control;
$this->container = $container;
} }
function init() { function init() {
$endpoint_class = __NAMESPACE__ . "\\Endpoints\\" . ucfirst($this->endpoint);
if(!$this->api_request) return; if(!$this->api_request) return;
$endpoint_class = __NAMESPACE__ . "\\Endpoints\\" . ucfirst($this->endpoint);
if(!$this->endpoint || !class_exists($endpoint_class)) { if(!$this->endpoint || !class_exists($endpoint_class)) {
return $this->terminateRequest(self::RESPONSE_ERROR, __('Invalid router endpoint', 'mailpoet')); return $this->terminateRequest(self::RESPONSE_ERROR, __('Invalid router endpoint', 'mailpoet'));
} }
$endpoint = new $endpoint_class($this->data, $this->access_control);
$endpoint = $this->container->get($endpoint_class);
if(!method_exists($endpoint, $this->endpoint_action) || !in_array($this->endpoint_action, $endpoint->allowed_actions)) { if(!method_exists($endpoint, $this->endpoint_action) || !in_array($this->endpoint_action, $endpoint->allowed_actions)) {
return $this->terminateRequest(self::RESPONSE_ERROR, __('Invalid router endpoint action', 'mailpoet')); return $this->terminateRequest(self::RESPONSE_ERROR, __('Invalid router endpoint action', 'mailpoet'));
} }
@ -46,10 +53,11 @@ class Router {
} }
do_action('mailpoet_conflict_resolver_router_url_query_parameters'); do_action('mailpoet_conflict_resolver_router_url_query_parameters');
return call_user_func( return call_user_func(
array( [
$endpoint, $endpoint,
$this->endpoint_action $this->endpoint_action,
) ],
$this->data
); );
} }
@ -88,4 +96,4 @@ class Router {
$this->access_control->validatePermission($permissions['actions'][$endpoint_action]) : $this->access_control->validatePermission($permissions['actions'][$endpoint_action]) :
$this->access_control->validatePermission($permissions['global']); $this->access_control->validatePermission($permissions['global']);
} }
} }

View File

@ -14,15 +14,14 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
CronHelper::DAEMON_SETTING, CronHelper::DAEMON_SETTING,
[] []
); );
$daemon = new DaemonHttpRunner($request_data = 'request data'); $daemon = new DaemonHttpRunner();
expect($daemon->request_data)->equals('request data');
expect(strlen($daemon->timer))->greaterOrEquals(5); expect(strlen($daemon->timer))->greaterOrEquals(5);
expect(strlen($daemon->token))->greaterOrEquals(5); expect(strlen($daemon->token))->greaterOrEquals(5);
} }
function testItDoesNotRunWithoutRequestData() { function testItDoesNotRunWithoutRequestData() {
$daemon = Stub::construct( $daemon = Stub::construct(
new DaemonHttpRunner(), new DaemonHttpRunner(new Daemon()),
array(), array(),
array( array(
'abortWithError' => function($message) { 'abortWithError' => function($message) {
@ -30,13 +29,12 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
} }
) )
); );
$daemon->request_data = false; expect($daemon->run(false))->equals('Invalid or missing request data.');
expect($daemon->run())->equals('Invalid or missing request data.');
} }
function testItDoesNotRunWhenThereIsInvalidOrMissingToken() { function testItDoesNotRunWhenThereIsInvalidOrMissingToken() {
$daemon = Stub::construct( $daemon = Stub::construct(
new DaemonHttpRunner(), new DaemonHttpRunner(new Daemon()),
array(), array(),
array( array(
'abortWithError' => function($message) { 'abortWithError' => function($message) {
@ -47,8 +45,7 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
$daemon->settings_daemon_data = array( $daemon->settings_daemon_data = array(
'token' => 123 'token' => 123
); );
$daemon->request_data = array('token' => 456); expect($daemon->run(['token' => 456]))->equals('Invalid or missing token.');
expect($daemon->run())->equals('Invalid or missing token.');
} }
function testItStoresErrorMessageAndContinuesExecutionWhenWorkersThrowException() { function testItStoresErrorMessageAndContinuesExecutionWhenWorkersThrowException() {
@ -63,13 +60,13 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
throw new \Exception(); throw new \Exception();
}, },
), $this); ), $this);
$daemon_http_runner = Stub::make(new DaemonHttpRunner($data, $daemon), array( $daemon_http_runner = Stub::make(new DaemonHttpRunner($daemon), array(
'pauseExecution' => null, 'pauseExecution' => null,
'callSelf' => null 'callSelf' => null
), $this); ), $this);
Setting::setValue(CronHelper::DAEMON_SETTING, $data); Setting::setValue(CronHelper::DAEMON_SETTING, $data);
$daemon_http_runner->__construct($data, $daemon); $daemon_http_runner->__construct($daemon);
$daemon_http_runner->run(); $daemon_http_runner->run($data);
$updated_daemon = Setting::getValue(CronHelper::DAEMON_SETTING); $updated_daemon = Setting::getValue(CronHelper::DAEMON_SETTING);
expect($updated_daemon['last_error'])->greaterOrEquals('Message'); expect($updated_daemon['last_error'])->greaterOrEquals('Message');
} }
@ -79,7 +76,7 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
'executeScheduleWorker' => null, 'executeScheduleWorker' => null,
'executeQueueWorker' => null, 'executeQueueWorker' => null,
), $this); ), $this);
$daemon_http_runner = Stub::make(new DaemonHttpRunner(true, $daemon), array( $daemon_http_runner = Stub::make(new DaemonHttpRunner($daemon), array(
'pauseExecution' => Expected::exactly(1, function($pause_delay) { 'pauseExecution' => Expected::exactly(1, function($pause_delay) {
expect($pause_delay)->lessThan(CronHelper::DAEMON_EXECUTION_LIMIT); expect($pause_delay)->lessThan(CronHelper::DAEMON_EXECUTION_LIMIT);
expect($pause_delay)->greaterThan(CronHelper::DAEMON_EXECUTION_LIMIT - 1); expect($pause_delay)->greaterThan(CronHelper::DAEMON_EXECUTION_LIMIT - 1);
@ -90,13 +87,13 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
'token' => 123 'token' => 123
); );
Setting::setValue(CronHelper::DAEMON_SETTING, $data); Setting::setValue(CronHelper::DAEMON_SETTING, $data);
$daemon_http_runner->__construct($data, $daemon); $daemon_http_runner->__construct($daemon);
$daemon_http_runner->run(); $daemon_http_runner->run($data);
} }
function testItTerminatesExecutionWhenDaemonIsDeleted() { function testItTerminatesExecutionWhenDaemonIsDeleted() {
$daemon = Stub::make(new DaemonHttpRunner(true), array( $daemon = Stub::make(new DaemonHttpRunner(new Daemon()), array(
'executeScheduleWorker' => function() { 'executeScheduleWorker' => function() {
Setting::deleteValue(CronHelper::DAEMON_SETTING); Setting::deleteValue(CronHelper::DAEMON_SETTING);
}, },
@ -108,12 +105,12 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
'token' => 123 'token' => 123
); );
Setting::setValue(CronHelper::DAEMON_SETTING, $data); Setting::setValue(CronHelper::DAEMON_SETTING, $data);
$daemon->__construct($data); $daemon->__construct(new Daemon());
$daemon->run(); $daemon->run($data);
} }
function testItTerminatesExecutionWhenDaemonTokenChangesAndKeepsChangedToken() { function testItTerminatesExecutionWhenDaemonTokenChangesAndKeepsChangedToken() {
$daemon = Stub::make(new DaemonHttpRunner(true), array( $daemon = Stub::make(new DaemonHttpRunner(new Daemon()), array(
'executeScheduleWorker' => function() { 'executeScheduleWorker' => function() {
Setting::setValue( Setting::setValue(
CronHelper::DAEMON_SETTING, CronHelper::DAEMON_SETTING,
@ -128,14 +125,14 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
'token' => 123 'token' => 123
); );
Setting::setValue(CronHelper::DAEMON_SETTING, $data); Setting::setValue(CronHelper::DAEMON_SETTING, $data);
$daemon->__construct($data); $daemon->__construct(new Daemon());
$daemon->run(); $daemon->run($data);
$data_after_run = Setting::getValue(CronHelper::DAEMON_SETTING); $data_after_run = Setting::getValue(CronHelper::DAEMON_SETTING);
expect($data_after_run['token'], 567); expect($data_after_run['token'], 567);
} }
function testItTerminatesExecutionWhenDaemonIsDeactivated() { function testItTerminatesExecutionWhenDaemonIsDeactivated() {
$daemon = Stub::make(new DaemonHttpRunner(true), [ $daemon = Stub::make(new DaemonHttpRunner(new Daemon()), [
'executeScheduleWorker' => null, 'executeScheduleWorker' => null,
'executeQueueWorker' => null, 'executeQueueWorker' => null,
'pauseExecution' => null, 'pauseExecution' => null,
@ -146,12 +143,12 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
'status' => CronHelper::DAEMON_STATUS_INACTIVE, 'status' => CronHelper::DAEMON_STATUS_INACTIVE,
]; ];
Setting::setValue(CronHelper::DAEMON_SETTING, $data); Setting::setValue(CronHelper::DAEMON_SETTING, $data);
$daemon->__construct($data); $daemon->__construct(new Daemon());
$daemon->run(); $daemon->run($data);
} }
function testItUpdatesDaemonTokenDuringExecution() { function testItUpdatesDaemonTokenDuringExecution() {
$daemon_http_runner = Stub::make(new DaemonHttpRunner(true), array( $daemon_http_runner = Stub::make(new DaemonHttpRunner(new Daemon()), array(
'executeScheduleWorker' => null, 'executeScheduleWorker' => null,
'executeQueueWorker' => null, 'executeQueueWorker' => null,
'pauseExecution' => null, 'pauseExecution' => null,
@ -161,8 +158,8 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
'token' => 123 'token' => 123
); );
Setting::setValue(CronHelper::DAEMON_SETTING, $data); Setting::setValue(CronHelper::DAEMON_SETTING, $data);
$daemon_http_runner->__construct($data); $daemon_http_runner->__construct(new Daemon());
$daemon_http_runner->run(); $daemon_http_runner->run($data);
$updated_daemon = Setting::getValue(CronHelper::DAEMON_SETTING); $updated_daemon = Setting::getValue(CronHelper::DAEMON_SETTING);
expect($updated_daemon['token'])->equals($daemon_http_runner->token); expect($updated_daemon['token'])->equals($daemon_http_runner->token);
} }
@ -174,7 +171,7 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
}, },
'executeQueueWorker' => null, 'executeQueueWorker' => null,
), $this); ), $this);
$daemon_http_runner = Stub::make(new DaemonHttpRunner(true, $daemon), array( $daemon_http_runner = Stub::make(new DaemonHttpRunner($daemon), array(
'pauseExecution' => null, 'pauseExecution' => null,
'callSelf' => null 'callSelf' => null
), $this); ), $this);
@ -183,8 +180,8 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
); );
$now = time(); $now = time();
Setting::setValue(CronHelper::DAEMON_SETTING, $data); Setting::setValue(CronHelper::DAEMON_SETTING, $data);
$daemon_http_runner->__construct($data, $daemon); $daemon_http_runner->__construct($daemon);
$daemon_http_runner->run(); $daemon_http_runner->run($data);
$updated_daemon = Setting::getValue(CronHelper::DAEMON_SETTING); $updated_daemon = Setting::getValue(CronHelper::DAEMON_SETTING);
expect($updated_daemon['run_started_at'])->greaterOrEquals($now); expect($updated_daemon['run_started_at'])->greaterOrEquals($now);
expect($updated_daemon['run_started_at'])->lessThan($now + 2); expect($updated_daemon['run_started_at'])->lessThan($now + 2);
@ -195,7 +192,7 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
function testItCanRun() { function testItCanRun() {
ignore_user_abort(0); ignore_user_abort(0);
expect(ignore_user_abort())->equals(0); expect(ignore_user_abort())->equals(0);
$daemon = Stub::make(new DaemonHttpRunner(true), array( $daemon = Stub::make(new DaemonHttpRunner(new Daemon()), array(
'pauseExecution' => null, 'pauseExecution' => null,
// workers should be executed // workers should be executed
'executeScheduleWorker' => Expected::exactly(1), 'executeScheduleWorker' => Expected::exactly(1),
@ -207,13 +204,13 @@ class DaemonHttpRunnerTest extends \MailPoetTest {
'token' => 123 'token' => 123
); );
Setting::setValue(CronHelper::DAEMON_SETTING, $data); Setting::setValue(CronHelper::DAEMON_SETTING, $data);
$daemon->__construct($data); $daemon->__construct(new Daemon());
$daemon->run(); $daemon->run($data);
expect(ignore_user_abort())->equals(1); expect(ignore_user_abort())->equals(1);
} }
function testItRespondsToPingRequest() { function testItRespondsToPingRequest() {
$daemon = Stub::make(new DaemonHttpRunner(true), array( $daemon = Stub::make(new DaemonHttpRunner(new Daemon()), array(
'terminateRequest' => Expected::exactly(1, function($message) { 'terminateRequest' => Expected::exactly(1, function($message) {
expect($message)->equals('pong'); expect($message)->equals('pong');
}) })

View File

@ -1,7 +1,7 @@
<?php <?php
namespace MailPoet\Test\Router\Endpoints; namespace MailPoet\Test\Router\Endpoints;
use AspectMock\Test as Mock; use Codeception\Stub;
use MailPoet\Models\Newsletter; use MailPoet\Models\Newsletter;
use MailPoet\Models\NewsletterLink; use MailPoet\Models\NewsletterLink;
use MailPoet\Models\ScheduledTask; use MailPoet\Models\ScheduledTask;
@ -74,9 +74,10 @@ class TrackTest extends \MailPoetTest {
) )
); );
$data->subscriber->email = 'random@email.com'; $data->subscriber->email = 'random@email.com';
$track = Mock::double($this->track, array('terminate' => null)); $track = Stub::make(new Track(), ['terminate' => function($code) {
expect($code)->equals(403);
}]);
$track->_validateTrackData($data); $track->_validateTrackData($data);
$track->verifyInvokedOnce('terminate', array(403));
} }
function testItFailsWhenSubscriberIsNotOnProcessedList() { function testItFailsWhenSubscriberIsNotOnProcessedList() {
@ -167,4 +168,4 @@ class TrackTest extends \MailPoetTest {
\ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); \ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table);
\ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); \ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table);
} }
} }

View File

@ -39,7 +39,7 @@ class ViewInBrowserTest extends \MailPoetTest {
'preview' => false 'preview' => false
); );
// instantiate class // instantiate class
$this->view_in_browser = new ViewInBrowser($this->browser_preview_data, new AccessControl()); $this->view_in_browser = new ViewInBrowser(new AccessControl());
} }
function testItAbortsWhenBrowserPreviewDataIsMissing() { function testItAbortsWhenBrowserPreviewDataIsMissing() {
@ -203,8 +203,7 @@ class ViewInBrowserTest extends \MailPoetTest {
$view_in_browser = Stub::make($this->view_in_browser, array( $view_in_browser = Stub::make($this->view_in_browser, array(
'_displayNewsletter' => Expected::exactly(1) '_displayNewsletter' => Expected::exactly(1)
), $this); ), $this);
$view_in_browser->data = $view_in_browser->_processBrowserPreviewData($this->browser_preview_data); $view_in_browser->view($this->browser_preview_data);
$view_in_browser->view();
} }
function _after() { function _after() {
@ -216,4 +215,4 @@ class ViewInBrowserTest extends \MailPoetTest {
$wp_user = wp_get_current_user(); $wp_user = wp_get_current_user();
$wp_user->add_role('administrator'); $wp_user->add_role('administrator');
} }
} }

View File

@ -5,6 +5,9 @@ namespace MailPoet\Test\Router;
use Codeception\Stub; use Codeception\Stub;
use Codeception\Stub\Expected; use Codeception\Stub\Expected;
use MailPoet\Config\AccessControl; use MailPoet\Config\AccessControl;
use MailPoet\Dependencies\Symfony\Component\DependencyInjection\Container;
use MailPoet\DI\ContainerFactory;
use MailPoet\Router\Endpoints\RouterTestMockEndpoint;
use MailPoet\Router\Router; use MailPoet\Router\Router;
require_once('RouterTestMockEndpoint.php'); require_once('RouterTestMockEndpoint.php');
@ -12,6 +15,8 @@ require_once('RouterTestMockEndpoint.php');
class RouterTest extends \MailPoetTest { class RouterTest extends \MailPoetTest {
public $access_control; public $access_control;
public $router_data; public $router_data;
/** @var Container */
private $container;
function _before() { function _before() {
$this->router_data = array( $this->router_data = array(
@ -21,7 +26,10 @@ class RouterTest extends \MailPoetTest {
'data' => base64_encode(json_encode(array('data' => 'dummy data'))) 'data' => base64_encode(json_encode(array('data' => 'dummy data')))
); );
$this->access_control = new AccessControl(); $this->access_control = new AccessControl();
$this->router = new Router($this->access_control, $this->router_data); $this->container = ContainerFactory::createContainer();
$this->container->register(RouterTestMockEndpoint::class)->setPublic(true);
$this->container->compile();
$this->router = new Router($this->access_control, $this->container, $this->router_data);
} }
function testItCanGetAPIDataFromGetRequest() { function testItCanGetAPIDataFromGetRequest() {
@ -29,7 +37,7 @@ class RouterTest extends \MailPoetTest {
$url = 'http://example.com/?' . Router::NAME . '&endpoint=view_in_browser&action=view&data=' $url = 'http://example.com/?' . Router::NAME . '&endpoint=view_in_browser&action=view&data='
. base64_encode(json_encode($data)); . base64_encode(json_encode($data));
parse_str(parse_url($url, PHP_URL_QUERY), $_GET); parse_str(parse_url($url, PHP_URL_QUERY), $_GET);
$router = new Router($this->access_control); $router = new Router($this->access_control, $this->container);
expect($router->api_request)->equals(true); expect($router->api_request)->equals(true);
expect($router->endpoint)->equals('viewInBrowser'); expect($router->endpoint)->equals('viewInBrowser');
expect($router->endpoint_action)->equals('view'); expect($router->endpoint_action)->equals('view');
@ -41,7 +49,7 @@ class RouterTest extends \MailPoetTest {
unset($router_data[Router::NAME]); unset($router_data[Router::NAME]);
$router = Stub::construct( $router = Stub::construct(
'\MailPoet\Router\Router', '\MailPoet\Router\Router',
array($this->access_control, $router_data) array($this->access_control, $this->container, $router_data)
); );
$result = $router->init(); $result = $router->init();
expect($result)->null(); expect($result)->null();
@ -52,7 +60,7 @@ class RouterTest extends \MailPoetTest {
$router_data['endpoint'] = 'invalid_endpoint'; $router_data['endpoint'] = 'invalid_endpoint';
$router = Stub::construct( $router = Stub::construct(
'\MailPoet\Router\Router', '\MailPoet\Router\Router',
array($this->access_control, $router_data), array($this->access_control, $this->container, $router_data),
array( array(
'terminateRequest' => function($code, $error) { 'terminateRequest' => function($code, $error) {
return array( return array(
@ -76,7 +84,7 @@ class RouterTest extends \MailPoetTest {
$router_data['action'] = 'invalid_action'; $router_data['action'] = 'invalid_action';
$router = Stub::construct( $router = Stub::construct(
'\MailPoet\Router\Router', '\MailPoet\Router\Router',
array($this->access_control, $router_data), array($this->access_control, $this->container, $router_data),
array( array(
'terminateRequest' => function($code, $error) { 'terminateRequest' => function($code, $error) {
return array( return array(
@ -164,7 +172,7 @@ class RouterTest extends \MailPoetTest {
function testItValidatesPermissionBeforeProcessingEndpointAction() { function testItValidatesPermissionBeforeProcessingEndpointAction() {
$router = Stub::construct( $router = Stub::construct(
'\MailPoet\Router\Router', '\MailPoet\Router\Router',
array($this->access_control, $this->router_data), array($this->access_control, $this->container, $this->router_data),
array( array(
'validatePermissions' => function($action, $permissions) { 'validatePermissions' => function($action, $permissions) {
expect($action)->equals($this->router_data['action']); expect($action)->equals($this->router_data['action']);
@ -186,7 +194,7 @@ class RouterTest extends \MailPoetTest {
function testItReturnsForbiddenResponseWhenPermissionFailsValidation() { function testItReturnsForbiddenResponseWhenPermissionFailsValidation() {
$router = Stub::construct( $router = Stub::construct(
'\MailPoet\Router\Router', '\MailPoet\Router\Router',
array($this->access_control, $this->router_data), array($this->access_control, $this->container, $this->router_data),
array( array(
'validatePermissions' => false, 'validatePermissions' => false,
'terminateRequest' => function($code, $error) { 'terminateRequest' => function($code, $error) {

View File

@ -14,11 +14,7 @@ class RouterTestMockEndpoint {
'global' => AccessControl::NO_ACCESS_RESTRICTION 'global' => AccessControl::NO_ACCESS_RESTRICTION
); );
function __construct($data) { function test($data) {
$this->data = $data; return $data;
} }
}
function test() {
return $this->data;
}
}