nextcloud/build/acceptance/features/core/NextcloudTestServerContext.php

136 lines
5.2 KiB
PHP

<?php
/**
*
* @copyright Copyright (c) 2017, Daniel Calviño Sánchez (danxuliu@gmail.com)
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
use Behat\Behat\Context\Context;
use Behat\Behat\Hook\Scope\BeforeScenarioScope;
/**
* Behat context to run each scenario against a clean Nextcloud server.
*
* Before each scenario is run, this context sets up a fresh Nextcloud server
* with predefined data and configuration. Thanks to this every scenario is
* independent from the others and they all know the initial state of the
* server.
*
* This context is expected to be used along with RawMinkContext contexts (or
* subclasses). As the server address can be different for each scenario, this
* context automatically sets the "base_url" parameter of all its sibling
* RawMinkContexts; just add NextcloudTestServerContext to the context list of a
* suite in "behat.yml".
*
* The Nextcloud server is provided by an instance of NextcloudTestServerHelper;
* its class must be specified when this context is created. By default,
* "NextcloudTestServerDockerHelper" is used, although that can be customized
* using the "nextcloudTestServerHelper" parameter in "behat.yml". In the same
* way, the parameters to be passed to the helper when it is created can be
* customized using the "nextcloudTestServerHelperParameters" parameter, which
* is an array (without keys) with the value of the parameters in the same order
* as in the constructor of the helper class (by default,
* [ "nextcloud-local-test-acceptance", "selenium-nextcloud-local-test-acceptance" ]).
*
* Example of custom parameters in "behat.yml":
* default:
* suites:
* default:
* contexts:
* - NextcloudTestServerContext:
* nextcloudTestServerHelper: NextcloudTestServerDockerHelper
* nextcloudTestServerHelperParameters:
* - nextcloud-local-test-acceptance-custom-image
* - selenium-nextcloud-local-test-acceptance-custom-image
*
* Note that using Docker containers as a regular user requires giving access to
* the Docker daemon to that user. Unfortunately, that makes possible for that
* user to get root privileges for the system. Please see the
* NextcloudTestServerDockerHelper documentation for further information on this
* issue.
*/
class NextcloudTestServerContext implements Context {
/**
* @var NextcloudTestServerHelper
*/
private $nextcloudTestServerHelper;
/**
* Creates a new NextcloudTestServerContext.
*
* @param string $nextcloudTestServerHelper the name of the
* NextcloudTestServerHelper implementing class to use.
* @param array $nextcloudTestServerHelperParameters the parameters for the
* constructor of the $nextcloudTestServerHelper class.
*/
public function __construct($nextcloudTestServerHelper = "NextcloudTestServerDockerHelper",
$nextcloudTestServerHelperParameters = [ "nextcloud-local-test-acceptance", "selenium-nextcloud-local-test-acceptance" ]) {
$nextcloudTestServerHelperClass = new ReflectionClass($nextcloudTestServerHelper);
if ($nextcloudTestServerHelperParameters === null) {
$nextcloudTestServerHelperParameters = array();
}
$this->nextcloudTestServerHelper = $nextcloudTestServerHelperClass->newInstanceArgs($nextcloudTestServerHelperParameters);
}
/**
* @BeforeScenario
*
* Sets up the Nextcloud test server before each scenario.
*
* Once the Nextcloud test server is set up, the "base_url" parameter of the
* sibling RawMinkContexts is set to the base URL of the Nextcloud test
* server.
*
* @param \Behat\Behat\Hook\Scope\BeforeScenarioScope $scope the
* BeforeScenario hook scope.
* @throws \Exception if the Nextcloud test server can not be set up or its
* base URL got.
*/
public function setUpNextcloudTestServer(BeforeScenarioScope $scope) {
$this->nextcloudTestServerHelper->setUp();
$this->setBaseUrlInSiblingRawMinkContexts($scope, $this->nextcloudTestServerHelper->getBaseUrl());
}
/**
* @AfterScenario
*
* Cleans up the Nextcloud test server after each scenario.
*
* @throws \Exception if the Nextcloud test server can not be cleaned up.
*/
public function cleanUpNextcloudTestServer() {
$this->nextcloudTestServerHelper->cleanUp();
}
private function setBaseUrlInSiblingRawMinkContexts(BeforeScenarioScope $scope, $baseUrl) {
$environment = $scope->getEnvironment();
foreach ($environment->getContexts() as $context) {
if ($context instanceof Behat\MinkExtension\Context\RawMinkContext) {
$context->setMinkParameter("base_url", $baseUrl);
}
}
}
}