Security update for permissions_by_term
[yaffs-website] / vendor / drupal / drupal-extension / features / bootstrap / FeatureContext.php
diff --git a/vendor/drupal/drupal-extension/features/bootstrap/FeatureContext.php b/vendor/drupal/drupal-extension/features/bootstrap/FeatureContext.php
new file mode 100644 (file)
index 0000000..8a72e5e
--- /dev/null
@@ -0,0 +1,460 @@
+<?php
+
+use Behat\Behat\Context\Context;
+use Behat\Gherkin\Node\PyStringNode;
+use Behat\Gherkin\Node\TableNode;
+use Drupal\DrupalExtension\Hook\Scope\BeforeNodeCreateScope;
+use Drupal\DrupalExtension\Hook\Scope\EntityScope;
+use Symfony\Component\Process\PhpExecutableFinder;
+use Symfony\Component\Process\Process;
+
+/**
+ * Features context for testing the Drupal Extension.
+ *
+ * @todo we are duplicating code from Behat's FeatureContext here for the
+ * purposes of testing since we can't easily run that as a context due to naming
+ * conflicts.
+ */
+class FeatureContext implements Context {
+  /**
+   * Hook into node creation to test `@beforeNodeCreate`
+   *
+   * @beforeNodeCreate
+   */
+  public static function alterNodeParameters(BeforeNodeCreateScope $scope) {
+    call_user_func('\Drupal\DrupalExtension\Context\RawDrupalContext::alterNodeParameters', $scope);
+    // @see `features/api.feature`
+    // Change 'published on' to the expected 'created'.
+    $node = $scope->getEntity();
+    if (isset($node->{"published on"})) {
+      $node->created = $node->{"published on"};
+      unset($node->{"published on"});
+    }
+  }
+
+  /**
+   * Hook into term creation to test `@beforeTermCreate`
+   *
+   * @beforeTermCreate
+   */
+  public static function alterTermParameters(EntityScope $scope) {
+    // @see `features/api.feature`
+    // Change 'Label' to expected 'name'.
+    $term = $scope->getEntity();
+    if (isset($term->{'Label'})) {
+      $term->name = $term->{'Label'};
+      unset($term->{'Label'});
+    }
+  }
+
+  /**
+   * Hook into user creation to test `@beforeUserCreate`
+   *
+   * @beforeUserCreate
+   */
+  public static function alterUserParameters(EntityScope $scope) {
+    // @see `features/api.feature`
+    // Concatenate 'First name' and 'Last name' to form user name.
+    $user = $scope->getEntity();
+    if (isset($user->{"First name"}) && isset($user->{"Last name"})) {
+      $user->name = $user->{"First name"} . ' ' . $user->{"Last name"};
+      unset($user->{"First name"}, $user->{"Last name"});
+    }
+    // Transform custom 'E-mail' to 'mail'.
+    if (isset($user->{"E-mail"})) {
+      $user->mail = $user->{"E-mail"};
+      unset($user->{"E-mail"});
+    }
+  }
+
+  /**
+   * Test that a node is returned after node create.
+   *
+   * @afterNodeCreate
+   */
+  public static function afterNodeCreate(EntityScope $scope) {
+    if (!$node = $scope->getEntity()) {
+      throw new \Exception('Failed to find a node in @afterNodeCreate hook.');
+    }
+  }
+
+  /**
+   * Test that a term is returned after term create.
+   *
+   * @afterTermCreate
+   */
+  public static function afterTermCreate(EntityScope $scope) {
+    if (!$term = $scope->getEntity()) {
+      throw new \Exception('Failed to find a term in @afterTermCreate hook.');
+    }
+  }
+
+  /**
+   * Test that a user is returned after user create.
+   *
+   * @afterUserCreate
+   */
+  public static function afterUserCreate(EntityScope $scope) {
+    if (!$user = $scope->getEntity()) {
+      throw new \Exception('Failed to find a user in @afterUserCreate hook.');
+    }
+  }
+
+  /**
+   * Transforms long address field columns into shorter aliases.
+   *
+   * This is used in field_handlers.feature for testing if lengthy field:column
+   * combinations can be shortened to more human friendly aliases.
+   *
+   * @Transform table:name,mail,street,city,postcode,country
+   */
+  public function castUsersTable(TableNode $user_table) {
+    $aliases = array(
+      'country' => 'field_post_address:country',
+      'city' => 'field_post_address:locality',
+      'street' => 'field_post_address:thoroughfare',
+      'postcode' => 'field_post_address:postal_code',
+    );
+
+    // The first row of the table contains the field names.
+    $table = $user_table->getTable();
+    reset($table);
+    $first_row = key($table);
+
+    // Replace the aliased field names with the actual ones.
+    foreach ($table[$first_row] as $key => $alias) {
+      if (array_key_exists($alias, $aliases)) {
+        $table[$first_row][$key] = $aliases[$alias];
+      }
+    }
+
+    return new TableNode($table);
+  }
+
+  /**
+   * Transforms human readable field names into machine names.
+   *
+   * This is used in field_handlers.feature for testing if human readable names
+   * can be used instead of machine names in tests.
+   *
+   * @param TableNode $post_table
+   *   The original table.
+   *
+   * @return TableNode
+   *   The transformed table.
+   *
+   * @Transform rowtable:title,body,reference,date,links,select,address
+   */
+  public function transformPostContentTable(TableNode $post_table) {
+    $aliases = array(
+      'reference' => 'field_post_reference',
+      'date' => 'field_post_date',
+      'links' => 'field_post_links',
+      'select' => 'field_post_select',
+      'address' => 'field_post_address',
+    );
+
+    $table = $post_table->getTable();
+    array_walk($table, function (&$row) use ($aliases) {
+      // The first column of the row contains the field names. Replace the
+      // human readable field name with the machine name if it exists.
+      if (array_key_exists($row[0], $aliases)) {
+        $row[0] = $aliases[$row[0]];
+      }
+    });
+
+    return new TableNode($table);
+  }
+
+  /**
+   * From here down is the Behat FeatureContext.
+   *
+   * @defgroup Behat FeatureContext
+   * @{
+   */
+
+    /**
+     * @var string
+     */
+    private $phpBin;
+    /**
+     * @var Process
+     */
+    private $process;
+    /**
+     * @var string
+     */
+    private $workingDir;
+
+    /**
+     * Cleans test folders in the temporary directory.
+     *
+     * @BeforeSuite
+     * @AfterSuite
+     */
+    public static function cleanTestFolders()
+    {
+        if (is_dir($dir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'behat')) {
+            self::clearDirectory($dir);
+        }
+    }
+
+    /**
+     * Prepares test folders in the temporary directory.
+     *
+     * @BeforeScenario
+     */
+    public function prepareTestFolders()
+    {
+        do {
+            $random_name = md5((int) microtime(true) * rand(0, 100000));
+            $dir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'behat' . DIRECTORY_SEPARATOR . $random_name;
+        } while (is_dir($dir));
+
+        mkdir($dir . '/features/bootstrap/i18n', 0777, true);
+
+        $phpFinder = new PhpExecutableFinder();
+        if (false === $php = $phpFinder->find()) {
+            throw new \RuntimeException('Unable to find the PHP executable.');
+        }
+        $this->workingDir = $dir;
+        $this->phpBin = $php;
+        $this->process = new Process(null);
+    }
+
+    /**
+     * Creates a file with specified name and context in current workdir.
+     *
+     * @Given /^(?:there is )?a file named "([^"]*)" with:$/
+     *
+     * @param   string       $filename name of the file (relative path)
+     * @param   PyStringNode $content  PyString string instance
+     */
+    public function aFileNamedWith($filename, PyStringNode $content)
+    {
+        $content = strtr((string) $content, array("'''" => '"""'));
+        $this->createFile($this->workingDir . '/' . $filename, $content);
+    }
+
+    /**
+     * Moves user to the specified path.
+     *
+     * @Given /^I am in the "([^"]*)" path$/
+     *
+     * @param   string $path
+     */
+    public function iAmInThePath($path)
+    {
+        $this->moveToNewPath($path);
+    }
+
+    /**
+     * Checks whether a file at provided path exists.
+     *
+     * @Given /^file "([^"]*)" should exist$/
+     *
+     * @param   string $path
+     */
+    public function fileShouldExist($path)
+    {
+        PHPUnit_Framework_Assert::assertFileExists($this->workingDir . DIRECTORY_SEPARATOR . $path);
+    }
+
+    /**
+     * Sets specified ENV variable
+     *
+     * @When /^"BEHAT_PARAMS" environment variable is set to:$/
+     *
+     * @param PyStringNode $value
+     */
+    public function iSetEnvironmentVariable(PyStringNode $value)
+    {
+        $this->process->setEnv(array('BEHAT_PARAMS' => (string) $value));
+    }
+
+    /**
+     * Runs behat command with provided parameters
+     *
+     * @When /^I run "behat(?: ((?:\"|[^"])*))?"$/
+     *
+     * @param   string $argumentsString
+     */
+    public function iRunBehat($argumentsString = '')
+    {
+        $argumentsString = strtr($argumentsString, array('\'' => '"'));
+
+        $this->process->setWorkingDirectory($this->workingDir);
+        $this->process->setCommandLine(
+            sprintf(
+                '%s %s %s %s',
+                $this->phpBin,
+                escapeshellarg(BEHAT_BIN_PATH),
+                $argumentsString,
+                strtr('--format-settings=\'{"timer": false}\'', array('\'' => '"', '"' => '\"'))
+            )
+        );
+        $this->process->start();
+        $this->process->wait();
+    }
+
+    /**
+     * Checks whether previously ran command passes|fails with provided output.
+     *
+     * @Then /^it should (fail|pass) with:$/
+     *
+     * @param   string       $success "fail" or "pass"
+     * @param   PyStringNode $text    PyString text instance
+     */
+    public function itShouldPassWith($success, PyStringNode $text)
+    {
+        $this->itShouldFail($success);
+        $this->theOutputShouldContain($text);
+    }
+
+    /**
+     * Checks whether specified file exists and contains specified string.
+     *
+     * @Then /^"([^"]*)" file should contain:$/
+     *
+     * @param   string       $path file path
+     * @param   PyStringNode $text file content
+     */
+    public function fileShouldContain($path, PyStringNode $text)
+    {
+        $path = $this->workingDir . '/' . $path;
+        PHPUnit_Framework_Assert::assertFileExists($path);
+
+        $fileContent = trim(file_get_contents($path));
+        // Normalize the line endings in the output
+        if ("\n" !== PHP_EOL) {
+            $fileContent = str_replace(PHP_EOL, "\n", $fileContent);
+        }
+
+        PHPUnit_Framework_Assert::assertEquals($this->getExpectedOutput($text), $fileContent);
+    }
+
+    /**
+     * Checks whether last command output contains provided string.
+     *
+     * @Then the output should contain:
+     *
+     * @param   PyStringNode $text PyString text instance
+     */
+    public function theOutputShouldContain(PyStringNode $text)
+    {
+        PHPUnit_Framework_Assert::assertContains($this->getExpectedOutput($text), $this->getOutput());
+    }
+
+    private function getExpectedOutput(PyStringNode $expectedText)
+    {
+        $text = strtr($expectedText, array('\'\'\'' => '"""', '%%TMP_DIR%%' => sys_get_temp_dir() . DIRECTORY_SEPARATOR));
+
+        // windows path fix
+        if ('/' !== DIRECTORY_SEPARATOR) {
+            $text = preg_replace_callback(
+                '/ features\/[^\n ]+/', function ($matches) {
+                    return str_replace('/', DIRECTORY_SEPARATOR, $matches[0]);
+                }, $text
+            );
+            $text = preg_replace_callback(
+                '/\<span class\="path"\>features\/[^\<]+/', function ($matches) {
+                    return str_replace('/', DIRECTORY_SEPARATOR, $matches[0]);
+                }, $text
+            );
+            $text = preg_replace_callback(
+                '/\+[fd] [^ ]+/', function ($matches) {
+                    return str_replace('/', DIRECTORY_SEPARATOR, $matches[0]);
+                }, $text
+            );
+        }
+
+        return $text;
+    }
+
+    /**
+     * Checks whether previously ran command failed|passed.
+     *
+     * @Then /^it should (fail|pass)$/
+     *
+     * @param   string $success "fail" or "pass"
+     */
+    public function itShouldFail($success)
+    {
+        if ('fail' === $success) {
+            if (0 === $this->getExitCode()) {
+                echo 'Actual output:' . PHP_EOL . PHP_EOL . $this->getOutput();
+            }
+
+            PHPUnit_Framework_Assert::assertNotEquals(0, $this->getExitCode());
+        } else {
+            if (0 !== $this->getExitCode()) {
+                echo 'Actual output:' . PHP_EOL . PHP_EOL . $this->getOutput();
+            }
+
+            PHPUnit_Framework_Assert::assertEquals(0, $this->getExitCode());
+        }
+    }
+
+    private function getExitCode()
+    {
+        return $this->process->getExitCode();
+    }
+
+    private function getOutput()
+    {
+        $output = $this->process->getErrorOutput() . $this->process->getOutput();
+
+        // Normalize the line endings in the output
+        if ("\n" !== PHP_EOL) {
+            $output = str_replace(PHP_EOL, "\n", $output);
+        }
+
+        // Replace wrong warning message of HHVM
+        $output = str_replace('Notice: Undefined index: ', 'Notice: Undefined offset: ', $output);
+
+        return trim(preg_replace("/ +$/m", '', $output));
+    }
+
+    private function createFile($filename, $content)
+    {
+        $path = dirname($filename);
+        if (!is_dir($path)) {
+            mkdir($path, 0777, true);
+        }
+
+        file_put_contents($filename, $content);
+    }
+
+    private function moveToNewPath($path)
+    {
+        $newWorkingDir = $this->workingDir .'/' . $path;
+        if (!file_exists($newWorkingDir)) {
+            mkdir($newWorkingDir, 0777, true);
+        }
+
+        $this->workingDir = $newWorkingDir;
+    }
+
+    private static function clearDirectory($path)
+    {
+        $files = scandir($path);
+        array_shift($files);
+        array_shift($files);
+
+        foreach ($files as $file) {
+            $file = $path . DIRECTORY_SEPARATOR . $file;
+            if (is_dir($file)) {
+                self::clearDirectory($file);
+            } else {
+                unlink($file);
+            }
+        }
+
+        rmdir($path);
+    }
+
+  /**
+   * @} End of defgroup Behat FeatureContext.
+   */
+
+}