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\Functional

Code

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);
}