You are here

protected function AssertConfigTrait::assertConfigDiff in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 core/tests/Drupal/KernelTests/AssertConfigTrait.php \Drupal\KernelTests\AssertConfigTrait::assertConfigDiff()

Ensures that a specific config diff does not contain unwanted changes.

Parameters

\Drupal\Component\Diff\Diff $result: The diff result for the passed in config name.

string $config_name: The config name to check.

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.

2 calls to AssertConfigTrait::assertConfigDiff()
ConfigAfterInstallerTestBase::assertInstalledConfig in core/modules/system/src/Tests/Installer/ConfigAfterInstallerTestBase.php
Ensures that all the installed config looks like the exported one.
DefaultConfigTest::testModuleConfig in core/tests/Drupal/KernelTests/Config/DefaultConfigTest.php
Tests if installed config is equal to the exported config.

File

core/tests/Drupal/KernelTests/AssertConfigTrait.php, line 32
Contains \Drupal\KernelTests\AssertConfigTrait.

Class

AssertConfigTrait
Trait to help with diffing config.

Namespace

Drupal\KernelTests

Code

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':
        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));
        break;
    }
  }
}