drupal/modules/user/user.test

469 lines
17 KiB
Plaintext
Raw Normal View History

<?php
// $Id$
class UserRegistrationTestCase extends DrupalWebTestCase {
/**
* Implementation of getInfo().
*/
function getInfo() {
return array(
'name' => t('User registration'),
'description' => t('Registers a user, fails login, resets password, successfully logs in with the one time password, changes password, logs out, successfully logs in with the new password, visits profile page.'),
'group' => t('User')
);
}
/**
* Registers a user, fails login, resets password, successfully logs in with the one time password,
* changes password, logs out, successfully logs in with the new password, visits profile page.
*
* Assumes that the profile module is disabled.
*/
function testUserRegistration() {
// Set user registration to "Visitors can create accounts and no administrator approval is required."
variable_set('user_register', 1);
// Enable user configurable timezone, and set the default timezone to +1 hour (or +3600 seconds).
variable_set('configurable_timezones', 1);
variable_set('date_default_timezone', 3600);
$edit = array();
$edit['name'] = $name = $this->randomName();
$edit['mail'] = $mail = $edit['name'] . '@example.com';
$this->drupalPost('user/register', $edit, t('Create new account'));
$this->assertText(t('Your password and further instructions have been sent to your e-mail address.'), t('User registered successfully.'));
// Check database for created user.
$user = user_load($edit);
$this->assertTrue($user, t('User found in database.'));
$this->assertTrue($user->uid > 0, t('User has valid user id.'));
// Check user fields.
$this->assertEqual($user->name, $name, t('Username matches.'));
$this->assertEqual($user->mail, $mail, t('E-mail address matches.'));
$this->assertEqual($user->theme, '', t('Correct theme field.'));
$this->assertEqual($user->signature, '', t('Correct signature field.'));
$this->assertTrue(($user->created > time() - 20 ), t('Correct creation time.'));
$this->assertEqual($user->status, variable_get('user_register', 1) == 1 ? 1 : 0, t('Correct status field.'));
$this->assertEqual($user->timezone, variable_get('date_default_timezone', NULL), t('Correct timezone field.'));
$this->assertEqual($user->language, '', t('Correct language field.'));
$this->assertEqual($user->picture, '', t('Correct picture field.'));
$this->assertEqual($user->init, $mail, t('Correct init field.'));
// Attempt to login with incorrect password.
$edit = array();
$edit['name'] = $name;
$edit['pass'] = 'foo';
$this->drupalPost('user', $edit, t('Log in'));
$this->assertText(t('Sorry, unrecognized username or password. Have you forgotten your password?'), t('Invalid login attempt failed.'));
// Login using password reset page.
$url = user_pass_reset_url($user);
sleep(1); // TODO Find better way.
$this->drupalGet($url);
$this->assertText(t('This login can be used only once.'), t('Login can be used only once.'));
$this->drupalPost(NULL, NULL, t('Log in'));
$this->assertText(t('You have just used your one-time login link. It is no longer necessary to use this link to login. Please change your password.'), t('This link is no longer valid.'));
// Change user password.
$new_pass = user_password();
$edit = array();
$edit['pass[pass1]'] = $new_pass;
$edit['pass[pass2]'] = $new_pass;
$this->drupalPost(NULL, $edit, t('Save'));
$this->assertText(t('The changes have been saved.'), t('Password changed to @password', array('@password' => $new_pass)));
// Make sure password changes are present in database.
require_once variable_get('password_inc', './includes/password.inc');
$user = user_load(array('uid' => $user->uid));
$this->assertTrue(user_check_password($new_pass, $user), t('Correct password in database.'));
// Logout of user account.
$this->clickLink(t('Log out'));
$this->assertNoText($user->name, t('Logged out.'));
// Login user.
$edit = array();
$edit['name'] = $user->name;
$edit['pass'] = $new_pass;
$this->drupalPost('user', $edit, t('Log in'));
$this->assertText(t('Log out'), t('Logged in.'));
$this->assertText($user->name, t('[logged in] Username found.'));
$this->assertNoText(t('Sorry. Unrecognized username or password.'), t('[logged in] No message for unrecognized username or password.'));
$this->assertNoText(t('User login'), t('[logged in] No user login form present.'));
$this->drupalGet('user');
$this->assertText($user->name, t('[user auth] Not login page.'));
$this->assertText(t('View'), t('[user auth] Found view tab on the profile page.'));
$this->assertText(t('Edit'), t('[user auth] Found edit tab on the profile page.'));
}
}
class UserValidationTestCase extends DrupalWebTestCase {
/**
* Implementation of getInfo().
*/
function getInfo() {
return array(
'name' => t('Username/e-mail validation'),
'description' => t('Verify that username/email validity checks behave as designed.'),
'group' => t('User')
);
}
// Username validation.
function testMinLengthName() {
$name = '';
$result = user_validate_name($name);
$this->assertNotNull($result, 'Excessively short username');
}
function testValidCharsName() {
$name = 'ab/';
$result = user_validate_name($name);
$this->assertNotNull($result, 'Invalid chars in username');
}
function testMaxLengthName() {
$name = str_repeat('a', 61);
$result = user_validate_name($name);
$this->assertNotNull($result, 'Excessively long username');
}
function testValidName() {
$name = 'abc';
$result = user_validate_name($name);
$this->assertNull($result, 'Valid username');
}
// Mail validation.
function testMinLengthMail() {
$name = '';
$result = user_validate_mail($name);
$this->assertNotNull($result, 'Empty mail');
}
function testInValidMail() {
$name = 'abc';
$result = user_validate_mail($name);
$this->assertNotNull($result, 'Invalid mail');
}
function testValidMail() {
$name = 'absdsdsdc@dsdsde.com';
$result = user_validate_mail($name);
$this->assertNull($result, 'Valid mail');
}
}
class UserDeleteTestCase extends DrupalWebTestCase {
/**
* Implementation of getInfo().
*/
function getInfo() {
return array(
'name' => t('User delete'),
'description' => t('Registers a user and deletes it.'),
'group' => t('User')
);
}
/**
* Registers a user and deletes it.
*/
function testUserRegistration() {
// Set user registration to "Visitors can create accounts and no administrator approval is required."
variable_set('user_register', 1);
$edit = array();
$edit['name'] = $this->randomName();
$edit['mail'] = $edit['name'] . '@example.com';
$this->drupalPost('user/register', $edit, t('Create new account'));
$this->assertText(t('Your password and further instructions have been sent to your e-mail address.'), t('User registered successfully.'));
$user = user_load($edit);
// Create admin user to delete registered user.
$admin_user = $this->drupalCreateUser(array('administer users'));
$this->drupalLogin($admin_user);
// Delete user.
$this->drupalGet('user/' . $user->uid . '/edit');
$this->drupalPost(NULL, NULL, t('Delete'));
$this->assertRaw(t('Are you sure you want to delete the account %name?', array('%name' => $user->name)), t('[confirm deletion] Asks for confirmation.'));
$this->assertText(t('All submissions made by this user will be attributed to the anonymous account. This action cannot be undone.'), t('[confirm deletion] Inform that all submissions will be attributed to anonymouse account.'));
// Confirm deletion.
$this->drupalPost(NULL, NULL, t('Delete'));
$this->assertRaw(t('%name has been deleted.', array('%name' => $user->name)), t('User deleted'));
$this->assertFalse(user_load($edit), t('User is not found in the database'));
}
}
class UserPictureTestCase extends DrupalWebTestCase {
protected $user;
protected $_directory_test;
function getInfo() {
return array(
'name' => t('Upload user picture'),
'description' => t('Assure that dimension check, extension check and image scaling work as designed.'),
'group' => t('User')
);
}
function setUp() {
parent::setUp();
// Enable user pictures.
variable_set('user_pictures', 1);
$this->user = $this->drupalCreateUser();
// Test if directories specified in settings exist in filesystem.
$file_dir = file_directory_path();
$file_check = file_check_directory($file_dir, FILE_CREATE_DIRECTORY, 'file_directory_path');
$picture_dir = variable_get('user_picture_path', 'pictures');
$picture_path = $file_dir .'/'.$picture_dir;
$pic_check = file_check_directory($picture_path, FILE_CREATE_DIRECTORY, 'user_picture_path');
$this->_directory_test = is_writable($picture_path);
$this->assertTrue($this->_directory_test, "The directory $picture_path doesn't exist or is not writable. Further tests won't be made.");
}
function testNoPicture() {
$this->drupalLogin($this->user);
// Try to upload a file that is not an image for the user picture.
$not_an_image = current($this->drupalGetTestFiles('html'));
$this->saveUserPicture($not_an_image);
$this->assertRaw(t('Only JPEG, PNG and GIF images are allowed.'), t('Non-image files are not accepted.'));
}
/**
* Do the test:
* GD Toolkit is installed
* Picture has invalid dimension
*
* results: The image should be uploaded because ImageGDToolkit resizes the picture
*/
function testWithGDinvalidDimension() {
if ($this->_directory_test)
if (image_get_toolkit()) {
$this->drupalLogin($this->user);
$image = current($this->drupalGetTestFiles('image'));
$info = image_get_info($image->filename);
// set new variables;
$test_size = floor(filesize($image->filename) / 1000) + 1;
$test_dim = ($info['width'] - 10) . 'x' . ($info['height'] - 10);
variable_set('user_picture_dimensions', $test_dim);
variable_set('user_picture_file_size', $test_size);
$pic_path = $this->saveUserPicture($image);
// check if image is displayed in user's profile page
$this->assertRaw(file_create_url($pic_path), "Image is displayed in user's profile page");
// check if file is located in proper directory
$this->assertTrue(is_file($pic_path), "File is located in proper directory");
}
}
/**
* Do the test:
* GD Toolkit is installed
* Picture has invalid size
*
* results: The image should be uploaded because ImageGDToolkit resizes the picture
*/
function testWithGDinvalidSize() {
if ($this->_directory_test)
if (image_get_toolkit()) {
$this->drupalLogin($this->user);
$image = current($this->drupalGetTestFiles('image'));
$info = image_get_info($image->filename);
// Set new variables.
$test_dim = ($info['width'] + 10) . 'x' . ($info['height'] + 10);
$test_size = filesize($image->filename);
variable_set('user_picture_dimensions', $test_dim);
variable_set('user_picture_file_size', $test_size);
$picture_path = $this->saveUserPicture($image);
$this->assertText(t('The changes have been saved.'));
// Check if image is displayed in user's profile page.
$this->assertRaw(file_create_url($picture_path), t("Image is displayed in user's profile page"));
// Check if file is located in proper directory.
$this->assertTrue(is_file($picture_path), t('File is located in proper directory'));
}
}
/**
* Do the test:
* GD Toolkit is not installed
* Picture has invalid size
*
* results: The image shouldn't be uploaded
*/
function testWithoutGDinvalidDimension() {
if ($this->_directory_test)
if (!image_get_toolkit()) {
$this->drupalLogin($this->user);
$image = current($this->drupalGetTestFiles('image'));
$info = image_get_info($image->filename);
// Set new variables.
$test_size = floor(filesize($image->filename) / 1000) + 1;
$test_dim = ($info['width'] - 10) . 'x' . ($info['height'] - 10);
variable_set('user_picture_dimensions', $test_dim);
variable_set('user_picture_file_size', $test_size);
$pic_path = $this->saveUserPicture($image);
$text = t('The uploaded image is too large; the maximum dimensions are %dimensions pixels.', array('%dimensions' => variable_get('user_picture_dimensions', '85x85')));
$this->assertText($text, t('Checking response on invalid image (dimensions).'));
// check if file is not uploaded
$this->assertFalse(is_file($pic_path), t('File is not uploaded'));
}
}
/**
* Do the test:
* GD Toolkit is not installed
* Picture has invalid size
*
* results: The image shouldn't be uploaded
*/
function testWithoutGDinvalidSize() {
if ($this->_directory_test)
if (!image_get_toolkit()) {
$this->drupalLogin($this->user);
$image = current($this->drupalGetTestFiles('image'));
$image->filename = realpath("modules/tests/image-2.jpg");
$info = image_get_info($image->filename);
// invalid size
// restore one and set another
$test_dim = ($info['width'] + 10) . 'x' . ($info['height'] + 10);
$test_size = floor(filesize($image->filename) / 1000) - 1;
variable_set('user_picture_dimensions', $test_dim);
variable_set('user_picture_file_size', $test_size);
$pic_path = $this->saveUserPicture($image);
$text = t('The uploaded image is too large; the maximum file size is %size kB.', array('%size' => variable_get('user_picture_file_size', '30')));
$this->assertText($text, t('Checking response on invalid image size.'));
// check if file is not uploaded
$this->assertFalse(is_file($pic_path), t('File is not uploaded.'));
}
}
/**
* Do the test:
* Picture is valid (proper size and dimension)
*
* results: The image should be uploaded
*/
function testPictureIsValid() {
if ($this->_directory_test) {
$this->drupalLogin($this->user);
$image = current($this->drupalGetTestFiles('image'));
$info = image_get_info($image->filename);
// valid size & dimensions
// restore one and set another
$test_dim = ($info['width'] + 10) . 'x' . ($info['height'] + 10);
$test_size = floor(filesize($image->filename) / 1000) + 1;
variable_set('user_picture_dimensions', $test_dim);
variable_set('user_picture_file_size', $test_size);
$pic_path = $this->saveUserPicture($image);
// check if image is displayed in user's profile page
$this->assertRaw($pic_path, t("Image is displayed in user's profile page"));
// check if file is located in proper directory
$this->assertTrue(is_file($pic_path), t('File is located in proper directory'));
}
}
function saveUserPicture($image) {
$edit = array('files[picture_upload]' => realpath($image->filename));
$this->drupalPost('user/' . $this->user->uid.'/edit', $edit, t('Save'));
$img_info = image_get_info($image->filename);
$picture_dir = variable_get('user_picture_path', 'pictures');
$pic_path = file_directory_path() . '/' . $picture_dir . '/picture-' . $this->user->uid . '.' . $img_info['extension'];
return $pic_path;
}
}
class UserPermissionsTestCase extends DrupalWebTestCase {
protected $admin_user;
protected $rid;
/**
* Implementation of getInfo().
*/
function getInfo() {
return array(
'name' => t('Role permissions'),
'description' => t('Verify that role permissions can be added and removed via the permissions page.'),
'group' => t('User')
);
}
function setUp() {
parent::setUp();
$this->admin_user = $this->drupalCreateUser(array('administer permissions', 'access user profiles'));
// Find the new role ID - it must be the maximum.
$all_rids = array_keys($this->admin_user->roles);
sort($all_rids);
$this->rid = array_pop($all_rids);
}
/**
* Change user permissions and check user_access().
*/
function testUserPermissionChanges() {
$this->drupalLogin($this->admin_user);
$rid = $this->rid;
$account = $this->admin_user;
// Add a permission.
$this->assertFalse(user_access('administer nodes', $account, TRUE), t('User does not have "administer nodes" permission.'));
$edit = array();
$edit[$rid . '[administer nodes]'] = TRUE;
$this->drupalPost('admin/user/permissions', $edit, t('Save permissions'));
$this->assertText(t('The changes have been saved.'), t('Successful save message displayed.'));
$this->assertTrue(user_access('administer nodes', $account, TRUE), t('User now has "administer nodes" permission.'));
// Remove a permission.
$this->assertTrue(user_access('access user profiles', $account, TRUE), t('User has "access user profiles" permission.'));
$edit = array();
$edit[$rid . '[access user profiles]'] = FALSE;
$this->drupalPost('admin/user/permissions', $edit, t('Save permissions'));
$this->assertText(t('The changes have been saved.'), t('Successful save message displayed.'));
$this->assertFalse(user_access('access user profiles', $account, TRUE), t('User no longer has "access user profiles" permission.'));
}
}