AssertConfigTrait.php

Same filename in other branches
  1. 8.9.x core/tests/Drupal/KernelTests/AssertConfigTrait.php
  2. 10 core/tests/Drupal/KernelTests/AssertConfigTrait.php
  3. 11.x core/tests/Drupal/KernelTests/AssertConfigTrait.php

Namespace

Drupal\KernelTests

File

core/tests/Drupal/KernelTests/AssertConfigTrait.php

View source
<?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) {
                        break;
                    }
                    // 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:') {
                        break;
                    }
                    foreach ($op->closing as $closing) {
                        // The UUIDs don't exist in the default config.
                        if (strpos($closing, 'uuid: ') === 0) {
                            break;
                        }
                        throw new \Exception($config_name . ': ' . var_export($op, TRUE));
                    }
                    break;
                default:
                    throw new \Exception($config_name . ': ' . var_export($op, TRUE));
            }
        }
    }

}

Traits

Title Deprecated Summary
AssertConfigTrait Trait to help with diffing config.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.