96 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
declare(strict_types=1);
 | 
						|
 | 
						|
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 (str_contains($closing, $line)) {
 | 
						|
                  $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 (str_starts_with($closing, 'uuid: ')) {
 | 
						|
              break;
 | 
						|
            }
 | 
						|
            throw new \Exception($config_name . ': ' . var_export($op, TRUE));
 | 
						|
          }
 | 
						|
          break;
 | 
						|
 | 
						|
        default:
 | 
						|
          throw new \Exception($config_name . ': ' . var_export($op, TRUE));
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
}
 |