function CKEditor5PluginManagerTest::providerTestDerivedPluginDefinitions

Same name in other branches
  1. 9 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 1642

Class

CKEditor5PluginManagerTest
Tests different ways of enabling CKEditor 5 plugins.

Namespace

Drupal\Tests\ckeditor5\Kernel

Code

public static 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
,
        InvalidPluginDefinitionException::class,
        '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
,
        \ArgumentCountError::class,
        NULL,
        $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
,
        InvalidPluginDefinitionException::class,
        '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
,
        InvalidPluginDefinitionException::class,
        '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,
        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 with Attribute' => [
        '',
        NULL,
        NULL,
        [
            'src' => [
                'Plugin' => [
                    'CKEditor5Plugin' => [
                        'Foo.php' => <<<'PHP'
<?php
declare(strict_types = 1);
namespace Drupal\ckeditor5_derived_plugin\Plugin\CKEditor5Plugin;
use Drupal\ckeditor5\Attribute\CKEditor5AspectsOfCKEditor5Plugin;
use Drupal\ckeditor5\Attribute\CKEditor5Plugin;
use Drupal\ckeditor5\Attribute\DrupalAspectsOfCKEditor5Plugin;
use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
use Drupal\Core\StringTranslation\TranslatableMarkup;

#[CKEditor5Plugin(
  id: 'ckeditor5_derived_plugin_foo',
  ckeditor5: new CKEditor5AspectsOfCKEditor5Plugin(
    plugins: [],
  ),
  drupal: new 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: simple deriver, base definition in PHP with Annotation' => [
        '',
        NULL,
        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,
        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,
        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.