name-8.x-1.x-dev/tests/src/Kernel/NameElementTest.php

tests/src/Kernel/NameElementTest.php
<?php

declare(strict_types=1);

namespace Drupal\Tests\name\Kernel;

use Drupal\Core\Render\ElementInfoManagerInterface;
use Drupal\name\Element\Name;
use Drupal\KernelTests\KernelTestBase;

/**
 * Tests the Name element integration.
 *
 * @group name
 * @coversDefaultClass \Drupal\name\Element\Name
 */
class NameElementTest extends KernelTestBase {

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'name',
    'field',
    'system',
    'user',
  ];

  /**
   * The element info manager.
   *
   * @var \Drupal\Core\Render\ElementInfoManagerInterface
   */
  protected ElementInfoManagerInterface $elementInfoManager;

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();
    $this->installConfig(self::$modules);

    $this->elementInfoManager = $this->container->get('plugin.manager.element_info');
  }

  /**
   * Tests that the Name element is properly registered.
   *
   * @covers ::getInfo
   */
  public function testElementRegistration(): void {
    $info = $this->elementInfoManager->getInfo('name');

    $this->assertNotEmpty($info);
    $this->assertTrue($info['#input']);
    $this->assertContains('name_element_expand', $info['#process']);
    $this->assertContains([Name::class, 'preRender'], $info['#pre_render']);
    $this->assertContains('name_element_validate', $info['#element_validate']);
    $this->assertContains('form_element', $info['#theme_wrappers']);
  }

  /**
   * Tests the preRender method with default layout.
   *
   * @covers ::preRender
   */
  public function testPreRenderWithDefaultLayout(): void {
    $element = [
      'title' => [
        '#type' => 'select',
        '#title' => 'Title',
        '#options' => ['Dr.' => 'Dr.', 'Mr.' => 'Mr.'],
      ],
      'given' => [
        '#type' => 'textfield',
        '#title' => 'Given Name',
      ],
      'family' => [
        '#type' => 'textfield',
        '#title' => 'Family Name',
      ],
      '#widget_layout' => 'stacked',
    ];

    $result = Name::preRender($element);

    // Check that the element structure is correct.
    $this->assertArrayHasKey('_name', $result);
    $this->assertArrayHasKey('#prefix', $result['_name']);
    $this->assertArrayHasKey('#suffix', $result['_name']);

    // Check that the wrapper div is created.
    $this->assertStringContainsString('<div', $result['_name']['#prefix']);
    $this->assertStringContainsString('</div>', $result['_name']['#suffix']);

    // Check that components are moved to _name.
    $this->assertArrayHasKey('title', $result['_name']);
    $this->assertArrayHasKey('given', $result['_name']);
    $this->assertArrayHasKey('family', $result['_name']);

    // Check that original components are removed.
    $this->assertArrayNotHasKey('title', $result);
    $this->assertArrayNotHasKey('given', $result);
    $this->assertArrayNotHasKey('family', $result);
  }

  /**
   * Tests the preRender method with inline layout.
   *
   * @covers ::preRender
   */
  public function testPreRenderWithInlineLayout(): void {
    $element = [
      'title' => [
        '#type' => 'select',
        '#title' => 'Title',
      ],
      'given' => [
        '#type' => 'textfield',
        '#title' => 'Given Name',
      ],
      'family' => [
        '#type' => 'textfield',
        '#title' => 'Family Name',
      ],
      '#widget_layout' => 'inline',
    ];

    $result = Name::preRender($element);

    // Check that the element structure is correct.
    $this->assertArrayHasKey('_name', $result);
    $this->assertArrayHasKey('#prefix', $result['_name']);
    $this->assertArrayHasKey('#suffix', $result['_name']);

    // Check that the wrapper div is created.
    $this->assertStringContainsString('<div', $result['_name']['#prefix']);
    $this->assertStringContainsString('</div>', $result['_name']['#suffix']);

    // Check that components are moved to _name.
    $this->assertArrayHasKey('title', $result['_name']);
    $this->assertArrayHasKey('given', $result['_name']);
    $this->assertArrayHasKey('family', $result['_name']);
  }

  /**
   * Tests the preRender method with custom component layout.
   *
   * @covers ::preRender
   */
  public function testPreRenderWithCustomComponentLayout(): void {
    $element = [
      'title' => [
        '#type' => 'select',
        '#title' => 'Title',
      ],
      'given' => [
        '#type' => 'textfield',
        '#title' => 'Given Name',
      ],
      'family' => [
        '#type' => 'textfield',
        '#title' => 'Family Name',
      ],
      '#component_layout' => 'custom_layout',
      '#widget_layout' => 'stacked',
    ];

    $result = Name::preRender($element);

    // Check that the element structure is correct.
    $this->assertArrayHasKey('_name', $result);
    $this->assertArrayHasKey('title', $result['_name']);
    $this->assertArrayHasKey('given', $result['_name']);
    $this->assertArrayHasKey('family', $result['_name']);
  }

  /**
   * Tests the preRender method with library attachment.
   *
   * @covers ::preRender
   */
  public function testPreRenderWithLibraryAttachment(): void {
    $element = [
      'title' => [
        '#type' => 'select',
        '#title' => 'Title',
      ],
      'given' => [
        '#type' => 'textfield',
        '#title' => 'Given Name',
      ],
      '#widget_layout' => 'inline',
    ];

    $result = Name::preRender($element);

    // Check that library is attached for inline layout.
    $this->assertArrayHasKey('#attached', $result);
    $this->assertArrayHasKey('library', $result['#attached']);
    $this->assertContains('name/widget.inline', $result['#attached']['library']);
  }

  /**
   * Tests the preRender method with all name components.
   *
   * @covers ::preRender
   */
  public function testPreRenderWithAllComponents(): void {
    $element = [
      'title' => [
        '#type' => 'select',
        '#title' => 'Title',
      ],
      'given' => [
        '#type' => 'textfield',
        '#title' => 'Given Name',
      ],
      'middle' => [
        '#type' => 'textfield',
        '#title' => 'Middle Name',
      ],
      'family' => [
        '#type' => 'textfield',
        '#title' => 'Family Name',
      ],
      'generational' => [
        '#type' => 'select',
        '#title' => 'Generational',
      ],
      'credentials' => [
        '#type' => 'textfield',
        '#title' => 'Credentials',
      ],
      '#widget_layout' => 'stacked',
    ];

    $result = Name::preRender($element);

    // Check that all components are moved to _name.
    $this->assertArrayHasKey('title', $result['_name']);
    $this->assertArrayHasKey('given', $result['_name']);
    $this->assertArrayHasKey('middle', $result['_name']);
    $this->assertArrayHasKey('family', $result['_name']);
    $this->assertArrayHasKey('generational', $result['_name']);
    $this->assertArrayHasKey('credentials', $result['_name']);

    // Check that original components are removed.
    $this->assertArrayNotHasKey('title', $result);
    $this->assertArrayNotHasKey('given', $result);
    $this->assertArrayNotHasKey('middle', $result);
    $this->assertArrayNotHasKey('family', $result);
    $this->assertArrayNotHasKey('generational', $result);
    $this->assertArrayNotHasKey('credentials', $result);
  }

  /**
   * Tests the preRender method with empty element.
   *
   * @covers ::preRender
   */
  public function testPreRenderWithEmptyElement(): void {
    $element = [
      '#widget_layout' => 'stacked',
    ];

    $result = Name::preRender($element);

    // Check that the element structure is correct even with no components.
    $this->assertArrayHasKey('_name', $result);
    $this->assertArrayHasKey('#prefix', $result['_name']);
    $this->assertArrayHasKey('#suffix', $result['_name']);

    // Check that the wrapper div is created.
    $this->assertStringContainsString('<div', $result['_name']['#prefix']);
    $this->assertStringContainsString('</div>', $result['_name']['#suffix']);
  }

  /**
   * Tests the preRender method with invalid widget layout.
   *
   * @covers ::preRender
   */
  public function testPreRenderWithInvalidWidgetLayout(): void {
    $element = [
      'title' => [
        '#type' => 'select',
        '#title' => 'Title',
      ],
      'given' => [
        '#type' => 'textfield',
        '#title' => 'Given Name',
      ],
      '#widget_layout' => 'invalid_layout',
    ];

    $result = Name::preRender($element);

    // Should fall back to stacked layout.
    $this->assertArrayHasKey('_name', $result);
    $this->assertArrayHasKey('#prefix', $result['_name']);
    $this->assertArrayHasKey('#suffix', $result['_name']);

    // Check that the wrapper div is created.
    $this->assertStringContainsString('<div', $result['_name']['#prefix']);
    $this->assertStringContainsString('</div>', $result['_name']['#suffix']);
  }

  /**
   * Tests that the element implements TrustedCallbackInterface.
   */
  public function testTrustedCallbackInterface(): void {
    $callbacks = Name::trustedCallbacks();
    $this->assertIsArray($callbacks);
    $this->assertContains('preRender', $callbacks);
  }

  /**
   * Tests that the element extends FormElementBase.
   */
  public function testFormElementBaseInheritance(): void {
    $info = $this->elementInfoManager->getInfo('name');
    $this->assertNotEmpty($info);
    $this->assertTrue($info['#input']);
  }

}

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

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