function CKEditor5PluginManagerTest::providerTestDerivedPluginDefinitions

Same name and namespace in other branches
  1. 11.x core/modules/ckeditor5/tests/src/Kernel/CKEditor5PluginManagerTest.php \Drupal\Tests\ckeditor5\Kernel\CKEditor5PluginManagerTest::providerTestDerivedPluginDefinitions()
  2. 10 core/modules/ckeditor5/tests/src/Kernel/CKEditor5PluginManagerTest.php \Drupal\Tests\ckeditor5\Kernel\CKEditor5PluginManagerTest::providerTestDerivedPluginDefinitions()

Data provider.

Return value

\Generator Test scenarios.

File

core/modules/ckeditor5/tests/src/Kernel/CKEditor5PluginManagerTest.php, line 1570

Class

CKEditor5PluginManagerTest
Tests different ways of enabling CKEditor 5 plugins.

Namespace

Drupal\Tests\ckeditor5\Kernel

Code

public function providerTestDerivedPluginDefinitions() : \Generator {
  // Defaults inherited from CKEditor5AspectsOfCKEditor5Plugin.
  $ckeditor5_aspects_defaults = get_class_vars(CKEditor5AspectsOfCKEditor5Plugin::class);
  // Defaults inherited from DrupalAspectsOfCKEditor5Plugin.
  $drupal_aspects_defaults = get_class_vars(DrupalAspectsOfCKEditor5Plugin::class);
  $simple_deriver_additional_files = [
    'src' => [
      'Plugin' => [
        'CKEditor5Plugin' => [
          'SimpleDeriver.php' => <<<'PHP'
          <?php
          namespace Drupal\ckeditor5_derived_plugin\Plugin\CKEditor5Plugin;
          use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
          use Drupal\Component\Plugin\Derivative\DeriverBase;
          class SimpleDeriver extends DeriverBase {
            public function getDerivativeDefinitions($base_plugin_definition) {
              assert($base_plugin_definition instanceof CKEditor5PluginDefinition);
              foreach (['bar', 'baz'] as $id) {
                $definition = $base_plugin_definition->toArray();
                $definition['id'] = $id;
                $definition['drupal']['label'] = sprintf("Foo %s", $id);
                $this->derivatives[$id] = new CKEditor5PluginDefinition($definition);
              }
              return $this->derivatives;
            }
          }
          PHP,
        ],
      ],
    ],
  ];
  yield 'INVALID: simple deriver but without `drupal.elements` in the base definition and it not getting set by the deriver' => [
    <<<YAML
    ckeditor5_derived_plugin_foo:
      ckeditor5:
        plugins: {}
      drupal:
        deriver: Drupal\\ckeditor5_derived_plugin\\Plugin\\CKEditor5Plugin\\SimpleDeriver
    YAML,
    'The "ckeditor5_derived_plugin_foo:bar" CKEditor 5 derived plugin definition must contain a "drupal.elements" key.',
    $simple_deriver_additional_files,
  ];
  yield 'INVALID: simple deriver but without `ckeditor5.plugins` in the base definition and it not getting set by the deriver' => [
    <<<YAML
    ckeditor5_derived_plugin_foo:
      ckeditor5: {}
      drupal:
        elements: false
        deriver: Drupal\\ckeditor5_derived_plugin\\Plugin\\CKEditor5Plugin\\SimpleDeriver
    YAML,
    'The "ckeditor5_derived_plugin_foo:bar" CKEditor 5 derived plugin definition must contain a "ckeditor5.plugins" key.',
    $simple_deriver_additional_files,
  ];
  yield 'INVALID: simple deriver but without `ckeditor5` in the base definition and it not getting set by the deriver' => [
    <<<YAML
    ckeditor5_derived_plugin_foo:
      drupal:
        elements: false
        deriver: Drupal\\ckeditor5_derived_plugin\\Plugin\\CKEditor5Plugin\\SimpleDeriver
    YAML,
    'The "ckeditor5_derived_plugin_foo:bar" CKEditor 5 derived plugin definition must contain a "ckeditor5" key.',
    $simple_deriver_additional_files,
  ];
  yield 'INVALID: simple deriver which returns arrays instead of CKEditor5PluginDefinition instances' => [
    <<<YAML
    ckeditor5_derived_plugin_foo:
      ckeditor5:
        plugins: {}
      drupal:
        elements: false
        deriver: Drupal\\ckeditor5_derived_plugin\\Plugin\\CKEditor5Plugin\\SimpleDeriver
    YAML,
    'The "ckeditor5_derived_plugin_foo:bar" CKEditor 5 plugin definition must extend Drupal\\ckeditor5\\Plugin\\CKEditor5PluginDefinition',
    [
      'src' => [
        'Plugin' => [
          'CKEditor5Plugin' => [
            'SimpleDeriver.php' => <<<'PHP'
            <?php
            namespace Drupal\ckeditor5_derived_plugin\Plugin\CKEditor5Plugin;
            use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
            use Drupal\Component\Plugin\Derivative\DeriverBase;
            class SimpleDeriver extends DeriverBase {
              public function getDerivativeDefinitions($base_plugin_definition) {
                assert($base_plugin_definition instanceof CKEditor5PluginDefinition);
                foreach (['bar', 'baz'] as $id) {
                  $definition = $base_plugin_definition->toArray();
                  $definition['id'] = $id;
                  $definition['drupal']['label'] = sprintf("Foo %s", $id);
                  $this->derivatives[$id] = $definition;
                }
                return $this->derivatives;
              }
            }
            PHP,
          ],
        ],
      ],
    ],
  ];
  yield 'VALID: simple deriver, base definition in YAML' => [
    <<<YAML
    ckeditor5_derived_plugin_foo:
      ckeditor5:
        plugins: {}
      drupal:
        elements: false
        deriver: Drupal\\ckeditor5_derived_plugin\\Plugin\\CKEditor5Plugin\\SimpleDeriver
    YAML,
    NULL,
    $simple_deriver_additional_files,
    [
      'ckeditor5_derived_plugin_foo:bar' => new CKEditor5PluginDefinition([
        'provider' => 'ckeditor5_derived_plugin',
        'id' => 'ckeditor5_derived_plugin_foo:bar',
        'ckeditor5' => [
          'plugins' => [],
        ] + $ckeditor5_aspects_defaults,
        'drupal' => [
          'label' => 'Foo bar',
          'elements' => FALSE,
          'deriver' => 'Drupal\\ckeditor5_derived_plugin\\Plugin\\CKEditor5Plugin\\SimpleDeriver',
        ] + $drupal_aspects_defaults,
      ]),
      'ckeditor5_derived_plugin_foo:baz' => new CKEditor5PluginDefinition([
        'provider' => 'ckeditor5_derived_plugin',
        'id' => 'ckeditor5_derived_plugin_foo:baz',
        'ckeditor5' => [
          'plugins' => [],
        ] + $ckeditor5_aspects_defaults,
        'drupal' => [
          'label' => 'Foo baz',
          'elements' => FALSE,
          'deriver' => 'Drupal\\ckeditor5_derived_plugin\\Plugin\\CKEditor5Plugin\\SimpleDeriver',
        ] + $drupal_aspects_defaults,
      ]),
    ],
  ];
  yield 'VALID: simple deriver, base definition in PHP' => [
    '',
    NULL,
    [
      'src' => [
        'Plugin' => [
          'CKEditor5Plugin' => [
            'Foo.php' => <<<'PHP'
            <?php
            declare(strict_types = 1);
            namespace Drupal\ckeditor5_derived_plugin\Plugin\CKEditor5Plugin;
            use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
            /**
             * @CKEditor5Plugin(
             *   id = "ckeditor5_derived_plugin_foo",
             *   ckeditor5 = @CKEditor5AspectsOfCKEditor5Plugin(
             *     plugins = {},
             *   ),
             *   drupal = @DrupalAspectsOfCKEditor5Plugin(
             *     elements = false,
             *     deriver = "Drupal\ckeditor5_derived_plugin\Plugin\CKEditor5Plugin\SimpleDeriver",
             *   )
             * )
             */
            class Foo extends CKEditor5PluginDefault {
            }
            PHP,
            'SimpleDeriver.php' => $simple_deriver_additional_files['src']['Plugin']['CKEditor5Plugin']['SimpleDeriver.php'],
          ],
        ],
      ],
    ],
    [
      'ckeditor5_derived_plugin_foo:bar' => new CKEditor5PluginDefinition([
        'provider' => 'ckeditor5_derived_plugin',
        'id' => 'ckeditor5_derived_plugin_foo:bar',
        'ckeditor5' => [
          'plugins' => [],
        ] + $ckeditor5_aspects_defaults,
        'drupal' => [
          'class' => 'Drupal\\ckeditor5_derived_plugin\\Plugin\\CKEditor5Plugin\\Foo',
          'label' => 'Foo bar',
          'elements' => FALSE,
          'deriver' => 'Drupal\\ckeditor5_derived_plugin\\Plugin\\CKEditor5Plugin\\SimpleDeriver',
        ] + $drupal_aspects_defaults,
      ]),
      'ckeditor5_derived_plugin_foo:baz' => new CKEditor5PluginDefinition([
        'provider' => 'ckeditor5_derived_plugin',
        'id' => 'ckeditor5_derived_plugin_foo:baz',
        'ckeditor5' => [
          'plugins' => [],
        ] + $ckeditor5_aspects_defaults,
        'drupal' => [
          'class' => 'Drupal\\ckeditor5_derived_plugin\\Plugin\\CKEditor5Plugin\\Foo',
          'label' => 'Foo baz',
          'elements' => FALSE,
          'deriver' => 'Drupal\\ckeditor5_derived_plugin\\Plugin\\CKEditor5Plugin\\SimpleDeriver',
        ] + $drupal_aspects_defaults,
      ]),
    ],
  ];
  yield 'VALID: minimal base plugin definition, maximal deriver' => [
    <<<YAML
    # Minimal annotation key-value pairs set in the YAML, most set in the deriver.
    ckeditor5_derived_plugin_foo:
      drupal:
        deriver: Drupal\\ckeditor5_derived_plugin\\Plugin\\CKEditor5Plugin\\MaximalDeriver
    YAML,
    NULL,
    [
      'src' => [
        'Plugin' => [
          'CKEditor5Plugin' => [
            'MaximalDeriver.php' => <<<'PHP'
            <?php
            namespace Drupal\ckeditor5_derived_plugin\Plugin\CKEditor5Plugin;
            use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
            use Drupal\Component\Plugin\Derivative\DeriverBase;
            class MaximalDeriver extends DeriverBase {
              public function getDerivativeDefinitions($base_plugin_definition) {
                assert($base_plugin_definition instanceof CKEditor5PluginDefinition);
                foreach (['A', 'B'] as $id) {
                  $definition = $base_plugin_definition->toArray();
                  $definition['id'] = $id;
                  $definition['drupal']['label'] = sprintf("Foo %s", $id);
                  $definition['drupal']['elements'] = FALSE;
                  $definition['ckeditor5']['plugins'] = [];
                  $this->derivatives[$id] = new CKEditor5PluginDefinition($definition);
                }
                return $this->derivatives;
              }
            }
            PHP,
          ],
        ],
      ],
    ],
    [
      'ckeditor5_derived_plugin_foo:A' => new CKEditor5PluginDefinition([
        'provider' => 'ckeditor5_derived_plugin',
        'id' => 'ckeditor5_derived_plugin_foo:A',
        'ckeditor5' => [
          'plugins' => [],
        ],
        'drupal' => [
          'label' => 'Foo A',
          'elements' => FALSE,
          'deriver' => 'Drupal\\ckeditor5_derived_plugin\\Plugin\\CKEditor5Plugin\\MaximalDeriver',
        ] + $drupal_aspects_defaults,
      ]),
      'ckeditor5_derived_plugin_foo:B' => new CKEditor5PluginDefinition([
        'provider' => 'ckeditor5_derived_plugin',
        'id' => 'ckeditor5_derived_plugin_foo:B',
        'ckeditor5' => [
          'plugins' => [],
        ],
        'drupal' => [
          'label' => 'Foo B',
          'elements' => FALSE,
          'deriver' => 'Drupal\\ckeditor5_derived_plugin\\Plugin\\CKEditor5Plugin\\MaximalDeriver',
        ] + $drupal_aspects_defaults,
      ]),
    ],
  ];
  yield 'VALID: container-dependent deriver' => [
    <<<YAML
    ckeditor5_derived_plugin_foo:
      ckeditor5:
        plugins: {}
      drupal:
        elements: false
        deriver: Drupal\\ckeditor5_derived_plugin\\Plugin\\CKEditor5Plugin\\ContainerDependentDeriver
    YAML,
    NULL,
    [
      'config' => [
        'schema' => [
          'ckeditor5_derived_plugin.schema.yml' => <<<YAML
          ckeditor5.plugin.ckeditor5_derived_plugin:
            type: mapping
            label: 'Foo'
            mapping:
              foo:
                type: boolean
                label: 'Foo'
          YAML,
        ],
      ],
      'src' => [
        'Plugin' => [
          'CKEditor5Plugin' => [
            'ContainerDependentDeriver.php' => <<<'PHP'
            <?php
            namespace Drupal\ckeditor5_derived_plugin\Plugin\CKEditor5Plugin;
            use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
            use Drupal\Component\Plugin\Derivative\DeriverBase;
            use Drupal\Core\Authentication\AuthenticationCollectorInterface;
            use Drupal\Core\Entity\EntityTypeRepositoryInterface;
            use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
            use Symfony\Component\DependencyInjection\ContainerInterface;
            class ContainerDependentDeriver extends DeriverBase implements ContainerDeriverInterface {
              protected $authenticationCollector;
              public function __construct(AuthenticationCollectorInterface $authentication_collector) {
                $this->authenticationCollector = $authentication_collector;
              }
              public static function create(ContainerInterface $container, $base_plugin_id) {
                assert($base_plugin_id === 'ckeditor5_derived_plugin_foo');
                return new static($container->get('authentication_collector'));
              }
              public function getDerivativeDefinitions($base_plugin_definition) {
                assert($base_plugin_definition instanceof CKEditor5PluginDefinition);
                $authentication_providers = array_keys($this->authenticationCollector->getSortedProviders());
                foreach ($authentication_providers as $id) {
                  $definition = $base_plugin_definition->toArray();
                  $definition['id'] = $id;
                  $definition['drupal']['label'] = sprintf("Foo %s", $id);
                  $this->derivatives[$definition['id']] = new CKEditor5PluginDefinition($definition);
                }
                return $this->derivatives;
              }
            }
            PHP,
          ],
        ],
      ],
    ],
    [
      'ckeditor5_derived_plugin_foo:cookie' => new CKEditor5PluginDefinition([
        'provider' => 'ckeditor5_derived_plugin',
        'id' => 'ckeditor5_derived_plugin_foo:cookie',
        'ckeditor5' => [
          'plugins' => [],
        ] + $ckeditor5_aspects_defaults,
        'drupal' => [
          'label' => 'Foo cookie',
          'elements' => FALSE,
          'deriver' => 'Drupal\\ckeditor5_derived_plugin\\Plugin\\CKEditor5Plugin\\ContainerDependentDeriver',
        ] + $drupal_aspects_defaults,
      ]),
    ],
  ];
}

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