pluginreference-2.0.0/tests/src/Kernel/PluginReferenceSelection/FilteredSelectionTest.php

tests/src/Kernel/PluginReferenceSelection/FilteredSelectionTest.php
<?php

namespace Drupal\Tests\pluginreference\Kernel\PluginReferenceSelection;

use Drupal\KernelTests\KernelTestBase;
use Drupal\pluginreference\Plugin\PluginReferenceSelection\BlockFilteredSelection;
use Drupal\user\RoleInterface;

/**
 * Tests the Plugin reference FilteredSelection plugin.
 *
 * @group pluginreference
 *
 * @coversDefaultClass \Drupal\pluginreference\Plugin\PluginReferenceSelection\FilteredSelection
 */
class FilteredSelectionTest extends KernelTestBase {

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'pluginreference',
    'pluginreference_test',
    'block',
    'entity_test',
    'field',
    'user',
    'system',
  ];

  /**
   * The entity type manager.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * The plugin reference selection manager.
   *
   * @var \Drupal\pluginreference\PluginReferenceSelectionManagerInterface
   */
  protected $pluginReferenceSelectionManager;

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();

    $this->installEntitySchema('entity_test');
    $this->installConfig(['field', 'user']);

    $this->entityTypeManager = $this->container->get('entity_type.manager');
    $this->pluginReferenceSelectionManager = $this->container->get('plugin.manager.plugin_reference_selection');
  }

  /**
   * Tests the ::getReferenceablePlugins method.
   *
   * @dataProvider getReferenceablePluginsDataProvider
   *
   * @covers ::getReferenceablePlugins
   */
  public function testGetReferenceablePlugins(array $expected, array $instance_options, ?string $match, string $match_operator, int $limit): void {
    /** @var \Drupal\pluginreference\PluginReferenceSelectionInterface $plugin_reference_selection */
    $plugin_reference_selection = $this->pluginReferenceSelectionManager->getInstance($instance_options);
    $this->assertEquals($expected, array_keys($plugin_reference_selection->getReferenceablePlugins($match, $match_operator, $limit)));
  }

  /**
   * Data provider for testGetReferenceablePlugins().
   *
   * @see testGetReferenceablePlugins()
   */
  public static function getReferenceablePluginsDataProvider(): array {
    return [
      // Test filtering on plugin ID.
      [
        [
          'plugin_reference_autocomplete',
          'plugin_reference_options_buttons',
        ],
        [
          'target_type' => 'field.widget',
          'handler' => 'filtered',
          'filter' => [
            'key' => 'id',
            'negate' => FALSE,
            'target_values' => [
              'plugin_reference_autocomplete',
              'plugin_reference_options_buttons',
            ],
          ],
          'sort' => [
            'key' => 'label',
            'direction' => 'ASC',
          ],
        ],
        NULL,
        'CONTAINS',
        0,
      ],
      // Test negated filtering on plugin ID.
      [
        [
          'entity_reference_autocomplete',
          'entity_reference_autocomplete_tags',
          'options_buttons',
          'datetime_timestamp',
          'email_default',
          'language_select',
          'number',
          'plugin_reference_select',
          'options_select',
          'shape_only_color_editable_widget',
          'boolean_checkbox',
          'string_textarea',
          'string_textfield',
          'uri',
        ],
        [
          'target_type' => 'field.widget',
          'handler' => 'filtered',
          'filter' => [
            'key' => 'id',
            'negate' => TRUE,
            'target_values' => [
              'plugin_reference_autocomplete',
              'plugin_reference_options_buttons',
            ],
          ],
          'sort' => [
            'key' => 'label',
            'direction' => 'ASC',
          ],
        ],
        NULL,
        'CONTAINS',
        0,
      ],
      // Test filtering on plugin ID and sorting descending on label.
      [
        [
          'plugin_reference_options_buttons',
          'plugin_reference_autocomplete',
        ],
        [
          'target_type' => 'field.widget',
          'handler' => 'filtered',
          'filter' => [
            'key' => 'id',
            'negate' => FALSE,
            'target_values' => [
              'plugin_reference_autocomplete',
              'plugin_reference_options_buttons',
            ],
          ],
          'sort' => [
            'key' => 'label',
            'direction' => 'DESC',
          ],
        ],
        NULL,
        'CONTAINS',
        0,
      ],
      // Test filtering on plugin ID and sorting descending on label, the
      // label starts with filter and limit to 1 result.
      [
        [
          'options_select',
        ],
        [
          'target_type' => 'field.widget',
          'handler' => 'filtered',
          'filter' => [
            'key' => 'id',
            'negate' => FALSE,
            'target_values' => [
              'plugin_reference_autocomplete',
              'plugin_reference_options_buttons',
              'plugin_reference_select',
              'options_select',
            ],
          ],
          'sort' => [
            'key' => 'label',
            'direction' => 'DESC',
          ],
        ],
        'Select',
        'STARTS_WITH',
        1,
      ],
      // Test filtering on provider.
      [
        [
          'plugin_reference_autocomplete',
          'plugin_reference_options_buttons',
          'plugin_reference_select',
        ],
        [
          'target_type' => 'field.widget',
          'handler' => 'filtered',
          'filter' => [
            'key' => 'provider',
            'negate' => FALSE,
            'target_values' => [
              'pluginreference',
            ],
          ],
          'sort' => [
            'key' => 'label',
            'direction' => 'ASC',
          ],
        ],
        NULL,
        'CONTAINS',
        0,
      ],
      // Test negated filtering on provider.
      [
        [
          'entity_reference_autocomplete',
          'entity_reference_autocomplete_tags',
          'options_buttons',
          'datetime_timestamp',
          'email_default',
          'language_select',
          'number',
          'options_select',
          'shape_only_color_editable_widget',
          'boolean_checkbox',
          'string_textarea',
          'string_textfield',
          'uri',
        ],
        [
          'target_type' => 'field.widget',
          'handler' => 'filtered',
          'filter' => [
            'key' => 'provider',
            'negate' => TRUE,
            'target_values' => [
              'pluginreference',
            ],
          ],
          'sort' => [
            'key' => 'label',
            'direction' => 'ASC',
          ],
        ],
        NULL,
        'CONTAINS',
        0,
      ],
      // Test filtering on block category.
      [
        [
          'plugin_reference_test_block',
          'plugin_reference_test_caching_block',
        ],
        [
          'target_type' => 'block',
          'handler' => 'filtered',
          'filter' => [
            'key' => 'category',
            'negate' => FALSE,
            'target_values' => [
              'Plugin Reference Test',
            ],
          ],
          'sort' => [
            'key' => 'label',
            'direction' => 'ASC',
          ],
        ],
        NULL,
        'CONTAINS',
        0,
      ],
    ];
  }

  /**
   * Tests the ::countReferenceablePlugins method.
   *
   * @dataProvider countReferenceablePluginsDataProvider
   *
   * @covers ::countReferenceablePlugins
   */
  public function testCountReferenceablePlugins(int $expected, array $instance_options, ?string $match, string $match_operator): void {
    /** @var \Drupal\pluginreference\PluginReferenceSelectionInterface $plugin_reference_selection */
    $plugin_reference_selection = $this->pluginReferenceSelectionManager->getInstance($instance_options);
    $this->assertEquals($expected, $plugin_reference_selection->countReferenceablePlugins($match, $match_operator));
  }

  /**
   * Data provider for testCountReferenceablePlugins().
   *
   * @see testCountReferenceablePlugins()
   */
  public static function countReferenceablePluginsDataProvider(): array {
    return [
      // Test count on a filtered list on plugin ID.
      [
        2,
        [
          'target_type' => 'field.widget',
          'handler' => 'filtered',
          'filter' => [
            'key' => 'id',
            'negate' => FALSE,
            'target_values' => [
              'plugin_reference_autocomplete',
              'plugin_reference_options_buttons',
            ],
          ],
          'sort' => [
            'key' => 'label',
            'direction' => 'ASC',
          ],
        ],
        NULL,
        'CONTAINS',
      ],
      // Test count on a negated filtered list on plugin ID.
      [
        14,
        [
          'target_type' => 'field.widget',
          'handler' => 'filtered',
          'filter' => [
            'key' => 'id',
            'negate' => TRUE,
            'target_values' => [
              'plugin_reference_autocomplete',
              'plugin_reference_options_buttons',
            ],
          ],
          'sort' => [
            'key' => 'label',
            'direction' => 'ASC',
          ],
        ],
        NULL,
        'CONTAINS',
      ],
      // Test count on a filtered list on plugin ID with a STARTS_WITH filter.
      [
        0,
        [
          'target_type' => 'field.widget',
          'handler' => 'filtered',
          'filter' => [
            'key' => 'id',
            'negate' => FALSE,
            'target_values' => [
              'plugin_reference_autocomplete',
              'plugin_reference_options_buttons',
            ],
          ],
          'sort' => [
            'key' => 'label',
            'direction' => 'ASC',
          ],
        ],
        'Select',
        'STARTS_WITH',
      ],
      // Test count on a filtered list on provider.
      [
        3,
        [
          'target_type' => 'field.widget',
          'handler' => 'filtered',
          'filter' => [
            'key' => 'provider',
            'negate' => FALSE,
            'target_values' => [
              'pluginreference',
            ],
          ],
          'sort' => [
            'key' => 'label',
            'direction' => 'ASC',
          ],
        ],
        NULL,
        'CONTAINS',
      ],
      // Test count on a filtered list on block category.
      [
        2,
        [
          'target_type' => 'block',
          'handler' => 'filtered',
          'filter' => [
            'key' => 'category',
            'negate' => FALSE,
            'target_values' => [
              'Plugin Reference Test',
            ],
          ],
          'sort' => [
            'key' => 'label',
            'direction' => 'ASC',
          ],
        ],
        NULL,
        'CONTAINS',
      ],
    ];
  }

  /**
   * Tests the ::validateReferenceablePlugins method.
   *
   * @dataProvider validateReferenceablePluginsDataProvider
   *
   * @covers ::validateReferenceablePlugins
   */
  public function testValidateReferenceablePlugins(array $expected, array $instance_options, array $plugin_ids): void {
    /** @var \Drupal\pluginreference\PluginReferenceSelectionInterface $plugin_reference_selection */
    $plugin_reference_selection = $this->pluginReferenceSelectionManager->getInstance($instance_options);
    $this->assertEquals($expected, $plugin_reference_selection->validateReferenceablePlugins($plugin_ids));
  }

  /**
   * Data provider for testValidateReferenceablePlugins().
   *
   * @see testValidateReferenceablePlugins()
   */
  public static function validateReferenceablePluginsDataProvider(): array {
    return [
      // Test validation on a filtered list on plugin ID.
      [
        [
          'plugin_reference_autocomplete',
          'plugin_reference_options_buttons',
        ],
        [
          'target_type' => 'field.widget',
          'handler' => 'filtered',
          'filter' => [
            'key' => 'id',
            'negate' => FALSE,
            'target_values' => [
              'plugin_reference_autocomplete',
              'plugin_reference_options_buttons',
            ],
          ],
          'sort' => [
            'key' => 'label',
            'direction' => 'ASC',
          ],
        ],
        [
          'plugin_reference_autocomplete',
          'plugin_reference_options_buttons',
          'nonexistent_widget',
          'options_select',
        ],
      ],
      // Test validation on a negated filtered list on provider.
      [
        [
          'options_select',
        ],
        [
          'target_type' => 'field.widget',
          'handler' => 'filtered',
          'filter' => [
            'key' => 'provider',
            'negate' => TRUE,
            'target_values' => [
              'pluginreference',
            ],
          ],
          'sort' => [
            'key' => 'label',
            'direction' => 'ASC',
          ],
        ],
        [
          'plugin_reference_autocomplete',
          'plugin_reference_options_buttons',
          'nonexistent_widget',
          'options_select',
        ],
      ],
      // Test validation on a filtered list on block category.
      [
        [
          'plugin_reference_test_block',
          'plugin_reference_test_caching_block',
        ],
        [
          'target_type' => 'block',
          'handler' => 'filtered',
          'filter' => [
            'key' => 'category',
            'negate' => FALSE,
            'target_values' => [
              'Plugin Reference Test',
            ],
          ],
          'sort' => [
            'key' => 'label',
            'direction' => 'ASC',
          ],
        ],
        [
          'plugin_reference_test_access_block',
          'plugin_reference_test_block',
          'plugin_reference_test_caching_block',
          'nonexistent_widget',
        ],
      ],
    ];
  }

  /**
   * Test the overridden FilteredSelection for block plugins.
   */
  public function testBlockFilteredSelection(): void {
    /** @var \Drupal\pluginreference\PluginReferenceSelectionInterface $plugin_reference_selection */
    $options = [
      'target_type' => 'block',
      'handler' => 'filtered',
      'filter' => [
        'key' => 'id',
        'negate' => FALSE,
        'target_values' => [
          'plugin_reference_test_access_block',
          'plugin_reference_test_block',
          'plugin_reference_test_caching_block',
        ],
      ],
      'sort' => [
        'key' => 'label',
        'direction' => 'ASC',
      ],
    ];
    $plugin_reference_selection = $this->pluginReferenceSelectionManager->getInstance($options);
    $this->assertInstanceOf(BlockFilteredSelection::class, $plugin_reference_selection);

    $this->assertEmpty($plugin_reference_selection->getReferenceablePlugins('Test access block'));
    $this->assertEquals(0, $plugin_reference_selection->countReferenceablePlugins('Test access block'));
    $this->assertEmpty($plugin_reference_selection->validateReferenceablePlugins(['plugin_reference_test_access_block']));

    $user_role_storage = $this->entityTypeManager->getStorage('user_role');
    $anonymous_role = $user_role_storage->load(RoleInterface::ANONYMOUS_ID);
    $anonymous_role->grantPermission('view plugin reference test access block');
    $anonymous_role->save();

    $this->assertEquals(['plugin_reference_test_access_block'], array_keys($plugin_reference_selection->getReferenceablePlugins('Test access block')));
    $this->assertEquals(1, $plugin_reference_selection->countReferenceablePlugins('Test access block'));
    $this->assertEquals(['plugin_reference_test_access_block'], $plugin_reference_selection->validateReferenceablePlugins(['plugin_reference_test_access_block']));
  }

}

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

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