hook_event_dispatcher-8.x-2.04/modules/field_event_dispatcher/tests/src/Unit/Field/AbstractFormEntityDisplayEditAlterEventSubscriberTestCase.php

modules/field_event_dispatcher/tests/src/Unit/Field/AbstractFormEntityDisplayEditAlterEventSubscriberTestCase.php
<?php

namespace Drupal\Tests\field_event_dispatcher\Unit\Field;

use Drupal\Component\Utility\NestedArray;
use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Core\Form\FormStateInterface;
use Drupal\core_event_dispatcher\Event\Form\FormIdAlterEvent;
use Drupal\field_event_dispatcher\EventSubscriber\Form\FormEntityDisplayEditAlterEventSubscriber;
use Drupal\Tests\hook_event_dispatcher\Unit\HookEventDispatcherManagerSpy;
use PHPUnit\Framework\TestCase;

/**
 * Class AbstractFormEntityDisplayEditAlterEventSubscriberTestCase.
 *
 * @covers \Drupal\field_event_dispatcher\EventSubscriber\Form\FormEntityDisplayEditAlterEventSubscriber
 *
 * @group hook_event_dispatcher
 * @group field_event_dispatcher
 */
abstract class AbstractFormEntityDisplayEditAlterEventSubscriberTestCase extends TestCase {

  /**
   * The form ID we're testing.
   *
   * @var string
   */
  protected $formId;

  /**
   * The manager.
   *
   * @var \Drupal\Tests\hook_event_dispatcher\Unit\HookEventDispatcherManagerSpy
   */
  private HookEventDispatcherManagerSpy $manager;

  /**
   * Sets up the test.
   */
  protected function setUp(): void {
    parent::setUp();
    $builder = new ContainerBuilder();
    $this->manager = new HookEventDispatcherManagerSpy();
    $builder->set('hook_event_dispatcher.manager', $this->manager);
    $builder->compile(TRUE);
    \Drupal::setContainer($builder);
  }

  /**
   * Get a basic test form.
   *
   * The required structure for the $fields parameter array is:
   * @code
   *  'field_test1' => ['test_module' => ['test']],
   *  'field_test2' => ['test_module' => ['test']],
   * @endcode
   *
   * @param array $fields
   *   An array containing zero or more fields and their third-party settings to
   *   create and return as a form.
   *
   * @return array
   *   A basic form array with the field structure in $fields added.
   */
  private function getTestForm(array $fields): array {
    $form = [
      '#fields' => [],
    ];

    foreach ($fields as $fieldName => $thirdPartySettings) {
      $form['#fields'][] = $fieldName;

      $form['fields'][$fieldName]['plugin']['settings_edit_form']['third_party_settings']['field_event_dispatcher'] = $thirdPartySettings;
    }

    return $form;
  }

  /**
   * Alter both $form and $expectedForm for a test.
   *
   * @param array &$form
   *   This is the form array to be passed to
   *   FormEntityDisplayEditAlterEventSubscriber for it to alter.
   * @param array &$expectedForm
   *   This is a duplicate of $form that is altered here in this method to match
   *   the expected changes FormEntityDisplayEditAlterEventSubscriber
   *   performs on $form.
   *
   * @see \Drupal\field_event_dispatcher\EventSubscriber\Form\FormEntityDisplayEditAlterEventSubscriber::formAlter()
   */
  private function alterForm(array &$form, array &$expectedForm): void {
    $eventSubscriber = new FormEntityDisplayEditAlterEventSubscriber();
    $formState = $this->createMock(FormStateInterface::class);
    $event = new FormIdAlterEvent($form, $formState, $this->formId);

    $eventSubscriber->formAlter($event);

    foreach ($expectedForm['#fields'] as $fieldName) {
      // Skip any fields that have no field_event_dispatcher third-party
      // settings.
      if (!isset($expectedForm['fields'][$fieldName]['plugin']['settings_edit_form']['third_party_settings']['field_event_dispatcher'])) {
        continue;
      }

      $thirdPartySettings = &$expectedForm['fields'][$fieldName]['plugin']['settings_edit_form']['third_party_settings'];

      $thirdPartySettings = NestedArray::mergeDeep(
        $thirdPartySettings,
        $thirdPartySettings['field_event_dispatcher']
      );

      unset($thirdPartySettings['field_event_dispatcher']);
    }

    $form = $event->getForm();
  }

  /**
   * FormEntityDisplayEditAlterEventSubscriber test with no fields.
   *
   * This tests that FormEntityDisplayEditAlterEventSubscriber::formAlter()
   * handles forms with no fields it can alter correctly.
   */
  public function testFormAlterNoFields(): void {
    $form = $this->getTestForm([]);

    $expectedForm = $form;

    $this->alterForm($form, $expectedForm);

    self::assertSame($expectedForm, $form);
  }

  /**
   * FormEntityDisplayEditAlterEventSubscriber test with one field.
   *
   * This tests that FormEntityDisplayEditAlterEventSubscriber::formAlter()
   * alters the $form array as expected when one field is provided.
   */
  public function testFormAlterOneField(): void {
    $form = $this->getTestForm(['field_test' => ['test_module' => ['test']]]);

    $expectedForm = $form;

    $this->alterForm($form, $expectedForm);

    self::assertSame($expectedForm, $form);
  }

  /**
   * FormEntityDisplayEditAlterEventSubscriber test with two fields.
   *
   * This tests that FormEntityDisplayEditAlterEventSubscriber::formAlter()
   * alters the $form array as expected when two fields are provided.
   */
  public function testFormAlterTwoFields(): void {
    $form = $this->getTestForm([
      'field_test1' => ['test_module' => ['test']],
      'field_test2' => ['test_module' => ['test']],
    ]);

    $expectedForm = $form;

    $this->alterForm($form, $expectedForm);

    self::assertSame($expectedForm, $form);
  }

  /**
   * FormEntityDisplayEditAlterEventSubscriber test with multiple merges.
   *
   * This tests that FormEntityDisplayEditAlterEventSubscriber::formAlter()
   * alters the $form array as expected when a field has third-party settings
   * merged in more than once.
   */
  public function testFormAlterMultipleMerges(): void {
    $form = $this->getTestForm(['field_test' => ['test_module1' => ['test']]]);

    $expectedForm = $form;

    // First merge.
    $this->alterForm($form, $expectedForm);

    $form = NestedArray::mergeDeep(
      $form,
      $this->getTestForm(['field_test' => ['test_module2' => ['test']]])
    );

    $expectedForm = $form;

    // Second merge.
    $this->alterForm($form, $expectedForm);

    self::assertSame($expectedForm, $form);
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc