You are here

public function RulesTestCase::testRuleImportExport in Rules 7.2

Same name and namespace in other branches
  1. 8.3 d7-tests/rules_test_case.test \RulesTestCase::testRuleImportExport()

Tests importing and exporting a rule.

File

tests/rules.test, line 820
Rules tests.

Class

RulesTestCase
Rules test cases.

Code

public function testRuleImportExport() {
  $rule = rule(array(
    'nid' => array(
      'type' => 'integer',
    ),
  ));
  $rule->name = "rules_export_test";
  $rule
    ->action('rules_action_load_node')
    ->action('drupal_message', array(
    'message' => 'Title: [node_loaded:title]',
  ));
  $export = '{ "rules_export_test" : {
    "PLUGIN" : "rule",
    "REQUIRES" : [ "rules_test", "rules" ],
    "USES VARIABLES" : { "nid" : { "type" : "integer" } },
    "DO" : [
      { "rules_action_load_node" : { "PROVIDE" : { "node_loaded" : { "node_loaded" : "Loaded content" } } } },
      { "drupal_message" : { "message" : "Title: [node_loaded:title]" } }
    ]
  }
}';
  $this
    ->assertEqual($export, $rule
    ->export(), 'Rule has been exported correctly.');

  // Test importing a rule which makes use of almost all features.
  $export = _rules_export_get_test_export();
  $rule = rules_import($export);
  $this
    ->assertTrue(!empty($rule) && $rule
    ->integrityCheck(), 'Rule has been imported.');

  // Test loading the same export provided as default rule.
  $rule = rules_config_load('rules_export_test');
  $this
    ->assertTrue(!empty($rule) && $rule
    ->integrityCheck(), 'Export has been provided in code.');

  // Export it and make sure the same export is generated again.
  $this
    ->assertEqual($export, $rule
    ->export(), 'Export of imported rule equals original export.');

  // Now try importing a rule set.
  $export = '{ "rules_test_set" : {
    "LABEL" : "Test set",
    "PLUGIN" : "rule set",
    "REQUIRES" : [ "rules" ],
    "USES VARIABLES" : { "node" : { "label" : "Test node", "type" : "node" } },
    "RULES" : [
      { "RULE" : {
          "IF" : [ { "NOT data_is" : { "data" : [ "node:title" ], "value" : "test" } } ],
          "DO" : [ { "data_set" : { "data" : [ "node:title" ], "value" : "test" } } ],
          "LABEL" : "Test Rule"
        }
      },
      { "RULE" : {
          "DO" : [ { "drupal_message" : { "message" : "hi" } } ],
          "LABEL" : "Test Rule 2"
        }
      }
    ]
  }
}';
  $set = rules_import($export);
  $this
    ->assertTrue(!empty($set) && $set
    ->integrityCheck(), 'Rule set has been imported.');

  // Export it and make sure the same export is generated again.
  $this
    ->assertEqual($export, $set
    ->export(), 'Export of imported rule set equals original export.');

  // Try executing the imported rule set.
  $node = $this
    ->drupalCreateNode();
  $set
    ->execute($node);
  $this
    ->assertEqual($node->title, 'test', 'Imported rule set has been executed.');
  RulesLog::logger()
    ->checkLog();

  // Try import / export for a rule component providing a variable.
  $rule = rule(array(
    'number' => array(
      'type' => 'integer',
      'label' => 'Number',
      'parameter' => FALSE,
    ),
  ), array(
    'number',
  ));
  $rule
    ->action('data_set', array(
    'data:select' => 'number',
    'value' => 3,
  ));
  $rule->name = 'rules_test_provides';
  $export = '{ "rules_test_provides" : {
    "PLUGIN" : "rule",
    "REQUIRES" : [ "rules" ],
    "USES VARIABLES" : { "number" : { "type" : "integer", "label" : "Number", "parameter" : false } },
    "DO" : [ { "data_set" : { "data" : [ "number" ], "value" : 3 } } ],
    "PROVIDES VARIABLES" : [ "number" ]
  }
}';
  $this
    ->assertEqual($export, $rule
    ->export(), 'Rule 2 has been exported correctly.');
  $imported_rule = rules_import($rule
    ->export());
  $this
    ->assertTrue(!empty($imported_rule) && $imported_rule
    ->integrityCheck(), 'Rule 2 has been imported.');
  $this
    ->assertEqual($export, $imported_rule
    ->export(), 'Export of imported rule 2 equals original export.');

  // Test importing a negated condition component.
  $export = '{ "rules_negated_component" : {
    "LABEL" : "negated_component",
    "PLUGIN" : "or",
    "REQUIRES" : [ "rules" ],
    "NOT OR" : [ { "data_is_empty" : { "data" : [ "site:slogan" ] } } ]
  }
}';
  $or = rules_import($export);
  $this
    ->assertTrue($or
    ->integrityCheck() && $or
    ->isNegated(), 'Negated condition component imported.');
}