SequentiallyConstraintValidatorTest.php

Namespace

Drupal\KernelTests\Core\Validation

File

core/tests/Drupal/KernelTests/Core/Validation/SequentiallyConstraintValidatorTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\KernelTests\Core\Validation;

use Drupal\Core\TypedData\DataDefinition;
use Drupal\Core\TypedData\TypedDataManagerInterface;
use Drupal\Core\Validation\Plugin\Validation\Constraint\SequentiallyConstraint;
use Drupal\KernelTests\KernelTestBase;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;

/**
 * Tests Sequentially validation constraint with both valid and invalid values.
 */
class SequentiallyConstraintValidatorTest extends KernelTestBase {
  
  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'config_test',
  ];
  
  /**
   * The typed data manager to use.
   */
  protected TypedDataManagerInterface $typedData;
  
  /**
   * {@inheritdoc}
   */
  protected function setUp() : void {
    parent::setUp();
    $this->typedData = $this->container
      ->get('typed_data_manager');
  }
  
  /**
   * Tests use of Sequentially validation constraint in config.
   */
  public function testConfigValidation() : void {
    $this->installConfig('config_test');
    $config = \Drupal::configFactory()->getEditable('config_test.validation');
    /** @var \Drupal\Core\Config\TypedConfigManagerInterface $typed_config_manager */
    $typed_config_manager = \Drupal::service('config.typed');
    $config->set('composite.sequentially', 'green');
    $result = $typed_config_manager->createFromNameAndData('config_test.validation', $config->get())
      ->validate();
    $this->assertCount(0, $result);
    $config->set('composite.sequentially', '');
    $result = $typed_config_manager->createFromNameAndData('config_test.validation', $config->get())
      ->validate();
    $this->assertCount(1, $result);
    $this->assertEquals('This value should not be blank.', $result->get(0)
      ->getMessage());
    $this->assertEquals('composite.sequentially', $result->get(0)
      ->getPropertyPath());
    $config->set('composite.sequentially', 'im a very long string that should now work');
    $result = $typed_config_manager->createFromNameAndData('config_test.validation', $config->get())
      ->validate();
    $this->assertCount(1, $result);
    $this->assertEquals('This value is too long. It should have 10 characters or less.', $result->get(0)
      ->getMessage());
    $this->assertEquals('composite.sequentially', $result->get(0)
      ->getPropertyPath());
  }
  
  /**
   * Tests the Sequentially validation constraint validator.
   */
  public function testValidation(string $type, mixed $value, array $constraints, array $expectedViolations, array $extra_constraints = []) : void {
    // Create a definition that specifies some AllowedValues.
    $definition = DataDefinition::create($type);
    if (count($extra_constraints) > 0) {
      foreach ($extra_constraints as $name => $settings) {
        $definition->addConstraint($name, $settings);
      }
    }
    $definition->addConstraint('Sequentially', [
      'constraints' => $constraints,
    ]);
    // Test the validation.
    $typed_data = $this->typedData
      ->create($definition, $value);
    $violations = $typed_data->validate();
    $violationMessages = [];
    foreach ($violations as $violation) {
      $violationMessages[] = (string) $violation->getMessage();
    }
    $this->assertEquals($expectedViolations, $violationMessages, 'Validation passed for correct value.');
  }
  
  /**
   * Data provider for testValidation().
   */
  public static function dataProvider() : array {
    return [
      'fail on a failing sibling validator' => [
        'integer',
        150,
        [
          [
            'Range' => [
              'min' => 100,
            ],
          ],
          [
            'NotNull' => [],
          ],
        ],
        [
          'This value should be blank.',
        ],
        [
          'Blank' => [],
        ],
      ],
      'fail if second validator fails' => [
        'integer',
        250,
        [
          [
            'Range' => [
              'min' => 100,
            ],
          ],
          [
            'AllowedValues' => [
              'choices' => [
                500,
              ],
            ],
          ],
        ],
        [
          'The value you selected is not a valid choice.',
        ],
      ],
      'show first validation error only even when multiple would fail' => [
        'string',
        'Green',
        [
          [
            'AllowedValues' => [
              'choices' => [
                'test',
              ],
            ],
          ],
          [
            'Blank' => [],
          ],
        ],
        [
          'The value you selected is not a valid choice.',
        ],
      ],
    ];
  }

}

Classes

Title Deprecated Summary
SequentiallyConstraintValidatorTest Tests Sequentially validation constraint with both valid and invalid values.

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