Newer
Older
The Great Git Migration
committed
<?php
// $Id$
/**
* @file
* Test file for privatemsg.module
*
*/
The Great Git Migration
committed
class PrivatemsgTestCase extends DrupalWebTestCase {
/**
* Implementation of getInfo().
*/
Sascha Grossenbacher
committed
public static function getInfo() {
The Great Git Migration
committed
// 'name' should start with what is being tested (menu item) followed by what about it
// is being tested (creation/deletion).
'name' => t('Privatemsg functionality.'),
// 'description' should be one or more complete sentences that provide more details on what
// exactly is being tested.
'description' => t('Test sending, receiving, listing, deleting messages and other features.'),
// 'group' should be a logical grouping of test cases, like a category. In most cases, that
// is the module the test case is for.
'group' => t('Privatemsg'),
);
}
/**
* Implementation of setUp().
*/
function setUp() {
parent::setUp('privatemsg');
}
/**
* Test user access to /messages
* Create user with no 'read privatemsg' permission. Try to access mailbox and see if it gives access denied error
* Create user with 'read privatemsg' permission. Try to access mailbox and see if it gives allows access
*/
function testPrivatemsgReadPrivatemsgPermission() {
$user_no_read_msg = $this->drupalCreateUser(); // set up user with default permissions (meaning: no read privatemsg permission
Sascha Grossenbacher
committed
$author = $this->drupalCreateUser(array('write privatemsg', 'read privatemsg'));
$recipient = $this->drupalCreateUser(array('read privatemsg'));
$no_recipient = $this->drupalCreateUser(array('read privatemsg'));
$subject = $this->randomName(20);
$body = $this->randomName(50);
$response = privatemsg_new_thread(array($recipient), $subject, $body, array('author' => $author));
The Great Git Migration
committed
$this->drupalLogin($user_no_read_msg);
$this->drupalGet('messages');
$this->assertResponse(403, t('HTTP Response 403: Access to mailbox was blocked to user without "<em>read privatemsg</em>" permission'));
Sascha Grossenbacher
committed
$this->drupalLogin($no_recipient);
The Great Git Migration
committed
$this->drupalGet('messages');
$this->assertResponse(200, t('HTTP Response 200: Access to mailbox was authorized to user with "<em>read privatemsg</em>" permission'));
Sascha Grossenbacher
committed
$this->drupalGet('messages/view/' . $response['message']->thread_id);
Sascha Grossenbacher
committed
$this->assertResponse(403, t('HTTP Response 403: Access to thread is blocked for non-recipients.'));
$this->drupalLogin($recipient);
$this->drupalGet('messages/view/' . $response['message']->thread_id);
Sascha Grossenbacher
committed
$this->assertText($subject, t('Access to thread for recipient allowed.'));
$this->drupalGet('messages/view/' . $response['message']->thread_id + 1);
Sascha Grossenbacher
committed
$this->assertResponse(404, t('Non-existing thread lead to HTTP Response 404.'));
The Great Git Migration
committed
}
/**
* Test user access to /messages/new
* Create user with no 'write privatemsg' permission. Try to access Write New Message page and see if it gives access denied error
* Create user with 'write privatemsg' permission. Try to access Write New Message page and see if it gives allows access
*/
function testPrivatemsgWritePrivatemsgPermission() {
$user_no_write_msg = $this->drupalCreateUser(); // set up user with default permissions (meaning: no read privatemsg permission
$this->drupalLogin($user_no_write_msg);
$this->drupalGet('messages/new');
$this->assertResponse(403, t('HTTP Response 403: Access to Write New Message page was blocked to user without "<em>write privatemsg</em>" permission'));
Sascha Grossenbacher
committed
$user_write_msg = $this->drupalCreateUser(array('write privatemsg')); // set up user with write privatemsg permissions
The Great Git Migration
committed
$this->drupalLogin($user_write_msg);
$this->drupalGet('messages/new');
$this->assertResponse(200, t('HTTP Response 200: Access to Write New Message page was authorized to user with "<em>write privatemsg</em>" permission'));
}
Sascha Grossenbacher
committed
function testPaging() {
$author = $this->drupalCreateUser(array('write privatemsg', 'read privatemsg'));
$recipient = $this->drupalCreateUser(array('read privatemsg'));
// Set lower values so that we don't need to generate 100's of messages.
variable_set('privatemsg_view_default_amount', 5);
variable_set('privatemsg_view_max_amount', 10);
$subject_single = $this->randomName(20);
$subject = $this->randomName(20);
$bodies = array();
for ($i = 0; $i < 24; $i++) {
$bodies[$i] = $this->randomName(100);
}
privatemsg_new_thread(array($recipient), $subject_single, $bodies[23], array('author' => $author));
$thread = privatemsg_new_thread(array($recipient), $subject, $bodies[0], array('author' => $author));
for ($i = 1; $i < 23; $i++) {
privatemsg_reply($thread['message']->thread_id, $bodies[$i], array('author' => $author));
Sascha Grossenbacher
committed
}
$this->drupalLogin($recipient);
$this->drupalGet('messages');
$this->clickLink($subject_single);
Sascha Grossenbacher
committed
Sascha Grossenbacher
committed
$this->assertText(t('Displaying messages 1 - 1 of 1'), t('Pager is displayed'));
Sascha Grossenbacher
committed
$this->assertNoText(t('>>'), t('Newer messages link not displayed.'));
$this->assertNoText(t('<<'), t('Older messages link not displayed.'));
Sascha Grossenbacher
committed
$this->drupalGet('messages');
$this->clickLink($subject);
// Verify that only the last 10 messages are displayed.
$this->assertText(t('<< Displaying messages 14 - 23 of 23'), t('Pager is displayed'));
$this->assertNoText($bodies[0], t('First message is not displayed.'));
$this->assertNoText($bodies[12], t('Hidden message is not displayed.'));
$this->assertText($bodies[13], t('Message is displayed.'));
$this->assertText($bodies[22], t('Message is displayed.'));
Sascha Grossenbacher
committed
$this->assertNoText(t('>>'), t('Newer messages link not displayed.'));
Sascha Grossenbacher
committed
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
variable_set('privatemsg_view_use_max_as_default', TRUE);
$this->drupalGet('messages');
$this->clickLink($subject);
// Now with separate default value.
// Verify that only the last 5 messages are displayed.
$this->assertText(t('<< Displaying messages 19 - 23 of 23'), t('Pager is displayed'));
$this->assertNoText($bodies[0], t('First message is not displayed.'));
$this->assertNoText($bodies[17], t('Hidden message is not displayed.'));
$this->assertText($bodies[18], t('Message is displayed.'));
$this->assertText($bodies[22], t('Message is displayed.'));
$this->assertNoText(t('>>'), t('Newer messages link not displayed.'));
// Load older messages and verify again.
$this->clickLink(t('<<'));
$this->assertText(t('<< Displaying messages 9 - 18 of 23 >>'), t('Pager is displayed'));
$this->assertNoText($bodies[0], t('First message is not displayed.'));
$this->assertNoText($bodies[7], t('Hidden message is not displayed.'));
$this->assertText($bodies[8], t('Message is displayed.'));
$this->assertText($bodies[17], t('Message is displayed.'));
$this->assertNoText($bodies[22], t('Hidden message is not displayed.'));
// Load older messages and verify again.
$this->clickLink(t('<<'));
$this->assertText(t('Displaying messages 1 - 8 of 23 >>'), t('Pager is displayed'));
$this->assertText($bodies[0], t('Message is displayed.'));
$this->assertText($bodies[7], t('Message is displayed.'));
$this->assertNoText($bodies[9], t('Hidden message is not displayed.'));
Sascha Grossenbacher
committed
$this->assertNoText(t('<<'), t('Older messages link not displayed.'));
Sascha Grossenbacher
committed
// Going back should follow the same order.
$this->clickLink(t('>>'));
$this->assertText(t('<< Displaying messages 9 - 18 of 23 >>'), t('Pager is displayed'));
$this->assertNoText($bodies[0], t('First message is not displayed.'));
$this->assertNoText($bodies[7], t('Hidden message is not displayed.'));
$this->assertText($bodies[8], t('Message is displayed.'));
$this->assertText($bodies[17], t('Message is displayed.'));
$this->assertNoText($bodies[22], t('Hidden message is not displayed.'));
variable_set('privatemsg_view_max_amount', PRIVATEMSG_UNLIMITED);
$this->drupalGet('messages');
$this->clickLink($subject);
// Now with separate default value.
// Verify that only the last 5 messages are displayed.
$this->assertText(t('<< Displaying messages 19 - 23 of 23'), t('Pager is displayed'));
$this->assertNoText($bodies[0], t('First message is not displayed.'));
$this->assertNoText($bodies[17], t('Hidden message is not displayed.'));
$this->assertText($bodies[18], t('Message is displayed.'));
$this->assertText($bodies[22], t('Message is displayed.'));
Sascha Grossenbacher
committed
$this->assertNoText(t('>>'), t('Newer messages link not displayed.'));
Sascha Grossenbacher
committed
// Load older messages and verify again.
$this->clickLink(t('<<'));
$this->assertText(t('Displaying messages 1 - 23 of 23'), t('Pager is displayed'));
$this->assertText($bodies[0], t('Message is displayed.'));
$this->assertText($bodies[22], t('Message is displayed.'));
Sascha Grossenbacher
committed
$this->assertNoText(t('>>'), t('Newer messages link not displayed.'));
$this->assertNoText(t('<<'), t('Older messages link not displayed.'));
Sascha Grossenbacher
committed
// Check with max_amount = UNLIMITED and different default amount disabled.
variable_set('privatemsg_view_use_max_as_default', FALSE);
$this->drupalGet('messages');
$this->clickLink($subject);
$this->assertText(t('Displaying messages 1 - 23 of 23'), t('Pager is displayed'));
$this->assertText($bodies[0], t('Message is displayed.'));
$this->assertText($bodies[22], t('Message is displayed.'));
$this->assertNoText(t('>>'), t('Newer messages link not displayed.'));
$this->assertNoText(t('<<'), t('Older messages link not displayed.'));
Sascha Grossenbacher
committed
}
The Great Git Migration
committed
/**
* Test sending message from the /messages/new page between two people
*/
Sascha Grossenbacher
committed
function testWriteReplyPrivatemsg() {
// Create a author and two recipients.
$author = $this->drupalCreateUser(array('write privatemsg', filter_permission_name(filter_format_load(3))));
The Great Git Migration
committed
$recipient = $this->drupalCreateUser(array('read privatemsg'));
Sascha Grossenbacher
committed
$recipient2 = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg'));
The Great Git Migration
committed
Sascha Grossenbacher
committed
// Login author and go to new message form.
The Great Git Migration
committed
$this->drupalLogin($author);
$this->drupalGet('messages/new');
Sascha Grossenbacher
committed
// Prepare edit arrays, single recipient with [user].
Sascha Grossenbacher
committed
$edit = array(
Sascha Grossenbacher
committed
'recipient' => $recipient->name . ' [user]',
Sascha Grossenbacher
committed
'subject' => $this->randomName(20),
Sascha Grossenbacher
committed
'body[value]' => $this->randomName(100),
Sascha Grossenbacher
committed
);
// Two recipients.
$edit2 = array(
'recipient' => $recipient->name . ', ' . $recipient2->name,
'subject' => $this->randomName(20),
Sascha Grossenbacher
committed
'body[value]' => $this->randomName(100),
Sascha Grossenbacher
committed
);
// No recipients.
$editnone = array(
'recipient' => '',
'subject' => $this->randomName(20),
Sascha Grossenbacher
committed
'body[value]' => $this->randomName(100),
Sascha Grossenbacher
committed
);
// Invalid recipient
$editinvalid = array(
'recipient' => $this->randomName(5),
'subject' => $this->randomName(20),
Sascha Grossenbacher
committed
'body[value]' => $this->randomName(100),
Sascha Grossenbacher
committed
);
// Empty body.
$editnobody = array(
'recipient' => $recipient->name,
'subject' => $this->randomName(20),
Sascha Grossenbacher
committed
'body[value]' => '',
Sascha Grossenbacher
committed
);
// Empty subject.
$editnosubject = array(
'recipient' => $recipient->name,
'subject' => '',
Sascha Grossenbacher
committed
'body[value]' => $this->randomName(100),
Sascha Grossenbacher
committed
);
// Empty subject and body.
$editempty = array(
'recipient' => $recipient->name,
'subject' => '',
Sascha Grossenbacher
committed
'body[value]' => '',
Sascha Grossenbacher
committed
);
// Invalid and valid recipient
$editmixed = array(
'recipient' => ($invalidmixed = $this->randomName(5)) . ', ' . $recipient->name,
'subject' => $this->randomName(20),
Sascha Grossenbacher
committed
'body[value]' => $this->randomName(100),
Sascha Grossenbacher
committed
);
Sascha Grossenbacher
committed
// message with a bold part, not allowed with default format
$editformatted = array(
'recipient' => $recipient2->name,
'subject' => $this->randomName(20),
Sascha Grossenbacher
committed
'body[value]' => $this->randomName(100) . '<b>formatted message #1</b>',
'body[format]' => 3,
Sascha Grossenbacher
committed
);
Sascha Grossenbacher
committed
// Submit the messages.
$this->drupalPost('messages/new', $edit, t('Send message'));
$this->assertText(t('A message has been sent to @recipients.', array('@recipients' => $recipient->name)), 'Message sent confirmation displayed.');
$this->drupalPost('messages/new', $edit2, t('Send message'));
$this->assertText(t('A message has been sent to @recipients.', array('@recipients' => implode(', ', array($recipient->name, $recipient2->name)))), 'Message sent confirmation displayed.');
$this->drupalPost('messages/new', $editnone, t('Send message'));
$this->assertText(t('Disallowed to send a message without at least one valid recipient'), 'Message was not sent.');
Sascha Grossenbacher
committed
$this->drupalPost('messages/new', $editinvalid, t('Send message'));
$this->assertText(t('Disallowed to send a message without at least one valid recipient'), 'Message was not sent.');
Sascha Grossenbacher
committed
$this->assertText(t('The following users will not receive this private message: @recipients', array('@recipients' => $editinvalid['recipient'])), 'Message about non-existing user displayed.');
$this->drupalPost('messages/new', $editnobody, t('Send message'));
$this->assertText(t('A message has been sent to @recipients.', array('@recipients' => $recipient->name)), 'Message sent confirmation displayed.');
$this->drupalPost('messages/new', $editnosubject, t('Send message'));
$this->assertText(t('A message has been sent to @recipients.', array('@recipients' => $recipient->name)), 'Message sent confirmation displayed.');
$this->drupalPost('messages/new', $editempty, t('Send message'));
Sascha Grossenbacher
committed
$this->assertText(t('Disallowed to send a message without a subject'), 'Empty subject message displayed.');
Sascha Grossenbacher
committed
$this->drupalPost('messages/new', $editmixed, t('Send message'));
$this->assertText(t('A message has been sent to @recipients.', array('@recipients' => $recipient->name)), 'Message sent confirmation displayed.');
$this->assertText(t('The following users will not receive this private message: @recipients', array('@recipients' => $invalidmixed)), 'Message about non-existing user displayed.');
Sascha Grossenbacher
committed
$this->drupalPost('messages/new', $editformatted, t('Send message'));
$this->assertText(t('A message has been sent to @recipients.', array('@recipients' => $recipient2->name)), 'Message sent confirmation displayed.');
Sascha Grossenbacher
committed
// Login as recipient2 and try to write some replies.
$this->drupalLogin($recipient2);
$this->drupalGet('messages');
$this->assertNoText($edit['subject'], 'Sent message subject found.');
$this->assertText($edit2['subject'], 'Sent message subject found.');
$this->clickLink($edit2['subject']);
Sascha Grossenbacher
committed
$this->assertText($edit2['body[value]'], 'Found message body.');
Sascha Grossenbacher
committed
// Prepare replies.
$reply = array(
Sascha Grossenbacher
committed
'body[value]' => $this->randomName(100),
Sascha Grossenbacher
committed
);
// Empty body.
$replyempty = array(
Sascha Grossenbacher
committed
'body[value]' => '',
Sascha Grossenbacher
committed
);
$this->drupalPost(NULL, $reply, t('Send message'));
Sascha Grossenbacher
committed
$this->assertText($reply['body[value]'], 'New message body displayed.');
Sascha Grossenbacher
committed
$this->drupalPost(NULL, $replyempty, t('Send message'));
$this->assertText(t('Disallowed to send reply without a message.'));
Sascha Grossenbacher
committed
// reply with a bold part, not allowed with default format
$replyformatted = array(
Sascha Grossenbacher
committed
'body[value]' => $this->randomName(100) . '<b>formatted message #2</b>',
Sascha Grossenbacher
committed
);
$this->drupalGet('messages');
$this->clickLink($editformatted['subject']);
Sascha Grossenbacher
committed
$this->assertRaw($editformatted['body[value]'], 'Found formatted message body.');
Sascha Grossenbacher
committed
$this->drupalPost(NULL, $replyformatted, t('Send message'));
Sascha Grossenbacher
committed
$this->assertNoRaw($replyformatted['body[value]'], 'Did not find formatted reply body.');
$this->assertText(strip_tags($replyformatted['body[value]']), 'New reply body displayed.');
Sascha Grossenbacher
committed
Sascha Grossenbacher
committed
// Login using recipient and try to read the message by going to inbox first.
$this->drupalLogin($recipient);
$this->drupalGet('messages');
// Assert if we see the subject of the messages.
$this->assertText($edit['subject'], 'Sent message subject found.');
$this->assertText($edit2['subject'], 'Sent message subject found.');
$this->assertText($editnobody['subject'], 'Sent message subject found.');
Sascha Grossenbacher
committed
$this->assertText(trim(truncate_utf8(strip_tags($editnosubject['body[value]']), 50, TRUE, TRUE)), 'Sent message subject found.');
Sascha Grossenbacher
committed
$this->assertText($editmixed['subject'], 'Sent message subject found.');
// Assert that we don't see those that were invalid.
$this->assertNoText($editnone['subject'], 'Invalid message subject not found.');
$this->assertNoText($editinvalid['subject'], 'Invalid message subject not found.');
// Navigate into the message.
$this->clickLink($edit['subject']);
// Confirm that we can read the message that was sent.
Sascha Grossenbacher
committed
$this->assertText($edit['body[value]'], 'Found message body.');
Sascha Grossenbacher
committed
$this->assertNoText(t('Reply to thread:'), 'Reply form is not displayed.');
// Navigate into the message.
$this->drupalGet('messages');
$this->clickLink($edit2['subject']);
// Confirm that we can read the message that was sent.
Sascha Grossenbacher
committed
$this->assertText($edit2['body[value]'], 'Found message body.');
Sascha Grossenbacher
committed
// Confirm that we can read the reply that was sent.
Sascha Grossenbacher
committed
$this->assertText($reply['body[value]'], 'Found reply body.');
The Great Git Migration
committed
}
Sascha Grossenbacher
committed
/**
* Test functionality around disabling private messaging.
*/
function testDisablePrivatemsg() {
Sascha Grossenbacher
committed
$admin_user = $this->drupalCreateUser(array('administer permissions'));
Sascha Grossenbacher
committed
$enableduser = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg')); // set up user with read/write privatemsg permissions
$enableduser2 = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg')); // set up user with read/write privatemsg permissions
Sascha Grossenbacher
committed
$disableduser = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg', 'allow disabling privatemsg')); // set up user with read/write privatemsg permissions
Sascha Grossenbacher
committed
// Create a message between the users that we can use to test
$return = privatemsg_new_thread(array($disableduser), $this->randomName(20), $this->randomName(100), array('author' => $enableduser));
$mid = $return['message']->thread_id;
Sascha Grossenbacher
committed
$this->drupalLogin($disableduser);
Sascha Grossenbacher
committed
// Now disable $disabledUser.
Sascha Grossenbacher
committed
$this->drupalGet('user/'. $disableduser->uid .'/edit');
$edit['pm_enable'] = FALSE;
$this->drupalPost('user/'. $disableduser->uid .'/edit', $edit, t('Save'));
Sascha Grossenbacher
committed
// Verify that disableduser can list messages.
Sascha Grossenbacher
committed
$this->drupalGet('messages');
$this->assertResponse(200, t('HTTP Response 200: Access to reading messages page is allowed.'));
// Verify that $disableduser can read messages but there is not reply form
Sascha Grossenbacher
committed
$this->drupalGet('messages/view/'. $return['message']->thread_id);
Sascha Grossenbacher
committed
$this->assertResponse(200, t('HTTP Response 200: Access to message thread page is allowed.'));
$this->assertNoText(t('Reply to thread'), 'No reply form shown.');
Sascha Grossenbacher
committed
// Verify that $disableduser cannot send a new message.
Sascha Grossenbacher
committed
$this->drupalGet('messages/new');
$this->assertResponse(403, t('HTTP Response 403: Access to Write New Message page was blocked to user with private messaging disabled'));
Sascha Grossenbacher
committed
// Use a newly loaded user object to test the API calls.
$disableduser_loaded = user_load($disableduser->uid, TRUE);
// Check that $disableduser cannot submit a reply
$result = privatemsg_reply($return['message']->thread_id, $this->randomName(100), array('author' => $disableduser_loaded));
Sascha Grossenbacher
committed
Sascha Grossenbacher
committed
$this->assertFalse($result['success'], 'Message reply was not sent.');
Sascha Grossenbacher
committed
// Log in as $enableduser and try to send to $disabled user.
// Make sure that a message to multiple recipients still works if one is
// disabled.
Sascha Grossenbacher
committed
$message = array(
'recipient' => $disableduser->name,
'subject' => $this->randomName(20),
Sascha Grossenbacher
committed
'body[value]' => $this->randomName(100),
Sascha Grossenbacher
committed
);
$this->drupalLogin($enableduser);
$this->drupalPost('messages/new', $message, t('Send message'));
$this->assertText(t('Disallowed to send message because all recipients are blocked'), 'Message was not sent.');
Sascha Grossenbacher
committed
// Make sure that a message to multiple recipients still works if one is
// disabled.
Sascha Grossenbacher
committed
$messagemultiple = array(
'recipient' => $enableduser2->name .', '. $disableduser->name,
'subject' => $this->randomName(20),
Sascha Grossenbacher
committed
'body[value]' => $this->randomName(100),
Sascha Grossenbacher
committed
);
$this->drupalPost('messages/new', $messagemultiple, t('Send message'));
$this->assertText(t('@recipient has disabled private message receiving.', array('@recipient' => $disableduser->name)), 'Message about user with disabled private messaging.');
$this->assertText(t('A message has been sent to @recipients.', array('@recipients' => $enableduser2->name)), 'Message sent confirmation displayed.');
Sascha Grossenbacher
committed
// Remove the permission to disable privatemsg.
$this->drupalLogin($admin_user);
// 6 is the rid of the custom $disableduser role.
$edit = array('7[allow disabling privatemsg]' => FALSE);
$this->drupalPost('admin/people/permissions', $edit, t('Save permissions'));
Sascha Grossenbacher
committed
// Make sure that the option is not visible anymore.
$this->drupalLogin($disableduser);
$this->drupalGet('user/' . $disableduser->uid . '/edit');
$this->assertNoText(t('Enable Private Messaging'), t('Disable privatemsg setting not displayed'));
// Verify that the user is now allowed to write messages again.
$this->drupalGet('messages/new');
$this->assertNoText(t('You are not authorized to access this page.'), t('Access denied page is not displayed.'));
$this->assertText(t('Write new message'), t('Write message form is displayed.'));
Sascha Grossenbacher
committed
}
Sascha Grossenbacher
committed
/**
* Test correct handling of read all permissions.
*/
function testReadAllPermission() {
$author = $this->drupalCreateUser(array('write privatemsg', 'read privatemsg'));
$recipient = $this->drupalCreateUser(array('write privatemsg', 'read privatemsg'));
$admin = $this->drupalCreateUser(array('write privatemsg', 'read privatemsg', 'read all private messages'));
// Create new message.
$edit = array(
'recipient' => $recipient->name,
'subject' => $this->randomName(20),
Sascha Grossenbacher
committed
'body[value]' => $this->randomName(100),
Sascha Grossenbacher
committed
);
$this->drupalLogin($author);
$this->drupalPost('messages/new', $edit, t('Send message'));
$this->assertText(t('A message has been sent to @recipients.', array('@recipients' => $recipient->name)), t('Message sent confirmation displayed'));
$this->drupalLogin($admin);
$this->drupalGet('messages/view/1');
Sascha Grossenbacher
committed
$this->assertText(t('This conversation is being viewed with escalated privileges and may not be the same as shown to normal users.'), t('Notice about read all mode displayed.'));
Sascha Grossenbacher
committed
// Send a first response.
$admin_edit = array(
Sascha Grossenbacher
committed
'body[value]' => $this->randomName(100),
Sascha Grossenbacher
committed
);
$this->drupalPost('messages/view/1', $admin_edit, t('Send message'));
// Make sure that the notice is not displayed anymore.
// @tod: Commented out because this does not work as expected.
Sascha Grossenbacher
committed
$this->assertNoText(t('This conversation is being viewed with escalated privileges and may not be the same as shown to normal users.'), t('Notice about read all mode not displayed.'));
Sascha Grossenbacher
committed
// Make sure that both the existing message body and the new one are displayed.
Sascha Grossenbacher
committed
$this->assertText($edit['body[value]'], t('First message body displayed.'));
$this->assertText($admin_edit['body[value]'], t('New message body displayed.'));
Sascha Grossenbacher
committed
Sascha Grossenbacher
committed
$admin_recipient_count = db_query("SELECT COUNT(*) FROM {pm_index} WHERE recipient = :recipient AND thread_id = :thread_id", array(
':recipient' => $admin->uid,
Sascha Grossenbacher
committed
':thread_id' => 1,
))->fetchField();
$this->assertEqual($admin_recipient_count, 2, t('Admin is listed as recipient for every message once.'));
// Send a second response.
$admin_edit2 = array(
Sascha Grossenbacher
committed
'body[value]' => $this->randomName(100),
Sascha Grossenbacher
committed
);
$this->drupalPost('messages/view/1', $admin_edit2, t('Send message'));
// Make sure that both the existing message body and the new one are displayed.
Sascha Grossenbacher
committed
$this->assertText($edit['body[value]'], t('First message body displayed.'));
$this->assertText($admin_edit['body[value]'], t('Second response body displayed.'));
$this->assertText($admin_edit2['body[value]'], t('Third message body displayed.'));
Sascha Grossenbacher
committed
Sascha Grossenbacher
committed
$admin_recipient_count = db_query("SELECT COUNT(*) FROM {pm_index} WHERE recipient = :recipient AND thread_id = :thread_id", array(
':recipient' => $admin->uid,
Sascha Grossenbacher
committed
':thread_id' => 1,
))->fetchField();
$this->assertEqual($admin_recipient_count, 3, t('Admin is listed as recipient for every message once.'));
}
Sascha Grossenbacher
committed
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
/**
* Tests for the flush feature
*/
function testPrivatemsgFlush()
{
$author = $this->drupalCreateUser(array('write privatemsg', 'read privatemsg'));
$recipient = $this->drupalCreateUser(array('write privatemsg', 'read privatemsg'));
// Send 10 messages.
for ($i = 0; $i < 10; $i++) {
privatemsg_new_thread(array($recipient), 'Message #'. $i, 'This is the body', array('author' => $author));
}
// Delete message 1, 3, 4, 6, 9 for author.
foreach (array(1, 3, 4, 6, 9) as $pmid) {
privatemsg_message_change_delete($pmid, TRUE, $author);
}
// Delete message 1, 2, 4, 6, 8 for recipient.
foreach (array(1, 3, 4, 6, 9) as $pmid) {
privatemsg_message_change_delete($pmid, TRUE, $recipient);
}
// Now, mid 1, 4 and 6 have been deleted by both.
// Flush configuration, enable, delay is default, 30 days
variable_set('privatemsg_flush_enabled', TRUE);
// Set back the deleted timestamp 35 days back of mid 4.
db_update('pm_index')
->fields(array('deleted' => time() - 35 * 86400))
->condition('mid', 4)
->execute();
// Set back the deleted timestamp of mid 6, but only 20 days back.
db_update('pm_index')
->fields(array('deleted' => time() - 20 * 86400))
->condition('mid', 6)
->execute();
// Run flush.
privatemsg_cron();
// Check if the undeleted messages are still there.
foreach (array(2, 3, 5, 7, 8, 9, 10) as $pmid) {
$message = privatemsg_message_load($pmid, $author);
Sascha Grossenbacher
committed
$this->assertTrue(!empty($message), t('Undeleted message #%id is still in the system', array('%id' => $pmid)));
}
// Check if the "recently" deleted messages are still there.
foreach (array(1, 6) as $pmid) {
$message = privatemsg_message_load($pmid, $author);
Sascha Grossenbacher
committed
$this->assertTrue(!empty($message), t('Deleted message #%id is still in the system', array('%id' => $pmid)));
}
// Mid 4 should have been flushed.
$message = privatemsg_message_load(4, $author);
Sascha Grossenbacher
committed
$this->assertTrue(empty($message), t('Message #4 has been flushed'));
}
The Great Git Migration
committed
Sascha Grossenbacher
committed
function testDelete() {
// Create users.
$author = $this->drupalCreateUser(array('write privatemsg', 'read privatemsg', 'delete privatemsg'));
$recipient = $this->drupalCreateUser(array('write privatemsg', 'read privatemsg', 'delete privatemsg'));
Sascha Grossenbacher
committed
$recipient2 = $this->drupalCreateUser(array('write privatemsg', 'read privatemsg', 'cancel account'));
Sascha Grossenbacher
committed
$admin = $this->drupalCreateUser(array('write privatemsg', 'read privatemsg', 'delete privatemsg', 'read all private messages'));
Sascha Grossenbacher
committed
$dummy = $this->drupalCreateUser(array('cancel account'));
Sascha Grossenbacher
committed
// Create texts.
$subject = $this->randomName(20);
$body1 = $this->randomName(100);
$body2 = $this->randomName(100);
// Create message and response.
$return = privatemsg_new_thread(array($recipient, $recipient2), $subject, $body1, array('author' => $author));
privatemsg_reply($return['message']->thread_id, $body2, array('author' => $recipient));
Sascha Grossenbacher
committed
// Check with user without delete permission.
$this->drupalLogin($recipient2);
$this->drupalGet('messages/view/' . $return['message']->thread_id);
Sascha Grossenbacher
committed
$this->assertText($subject, 'Subject is displayed');
$this->assertText($body1, 'First message is displayed');
$this->assertText($body2, 'Second message is displayed');
$this->assertNoText(t('Delete message'), 'Delete message is link is not displayed for user without permission');
// Check if access for that user is denied.
$this->drupalGet('messages/delete/' . $return['message']->thread_id . '/' . $return['message']->mid);
Sascha Grossenbacher
committed
$this->assertText(t('Access denied'));
// Check with user with delete access.
$this->drupalLogin($recipient);
$this->drupalGet('messages/view/' . $return['message']->thread_id);
Sascha Grossenbacher
committed
$this->assertText(t('Delete message'), 'Delete message is link is displayed for user without permission');
// Click delete link of the second message and cancel.
$this->clickLink(t('Delete message'), 1);
$this->assertText(t('Are you sure you want to delete this message?'), 'Confirmation message displayed');
$this->clickLink(t('Cancel'));
$this->assertText($body2, 'Second message is still displayed');
// Confirm message deletion.
$this->clickLink(t('Delete message'), 1);
$this->assertText(t('Are you sure you want to delete this message?'), 'Confirmation message displayed');
$this->drupalPost(NULL, array(), t('Delete'));
$this->assertText(t('Message has been deleted.'), 'Message has been deleted');
Sascha Grossenbacher
committed
$this->assertText($body1, 'First message is still displayed');
$this->assertNoText($body2, 'Second message was deleted');
Sascha Grossenbacher
committed
Sascha Grossenbacher
committed
// Click delete link of the first message and cancel.
$this->clickLink(t('Delete message'));
$this->assertText(t('Are you sure you want to delete this message?'), 'Confirmation message displayed');
$this->clickLink(t('Cancel'));
$this->assertText($body1, 'First message is still displayed');
Sascha Grossenbacher
committed
// Confirm message deletion.
$this->clickLink(t('Delete message'));
$this->assertText(t('Are you sure you want to delete this message?'), 'Confirmation message displayed');
$this->drupalPost(NULL, array(), t('Delete'));
$this->assertText(t('Message has been deleted.'), 'Message deleted has been deleted');
$this->assertNoText($subject, 'All messages of that thread have been deleted');
// Test if the message has not been deleted for other users.
$this->drupalLogin($recipient2);
$this->drupalGet('messages/view/' . $return['message']->thread_id);
Sascha Grossenbacher
committed
$this->assertText($body1, 'First message is still displayed');
$this->assertText($body2,'First message is still displayed');
// Test delete all checkbox.
$this->drupalLogin($admin);
$this->drupalGet('messages/view/' . $return['message']->thread_id);
Sascha Grossenbacher
committed
$this->clickLink(t('Delete message'), 1);
$this->drupalPost(NULL, array('delete_options' => TRUE), t('Delete'));
$this->assertText(t('Message has been deleted for all users.'), 'Message deleted has been deleted');
// Test if the message has been deleted for all users.
$this->drupalLogin($recipient2);
$this->drupalGet('messages/view/' . $return['message']->thread_id);
Sascha Grossenbacher
committed
$this->assertText($body1, 'First message is still displayed');
$this->assertNoText($body2, 'Second message has been deleted for all users');
Sascha Grossenbacher
committed
// Check that messages of canceled users (user_cancel_delete) are deleted too.
Sascha Grossenbacher
committed
$edit = array('body[value]' => $this->randomName(100));
Sascha Grossenbacher
committed
$this->drupalPost(NULL, $edit, t('Send message'));
$this->drupalGet('messages/view/' . $return['message']->thread_id);
Sascha Grossenbacher
committed
$this->assertText($edit['body[value]'], t('New reply is displayed'));
Sascha Grossenbacher
committed
// Reload user object, don't use the cache.
$recipient2 = user_load($recipient2->uid, TRUE);
// Attempt to cancel account.
variable_set('user_cancel_method', 'user_cancel_delete');
$this->drupalGet('user/' . $recipient2->uid . '/edit');
$this->drupalPost(NULL, NULL, t('Cancel account'));
// Confirm account cancellation.
$timestamp = time();
$this->drupalPost(NULL, NULL, t('Cancel account'));
// Confirm account cancellation request.
$this->drupalGet("user/$recipient2->uid/cancel/confirm/$timestamp/" . user_pass_rehash($recipient2->pass, $timestamp, $recipient2->login));
// Simpletest thinks that we are still logged in.
$this->loggedInUser = NULL;
$this->drupalLogin($admin);
$this->drupalGet('messages/view/' . $return['message']->thread_id);
Sascha Grossenbacher
committed
$this->assertText($body1, 'First message is still displayed');
Sascha Grossenbacher
committed
$this->assertNoText($edit['body[value]'], t('Reply of deleted user is not displayed anymore'));
Sascha Grossenbacher
committed
Sascha Grossenbacher
committed
// Test if admin is allowed to delete messages of other users.
$this->drupalGet('user/' . $author->uid . '/messages');
$this->checkThreadDelete($return['message']);
// Check if user is allowed to delete messages.
$this->drupalLogin($author);
$this->drupalGet('messages');
$this->checkThreadDelete($return['message']);
Sascha Grossenbacher
committed
// Check that deleting users that didn't send any message does not cause
// errors.
$this->drupalLogin($dummy);
// Reload user object, don't use the cache.
$dummy = user_load($dummy->uid, TRUE);
// Attempt to cancel account.
$this->drupalGet('user/' . $dummy->uid . '/edit');
$this->drupalPost(NULL, NULL, t('Cancel account'));
// Confirm account cancellation.
$timestamp = time();
$this->drupalPost(NULL, NULL, t('Cancel account'));
// Confirm account cancellation request.
$this->drupalGet("user/$dummy->uid/cancel/confirm/$timestamp/" . user_pass_rehash($dummy->pass, $timestamp, $dummy->login));
Sascha Grossenbacher
committed
}
Sascha Grossenbacher
committed
function checkThreadDelete($message) {
$this->assertText($message->subject, t('Message is displayed.'));
Sascha Grossenbacher
committed
$delete = array(
'list[' . $message->thread_id . ']' => 1,
Sascha Grossenbacher
committed
);
$this->drupalPost(NULL, $delete, t('Delete'));
$this->assertText(t('Deleted @count thread.', array('@count' => 1)), t('Delete message displayed.'));
$this->assertNoText($message->subject, t('Message is not displayed anymore.'));
Sascha Grossenbacher
committed
$this->assertText(t('No messages available.'), t('No messages available anymore.'));
// Revert delete action.
$this->clickLink(t('undone'));
$this->assertText(t('Restored @count thread.', array('@count' => 1)), t('Restore message displayed'));
$this->assertText($message->subject, t('Message is displayed again.'));
Sascha Grossenbacher
committed
$this->assertNoText(t('No messages available.'), t('Messages are available.'));
}
The Great Git Migration
committed
/**
* Test preview functionality.
*/
function testPreview() {
$user = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg'));
$message = array(
'recipient' => $user->name,
'subject' => $this->randomName(),
'body[value]' => $this->randomName(50),
);
$this->drupalLogin($user);
$this->drupalPost('messages/new', $message, t('Preview message'));
$this->assertTitle(t('Write new message to @user', array('@user' => $user->name)) . ' | Drupal', t('Correct title is displayed.'));
$this->assertFieldByXPath($this->buildXPathQuery('//div[@class=:class]/p', array(':class' => 'privatemsg-message-body')), $message['body[value]'], t('Message body is previewed'));
}
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
/**
* Test autocomplete.
*/
function testAutocomplete() {
$current = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg'));
$user1 = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg'));
$user2 = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg'));
$user3 = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg'));
$this->drupalLogin($current);
// Use specific names to be able to test for specific name combinations.
user_save($current, array('name' => 'wathever'));
user_save($user1, array('name' => 'aaaa'));
user_save($user2, array('name' => 'aaab'));
user_save($user3, array('name' => 'bbbb'));
$json = $this->drupalGet('messages/user-name-autocomplete/aa');
$autocomplete = (array)json_decode($json);
$this->assertEqual(count($autocomplete), 2, t('Autocomplete object contains two suggestions.'));
$this->assertEqual($autocomplete['aaaa, '], 'aaaa');
$this->assertEqual($autocomplete['aaab, '], 'aaab');
$json = $this->drupalGet('messages/user-name-autocomplete/bb');
$autocomplete = (array)json_decode($json);
$this->assertEqual(count($autocomplete), 1, t('Autocomplete object contains one suggestion.'));
$this->assertEqual($autocomplete['bbbb, '], 'bbbb');
$json = $this->drupalGet('messages/user-name-autocomplete/cc');
$autocomplete = (array)json_decode($json);
$this->assertEqual(count($autocomplete), 0, t('Autocomplete object contains no suggestions.'));
$json = $this->drupalGet('messages/user-name-autocomplete/aaaa, a');
$autocomplete = (array)json_decode($json);
$this->assertEqual(count($autocomplete), 1, t('Autocomplete object contains one suggestion.'));
$this->assertEqual($autocomplete['aaaa, aaab, '], 'aaab');
}
/**
* Implements tearDown().
The Great Git Migration
committed
*/
function tearDown() {
//we dont really need to do this. i'm adding it just to keep it in front of my eyes so i can memorize it.
parent::tearDown();
}
}
/**
* Tests for fields integration.
*/
class PrivatemsgFieldsTestCase extends DrupalWebTestCase {
/**
* Implementation of getInfo().
*/
public static function getInfo() {
return array
(
'name' => t('Privatemsg fields.'),
'description' => t('Tests integration with fields.'),
'group' => t('Privatemsg'),
);
}
The Great Git Migration
committed
/**
* Implementation of setUp().
*/
function setUp() {
parent::setUp('privatemsg');
}
The Great Git Migration
committed
function testSingleField() {
$admin = $this->drupalCreateUser(array('administer privatemsg settings', 'write privatemsg', 'read privatemsg'));
$user = $this->drupalCreateUser(array('write privatemsg', 'read privatemsg'));
The Great Git Migration
committed
$this->drupalLogin($admin);
The Great Git Migration
committed
// Create a new field.
$edit = array(
'_add_new_field[label]' => $label = $this->randomName(),
'_add_new_field[field_name]' => $name = strtolower($this->randomName()),
'_add_new_field[type]' => 'text',
'_add_new_field[widget_type]' => 'text_textfield',
);
$this->drupalPost('admin/config/messaging/privatemsg/fields', $edit, t('Save'));
$this->drupalPost(NULL, array(), t('Save field settings'));
$this->drupalPost(NULL, array(), t('Save settings'));
The Great Git Migration
committed
Sascha Grossenbacher
committed
// Preview message.
$message = array(
'recipient' => $user->name,
'subject' => $this->randomName(),
'body[value]' => $this->randomName(50),
'field_' . $name . '[und][0][value]' => $this->randomName(50),
);
Sascha Grossenbacher
committed
$this->drupalPost('messages/new', $message, t('Preview message'));
// Send message.
$this->drupalPost(NULL, array(), t('Send message'));
The Great Git Migration
committed
// Check message.
$this->drupalLogin($user);
$this->drupalGet('messages');
$this->clickLink($message['subject']);
The Great Git Migration
committed
$this->assertText($message['body[value]'], t('Message body displayed.'));
$this->assertText($message['field_' . $name . '[und][0][value]'], t('Content of new field is displayed.'));
The Great Git Migration
committed
// Respond.
$response = array(
'body[value]' => $this->randomName(50),
'field_' . $name . '[und][0][value]' => $this->randomName(50),
);
$this->drupalPost(NULL, $response, t('Send message'));
The Great Git Migration
committed
// Check response.
$this->drupalLogin($admin);
$this->drupalGet('messages');
$this->clickLink($message['subject']);
The Great Git Migration
committed
$this->assertText($response['body[value]'], t('Message body displayed.'));
$this->assertText($response['field_' . $name . '[und][0][value]'], t('Content of new field is displayed.'));
}
Sascha Grossenbacher
committed
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
/**
* Verify that a message with an empty image can be sent.
*/
function testEmptyImage() {
$admin = $this->drupalCreateUser(array('administer privatemsg settings', 'write privatemsg', 'read privatemsg'));
$user = $this->drupalCreateUser(array('write privatemsg', 'read privatemsg'));
$this->drupalLogin($admin);
// Create a new field.
$edit = array(
'_add_new_field[label]' => $label = $this->randomName(),
'_add_new_field[field_name]' => $name = strtolower($this->randomName()),
'_add_new_field[type]' => 'image',
'_add_new_field[widget_type]' => 'image_image',
);
$this->drupalPost('admin/config/messaging/privatemsg/fields', $edit, t('Save'));
$this->drupalPost(NULL, array(), t('Save field settings'));
$this->drupalPost(NULL, array(), t('Save settings'));
// Preview message.
$message = array(
'recipient' => $user->name,
'subject' => $this->randomName(),
'body[value]' => $this->randomName(50),
);
$this->drupalPost('messages/new', $message, t('Preview message'));
// Send message.
$this->drupalPost(NULL, array(), t('Send message'));
// Check message.
$this->drupalLogin($user);
$this->drupalGet('messages');
$this->clickLink($message['subject']);
$this->assertText($message['body[value]'], t('Message body displayed.'));
}
}
Sascha Grossenbacher
committed
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/**
* Tests for fields integration.
*/
class PrivatemsgLinksTestCase extends DrupalWebTestCase {
/**
* Implements of getInfo().
*/
public static function getInfo() {
return array
(
'name' => t('Privatemsg links'),
'description' => t('Tests links displayed in nodes, profiles and blocks.'),
'group' => t('Privatemsg'),
);
}
/**
* Implements setUp().
*/
function setUp() {
parent::setUp('privatemsg');
}
/**
* Tests author links displayed on nodes and comments.
*/
function testAuthorLinks() {
$admin = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg', 'administer privatemsg settings', 'create article content', 'create page content'));
$user = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg'));
$this->drupalLogin($admin);
$settings = array(
'privatemsg_display_link_self' => FALSE,
'privatemsg_link_node_types[article]' => TRUE,
'privatemsg_display_on_teaser' => FALSE,
'privatemsg_display_on_comments' => TRUE,
);
$this->drupalPost('admin/config/messaging/privatemsg', $settings, t('Save configuration'));
$node1 = array(
'title' => $this->randomName(10),
'body[und][0][value]' => $this->randomString(50),
);
$this->drupalPost('node/add/article', $node1, t('Save'));
$comment = array(
'comment_body[und][0][value]' => $this->randomName(20),
);
$this->drupalPost(NULL, $comment, t('Save'));
$node2 = array(
'title' => $this->randomName(),
'body[und][0][value]' => $this->randomString(50),
);
$this->drupalPost('node/add/page', $node2, t('Save'));
$this->drupalGet('node');
$this->assertNoText(t('Send author a message'), t('Send author a message link not displayed.'));
$this->clickLink($node1['title']);
$this->assertNoText(t('Send author a message'), t('Send author a message link not displayed.'));
$this->drupalLogin($user);
$this->drupalGet('node');
$this->assertNoText(t('Send author a message'), t('Send author a message link not displayed.'));
$this->clickLink($node1['title']);
$this->assertNoUniqueText(t('Send author a message'), t('Send author a message link displayed.'));
// @todo: Do not guess nid.
$this->drupalGet('node/2');
$this->assertNoText(t('Send author a message'), t('Send author a message link not displayed.'));
}
/**
* Tests menu block.
*/
function testMenuBlock() {
$admin = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg', 'administer privatemsg settings', 'administer blocks', 'administer menu'));
$user = $this->drupalCreateUser(array('read privatemsg'));
// Enable block.
$this->drupalLogin($admin);
$blocks = array(
'privatemsg_privatemsg-menu[region]' => 'sidebar_second',
);
$this->drupalPost('admin/structure/block', $blocks, t('Save blocks'));
// Disable secondary menu.
/* @todo: Not yet possible because simpletest needs a log out link to verify that the user is logged in.
$menu_settings = array(
'menu_secondary_links_source' => '',
);
$this->drupalPost('admin/structure/menu/settings', $menu_settings, t('Save configuration'));
*
*/