From 4babbdf901e4ff5b017d1162712b9ceaf065ce1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Bajsarowicz?= Date: Fri, 2 Nov 2018 17:21:31 +0200 Subject: [PATCH 1/3] Use custom Backend domain, refactoring to Executors responsible for calling HTTP endpoints --- etc/config/.env.example | 8 +++-- etc/config/functional.suite.dist.yml | 1 + .../Persist/Curl/AbstractExecutor.php | 24 ++------------ .../Persist/Curl/AdminExecutor.php | 33 ++++++++----------- .../Persist/Curl/FrontendExecutor.php | 9 ++--- .../Persist/Curl/WebapiExecutor.php | 29 +++++++++++++--- .../Util/ModuleResolver.php | 16 +++++++-- 7 files changed, 64 insertions(+), 56 deletions(-) diff --git a/etc/config/.env.example b/etc/config/.env.example index 17ea384ca..899a52df4 100644 --- a/etc/config/.env.example +++ b/etc/config/.env.example @@ -4,6 +4,9 @@ #*** Set the base URL for your Magento instance ***# MAGENTO_BASE_URL=http://devdocs.magento.com/ +#*** Uncomment if you are running Admin Panel on separate domain (used with MAGENTO_BACKEND_NAME) ***# +# MAGENTO_BACKEND_BASE_HOST=http://admin.example.com/ + #*** Set the Admin Username and Password for your Magento instance ***# MAGENTO_BACKEND_NAME=admin MAGENTO_ADMIN_USERNAME=admin @@ -23,8 +26,9 @@ MAGENTO_ADMIN_PASSWORD=123123q BROWSER=chrome #*** Uncomment and set host & port if your dev environment needs different value other than MAGENTO_BASE_URL for Rest API Requests ***# -#MAGENTO_RESTAPI_SERVER_HOST= -#MAGENTO_RESTAPI_SERVER_PORT= +#MAGENTO_RESTAPI_SERVER_HOST=restapi.magento.com +#MAGENTO_RESTAPI_SERVER_PORT=8080 +#MAGENTO_RESTAPI_SERVER_PROTOCOL=https #*** Uncomment these properties to set up a dev environment with symlinked projects ***# #TESTS_BP= diff --git a/etc/config/functional.suite.dist.yml b/etc/config/functional.suite.dist.yml index da05a13e3..12c006801 100644 --- a/etc/config/functional.suite.dist.yml +++ b/etc/config/functional.suite.dist.yml @@ -26,6 +26,7 @@ modules: config: \Magento\FunctionalTestingFramework\Module\MagentoWebDriver: url: "%MAGENTO_BASE_URL%" + backend_url: "%MAGENTO_BACKEND_BASE_URL%" backend_name: "%MAGENTO_BACKEND_NAME%" browser: 'chrome' restart: true diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AbstractExecutor.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AbstractExecutor.php index 6adf87892..30e25abd2 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AbstractExecutor.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AbstractExecutor.php @@ -14,32 +14,14 @@ abstract class AbstractExecutor implements CurlInterface { /** - * Base url. + * Returns Magento base URL. Used as a fallback for other services (eg. WebApi, Backend) * * @var string */ protected static $baseUrl = null; - /** - * Resolve base url. - * - * @return void - */ - protected static function resolveBaseUrl() + public function getBaseUrl(): string { - - if ((getenv('MAGENTO_RESTAPI_SERVER_HOST') !== false) - && (getenv('MAGENTO_RESTAPI_SERVER_HOST') !== '') ) { - self::$baseUrl = getenv('MAGENTO_RESTAPI_SERVER_HOST'); - } else { - self::$baseUrl = getenv('MAGENTO_BASE_URL'); - } - - if ((getenv('MAGENTO_RESTAPI_SERVER_PORT') !== false) - && (getenv('MAGENTO_RESTAPI_SERVER_PORT') !== '')) { - self::$baseUrl .= ':' . getenv('MAGENTO_RESTAPI_SERVER_PORT'); - } - - self::$baseUrl = rtrim(self::$baseUrl, '/') . '/'; + return getenv('MAGENTO_BASE_URL'); } } diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AdminExecutor.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AdminExecutor.php index cff7c04fb..7524d7913 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AdminExecutor.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AdminExecutor.php @@ -37,18 +37,11 @@ class AdminExecutor extends AbstractExecutor implements CurlInterface private $response; /** - * Should executor remove backend_name from api url + * Flag describes whether the request is to Magento Base URL, removes backend_name from api url * @var boolean */ private $removeBackend; - /** - * Backend url. - * - * @var string - */ - private static $adminUrl; - /** * Constructor. * @param boolean $removeBackend @@ -58,15 +51,17 @@ class AdminExecutor extends AbstractExecutor implements CurlInterface */ public function __construct($removeBackend) { - if (!isset(parent::$baseUrl)) { - parent::resolveBaseUrl(); - } - self::$adminUrl = parent::$baseUrl . getenv('MAGENTO_BACKEND_NAME') . '/'; $this->removeBackend = $removeBackend; $this->transport = new CurlTransport(); $this->authorize(); } + public function getBaseUrl(): string + { + $backendHost = getenv('MAGENTO_BACKEND_BASE_URL') ?: parent::getBaseUrl(); + return $backendHost . getenv('MAGENTO_BACKEND_NAME') . '/'; + } + /** * Authorize admin on backend. * @@ -76,11 +71,11 @@ public function __construct($removeBackend) private function authorize() { // Perform GET to backend url so form_key is set - $this->transport->write(self::$adminUrl, [], CurlInterface::GET); + $this->transport->write($this->getBaseUrl(), [], CurlInterface::GET); $this->read(); // Authenticate admin user - $authUrl = self::$adminUrl . 'admin/auth/login/'; + $authUrl = $this->getBaseUrl() . 'admin/auth/login/'; $data = [ 'login[username]' => getenv('MAGENTO_ADMIN_USERNAME'), 'login[password]' => getenv('MAGENTO_ADMIN_PASSWORD'), @@ -110,19 +105,19 @@ private function setFormKey() * Send request to the remote server. * * @param string $url - * @param array $data + * @param array $data * @param string $method - * @param array $headers + * @param array $headers * @return void * @throws TestFrameworkException */ public function write($url, $data = [], $method = CurlInterface::POST, $headers = []) { $url = ltrim($url, "/"); - $apiUrl = self::$adminUrl . $url; + $apiUrl = $this->getBaseUrl() . $url; if ($this->removeBackend) { - $apiUrl = parent::$baseUrl . $url; + $apiUrl = parent::getBaseUrl() . $url; } if ($this->formKey) { @@ -168,7 +163,7 @@ public function read($successRegex = null, $returnRegex = null) /** * Add additional option to cURL. * - * @param integer $option CURLOPT_* constants. + * @param integer $option CURLOPT_* constants. * @param integer|string|boolean|array $value * @return void */ diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/FrontendExecutor.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/FrontendExecutor.php index aa1706ef3..806507656 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/FrontendExecutor.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/FrontendExecutor.php @@ -67,9 +67,6 @@ class FrontendExecutor extends AbstractExecutor implements CurlInterface */ public function __construct($customerEmail, $customerPassWord) { - if (!isset(parent::$baseUrl)) { - parent::resolveBaseUrl(); - } $this->transport = new CurlTransport(); $this->customerEmail = $customerEmail; $this->customerPassword = $customerPassWord; @@ -84,11 +81,11 @@ public function __construct($customerEmail, $customerPassWord) */ private function authorize() { - $url = parent::$baseUrl . 'customer/account/login/'; + $url = $this->getBaseUrl() . 'customer/account/login/'; $this->transport->write($url); $this->read(); - $url = parent::$baseUrl . 'customer/account/loginPost/'; + $url = $this->getBaseUrl() . 'customer/account/loginPost/'; $data = [ 'login[username]' => $this->customerEmail, 'login[password]' => $this->customerPassword, @@ -146,7 +143,7 @@ public function write($url, $data = [], $method = CurlInterface::POST, $headers if (isset($data['customer_password'])) { unset($data['customer_password']); } - $apiUrl = parent::$baseUrl . $url; + $apiUrl = $this->getBaseUrl() . $url; if ($this->formKey) { $data['form_key'] = $this->formKey; } else { diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/WebapiExecutor.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/WebapiExecutor.php index 16fef75f2..e1d68ab28 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/WebapiExecutor.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/WebapiExecutor.php @@ -59,15 +59,34 @@ class WebapiExecutor extends AbstractExecutor implements CurlInterface */ public function __construct($storeCode = null) { - if (!isset(parent::$baseUrl)) { - parent::resolveBaseUrl(); - } - $this->storeCode = $storeCode; $this->transport = new CurlTransport(); $this->authorize(); } + /** + * Returns WebApi base URL, fallback to Magento Base URL + * @return string + */ + public function getBaseUrl(): string + { + $baseUrl = parent::getBaseUrl(); + + $webapiHost = getenv('MAGENTO_RESTAPI_SERVER_HOST'); + $webapiPort = getenv("MAGENTO_RESTAPI_SERVER_PORT"); + $webapiProtocol = getenv("MAGENTO_RESTAPI_SERVER_PROTOCOL"); + + if ($webapiHost) { + $baseUrl = sprintf('%s://%s/', $webapiProtocol, $webapiHost); + } + + if ($webapiPort) { + $baseUrl = rtrim($baseUrl,'/').':'.$webapiPort.'/'; + } + + return $baseUrl; + } + /** * Returns the authorization token needed for some requests via REST call. * @@ -152,7 +171,7 @@ public function close() */ public function getFormattedUrl($resource) { - $urlResult = parent::$baseUrl . 'rest/'; + $urlResult = $this->getBaseUrl() . 'rest/'; if ($this->storeCode != null) { $urlResult .= $this->storeCode . "/"; } diff --git a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php index 55130deeb..978186203 100644 --- a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php +++ b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php @@ -396,17 +396,18 @@ protected function getAdminToken() { $login = $_ENV['MAGENTO_ADMIN_USERNAME'] ?? null; $password = $_ENV['MAGENTO_ADMIN_PASSWORD'] ?? null; - if (!$login || !$password || !isset($_ENV['MAGENTO_BASE_URL'])) { + if (!$login || !$password || !$this->getBackendUrl()) { $message = "Cannot retrieve API token without credentials and base url, please fill out .env."; $context = [ "MAGENTO_BASE_URL" => getenv("MAGENTO_BASE_URL"), + "MAGENTO_BACKEND_BASE_URL" => getenv("MAGENTO_BACKEND_BASE_URL"), "MAGENTO_ADMIN_USERNAME" => getenv("MAGENTO_ADMIN_USERNAME"), "MAGENTO_ADMIN_PASSWORD" => getenv("MAGENTO_ADMIN_PASSWORD"), ]; throw new TestFrameworkException($message, $context); } - $url = ConfigSanitizerUtil::sanitizeUrl($_ENV['MAGENTO_BASE_URL']) . $this->adminTokenUrl; + $url = ConfigSanitizerUtil::sanitizeUrl($this->getBackendUrl()) . $this->adminTokenUrl; $data = [ 'username' => $login, 'password' => $password @@ -428,7 +429,7 @@ protected function getAdminToken() if ($responseCode !== 200) { if ($responseCode == 0) { - $details = "Could not find Magento Instance at given MAGENTO_BASE_URL"; + $details = "Could not find Magento Backend Instance at MAGENTO_BACKEND_BASE_URL or MAGENTO_BASE_URL"; } else { $details = $responseCode . " " . Response::$statusTexts[$responseCode]; } @@ -563,4 +564,13 @@ private function getRegisteredModuleList() } return []; } + + /** + * Returns custom Backend URL if set, fallback to Magento Base URL + * @return string|null + */ + private function getBackendUrl() + { + return getenv('MAGENTO_BACKEND_BASE_URL') ?: getenv('MAGENTO_BASE_URL'); + } } From 85efb600efc659cf8d313d3b978721d548f4c0c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Bajsarowicz?= Date: Sat, 3 Nov 2018 15:29:19 +0200 Subject: [PATCH 2/3] Add PHPDoc for getBaseUrl methods --- .../DataGenerator/Persist/Curl/AbstractExecutor.php | 4 ++++ .../DataGenerator/Persist/Curl/AdminExecutor.php | 4 ++++ .../DataGenerator/Persist/Curl/WebapiExecutor.php | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AbstractExecutor.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AbstractExecutor.php index 30e25abd2..b6c3f29ec 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AbstractExecutor.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AbstractExecutor.php @@ -20,6 +20,10 @@ abstract class AbstractExecutor implements CurlInterface */ protected static $baseUrl = null; + /** + * Returns base URL for Magento instance + * @return string + */ public function getBaseUrl(): string { return getenv('MAGENTO_BASE_URL'); diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AdminExecutor.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AdminExecutor.php index 7524d7913..91a0b8f4b 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AdminExecutor.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AdminExecutor.php @@ -56,6 +56,10 @@ public function __construct($removeBackend) $this->authorize(); } + /** + * Returns base URL for Magento backend instance + * @return string + */ public function getBaseUrl(): string { $backendHost = getenv('MAGENTO_BACKEND_BASE_URL') ?: parent::getBaseUrl(); diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/WebapiExecutor.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/WebapiExecutor.php index e1d68ab28..6efd3a173 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/WebapiExecutor.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/WebapiExecutor.php @@ -65,7 +65,7 @@ public function __construct($storeCode = null) } /** - * Returns WebApi base URL, fallback to Magento Base URL + * Returns base URL for Magento Web API instance * @return string */ public function getBaseUrl(): string From 0fe21e944f6fbf7092cdd1ba0ef85853731f02d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Bajsarowicz?= Date: Sat, 3 Nov 2018 15:45:06 +0200 Subject: [PATCH 3/3] Method arguments alignment to comply with PHPCS --- .../DataGenerator/Persist/Curl/AdminExecutor.php | 6 +++--- .../DataGenerator/Persist/Curl/FrontendExecutor.php | 2 +- .../DataGenerator/Persist/Curl/WebapiExecutor.php | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AdminExecutor.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AdminExecutor.php index 91a0b8f4b..1f7ae70d7 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AdminExecutor.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AdminExecutor.php @@ -109,9 +109,9 @@ private function setFormKey() * Send request to the remote server. * * @param string $url - * @param array $data + * @param array $data * @param string $method - * @param array $headers + * @param array $headers * @return void * @throws TestFrameworkException */ @@ -167,7 +167,7 @@ public function read($successRegex = null, $returnRegex = null) /** * Add additional option to cURL. * - * @param integer $option CURLOPT_* constants. + * @param integer $option CURLOPT_* constants. * @param integer|string|boolean|array $value * @return void */ diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/FrontendExecutor.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/FrontendExecutor.php index 806507656..0a82e88a6 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/FrontendExecutor.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/FrontendExecutor.php @@ -85,7 +85,7 @@ private function authorize() $this->transport->write($url); $this->read(); - $url = $this->getBaseUrl() . 'customer/account/loginPost/'; + $url = $this->getBaseUrl() . 'customer/account/loginPost/'; $data = [ 'login[username]' => $this->customerEmail, 'login[password]' => $this->customerPassword, diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/WebapiExecutor.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/WebapiExecutor.php index 6efd3a173..5eb877443 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/WebapiExecutor.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/WebapiExecutor.php @@ -81,7 +81,7 @@ public function getBaseUrl(): string } if ($webapiPort) { - $baseUrl = rtrim($baseUrl,'/').':'.$webapiPort.'/'; + $baseUrl = rtrim($baseUrl, '/') . ':' . $webapiPort . '/'; } return $baseUrl; @@ -175,7 +175,7 @@ public function getFormattedUrl($resource) if ($this->storeCode != null) { $urlResult .= $this->storeCode . "/"; } - $urlResult.= trim($resource, "/"); + $urlResult .= trim($resource, "/"); return $urlResult; } }