'Notifications Templates', 'group' => 'Notifications', 'description' => 'Notifications templates and message composition' ); } function setUp() { parent::setUp('messaging', 'messaging_debug', 'token', 'notifications', 'notifications_content'); // Set some defaults // Default send interval will be: immediately variable_set('notifications_default_send_interval', 0); variable_set('notifications_default_send_method', 'debug'); // Set fake site name for comparison after token replacement variable_set('site_name', 'Test Site'); require_once drupal_get_path('module', 'notifications') .'/notifications.cron.inc'; } /** * Play with creating, retrieving, deleting a pair subscriptions */ function testNotificationsTemplates() { // Create a new content-type for test nodes $ctype1 = $this->drupalCreateContentType(); $ctype2 = $this->drupalCreateContentType(); // Author and node for testing, will be admin $author = $this->drupalCreateUser(); $node1 = $this->drupalCreateNode(array( 'title' => 'Title 1', 'body' => 'Body 1', 'type' => $ctype1->type, 'uid' => $author->uid, 'status' => 1, )); $node2 = $this->drupalCreateNode(array( 'title' => 'Title 2', 'body' => 'Body 2', 'type' => $ctype2->type, 'uid' => $author->uid, 'status' => 1, )); // Build some fake objects $event1 = $this->notificationsCreateNodeEvent('insert', $node1); $event2 = $this->notificationsCreateNodeEvent('update', $node2); // Basic api, text parts and info functions variable_set('notifications_digest_methods', array(1 => 'short', 2 => 'long')); $digest = notifications_digest_method(1); $this->assertEqual($digest['type'], 'short', 'Get information about intervals and digest methods.'); $info = notifications_event_types($event1->type, $event1->action); $this->assertEqual($info['digest'], array('node', 'type'), 'Get event information about digest fields'); $info = nofitications_digest_event_info($event1); $this->assertEqual($info, array('type' => 'node', 'field' => 'type', 'value' => $node1->type, 'object' => $node1), 'Get digest information for first event.'); //$this->printObject('digest information', $info); $info = nofitications_digest_event_info($event2); $this->assertEqual($info, array('type' => 'node', 'field' => 'nid', 'value' => $node2->nid, 'object' => $node2), 'Get digest information for second event.'); //$this->printObject('digest information', $info); // Text parts, text replacement, etc... $event1->text['test'] = 'Text part'; $part = notifications_message_part('event', 'test', 'test', $event1); $this->assertEqual($part, 'Text part', 'Retrieved message part from event'); $part = notifications_message_part('type', 'key', 'test'); $this->assertEqual($part, 'type key [type-name] [title] [site-name]', 'Retrieved testing message part: ' . $part); $text = messaging_text_replace('[title] [type-name] [site-name]', array('node' => $node1)); $this->assertEqual($text, "$node1->title $node1->type Test Site", 'Text replacement for node object'); // Now lets get into the scary part, events and event digesting $text = array( 'subject' => 'Subject [title]', 'header' => 'Update for [type-name] [title]', 'main' => 'The body is [node-body-raw]', 'footer' => 'My site is [site-name]', 'digest' => 'Digest line [title]', ); $target = array( 'subject' => "Subject $node1->title", 'body' => array( 'header' => "Update for $ctype1->name $node1->title", 'event' => "The body is $node1->body", 'footer' => 'My site is Test Site', ) ); $event1->text = $event2->text = $text; $message = notifications_process_message(NULL, $event1, array(), 'test'); $this->assertEqual($message, $target, 'Message composition for single event'. $this->compareTexts($message, $target)); // Test digesting, prepare events and build event list $node3 = $this->drupalCreateNode(array( 'title' => 'Title 3', 'body' => 'Body 3', 'type' => $ctype1->type, 'uid' => $author->uid, 'status' => 1, )); // This should be digested by node type with the first one $event3 = $this->notificationsCreateNodeEvent('insert', $node3); // This should be digested by node with the second one, it's the same node update $event4 = $this->notificationsCreateNodeEvent('update', $node2); // Set known event texts $event3->text = $event4->text = $text; $event_list = array(1 => $event1, 2 => $event2, 3 => $event3, 4 => $event4); // This should produce a short digest, build the target to compare $test_line = '[type-name] [title] Test Site'; $body_common = array( 'header' => 'digest header ' . $test_line, 'footer' => 'digest footer ' . $test_line, ); $lines = array(); $lines['node']['story'] = array( 'group' => array( 'title' => "digest title $ctype1->name $node1->title Test Site", 'footer' => "digest footer $ctype1->name $node1->title Test Site" ), 'line' => array( 1 => "Digest line $node1->title", 2 => "Digest line $node3->title", ), ); $lines['node'][2] = array( 'group' => array( 'title' => "digest title $ctype2->name $node2->title Test Site", 'footer' => "digest footer $ctype2->name $node2->title Test Site" ), 'line' => array( 1 => "Digest line $node2->title", 2 => "Digest line $node2->title", ), ); $target = array( 'subject' => 'digest subject ' . $test_line, 'body' => theme('notifications_digest_short_body', $body_common, $lines), ); // Build fake subscriptions array $subscriptions = array_fill(1, count($event_list), array()); $digest = notifications_process_send(NULL, $event_list, $subscriptions, 'test', 1); $message = array('subject' => $digest[0]['subject'], 'body' => $digest[0]['body']); $this->assertEqual($message, $target, 'Message composition for short digest.'. $this->compareTexts($message, $target)); //$this->printObject('Digest target', $target); //$this->printObject('Digest actual', $message); // This should be a long digest, interval 2, build target to compare $event_list = array(1 => $event1, 2 => $event2); $body = array( "The body is $node1->body", "The body is $node2->body", ); $target = array( 'subject' => 'digest subject [type-name] [title] Test Site', 'body' => theme('notifications_digest_long_body', $body_common['header'], $body, $body_common['footer']), ); $subscriptions = array_fill(1, count($event_list), array()); $digest = notifications_process_send(NULL, $event_list, $subscriptions, 'test', 2); $message = array('subject' => $digest[0]['subject'], 'body' => $digest[0]['body']); $this->assertEqual($message, $target, 'Message composition for long digest.'. $this->compareTexts($message, $target)); //$this->printObject('Digest target', $target); //$this->printObject('Digest actual', $message); } // Notifications helper functions function notificationsCreateNodeEvent($action, $node) { static $eid = 0; return (object)array( 'eid' => ++$eid, 'type' => 'node', 'action' => $action, 'node' => $node, 'params' => array('nid' => $node->nid), 'objects' => array('node' => $node), ); } // Helper function to diff two text arrays function compareTexts($text1, $text2) { $diff = ''; foreach ($text1 as $key => $value) { if (!isset($text2[$key])) { $diff .= "($key)"; } elseif (is_array($value)) { $diff .= $this->compareTexts($text1[$key], $text2[$key]); } elseif ($value != $text2[$key]) { $diff .= "($key)$value=" .$text2[$key]; } } return $diff; } // Debug dump object function printObject($title, $object) { $this->assertTrue(TRUE, $title . '= ' . print_r($object, TRUE)); } }