diff core/tests/Drupal/KernelTests/AssertConfigTrait.php @ 0:c75dbcec494b

Initial commit from drush-created site
author Chris Cannam
date Thu, 05 Jul 2018 14:24:15 +0000
parents
children a9cd425dd02b
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/tests/Drupal/KernelTests/AssertConfigTrait.php	Thu Jul 05 14:24:15 2018 +0000
@@ -0,0 +1,90 @@
+<?php
+
+namespace Drupal\KernelTests;
+
+use Drupal\Component\Diff\Diff;
+
+/**
+ * Trait to help with diffing config.
+ */
+trait AssertConfigTrait {
+
+  /**
+   * Ensures that a specific config diff does not contain unwanted changes.
+   *
+   * @param \Drupal\Component\Diff\Diff $result
+   *   The diff result for the passed in config name.
+   * @param string $config_name
+   *   The config name to check.
+   * @param array $skipped_config
+   *   An array of skipped config, keyed by string. If the value is TRUE, the
+   *   entire file will be ignored, otherwise it's an array of strings which are
+   *   ignored.
+   *
+   * @throws \Exception
+   *   Thrown when a configuration is different.
+   */
+  protected function assertConfigDiff(Diff $result, $config_name, array $skipped_config) {
+    foreach ($result->getEdits() as $op) {
+      switch (get_class($op)) {
+        case 'Drupal\Component\Diff\Engine\DiffOpCopy':
+          // Nothing to do, a copy is what we expect.
+          break;
+        case 'Drupal\Component\Diff\Engine\DiffOpDelete':
+        case 'Drupal\Component\Diff\Engine\DiffOpChange':
+          // It is not part of the skipped config, so we can directly throw the
+          // exception.
+          if (!in_array($config_name, array_keys($skipped_config))) {
+            throw new \Exception($config_name . ': ' . var_export($op, TRUE));
+          }
+
+          // Allow to skip entire config files.
+          if ($skipped_config[$config_name] === TRUE) {
+            continue;
+          }
+
+          // Allow to skip some specific lines of imported config files.
+          // Ensure that the only changed lines are the ones we marked as
+          // skipped.
+          $all_skipped = TRUE;
+
+          $changes = get_class($op) == 'Drupal\Component\Diff\Engine\DiffOpDelete' ? $op->orig : $op->closing;
+          foreach ($changes as $closing) {
+            // Skip some of the changes, as they are caused by module install
+            // code.
+            $found = FALSE;
+            if (!empty($skipped_config[$config_name])) {
+              foreach ($skipped_config[$config_name] as $line) {
+                if (strpos($closing, $line) !== FALSE) {
+                  $found = TRUE;
+                  break;
+                }
+              }
+            }
+            $all_skipped = $all_skipped && $found;
+          }
+
+          if (!$all_skipped) {
+            throw new \Exception($config_name . ': ' . var_export($op, TRUE));
+          }
+          break;
+        case 'Drupal\Component\Diff\Engine\DiffOpAdd':
+          // The _core property does not exist in the default config.
+          if ($op->closing[0] === '_core:') {
+            continue;
+          }
+          foreach ($op->closing as $closing) {
+            // The UUIDs don't exist in the default config.
+            if (strpos($closing, 'uuid: ') === 0) {
+              continue;
+            }
+            throw new \Exception($config_name . ': ' . var_export($op, TRUE));
+          }
+          break;
+        default:
+          throw new \Exception($config_name . ': ' . var_export($op, TRUE));
+      }
+    }
+  }
+
+}