function AutocompleteTest::testNodeAutocomplete

Test various node example data selectors.

File

tests/src/Kernel/Engine/AutocompleteTest.php, line 85

Class

AutocompleteTest
Tests that data selector autocomplete results work correctly.

Namespace

Drupal\Tests\rules\Kernel\Engine

Code

public function testNodeAutocomplete() {
    $rule = $this->expressionManager
        ->createRule();
    $rule->addAction('rules_data_set');
    $component = RulesComponent::create($rule)->addContextDefinition('node', ContextDefinition::create('entity:node:page'));
    // Tests that "node.uid.en" returns the suggestion "node.uid.entity".
    $results = $component->autocomplete('node.uid.en');
    $this->assertSame([
        [
            'value' => 'node.uid.entity',
            'label' => 'node.uid.entity (User)',
        ],
        [
            'value' => 'node.uid.entity.',
            'label' => 'node.uid.entity... (User)',
        ],
    ], $results);
    // Tests that "node." returns all available fields on a node.
    $results = $component->autocomplete('node.');
    $expected = array_merge([
        [
            'value' => 'node.changed',
            'label' => 'node.changed (Changed)',
        ],
        [
            'value' => 'node.changed.',
            'label' => 'node.changed... (Changed)',
        ],
        [
            'value' => 'node.created',
            'label' => 'node.created (Authored on)',
        ],
        [
            'value' => 'node.created.',
            'label' => 'node.created... (Authored on)',
        ],
        [
            'value' => 'node.default_langcode',
            'label' => 'node.default_langcode (Default translation)',
        ],
        [
            'value' => 'node.default_langcode.',
            'label' => 'node.default_langcode... (Default translation)',
        ],
        [
            'value' => 'node.field_integer',
            'label' => 'node.field_integer (field_integer)',
        ],
        [
            'value' => 'node.field_integer.',
            'label' => 'node.field_integer... (field_integer)',
        ],
        [
            'value' => 'node.langcode',
            'label' => 'node.langcode (Language)',
        ],
        [
            'value' => 'node.langcode.',
            'label' => 'node.langcode... (Language)',
        ],
        [
            'value' => 'node.nid',
            'label' => 'node.nid (ID)',
        ],
        [
            'value' => 'node.nid.',
            'label' => 'node.nid... (ID)',
        ],
        [
            'value' => 'node.promote',
            'label' => 'node.promote (Promoted to front page)',
        ],
        [
            'value' => 'node.promote.',
            'label' => 'node.promote... (Promoted to front page)',
        ],
    ], [
        [
            'value' => 'node.revision_default',
            'label' => 'node.revision_default (Default revision)',
        ],
        [
            'value' => 'node.revision_default.',
            'label' => 'node.revision_default... (Default revision)',
        ],
    ], [
        [
            'value' => 'node.revision_log',
            'label' => 'node.revision_log (Revision log message)',
        ],
        [
            'value' => 'node.revision_log.',
            'label' => 'node.revision_log... (Revision log message)',
        ],
        [
            'value' => 'node.revision_timestamp',
            'label' => 'node.revision_timestamp (Revision create time)',
        ],
        [
            'value' => 'node.revision_timestamp.',
            'label' => 'node.revision_timestamp... (Revision create time)',
        ],
        [
            'value' => 'node.revision_translation_affected',
            'label' => 'node.revision_translation_affected (Revision translation affected)',
        ],
        [
            'value' => 'node.revision_translation_affected.',
            'label' => 'node.revision_translation_affected... (Revision translation affected)',
        ],
        [
            'value' => 'node.revision_uid',
            'label' => 'node.revision_uid (Revision user)',
        ],
        [
            'value' => 'node.revision_uid.',
            'label' => 'node.revision_uid... (Revision user)',
        ],
        [
            'value' => 'node.status',
            'label' => 'node.status (Published)',
        ],
        [
            'value' => 'node.status.',
            'label' => 'node.status... (Published)',
        ],
        [
            'value' => 'node.sticky',
            'label' => 'node.sticky (Sticky at top of lists)',
        ],
        [
            'value' => 'node.sticky.',
            'label' => 'node.sticky... (Sticky at top of lists)',
        ],
        [
            'value' => 'node.title',
            'label' => 'node.title (Title)',
        ],
        [
            'value' => 'node.title.',
            'label' => 'node.title... (Title)',
        ],
        [
            'value' => 'node.type',
            'label' => 'node.type (Content type)',
        ],
        [
            'value' => 'node.type.',
            'label' => 'node.type... (Content type)',
        ],
        [
            'value' => 'node.uid',
            'label' => 'node.uid (Authored by)',
        ],
        [
            'value' => 'node.uid.',
            'label' => 'node.uid... (Authored by)',
        ],
        [
            'value' => 'node.uuid',
            'label' => 'node.uuid (UUID)',
        ],
        [
            'value' => 'node.uuid.',
            'label' => 'node.uuid... (UUID)',
        ],
        [
            'value' => 'node.vid',
            'label' => 'node.vid (Revision ID)',
        ],
        [
            'value' => 'node.vid.',
            'label' => 'node.vid... (Revision ID)',
        ],
    ]);
    // Because this is a huge array, run the assertion per entry as that is
    // easier for debugging.
    foreach ($expected as $index => $entry) {
        $this->assertSame($entry, $results[$index]);
    }
    // Tests that "node.uid.entity.na" returns "node.uid.entity.name".
    $results = $component->autocomplete('node.uid.entity.na');
    $this->assertSame([
        [
            'value' => 'node.uid.entity.name',
            'label' => 'node.uid.entity.name (Name)',
        ],
        [
            'value' => 'node.uid.entity.name.',
            'label' => 'node.uid.entity.name... (Name)',
        ],
    ], $results);
    // A multi-valued field should show numeric indices suggestions.
    $results = $component->autocomplete('node.field_integer.');
    $this->assertSame([
        [
            'value' => 'node.field_integer.0',
            'label' => 'node.field_integer.0',
        ],
        [
            'value' => 'node.field_integer.0.',
            'label' => 'node.field_integer.0...',
        ],
        [
            'value' => 'node.field_integer.1',
            'label' => 'node.field_integer.1',
        ],
        [
            'value' => 'node.field_integer.1.',
            'label' => 'node.field_integer.1...',
        ],
        [
            'value' => 'node.field_integer.2',
            'label' => 'node.field_integer.2',
        ],
        [
            'value' => 'node.field_integer.2.',
            'label' => 'node.field_integer.2...',
        ],
        [
            'value' => 'node.field_integer.value',
            'label' => 'node.field_integer.value (Integer value)',
        ],
    ], $results);
    // A single-valued field should not show numeric indices suggestions.
    $results = $component->autocomplete('node.title.');
    $this->assertSame([
        [
            'value' => 'node.title.value',
            'label' => 'node.title.value (Text value)',
        ],
    ], $results);
    // A single-valued field should not show numeric indices suggestions.
    $results = $component->autocomplete('n');
    $this->assertSame([
        [
            'value' => 'node',
            'label' => 'node',
        ],
        [
            'value' => 'node.',
            'label' => 'node...',
        ],
    ], $results);
}