/** * Tests that context values get data processed with processor mappings. */ public function testDataProcessor() { $this->conditionManager->createInstance('test_condition', ['negate' => FALSE])->willReturn($this->trueCondition->reveal())->shouldBeCalledTimes(1); $condition = new RulesCondition(['condition_id' => 'test_condition'] + ContextConfig::create()->process('test', 'foo', [])->toArray(), '', [], $this->conditionManager->reveal(), $this->processorManager->reveal()); $this->trueCondition->getContextDefinitions()->willReturn(['test' => $this->prophesize(ContextDefinitionInterface::class)->reveal()])->shouldBeCalledTimes(1); $this->trueCondition->getProvidedContextDefinitions()->willReturn([])->shouldBeCalledTimes(1); // Mock some original old value that will be replaced by the data processor. $this->trueCondition->getContextValue('test')->willReturn('old_value')->shouldBeCalled(); // The outcome of the data processor needs to get set on the condition. $this->trueCondition->setContextValue('test', 'new_value')->shouldBeCalledTimes(1); $this->trueCondition->refineContextDefinitions([])->shouldBeCalledTimes(1); $data_processor = $this->prophesize(DataProcessorInterface::class); $data_processor->process('old_value', Argument::any())->willReturn('new_value')->shouldBeCalledTimes(1); $this->processorManager->createInstance('foo', [])->willReturn($data_processor->reveal())->shouldBeCalledTimes(1); // Build some mocked execution state. $state = $this->prophesize(ExecutionStateInterface::class); $prophecy = $state->getVariable('test'); /** @var \Prophecy\Prophecy\MethodProphecy $prophecy */ $prophecy->willReturn('old_value'); $this->assertTrue($condition->executeWithState($state->reveal())); }
/** * Process data context on the plugin, usually before it gets executed. * * @param \Drupal\Core\Plugin\ContextAwarePluginInterface $plugin * The plugin to process the context data on. * @param \Drupal\rules\Engine\RulesStateInterface $rules_state * The current Rules execution state with context variables. */ protected function processData(CoreContextAwarePluginInterface $plugin, RulesStateInterface $rules_state) { if (isset($this->configuration['context_processors'])) { foreach ($this->configuration['context_processors'] as $context_name => $processors) { $value = $plugin->getContextValue($context_name); foreach ($processors as $processor_plugin_id => $configuration) { $data_processor = $this->processorManager->createInstance($processor_plugin_id, $configuration); $value = $data_processor->process($value, $rules_state); } $plugin->setContextValue($context_name, $value); } } }