Loading tests/src/Functional/ActionsFormTest.php +158 −77 Changes for tests/src/Functional/ActionsFormTest.php: 158 added lines, 77 removed lines. Original line number Diff line number Diff line Loading @@ -53,6 +53,9 @@ class ActionsFormTest extends RulesBrowserTestBase { 'administer site configuration', ]); $this->drupalLogin($this->account); // Create a named role for use in conditions and actions. $this->createRole(['administer nodes'], 'test-editor', 'Test Editor'); } /** Loading @@ -64,7 +67,7 @@ class ActionsFormTest extends RulesBrowserTestBase { * * @dataProvider dataActionsFormWidgets */ public function testActionsFormWidgets($id, $values = [], $widgets = [], $selectors = []) { public function testActionsFormWidgets($id, $required = [], $defaulted = [], $widgets = [], $selectors = [], $provides = []) { $expressionManager = $this->container->get('plugin.manager.rules_expression'); $storage = $this->container->get('entity_type.manager')->getStorage('rules_reaction_rule'); Loading @@ -77,7 +80,7 @@ class ActionsFormTest extends RulesBrowserTestBase { $action = $expressionManager->createAction($id); $rule->addExpressionObject($action); // Save the configuration. $expr_id = 'test_action_' . str_replace(':', '_', $id); $expr_id = 'action_' . str_replace(':', '_', $id); $config_entity = $storage->create([ 'id' => $expr_id, 'expression' => $rule->getConfiguration(), Loading @@ -91,7 +94,7 @@ class ActionsFormTest extends RulesBrowserTestBase { $assert->pageTextContains('Edit ' . $action->getLabel()); // If any field values have been specified then fill in the form and save. if (!empty($values)) { if (!empty($required) || !empty($defaulted)) { // Switch to data selector if required by the test settings. if (!empty($selectors)) { Loading @@ -102,10 +105,17 @@ class ActionsFormTest extends RulesBrowserTestBase { } } // Fill each given field with the value provided. foreach ($values as $name => $value) { // Try to save the form before entering the required values. if (!empty($required)) { $this->pressButton('Save'); // Check that the form has not been saved. $assert->pageTextContains('Error message'); $assert->pageTextContains('field is required'); // Fill each required field with the value provided. foreach ($required as $name => $value) { $this->fillField('edit-context-definitions-' . $name . '-setting', $value); } } // Check that the action can be saved. $this->pressButton('Save'); Loading @@ -118,6 +128,16 @@ class ActionsFormTest extends RulesBrowserTestBase { // Check that re-edit and re-save works OK. $this->clickLink('Edit'); if (!empty($defaulted) || !empty($provides)) { // Fill each previously defaulted field with the value provided. foreach ($defaulted as $name => $value) { $this->fillField('edit-context-definitions-' . $name . '-setting', $value); } foreach ($provides as $name => $value) { $this->fillField('edit-provides-' . $name . '-name', $value); } } $this->pressButton('Save'); $assert->pageTextNotContains('Error message'); $assert->addressMatches('#admin/config/workflow/rules/reactions/edit/' . $expr_id . '(\?uuid=' . $action->getUuid() . '|)$#'); Loading @@ -136,219 +156,280 @@ class ActionsFormTest extends RulesBrowserTestBase { * The test data array. The top level keys are free text but should be short * and relate to the test case. The values are ordered arrays of test case * data with elements that must appear in the following order: * - Machine name of the condition being tested. * - (optional) Values to enter on the Context form. This is an associative * - Machine name of the action being tested. * - (optional) Required values to enter on the Context form. This is an * associative array with keys equal to the field names and values equal * to the required field values. * - (optional) Values for fields that have defaults. This is an associative * array with keys equal to the field names and values equal to the field * values. * values. These are used on the second edit, to alter the fields that * have been saved with their default value. * - (optional) Widget types we expect to see on the Context form. This is * an associative array with keys equal to the field names as above, and * values equal to expected widget type. * - (optional) Names of fields for which the selector/direct input button * needs pressing to 'data selection' before the field value is entered. * - (optional) Provides values. This is an associative array with keys * equal to the field names and values equal to values to set. */ public function dataActionsFormWidgets() { // Instead of directly returning the full set of test data, create variable // $data to hold it. This allows for manipulation before the final return. $data = [ 'Data calculate value' => [ // Data. '1. Data calculate value' => [ // Machine name. 'rules_data_calculate_value', // Values. // Required values. [ 'input-1' => '3', 'operator' => '*', 'input-2' => '4', ], // Defaulted values. [], // Widgets. [ 'input-1' => 'text-input', 'operator' => 'text-input', 'input-2' => 'text-input', ], // Selectors. [], // Provides. ['result' => 'new_named_variable'], ], 'Data convert' => [ '2. Data convert' => [ 'rules_data_convert', ['value' => 'node.uid', 'target-type' => 'string'], ['rounding-behavior' => 'up'], ], 'List item add' => [ '3. List item add' => [ 'rules_list_item_add', [ 'list' => 'node.uid.entity.roles', 'item' => '1', ], [ 'unique' => TRUE, 'position' => 'start', ], ], 'List item remove' => [ '4. List item remove' => [ 'rules_list_item_remove', ['list' => 'node.uid.entity.roles', 'item' => '1'], ], 'Data set - direct' => [ '5. Data set - direct' => [ 'rules_data_set', ['data' => 'node.title', 'value' => 'abc'], ['data' => 'node.title'], ['value' => 'abc'], ], 'Data set - selector' => [ // Machine name. '6. Data set - selector' => [ 'rules_data_set', // Values. ['data' => 'node.title', 'value' => '@user.current_user_context:current_user.name.value'], // Widgets. [ 'data' => 'node.title', 'value' => '@user.current_user_context:current_user.name.value', ], [], [], // Selectors. ['value'], ], 'Entity create node' => [ 'rules_entity_create:node', ['type' => 'article', 'title' => 'abc'], ], 'Entity create user' => [ 'rules_entity_create:user', ['name' => 'fred'], '7. Variable add' => [ 'rules_variable_add', ['type' => 'integer', 'value' => 'node.nid'], ], 'Entity delete' => [ // Entity. '8. Entity delete' => [ 'rules_entity_delete', ['entity' => 'node'], ], 'Entity fetch by field - selector' => [ '9. Entity fetch by field - selector' => [ // Machine name. 'rules_entity_fetch_by_field', ['type' => 'node', 'field-name' => 'abc', 'field-value' => 'node.uid'], // Required values. ['type' => 'node', 'field-name' => 'nid', 'field-value' => 'node.uid'], // Defaulted values. ['limit' => 5], // Widgets. [], // Selectors. ['field-value'], // Provides. ['entity-fetched' => 'new_named_variable'], ], 'Entity fetch by field - direct' => [ '10. Entity fetch by field - direct' => [ 'rules_entity_fetch_by_field', ['type' => 'node', 'field-name' => 'sticky', 'field-value' => 1], ], '11. Entity fetch by id' => [ 'rules_entity_fetch_by_id', ['type' => 'node', 'entity-id' => 123], ], 'Entity path alias create' => [ 'rules_entity_path_alias_create:entity:node', ['entity' => 'node', 'alias' => 'abc'], ], 'Entity save' => [ '12. Entity save' => [ 'rules_entity_save', ['entity' => 'node', 'immediate' => TRUE], ['entity' => 'node'], ['immediate' => TRUE], ], 'Node make sticky' => [ // Content. '13. Entity create node' => [ 'rules_entity_create:node', ['type' => 'article', 'title' => 'abc'], ], '14. Node make sticky' => [ 'rules_node_make_sticky', ['node' => 'node'], ], 'Node make unsticky' => [ '15. Node make unsticky' => [ 'rules_node_make_unsticky', ['node' => 'node'], ], 'Node publish' => [ '16. Node publish' => [ 'rules_node_publish', ['node' => 'node'], ], 'Node unpublish' => [ '17.Node unpublish' => [ 'rules_node_unpublish', ['node' => 'node'], ], 'Node promote' => [ '18. Node promote' => [ 'rules_node_promote', ['node' => 'node'], ], 'Node unpromote' => [ '19. Node unpromote' => [ 'rules_node_unpromote', ['node' => 'node'], ], 'Path alias create' => [ // Path. '20. Path alias create' => [ 'rules_path_alias_create', ['source' => '/node/1', 'alias' => 'abc'], ['language' => 'en'], ], 'Path alias delete by alias' => [ '21. Entity path alias create' => [ 'rules_entity_path_alias_create:entity:node', ['entity' => 'node', 'alias' => 'abc'], ], '22. Path alias delete by alias' => [ 'rules_path_alias_delete_by_alias', ['alias' => 'abc'], ], 'Path alias delete by path' => [ '23. Path alias delete by path' => [ 'rules_path_alias_delete_by_path', ['path' => '/node/1'], ], 'Page redirect' => [ // System. '24. Page redirect' => [ 'rules_page_redirect', ['url' => '/node/1'], ], 'Send account email' => [ 'rules_send_account_email', ['user' => 'node.uid', 'email-type' => 'abc'], ], 'Email to all users of role' => [ '25. Email to users of role' => [ 'rules_email_to_users_of_role', ['roles' => 'editor', 'subject' => 'Hello', 'message' => 'Some text'], [ 'roles' => 'test-editor', 'subject' => 'Hello', 'message' => "Some text\nLine two", ], ['reply' => 'test@example.com', 'language' => 'und'], ['message' => 'textarea'], ], 'System message' => [ '26. System message' => [ 'rules_system_message', ['message' => 'Some text'], ['type' => 'warning', 'repeat' => 0], ], 'Send email - direct input' => [ '27. Send email - direct input' => [ 'rules_send_email', [ 'to' => 'test@example.com', 'subject' => 'Some testing subject', 'message' => 'Test with direct input of recipients', ], ['reply' => 'test@example.com', 'language' => 'en'], ['message' => 'textarea'], ], 'Send email - data selector for address' => [ '28. Send email - data selector for address' => [ 'rules_send_email', [ 'to' => 'node.uid.entity.mail.value', 'subject' => 'Some testing subject', 'message' => 'Test with selector input of node author', ], ['reply' => 'test@example.com'], ['message' => 'textarea'], ['to'], ], 'User block' => [ // User. '29. Entity create user' => [ 'rules_entity_create:user', // The name should be required, but can save with blank name. // @todo fix this. Then move 'name' into the required array. [], ['name' => 'fred'], ], '30. Send account email' => [ 'rules_send_account_email', ['user' => 'node.uid', 'email-type' => 'password_reset'], ], '31. User block' => [ 'rules_user_block', ['user' => '@user.current_user_context:current_user'], [], [], ['user'], ], 'User role add' => [ '32. User role add' => [ 'rules_user_role_add', [ 'user' => '@user.current_user_context:current_user', 'roles' => 'Editor', 'roles' => 'test-editor', ], [], [], ['user'], ], 'User role remove' => [ '33. User role remove' => [ 'rules_user_role_remove', [ 'user' => '@user.current_user_context:current_user', 'roles' => 'Editor', 'roles' => 'test-editor', ], ], 'Unblock user' => [ '34. Unblock user' => [ 'rules_user_unblock', ['user' => '@user'], ], 'Variable add' => [ 'rules_variable_add', ['type' => 'integer', 'value' => 'node.nid'], ], 'Ban IP - empty' => [ 'rules_ban_ip', ['ip' => ''], ['user' => '@user.current_user_context:current_user'], [], [], ['user'], ], 'Ban IP - value' => [ // Ban. '35. Ban IP' => [ 'rules_ban_ip', [], ['ip' => '192.0.2.1'], ], 'Unban IP' => [ '36. Unban IP' => [ 'rules_unban_ip', [], ['ip' => '192.0.2.1'], ], ]; // Selecting the 'to' email address using data selector will not work until // single data selector values with multiple = True are converted to arrays. // Error "Expected a list data type ... but got a email data type instead". // @see https://www.drupal.org/project/rules/issues/2723259 // @todo Delete this unset() when the above issue is fixed. unset($data['Send email - data selector for address']); unset($data['28. Send email - data selector for address']); // Use unset $data['The key to remove']; to remove a temporarily unwanted // item, use return [$data['The key to test']]; to selectively test just one // item, or have return $data; to test everything. // item, use return [$data['Key to test'], $data['Another']]; to selectively // test some items, or use return $data; to test everything. return $data; } Loading tests/src/Functional/ConditionsFormTest.php +91 −42 Changes for tests/src/Functional/ConditionsFormTest.php: 91 added lines, 42 removed lines. Original line number Diff line number Diff line Loading @@ -53,6 +53,9 @@ class ConditionsFormTest extends RulesBrowserTestBase { 'administer site configuration', ]); $this->drupalLogin($this->account); // Create a named role for use in conditions and actions. $this->createRole(['administer nodes'], 'test-editor', 'Test Editor'); } /** Loading @@ -64,7 +67,7 @@ class ConditionsFormTest extends RulesBrowserTestBase { * * @dataProvider dataConditionsFormWidgets */ public function testConditionsFormWidgets($id, $values = [], $widgets = [], $selectors = []) { public function testConditionsFormWidgets($id, $required = [], $defaulted = [], $widgets = [], $selectors = []) { $expressionManager = $this->container->get('plugin.manager.rules_expression'); $storage = $this->container->get('entity_type.manager')->getStorage('rules_reaction_rule'); Loading @@ -77,7 +80,7 @@ class ConditionsFormTest extends RulesBrowserTestBase { $condition = $expressionManager->createCondition($id); $rule->addExpressionObject($condition); // Save the configuration. $expr_id = 'test_condition_' . $id; $expr_id = 'condition_' . str_replace(':', '_', $id); $config_entity = $storage->create([ 'id' => $expr_id, 'expression' => $rule->getConfiguration(), Loading @@ -91,7 +94,7 @@ class ConditionsFormTest extends RulesBrowserTestBase { $assert->pageTextContains('Edit ' . $condition->getLabel()); // If any field values have been specified then fill in the form and save. if (!empty($values)) { if (!empty($required) || !empty($defaulted)) { // Switch to data selector where required. if (!empty($selectors)) { Loading @@ -102,10 +105,17 @@ class ConditionsFormTest extends RulesBrowserTestBase { } } // Fill each given field with the value provided. foreach ($values as $name => $value) { // Try to save the form before entering the required values. if (!empty($required)) { $this->pressButton('Save'); // Check that the form has not been saved. $assert->pageTextContains('Error message'); $assert->pageTextContains('field is required'); // Fill each required field with the value provided. foreach ($required as $name => $value) { $this->fillField('edit-context-definitions-' . $name . '-setting', $value); } } // Check that the condition can be saved. $this->pressButton('Save'); Loading @@ -118,6 +128,13 @@ class ConditionsFormTest extends RulesBrowserTestBase { // Check that re-edit and re-save works OK. $this->clickLink('Edit'); if (!empty($defaulted)) { // Fill each previously defaulted field with the value provided. foreach ($defaulted as $name => $value) { $this->fillField('edit-context-definitions-' . $name . '-setting', $value); } } $this->pressButton('Save'); $assert->pageTextNotContains('Error message'); $assert->addressMatches('#admin/config/workflow/rules/reactions/edit/' . $expr_id . '(\?uuid=' . $condition->getUuid() . '|)$#'); Loading @@ -136,9 +153,13 @@ class ConditionsFormTest extends RulesBrowserTestBase { * and relate to the test case. The values are ordered arrays of test case * data with elements that must appear in the following order: * - Machine name of the condition being tested. * - (optional) Values to enter on the Context form. This is an associative * - (optional) Required values to enter on the Context form. This is an * associative array with keys equal to the field names and values equal * to the required field values. * - (optional) Values for fields that have defaults. This is an associative * array with keys equal to the field names and values equal to the field * values. * values. These are used on the second edit, to alter the fields that * have been saved with their default value. * - (optional) Widget types we expect to see on the Context form. This is * an associative array with keys equal to the field names as above, and * values equal to expected widget type. Loading @@ -149,15 +170,18 @@ class ConditionsFormTest extends RulesBrowserTestBase { // Instead of directly returning the full set of test data, create variable // $data to hold it. This allows for manipulation before the final return. $data = [ 'Data comparison' => [ // Data. '1. Data comparison' => [ // Machine name. 'rules_data_comparison', // Values. // Required values. [ 'data' => 'node.title.value', 'operation' => '=this=is-not-validated=yet=', 'value' => 'node_unchanged.title.value', ], // Defaulted values. ['operation' => 'contains'], // Widgets. [ 'data' => 'text-input', Loading @@ -167,94 +191,119 @@ class ConditionsFormTest extends RulesBrowserTestBase { // Selectors. ['value'], ], 'Data is empty' => [ '2. Data is empty' => [ 'rules_data_is_empty', ['data' => 'node.title.value'], ], 'List contains' => [ '3. List contains' => [ 'rules_list_contains', ['list' => 'node.uid.entity.roles', 'item' => 'abc'], [], ['list' => 'textarea'], ], 'List Count' => [ '4. List count is' => [ 'rules_list_count_is', [ 'list' => 'node.uid.entity.roles', 'operator' => 'not * validated * yet', 'value' => 2, ], ['operator' => '<='], ], '5. Text comparison - direct' => [ 'rules_text_comparison', ['text' => 'node.title.value', 'match' => 'abc'], ], '6. Text comparison - selector' => [ 'rules_text_comparison', [ 'text' => 'node.title.value', 'match' => 'node.uid.entity.name.value', ], ['operator' => 'ends'], [], ['match'], ], 'Entity has field' => [ // Entity. '7. Entity has field' => [ 'rules_entity_has_field', ['entity' => 'node', 'field' => 'abc'], ['entity' => 'node', 'field' => 'login'], ], 'Entity is new' => [ '8. Entity is new' => [ 'rules_entity_is_new', ['entity' => 'node'], ], 'Entity is bundle' => [ '9. Entity is of bundle' => [ 'rules_entity_is_of_bundle', ['entity' => 'node', 'type' => 'node', 'bundle' => 'article'], ], 'Entity is type' => [ '10. Entity is of type' => [ 'rules_entity_is_of_type', ['entity' => 'node', 'type' => 'article'], ['entity' => 'node', 'type' => 'path_alias'], ], 'Node is type' => [ // Content. '11. Node is of type' => [ 'rules_node_is_of_type', ['node' => 'node', 'types' => 'article'], ], 'Node is promoted' => [ '12. Node is promoted' => [ 'rules_node_is_promoted', ['node' => 'node'], ], 'Node is published' => [ '13. Node is published' => [ 'rules_node_is_published', ['node' => 'node'], ], 'Node is sticky' => [ '14. Node is sticky' => [ 'rules_node_is_sticky', ['node' => 'node'], ], 'Path alias exists' => [ // Path. '15. Path alias exists' => [ 'rules_path_alias_exists', ['alias' => '/abc'], ['language' => 'und'], ], 'Path has alias' => [ '16. Path has alias' => [ 'rules_path_has_alias', ['path' => '/node/1'], ['language' => 'en'], ], 'Text comparison - direct' => [ 'rules_text_comparison', ['text' => 'node.title.value', 'match' => 'abc'], ], 'Text comparison - selector' => [ 'rules_text_comparison', ['text' => 'node.title.value', 'match' => 'node.uid.entity.name.value'], [], ['match'], ], 'Entity field access' => [ // User. '17. Entity field access' => [ 'rules_entity_field_access', [ 'entity' => 'node', 'field' => 'abc', 'field' => 'timezone', 'user' => '@user.current_user_context:current_user', ], ['operation' => 'edit'], ], 'User has role' => [ '18. User has role' => [ 'rules_user_has_role', [ 'user' => '@user.current_user_context:current_user', 'roles' => 'Developer', 'roles' => 'test-editor', ], ['operation' => 'OR'], [], ['user'], ], 'User is blocked' => [ '19. User is blocked' => [ 'rules_user_is_blocked', ['user' => '@user.current_user_context:current_user'], [], [], ['user'], ], 'Ip is banned' => [ // Ban. '20. Ip is banned' => [ 'rules_ip_is_banned', [], ['ip' => '192.0.2.1'], ], ]; Loading Loading
tests/src/Functional/ActionsFormTest.php +158 −77 Changes for tests/src/Functional/ActionsFormTest.php: 158 added lines, 77 removed lines. Original line number Diff line number Diff line Loading @@ -53,6 +53,9 @@ class ActionsFormTest extends RulesBrowserTestBase { 'administer site configuration', ]); $this->drupalLogin($this->account); // Create a named role for use in conditions and actions. $this->createRole(['administer nodes'], 'test-editor', 'Test Editor'); } /** Loading @@ -64,7 +67,7 @@ class ActionsFormTest extends RulesBrowserTestBase { * * @dataProvider dataActionsFormWidgets */ public function testActionsFormWidgets($id, $values = [], $widgets = [], $selectors = []) { public function testActionsFormWidgets($id, $required = [], $defaulted = [], $widgets = [], $selectors = [], $provides = []) { $expressionManager = $this->container->get('plugin.manager.rules_expression'); $storage = $this->container->get('entity_type.manager')->getStorage('rules_reaction_rule'); Loading @@ -77,7 +80,7 @@ class ActionsFormTest extends RulesBrowserTestBase { $action = $expressionManager->createAction($id); $rule->addExpressionObject($action); // Save the configuration. $expr_id = 'test_action_' . str_replace(':', '_', $id); $expr_id = 'action_' . str_replace(':', '_', $id); $config_entity = $storage->create([ 'id' => $expr_id, 'expression' => $rule->getConfiguration(), Loading @@ -91,7 +94,7 @@ class ActionsFormTest extends RulesBrowserTestBase { $assert->pageTextContains('Edit ' . $action->getLabel()); // If any field values have been specified then fill in the form and save. if (!empty($values)) { if (!empty($required) || !empty($defaulted)) { // Switch to data selector if required by the test settings. if (!empty($selectors)) { Loading @@ -102,10 +105,17 @@ class ActionsFormTest extends RulesBrowserTestBase { } } // Fill each given field with the value provided. foreach ($values as $name => $value) { // Try to save the form before entering the required values. if (!empty($required)) { $this->pressButton('Save'); // Check that the form has not been saved. $assert->pageTextContains('Error message'); $assert->pageTextContains('field is required'); // Fill each required field with the value provided. foreach ($required as $name => $value) { $this->fillField('edit-context-definitions-' . $name . '-setting', $value); } } // Check that the action can be saved. $this->pressButton('Save'); Loading @@ -118,6 +128,16 @@ class ActionsFormTest extends RulesBrowserTestBase { // Check that re-edit and re-save works OK. $this->clickLink('Edit'); if (!empty($defaulted) || !empty($provides)) { // Fill each previously defaulted field with the value provided. foreach ($defaulted as $name => $value) { $this->fillField('edit-context-definitions-' . $name . '-setting', $value); } foreach ($provides as $name => $value) { $this->fillField('edit-provides-' . $name . '-name', $value); } } $this->pressButton('Save'); $assert->pageTextNotContains('Error message'); $assert->addressMatches('#admin/config/workflow/rules/reactions/edit/' . $expr_id . '(\?uuid=' . $action->getUuid() . '|)$#'); Loading @@ -136,219 +156,280 @@ class ActionsFormTest extends RulesBrowserTestBase { * The test data array. The top level keys are free text but should be short * and relate to the test case. The values are ordered arrays of test case * data with elements that must appear in the following order: * - Machine name of the condition being tested. * - (optional) Values to enter on the Context form. This is an associative * - Machine name of the action being tested. * - (optional) Required values to enter on the Context form. This is an * associative array with keys equal to the field names and values equal * to the required field values. * - (optional) Values for fields that have defaults. This is an associative * array with keys equal to the field names and values equal to the field * values. * values. These are used on the second edit, to alter the fields that * have been saved with their default value. * - (optional) Widget types we expect to see on the Context form. This is * an associative array with keys equal to the field names as above, and * values equal to expected widget type. * - (optional) Names of fields for which the selector/direct input button * needs pressing to 'data selection' before the field value is entered. * - (optional) Provides values. This is an associative array with keys * equal to the field names and values equal to values to set. */ public function dataActionsFormWidgets() { // Instead of directly returning the full set of test data, create variable // $data to hold it. This allows for manipulation before the final return. $data = [ 'Data calculate value' => [ // Data. '1. Data calculate value' => [ // Machine name. 'rules_data_calculate_value', // Values. // Required values. [ 'input-1' => '3', 'operator' => '*', 'input-2' => '4', ], // Defaulted values. [], // Widgets. [ 'input-1' => 'text-input', 'operator' => 'text-input', 'input-2' => 'text-input', ], // Selectors. [], // Provides. ['result' => 'new_named_variable'], ], 'Data convert' => [ '2. Data convert' => [ 'rules_data_convert', ['value' => 'node.uid', 'target-type' => 'string'], ['rounding-behavior' => 'up'], ], 'List item add' => [ '3. List item add' => [ 'rules_list_item_add', [ 'list' => 'node.uid.entity.roles', 'item' => '1', ], [ 'unique' => TRUE, 'position' => 'start', ], ], 'List item remove' => [ '4. List item remove' => [ 'rules_list_item_remove', ['list' => 'node.uid.entity.roles', 'item' => '1'], ], 'Data set - direct' => [ '5. Data set - direct' => [ 'rules_data_set', ['data' => 'node.title', 'value' => 'abc'], ['data' => 'node.title'], ['value' => 'abc'], ], 'Data set - selector' => [ // Machine name. '6. Data set - selector' => [ 'rules_data_set', // Values. ['data' => 'node.title', 'value' => '@user.current_user_context:current_user.name.value'], // Widgets. [ 'data' => 'node.title', 'value' => '@user.current_user_context:current_user.name.value', ], [], [], // Selectors. ['value'], ], 'Entity create node' => [ 'rules_entity_create:node', ['type' => 'article', 'title' => 'abc'], ], 'Entity create user' => [ 'rules_entity_create:user', ['name' => 'fred'], '7. Variable add' => [ 'rules_variable_add', ['type' => 'integer', 'value' => 'node.nid'], ], 'Entity delete' => [ // Entity. '8. Entity delete' => [ 'rules_entity_delete', ['entity' => 'node'], ], 'Entity fetch by field - selector' => [ '9. Entity fetch by field - selector' => [ // Machine name. 'rules_entity_fetch_by_field', ['type' => 'node', 'field-name' => 'abc', 'field-value' => 'node.uid'], // Required values. ['type' => 'node', 'field-name' => 'nid', 'field-value' => 'node.uid'], // Defaulted values. ['limit' => 5], // Widgets. [], // Selectors. ['field-value'], // Provides. ['entity-fetched' => 'new_named_variable'], ], 'Entity fetch by field - direct' => [ '10. Entity fetch by field - direct' => [ 'rules_entity_fetch_by_field', ['type' => 'node', 'field-name' => 'sticky', 'field-value' => 1], ], '11. Entity fetch by id' => [ 'rules_entity_fetch_by_id', ['type' => 'node', 'entity-id' => 123], ], 'Entity path alias create' => [ 'rules_entity_path_alias_create:entity:node', ['entity' => 'node', 'alias' => 'abc'], ], 'Entity save' => [ '12. Entity save' => [ 'rules_entity_save', ['entity' => 'node', 'immediate' => TRUE], ['entity' => 'node'], ['immediate' => TRUE], ], 'Node make sticky' => [ // Content. '13. Entity create node' => [ 'rules_entity_create:node', ['type' => 'article', 'title' => 'abc'], ], '14. Node make sticky' => [ 'rules_node_make_sticky', ['node' => 'node'], ], 'Node make unsticky' => [ '15. Node make unsticky' => [ 'rules_node_make_unsticky', ['node' => 'node'], ], 'Node publish' => [ '16. Node publish' => [ 'rules_node_publish', ['node' => 'node'], ], 'Node unpublish' => [ '17.Node unpublish' => [ 'rules_node_unpublish', ['node' => 'node'], ], 'Node promote' => [ '18. Node promote' => [ 'rules_node_promote', ['node' => 'node'], ], 'Node unpromote' => [ '19. Node unpromote' => [ 'rules_node_unpromote', ['node' => 'node'], ], 'Path alias create' => [ // Path. '20. Path alias create' => [ 'rules_path_alias_create', ['source' => '/node/1', 'alias' => 'abc'], ['language' => 'en'], ], 'Path alias delete by alias' => [ '21. Entity path alias create' => [ 'rules_entity_path_alias_create:entity:node', ['entity' => 'node', 'alias' => 'abc'], ], '22. Path alias delete by alias' => [ 'rules_path_alias_delete_by_alias', ['alias' => 'abc'], ], 'Path alias delete by path' => [ '23. Path alias delete by path' => [ 'rules_path_alias_delete_by_path', ['path' => '/node/1'], ], 'Page redirect' => [ // System. '24. Page redirect' => [ 'rules_page_redirect', ['url' => '/node/1'], ], 'Send account email' => [ 'rules_send_account_email', ['user' => 'node.uid', 'email-type' => 'abc'], ], 'Email to all users of role' => [ '25. Email to users of role' => [ 'rules_email_to_users_of_role', ['roles' => 'editor', 'subject' => 'Hello', 'message' => 'Some text'], [ 'roles' => 'test-editor', 'subject' => 'Hello', 'message' => "Some text\nLine two", ], ['reply' => 'test@example.com', 'language' => 'und'], ['message' => 'textarea'], ], 'System message' => [ '26. System message' => [ 'rules_system_message', ['message' => 'Some text'], ['type' => 'warning', 'repeat' => 0], ], 'Send email - direct input' => [ '27. Send email - direct input' => [ 'rules_send_email', [ 'to' => 'test@example.com', 'subject' => 'Some testing subject', 'message' => 'Test with direct input of recipients', ], ['reply' => 'test@example.com', 'language' => 'en'], ['message' => 'textarea'], ], 'Send email - data selector for address' => [ '28. Send email - data selector for address' => [ 'rules_send_email', [ 'to' => 'node.uid.entity.mail.value', 'subject' => 'Some testing subject', 'message' => 'Test with selector input of node author', ], ['reply' => 'test@example.com'], ['message' => 'textarea'], ['to'], ], 'User block' => [ // User. '29. Entity create user' => [ 'rules_entity_create:user', // The name should be required, but can save with blank name. // @todo fix this. Then move 'name' into the required array. [], ['name' => 'fred'], ], '30. Send account email' => [ 'rules_send_account_email', ['user' => 'node.uid', 'email-type' => 'password_reset'], ], '31. User block' => [ 'rules_user_block', ['user' => '@user.current_user_context:current_user'], [], [], ['user'], ], 'User role add' => [ '32. User role add' => [ 'rules_user_role_add', [ 'user' => '@user.current_user_context:current_user', 'roles' => 'Editor', 'roles' => 'test-editor', ], [], [], ['user'], ], 'User role remove' => [ '33. User role remove' => [ 'rules_user_role_remove', [ 'user' => '@user.current_user_context:current_user', 'roles' => 'Editor', 'roles' => 'test-editor', ], ], 'Unblock user' => [ '34. Unblock user' => [ 'rules_user_unblock', ['user' => '@user'], ], 'Variable add' => [ 'rules_variable_add', ['type' => 'integer', 'value' => 'node.nid'], ], 'Ban IP - empty' => [ 'rules_ban_ip', ['ip' => ''], ['user' => '@user.current_user_context:current_user'], [], [], ['user'], ], 'Ban IP - value' => [ // Ban. '35. Ban IP' => [ 'rules_ban_ip', [], ['ip' => '192.0.2.1'], ], 'Unban IP' => [ '36. Unban IP' => [ 'rules_unban_ip', [], ['ip' => '192.0.2.1'], ], ]; // Selecting the 'to' email address using data selector will not work until // single data selector values with multiple = True are converted to arrays. // Error "Expected a list data type ... but got a email data type instead". // @see https://www.drupal.org/project/rules/issues/2723259 // @todo Delete this unset() when the above issue is fixed. unset($data['Send email - data selector for address']); unset($data['28. Send email - data selector for address']); // Use unset $data['The key to remove']; to remove a temporarily unwanted // item, use return [$data['The key to test']]; to selectively test just one // item, or have return $data; to test everything. // item, use return [$data['Key to test'], $data['Another']]; to selectively // test some items, or use return $data; to test everything. return $data; } Loading
tests/src/Functional/ConditionsFormTest.php +91 −42 Changes for tests/src/Functional/ConditionsFormTest.php: 91 added lines, 42 removed lines. Original line number Diff line number Diff line Loading @@ -53,6 +53,9 @@ class ConditionsFormTest extends RulesBrowserTestBase { 'administer site configuration', ]); $this->drupalLogin($this->account); // Create a named role for use in conditions and actions. $this->createRole(['administer nodes'], 'test-editor', 'Test Editor'); } /** Loading @@ -64,7 +67,7 @@ class ConditionsFormTest extends RulesBrowserTestBase { * * @dataProvider dataConditionsFormWidgets */ public function testConditionsFormWidgets($id, $values = [], $widgets = [], $selectors = []) { public function testConditionsFormWidgets($id, $required = [], $defaulted = [], $widgets = [], $selectors = []) { $expressionManager = $this->container->get('plugin.manager.rules_expression'); $storage = $this->container->get('entity_type.manager')->getStorage('rules_reaction_rule'); Loading @@ -77,7 +80,7 @@ class ConditionsFormTest extends RulesBrowserTestBase { $condition = $expressionManager->createCondition($id); $rule->addExpressionObject($condition); // Save the configuration. $expr_id = 'test_condition_' . $id; $expr_id = 'condition_' . str_replace(':', '_', $id); $config_entity = $storage->create([ 'id' => $expr_id, 'expression' => $rule->getConfiguration(), Loading @@ -91,7 +94,7 @@ class ConditionsFormTest extends RulesBrowserTestBase { $assert->pageTextContains('Edit ' . $condition->getLabel()); // If any field values have been specified then fill in the form and save. if (!empty($values)) { if (!empty($required) || !empty($defaulted)) { // Switch to data selector where required. if (!empty($selectors)) { Loading @@ -102,10 +105,17 @@ class ConditionsFormTest extends RulesBrowserTestBase { } } // Fill each given field with the value provided. foreach ($values as $name => $value) { // Try to save the form before entering the required values. if (!empty($required)) { $this->pressButton('Save'); // Check that the form has not been saved. $assert->pageTextContains('Error message'); $assert->pageTextContains('field is required'); // Fill each required field with the value provided. foreach ($required as $name => $value) { $this->fillField('edit-context-definitions-' . $name . '-setting', $value); } } // Check that the condition can be saved. $this->pressButton('Save'); Loading @@ -118,6 +128,13 @@ class ConditionsFormTest extends RulesBrowserTestBase { // Check that re-edit and re-save works OK. $this->clickLink('Edit'); if (!empty($defaulted)) { // Fill each previously defaulted field with the value provided. foreach ($defaulted as $name => $value) { $this->fillField('edit-context-definitions-' . $name . '-setting', $value); } } $this->pressButton('Save'); $assert->pageTextNotContains('Error message'); $assert->addressMatches('#admin/config/workflow/rules/reactions/edit/' . $expr_id . '(\?uuid=' . $condition->getUuid() . '|)$#'); Loading @@ -136,9 +153,13 @@ class ConditionsFormTest extends RulesBrowserTestBase { * and relate to the test case. The values are ordered arrays of test case * data with elements that must appear in the following order: * - Machine name of the condition being tested. * - (optional) Values to enter on the Context form. This is an associative * - (optional) Required values to enter on the Context form. This is an * associative array with keys equal to the field names and values equal * to the required field values. * - (optional) Values for fields that have defaults. This is an associative * array with keys equal to the field names and values equal to the field * values. * values. These are used on the second edit, to alter the fields that * have been saved with their default value. * - (optional) Widget types we expect to see on the Context form. This is * an associative array with keys equal to the field names as above, and * values equal to expected widget type. Loading @@ -149,15 +170,18 @@ class ConditionsFormTest extends RulesBrowserTestBase { // Instead of directly returning the full set of test data, create variable // $data to hold it. This allows for manipulation before the final return. $data = [ 'Data comparison' => [ // Data. '1. Data comparison' => [ // Machine name. 'rules_data_comparison', // Values. // Required values. [ 'data' => 'node.title.value', 'operation' => '=this=is-not-validated=yet=', 'value' => 'node_unchanged.title.value', ], // Defaulted values. ['operation' => 'contains'], // Widgets. [ 'data' => 'text-input', Loading @@ -167,94 +191,119 @@ class ConditionsFormTest extends RulesBrowserTestBase { // Selectors. ['value'], ], 'Data is empty' => [ '2. Data is empty' => [ 'rules_data_is_empty', ['data' => 'node.title.value'], ], 'List contains' => [ '3. List contains' => [ 'rules_list_contains', ['list' => 'node.uid.entity.roles', 'item' => 'abc'], [], ['list' => 'textarea'], ], 'List Count' => [ '4. List count is' => [ 'rules_list_count_is', [ 'list' => 'node.uid.entity.roles', 'operator' => 'not * validated * yet', 'value' => 2, ], ['operator' => '<='], ], '5. Text comparison - direct' => [ 'rules_text_comparison', ['text' => 'node.title.value', 'match' => 'abc'], ], '6. Text comparison - selector' => [ 'rules_text_comparison', [ 'text' => 'node.title.value', 'match' => 'node.uid.entity.name.value', ], ['operator' => 'ends'], [], ['match'], ], 'Entity has field' => [ // Entity. '7. Entity has field' => [ 'rules_entity_has_field', ['entity' => 'node', 'field' => 'abc'], ['entity' => 'node', 'field' => 'login'], ], 'Entity is new' => [ '8. Entity is new' => [ 'rules_entity_is_new', ['entity' => 'node'], ], 'Entity is bundle' => [ '9. Entity is of bundle' => [ 'rules_entity_is_of_bundle', ['entity' => 'node', 'type' => 'node', 'bundle' => 'article'], ], 'Entity is type' => [ '10. Entity is of type' => [ 'rules_entity_is_of_type', ['entity' => 'node', 'type' => 'article'], ['entity' => 'node', 'type' => 'path_alias'], ], 'Node is type' => [ // Content. '11. Node is of type' => [ 'rules_node_is_of_type', ['node' => 'node', 'types' => 'article'], ], 'Node is promoted' => [ '12. Node is promoted' => [ 'rules_node_is_promoted', ['node' => 'node'], ], 'Node is published' => [ '13. Node is published' => [ 'rules_node_is_published', ['node' => 'node'], ], 'Node is sticky' => [ '14. Node is sticky' => [ 'rules_node_is_sticky', ['node' => 'node'], ], 'Path alias exists' => [ // Path. '15. Path alias exists' => [ 'rules_path_alias_exists', ['alias' => '/abc'], ['language' => 'und'], ], 'Path has alias' => [ '16. Path has alias' => [ 'rules_path_has_alias', ['path' => '/node/1'], ['language' => 'en'], ], 'Text comparison - direct' => [ 'rules_text_comparison', ['text' => 'node.title.value', 'match' => 'abc'], ], 'Text comparison - selector' => [ 'rules_text_comparison', ['text' => 'node.title.value', 'match' => 'node.uid.entity.name.value'], [], ['match'], ], 'Entity field access' => [ // User. '17. Entity field access' => [ 'rules_entity_field_access', [ 'entity' => 'node', 'field' => 'abc', 'field' => 'timezone', 'user' => '@user.current_user_context:current_user', ], ['operation' => 'edit'], ], 'User has role' => [ '18. User has role' => [ 'rules_user_has_role', [ 'user' => '@user.current_user_context:current_user', 'roles' => 'Developer', 'roles' => 'test-editor', ], ['operation' => 'OR'], [], ['user'], ], 'User is blocked' => [ '19. User is blocked' => [ 'rules_user_is_blocked', ['user' => '@user.current_user_context:current_user'], [], [], ['user'], ], 'Ip is banned' => [ // Ban. '20. Ip is banned' => [ 'rules_ip_is_banned', [], ['ip' => '192.0.2.1'], ], ]; Loading