ContextIntegrationTest.php

Namespace

Drupal\Tests\rules\Kernel

File

tests/src/Kernel/ContextIntegrationTest.php

View source
<?php

namespace Drupal\Tests\rules\Kernel;

use Drupal\rules\Context\ContextConfig;
use Drupal\rules\Context\ContextDefinition;
use Drupal\rules\Engine\RulesComponent;
use Drupal\rules\Exception\EvaluationException;

/**
 * Tests the extended core context API with Rules.
 *
 * @group Rules
 */
class ContextIntegrationTest extends RulesKernelTestBase {
    
    /**
     * Tests that a required context mapping that is NULL throws an exception.
     */
    public function testRequiredNullMapping() {
        // Configure a simple rule with one action.
        $action = $this->expressionManager
            ->createInstance('rules_action', ContextConfig::create()->setConfigKey('action_id', 'rules_test_string')
            ->map('text', 'null_context')
            ->toArray());
        $rule = $this->expressionManager
            ->createRule()
            ->addExpressionObject($action);
        $component = RulesComponent::create($rule)->addContextDefinition('null_context', ContextDefinition::create('string'))
            ->setContextValue('null_context', NULL);
        try {
            $component->execute();
            $this->fail('No exception thrown when required context value is NULL');
        } catch (EvaluationException $e) {
            $this->assertTrue(TRUE, 'Exception thrown as expected when a required context is NULL');
        }
    }
    
    /**
     * Tests that a required context value that is NULL throws an exception.
     */
    public function testRequiredNullValue() {
        // Configure a simple rule with one action. The required 'text' context is
        // set to be NULL.
        $action = $this->expressionManager
            ->createInstance('rules_action', ContextConfig::create()->setConfigKey('action_id', 'rules_test_string')
            ->setValue('text', NULL)
            ->toArray());
        $rule = $this->expressionManager
            ->createRule();
        $rule->addExpressionObject($action);
        try {
            $rule->execute();
            $this->fail('No exception thrown when required context value is NULL');
        } catch (EvaluationException $e) {
            $this->assertTrue(TRUE, 'Exception thrown as expected when a required context is NULL');
        }
    }
    
    /**
     * Tests that NULL values for contexts are allowed if specified.
     */
    public function testAllowNullValue() {
        // Configure a simple rule with the data set action which allows NULL
        // values.
        $action = $this->expressionManager
            ->createInstance('rules_action', ContextConfig::create()->setConfigKey('action_id', 'rules_data_set')
            ->map('data', 'null_variable')
            ->map('value', 'new_value')
            ->toArray());
        $rule = $this->expressionManager
            ->createRule()
            ->addExpressionObject($action);
        $component = RulesComponent::create($rule)->addContextDefinition('null_variable', ContextDefinition::create('string'))
            ->addContextDefinition('new_value', ContextDefinition::create('string'))
            ->setContextValue('null_variable', NULL)
            ->setContextValue('new_value', 'new value');
        $component->execute();
        $this->assertEquals('new value', $component->getState()
            ->getVariableValue('null_variable'));
    }
    
    /**
     * Tests the assignment restriction on context definitions.
     */
    public function testAssignmentRestriction() {
        $action_manager = $this->container
            ->get('plugin.manager.rules_action');
        // Test the assignment restriction on the entity fetch action as an example.
        $entity_fetch_action = $action_manager->createInstance('rules_entity_fetch_by_id');
        $context_definition = $entity_fetch_action->getContextDefinition('type');
        $this->assertEquals(ContextDefinition::ASSIGNMENT_RESTRICTION_INPUT, $context_definition->getAssignmentRestriction());
        // Test the assignment restriction on the entity delete action.
        $entity_delete_action = $action_manager->createInstance('rules_entity_delete');
        $context_definition = $entity_delete_action->getContextDefinition('entity');
        $this->assertEquals(ContextDefinition::ASSIGNMENT_RESTRICTION_SELECTOR, $context_definition->getAssignmentRestriction());
    }

}

Classes

Title Deprecated Summary
ContextIntegrationTest Tests the extended core context API with Rules.