function ConfigureAndExecuteTest::testTwoRulesSameEvent
Tests creating and altering two rules reacting on the same event.
File
-
tests/
src/ Functional/ ConfigureAndExecuteTest.php, line 300
Class
- ConfigureAndExecuteTest
- Tests that a rule can be configured and triggered when a node is edited.
Namespace
Drupal\Tests\rules\FunctionalCode
public function testTwoRulesSameEvent() {
/** @var \Drupal\Tests\WebAssert $assert */
$assert = $this->assertSession();
// Create a rule that will show a system message when updating a node whose
// title contains "Two Rules Same Event".
$rule1 = $this->expressionManager
->createRule();
// Add the condition to the rule.
$rule1->addCondition('rules_data_comparison', ContextConfig::create()->map('data', 'node.title.value')
->setValue('operation', 'contains')
->setValue('value', 'Two Rules Same Event'));
// Add the action to the rule.
$message1 = 'RULE ONE is triggered';
$rule1->addAction('rules_system_message', ContextConfig::create()->setValue('message', $message1)
->setValue('type', 'status'));
// Add the event and save the rule configuration.
$config_entity = $this->storage
->create([
'id' => 'rule1',
'label' => 'Rule One',
'events' => [
[
'event_name' => 'rules_entity_presave:node',
],
],
'expression' => $rule1->getConfiguration(),
]);
$config_entity->save();
// Add a node and check that rule 1 is triggered.
$this->drupalGet('node/add/article');
$this->submitForm([
'title[0][value]' => 'Two Rules Same Event',
], 'Save');
$node = $this->drupalGetNodeByTitle('Two Rules Same Event');
$assert->pageTextContains($message1);
// Repeat to create a second similar rule.
$rule2 = $this->expressionManager
->createRule();
// Add the condition to the rule.
$rule2->addCondition('rules_data_comparison', ContextConfig::create()->map('data', 'node.title.value')
->setValue('operation', 'contains')
->setValue('value', 'Two Rules Same Event'));
// Add the action to the rule.
$message2 = 'RULE TWO is triggered';
$rule2->addAction('rules_system_message', ContextConfig::create()->setValue('message', $message2)
->setValue('type', 'status'));
// Add the event and save the rule configuration.
$config_entity = $this->storage
->create([
'id' => 'rule2',
'label' => 'Rule Two',
'events' => [
[
'event_name' => 'rules_entity_presave:node',
],
],
'expression' => $rule2->getConfiguration(),
]);
$config_entity->save();
// Edit the node and check that both rules are triggered.
$this->drupalGet('node/' . $node->id() . '/edit/');
$this->submitForm([], 'Save');
$assert->pageTextContains($message1);
$assert->pageTextContains($message2);
// Disable rule 2.
$this->drupalGet('admin/config/workflow/rules');
$this->clickLinkByHref('disable/rule2');
// Edit the node and check that only rule 1 is triggered.
$this->drupalGet('node/' . $node->id() . '/edit/');
$this->submitForm([], 'Save');
$assert->pageTextContains($message1);
$assert->pageTextNotContains($message2);
// Re-enable rule 2.
$this->drupalGet('admin/config/workflow/rules');
$this->clickLinkByHref('enable/rule2');
// Check that both rules are triggered.
$this->drupalGet('node/' . $node->id() . '/edit/');
$this->submitForm([], 'Save');
$assert->pageTextContains($message1);
$assert->pageTextContains($message2);
// Edit rule 1 and change the message text in the action.
$message1updated = 'RULE ONE has a new message.';
$this->drupalGet('admin/config/workflow/rules/reactions/edit/rule1');
$this->clickLink('Edit', 1);
$this->fillField('context_definitions[message][setting]', $message1updated);
// Save the action then save the rule.
$this->pressButton('Save');
$this->pressButton('Save');
// Check that rule 1 now shows the updated text message.
$this->drupalGet('node/' . $node->id() . '/edit/');
$this->submitForm([], 'Save');
$assert->pageTextNotContains($message1);
$assert->pageTextContains($message1updated);
$assert->pageTextContains($message2);
// Delete rule 1.
$this->drupalGet('admin/config/workflow/rules');
$this->clickLinkByHref('delete/rule1');
$this->pressButton('Delete');
// Check that only Rule 2's message is shown.
$this->drupalGet('node/' . $node->id() . '/edit/');
$this->submitForm([], 'Save');
$assert->pageTextNotContains($message1);
$assert->pageTextNotContains($message1updated);
$assert->pageTextContains($message2);
// Disable rule 2.
$this->drupalGet('admin/config/workflow/rules');
$this->clickLinkByHref('disable/rule2');
// Check that neither rule's message is shown.
$this->drupalGet('node/' . $node->id() . '/edit/');
$this->submitForm([], 'Save');
$assert->pageTextNotContains($message1);
$assert->pageTextNotContains($message1updated);
$assert->pageTextNotContains($message2);
}