rules for php 7.4 which is on ubuntu 20. May also need this version of rules for php7.2. Base off of Development version: 7.x-2.x-dev updated 15 Mar 2020 at 21:52 UTC
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

377 lines
12 KiB

4 years ago
<?php
/**
* @file
* Rules UI tests.
*/
/**
* Tests for creating rules through the UI.
*/
class RulesUiTestCase extends DrupalWebTestCase {
/**
* Declares test metadata.
*/
public static function getInfo() {
return array(
'name' => 'Rules UI Tests ',
'description' => 'Tests Rules UI.',
'group' => 'Rules',
);
}
/**
* Overrides DrupalWebTestCase::setUp().
*/
protected function setUp() {
parent::setUp('rules', 'rules_admin', 'rules_test');
RulesLog::logger()->clear();
variable_set('rules_debug_log', TRUE);
}
/**
* Tests that NOT condition labels are not HTML-encoded in the UI.
*
* @see https://www.drupal.org/project/rules/issues/1945006
*/
public function testConditionLabel() {
// Create a simple user account with permission to create a rule.
$user = $this->drupalCreateUser(array('access administration pages', 'administer rules'));
$this->drupalLogin($user);
// First we need an event.
$this->drupalGet('admin/config/workflow/rules/reaction/add');
$edit = array(
'settings[label]' => 'Test node event',
'settings[name]' => 'test_node_event',
'event' => 'node_insert',
);
$this->drupalPost(NULL, $edit, 'Save');
$this->assertText('Editing reaction rule', 'Rule edit page is shown.');
// Now add a condition with a special character in the label.
$this->clickLink('Add condition');
$this->assertText('Add a new condition', 'Condition edit page is shown.');
$edit = array(
'element_name' => 'rules_test_condition_apostrophe',
);
$this->drupalPost(NULL, $edit, 'Continue');
// Negate the condition, as this is how it gets improperly HTML encoded.
$edit = array(
'negate' => TRUE,
);
$this->drupalPost(NULL, $edit, 'Save');
$this->assertNoRaw("&amp;#039;", 'Apostrophe is not HTML-encoded.');
}
/**
* Tests that the title for embedded container plugins displays properly.
*
* @see https://www.drupal.org/project/rules/issues/3028444
*/
public function testContainerPluginLabel() {
// Create a simple user account with permission to create a rule.
$user = $this->drupalCreateUser(array('access administration pages', 'administer rules'));
$this->drupalLogin($user);
// First we need an event.
$this->drupalGet('admin/config/workflow/rules/reaction/add');
$edit = array(
'settings[label]' => 'Test node event',
'settings[name]' => 'test_node_event',
'event' => 'node_insert',
);
$this->drupalPost(NULL, $edit, 'Save');
$this->assertText('Editing reaction rule', 'Rule edit page is shown.');
// Now add an OR condition container.
$this->clickLink('Add or');
$this->assertText('Add a new condition set (OR)', 'Condition set add confirmation is shown.');
$this->drupalPost(NULL, array(), 'Continue');
$this->assertRaw('<div class="rules-element-label">OR</div>', 'Condition set label is shown.');
}
/**
* Tests setting component variables in the UI.
*
* @see https://www.drupal.org/project/rules/issues/3005864
*/
public function testComponentVariables() {
// Create a simple user account with permission to create a rule.
$user = $this->drupalCreateUser(array(
'access administration pages',
'administer rules',
'bypass rules access',
));
$this->drupalLogin($user);
// Variables cannot be set/changed for code-provided components, so we must
// build our test component here.
// Create an 'action set' rule component.
$action_set = rules_action_set(array(
'node' => array('type' => 'node', 'label' => 'Input node'),
));
$action_set->save('rules_test_variables');
// Verify that our test component appears in the UI.
$this->drupalGet('admin/config/workflow/rules/components');
$this->assertText(
'rules_test_variables',
'Test component is defined.'
);
// Visit the component edit page.
$this->clickLink('rules_test_variables');
$this->assertText(
'Variables are normally input parameters for the component',
'Component variables form is present.'
);
// Check for presence of pre-existing variable fields AND for presence
// of exactly one row of fields for new variable input.
$this->assertFieldByName(
'settings[vars][items][node][label]',
'Input node',
'Label of pre-existing variable is defined.'
);
$this->assertFieldByName(
'settings[vars][items][0][label]',
'',
'First row for new variable is present.'
);
// Should only have line [0], not [1] or [2].
$this->assertNoFieldByName(
'settings[vars][items][1][label]',
NULL,
'Second row for new variable is missing.'
);
$this->assertNoFieldByName(
'settings[vars][items][2][label]',
NULL,
'Third row for new variable is missing.'
);
// Save new variable.
$edit = array(
'settings[vars][items][0][type]' => 'integer',
'settings[vars][items][0][label]' => 'Integer value',
'settings[vars][items][0][name]' => 'integer_value',
);
$this->drupalPost(NULL, $edit, 'Save changes');
$this->assertFieldByName(
'settings[vars][items][node][label]',
'Input node',
'Label of pre-existing variable is defined.'
);
$this->assertFieldByName(
'settings[vars][items][integer_value][label]',
'Integer value',
'Label of variable is defined.'
);
$this->assertFieldByName(
'settings[vars][items][integer_value][name]',
'integer_value',
'Machine name of variable is defined.'
);
// Check to see if "Add more" button properly adds one more row for
// variable input while preserving what we've already entered.
$edit = array(
'settings[vars][items][0][type]' => 'decimal',
'settings[vars][items][0][label]' => 'Decimal value',
'settings[vars][items][0][name]' => 'decimal_value',
);
$this->drupalPostAjax(NULL, $edit, array('op' => 'Add more'));
$this->assertFieldByName(
'settings[vars][items][node][label]',
'Input node',
'Label of pre-existing variable is defined.'
);
$this->assertFieldByName(
'settings[vars][items][integer_value][label]',
'Integer value',
'Label of integer variable is defined.'
);
$this->assertFieldByName(
'settings[vars][items][decimal_value][label]',
'Decimal value',
'Label of decimal variable is defined.'
);
$this->assertFieldByName(
'settings[vars][items][0][label]',
NULL,
'First row for new variable is present.'
);
}
/**
* Tests setting component permissions in the UI.
*
* @see https://www.drupal.org/project/rules/issues/2340505
*/
public function testComponentPermissions() {
// Create a simple user account with permission to create a rule.
$user = $this->drupalCreateUser(array(
'access administration pages',
'administer rules',
'bypass rules access',
));
$this->drupalLogin($user);
// The rules_test module defines the component 'rules_test_action_set'.
// Verify that this code-provided component appears in the UI.
$this->drupalGet('admin/config/workflow/rules/components');
$this->assertText(
'rules_test_action_set',
'Test component is defined.'
);
// Visit the component edit page.
$this->clickLink('rules_test_action_set');
$this->assertText(
'Configure access for using this component with a permission.',
'Enable component permission checkbox is present.'
);
$this->assertText(
'Use Rules component rules_test_action_set',
'Permission configuration form is present.'
);
// Try to enable permissions on this component and set a component
// permission at the same time.
$edit = array(
'settings[access][access_exposed]' => TRUE,
'settings[access][permissions][matrix][checkboxes][1][use Rules component rules_test_action_set]' => TRUE,
);
$this->drupalPost(NULL, $edit, 'Save changes');
}
/**
* Tests overriding and reverting configurations.
*
* Verify that when we overwrite a default rule with an import, the status of
* that rule is overridden.
*
* @see https://www.drupal.org/project/rules/issues/2027717#comment-12904190
*/
public function testOverrideStatus() {
// Create a simple user account with permission to create a rule.
$user = $this->drupalCreateUser(array(
'access administration pages',
'administer rules',
'bypass rules access',
));
$this->drupalLogin($user);
// The rules_test module defines the rule 'rules_test_default_1' in code.
// Ensure this rule has status equals ENTITY_IN_CODE.
$rule = rules_config_load('rules_test_default_1');
$this->assertTrue(
$rule->hasStatus(ENTITY_IN_CODE),
'Rule defined in hook_default_rules_configuration() has status ENTITY_IN_CODE.'
);
// Verify the code-provided rule appears in the UI.
$this->drupalGet('admin/config/workflow/rules');
$this->assertText(
'example default rule',
'Example default rule is defined in code.'
);
$this->assertText(
'rules_test_default_1',
'Machine name shows up in UI.'
);
// Now we need to overwrite the 'rules_test_default_1' rule in the
// database by importing a rule with the same id and forcing the overwrite.
// First check that importing fails if the 'overwrite' box is not checked.
$this->drupalGet('admin/config/workflow/rules/reaction/import');
$edit = array(
'import' => $this->getTestRuleExport('rules_test_default_1'),
'overwrite' => FALSE,
);
$this->drupalPost(NULL, $edit, 'Import');
$this->assertText(
'Import of Rules configuration example imported default rule failed, a Rules configuration with the same machine name already exists. Check the overwrite option to replace it.',
'Rule overwrite failed.'
);
// Now set the 'overwrite' checkbox to force the overwrite and resubmit.
$edit = array(
'import' => $this->getTestRuleExport('rules_test_default_1'),
'overwrite' => TRUE,
);
$this->drupalPost(NULL, $edit, 'Import');
// Verify that the overwritten rule now has a status of ENTITY_OVERRIDDEN.
$this->assertText(
'example imported default rule',
'New example default rule has been imported.'
);
$this->assertText(
'rules_test_default_1',
'Machine name shows up in UI.'
);
$this->assertText(
'Overridden',
'Example default rule has overridden status.'
);
// Clear cache and ensure the rule is still overridden.
cache_clear_all();
// Visit reaction rules listing page to force refresh.
$this->clickLink('Rules');
$this->assertText(
'example imported default rule',
'Rule label unchanged after cache clear.'
);
$this->assertText(
'Overridden',
'Rule overridden status unchanged after cache clear.'
);
// A 'revert' link should now be available for the overridden rule.
$this->assertText('revert', 'Revert link is now present.');
// Revert the overridden rule and verify it's back to its original status.
$this->clickLink('revert');
$this->drupalPost(NULL, array(), 'Confirm');
$this->assertText(
'example default rule',
'Example default rule original label restored.'
);
$this->assertText(
'Reverted reaction rule example imported default rule to the defaults',
'Example default rule was reverted.'
);
$this->assertNoText('revert', 'Revert link is not present.');
}
/**
* Helper function to return a known JSON encoded rule export.
*
* @param string $machine_name
* The machine name of the returned rule.
*/
protected function getTestRuleExport($machine_name) {
return '{ "' . $machine_name . '" : {
"LABEL" : "example imported default rule",
"PLUGIN" : "reaction rule",
"ACTIVE" : false,
"OWNER" : "rules",
"TAGS" : [ "Admin", "Tag2" ],
"REQUIRES" : [ "rules" ],
"ON" : { "node_update" : [] },
"IF" : [
{ "NOT data_is" : { "data" : [ "node:status" ], "value" : true } },
{ "data_is" : { "data" : [ "node:type" ], "value" : "page" } }
],
"DO" : [ { "drupal_message" : { "message" : "A node has been updated." } } ]
}
}';
}
}