drupal/modules/upload/upload.test

551 lines
22 KiB
Plaintext

<?php
// $Id$
class UploadTestCase extends DrupalWebTestCase {
/**
* Implementation of getInfo().
*/
function getInfo() {
return array(
'name' => t('Upload functionality'),
'description' => t('Check content uploaded to nodes.'),
'group' => t('Upload'),
);
}
function setUp() {
parent::setUp('upload');
}
/**
* Create node; upload files to node; and edit, and delete uploads.
*/
function testNodeUpload() {
$admin_user = $this->drupalCreateUser(array('administer site configuration'));
$web_user = $this->drupalCreateUser(array('access content', 'edit any page content', 'upload files', 'view uploaded files'));
$this->drupalLogin($admin_user);
// Setup upload settings.
$edit = array();
$edit['upload_list_default'] = '1'; // Yes.
$edit['upload_extensions_default'] = 'jpg jpeg gif png txt doc xls pdf ppt pps odt ods odp';
$edit['upload_uploadsize_default'] = '1.5';
$edit['upload_usersize_default'] = '1.5';
$this->drupalPost('admin/settings/uploads', $edit, t('Save configuration'));
$this->assertText('The configuration options have been saved.', 'Upload setting saved.');
$this->drupalLogout();
$this->drupalLogin($web_user);
// Create a node and attempt to attach files.
$node = $this->drupalCreateNode();
$text_files = $this->drupalGetTestFiles('text');
$files = array(current($text_files)->filename, next($text_files)->filename);
$this->uploadFile($node, $files[0]);
$this->uploadFile($node, $files[1]);
// Check to see that uploaded file is listed and actually accessible.
$this->assertText(basename($files[0]), basename($files[0]) .' found on node.');
$this->assertText(basename($files[1]), basename($files[1]) .' found on node.');
$this->checkUploadedFile(basename($files[0]));
$this->checkUploadedFile(basename($files[1]));
// Fetch db record and use fid to rename and delete file.
$upload = db_fetch_object(db_query('SELECT fid, description FROM {upload} WHERE nid = %d', array($node->nid)));
if ($upload) {
// Rename file.
$edit = array();
$edit['files['. $upload->fid .'][description]'] = $new_name = substr($upload->description, 1);
$this->drupalPost('node/'. $node->nid .'/edit', $edit, t('Save'));
$this->assertRaw(t('Page %title has been updated.', array('%title' => $node->title)), 'File renamed successfully.');
$this->assertText($new_name, $new_name .' found on node.');
$this->assertNoText($upload->description, $upload->description .' not found on node.');
// Delete a file.
$edit = array();
$edit['files['. $upload->fid .'][remove]'] = TRUE;
$this->drupalPost('node/'. $node->nid .'/edit', $edit, t('Save'));
$this->assertRaw(t('Page %title has been updated.', array('%title' => $node->title)), 'File deleted successfully.');
$this->assertNoText($new_name, $new_name .' not found on node.');
$this->drupalGet(file_directory_path() .'/'. $upload->description);
$this->assertResponse(array(404), 'Uploaded '. $upload->description .' is not accessible.');
}
else {
$this->fail('File upload record not found in database.');
}
}
/**
* Ensure the the file filter works correctly by attempting to upload a non-allowed file extension.
*/
function testFilesFilter() {
$admin_user = $this->drupalCreateUser(array('administer site configuration'));
$web_user = $this->drupalCreateUser(array('access content', 'edit any page content', 'upload files', 'view uploaded files'));
$this->drupalLogin($admin_user);
// Setup upload settings.
$settings = array();
$settings['upload_list'] = '1'; // Yes.
$settings['upload_extensions'] = 'html';
$settings['upload_uploadsize'] = '1';
$settings['upload_usersize'] = '1';
$this->setUploadSettings($settings, $this->getSimpletestRoleId($web_user));
$this->drupalLogin($web_user);
$node = $this->drupalCreateNode();
$text_files = $this->drupalGetTestFiles('text');
$html_files = $this->drupalGetTestFiles('html');
$files = array(current($text_files)->filename, current($html_files)->filename);
// Attempt to upload .txt file when .test is only extension allowed.
$this->uploadFile($node, $files[0], FALSE);
$this->assertRaw(t('The selected file %name could not be uploaded. Only files with the following extensions are allowed: %files-allowed.', array('%name' => basename($files[0]), '%files-allowed' => $settings['upload_extensions'])), 'File '. $files[0] .' was not allowed to be uploaded');
// Attempt to upload .test file when .test is only extension allowed.
$this->uploadFile($node, $files[1]);
}
/**
* Attempt to upload a file that is larger than the maxsize and see that it fails.
*/
function testLimit() {
$files = $this->drupalGetTestFiles('text', 1310720); // 1 MB.
$file = current($files)->filename;
$admin_user = $this->drupalCreateUser(array('administer site configuration'));
$web_user = $this->drupalCreateUser(array('access content', 'edit any page content', 'upload files', 'view uploaded files'));
$this->drupalLogin($admin_user);
// Setup upload settings.
$settings = array();
$settings['upload_list'] = '1'; // Yes.
$settings['upload_extensions'] = 'jpg jpeg gif png txt doc xls pdf ppt pps odt ods odp';
$settings['upload_uploadsize'] = '0.5';
$settings['upload_usersize'] = '1.5';
$this->setUploadSettings($settings, $this->getSimpletestRoleId($web_user));
$this->drupalLogin($web_user);
$node = $this->drupalCreateNode();
// Attempt to upload file which is bigger than the maximum size of 0.5 MB.
$this->uploadFile($node, $file, FALSE);
$info = stat($file);
$filename = basename($file);
$filesize = format_size($info['size']);
$maxsize = format_size(parse_size(($settings['upload_uploadsize'] * 1024) .'KB')); // Won't parse decimals.
$this->assertRaw(t('The selected file %name could not be uploaded. The file is %filesize exceeding the maximum file size of %maxsize.', array('%name' => $filename, '%filesize' => $filesize, '%maxsize' => $maxsize)), t('File upload was blocked since it was larger than maxsize.'));
}
function setUploadSettings($settings, $rid = NULL) {
$edit = array();
foreach ($settings as $key => $value) {
$edit[$key .'_default'] = $value;
if ($rid !== NULL && $key != 'upload_list' && $key != 'upload_max_resolution') {
$edit[$key .'_'. $rid] = $value;
}
}
$this->drupalPost('admin/settings/uploads', $edit, 'Save configuration');
$this->assertText('The configuration options have been saved.', 'Upload setting saved.');
}
/**
* Upload file to specified node.
*
* @param object $node Node object.
* @param string $filename Name of file to upload.
* @param boolean $assert Assert that the node was successfully updated.
*/
function uploadFile($node, $filename, $assert = TRUE) {
$edit = array();
$edit['files[upload]'] = $filename; //edit-upload
$this->drupalPost('node/'. $node->nid .'/edit', $edit, t('Save'));
if ($assert) {
$this->assertRaw(t('Page %title has been updated.', array('%title' => $node->title)), 'File attached successfully.');
}
}
/**
* Check that uploaded file is accessible and verify the contents against the original.
*
* @param string $filename Name of file to verifiy.
*/
function checkUploadedFile($filename) {
$file = realpath(file_directory_path() .'/'. $filename);
$this->drupalGet(file_directory_path() .'/'. $filename);
$this->assertResponse(array(200), 'Uploaded '. $filename .' is accessible.');
$this->assertEqual(file_get_contents($file), $this->drupalGetContent(), 'Uploaded contents of '. $filename .' verified.');
}
/**
* Get the role id of the 'simpletest' role associated with a SimpleTest test user.
*
* @param object $user User object.
* @return interger SimpleTest role id.
*/
function getSimpletestRoleId($user) {
foreach ($user->roles as $rid => $role) {
if (strpos($role, 'simpletest') !== FALSE) {
return $rid;
}
}
return NULL;
}
}
class UploadPictureTestCase extends DrupalWebTestCase {
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('Upload')
);
}
/*
* Test if directories specified in settings exist in filesystem
*/
function testDirectories() {
// test if filepath is proper
$file_dir = file_directory_path();
$picture_dir = variable_get('user_picture_path', 'pictures');
$file_check = file_check_directory($file_dir, FILE_CREATE_DIRECTORY, 'file_directory_path');
$picture_path = $file_dir .'/'.$picture_dir;
$pic_check = file_check_directory($picture_path, FILE_CREATE_DIRECTORY, 'user_picture_path');
// check directories
//$this->assertTrue($file_check,"The directory $file_dir doesn't exist or cannot be created.");
//$this->assertTrue($pic_check,"The directory $picture_path doesn't exist or cannot be created.");
$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() {
$old_pic_set = variable_get('user_pictures', 0);
variable_set('user_pictures', 1);
/* Prepare a user to do the stuff */
$user = $this->drupalCreateUser(array('access content'));
$this->drupalLogin($user);
// not a image
//$img_path = realpath(drupal_get_path('module', 'simpletest'). "/tests/functional/upload.test");
$img_path = realpath(drupal_get_path('module', 'simpletest'). "/files/html-1.txt");
$edit = array('files[picture_upload]' => $img_path);
$this->drupalPost('user/'.$user->uid.'/edit', $edit, t('Save'));
$this->assertRaw(t('The selected file %file could not be uploaded. Only JPEG, PNG and GIF images are allowed.', array('%file' => basename($img_path))), 'The uploaded file was not an image.');
variable_set('user_pictures', $old_pic_set);
// do we have to check users roles?
// delete test user and roles
}
/*
* Do one test if ImageGDToolkit is installed
*/
/*
* 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()) {
// PREPARE:
$old_pic_set = variable_get('user_pictures', 0);
variable_set('user_pictures', 1);
/* Prepare a user to do the stuff */
$user = $this->drupalCreateUser(array('access content'));
$this->drupalLogin($user);
// changing actual setting;
$old_dim = variable_get('user_picture_dimensions', '85x85');
$old_size = variable_get('user_picture_file_size', '30');
//$img_path = realpath(drupal_get_path('module', 'simpletest'). "/tests/files/image-2.jpg");
$img_path = realpath(drupal_get_path('module', 'simpletest'). "/files/image-2.jpg");
$info = image_get_info($img_path);
// set new variables;
$test_size = floor(filesize($img_path) / 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);
// Create pictures folder
$file_dir = 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');
// TEST:
$edit = array('files[picture_upload]' => $img_path);
$this->drupalPost('user/'.$user->uid.'/edit', $edit, t('Save'));
$picture_dir = variable_get('user_picture_path', 'pictures');
$picture = $picture_dir .'/picture-'.$user->uid.'.jpg';
// get full url to the user's image
$picture_url = file_create_url($picture);
$picture_path = file_create_path($picture);
// check if image is displayed in user's profile page
$this->assertRaw($picture_url, "Image is displayed in user's profile page");
// check if file is located in proper directory
$this->assertTrue(is_file($picture_path), "File is located in proper directory");
// RESTORING:
variable_set('user_picture_file_size', $old_size);
variable_set('user_picture_dimensions', $old_dim);
variable_set('user_pictures', $old_pic_set);
}
}
/*
* Do the test:
* GD Toolkit is installed
* Picture has invalid size
*
* results: The image should be uploaded because ImageGDToolkit resizes the picture
*/
function tstWithGDinvalidSize() {
if ($this->_directory_test)
if (image_get_toolkit()) {
// PREPARE:
$old_pic_set = variable_get('user_pictures', 0);
variable_set('user_pictures', 1);
/* Prepare a user to do the stuff */
$user = $this->drupalCreateUser(array('access content'));
$this->drupalLogin($user);
// changing actual setting;
$old_dim = variable_get('user_picture_dimensions', '85x85');
$old_size = variable_get('user_picture_file_size', '30');
$files = $this->drupalGetTestFiles('image');
$file = current($files);
$img_path = realpath($file->filename);
$info = image_get_info($img_path);
// set new variables;
$test_dim = ($info['width'] + 10) . 'x' . ($info['height'] + 10);
$test_size = filesize($img_path);
variable_set('user_picture_dimensions', $test_dim);
variable_set('user_picture_file_size', $test_size);
// Create pictures folder
$file_dir = 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');
// TEST:
$edit = array('files[picture_upload]' => $img_path);
$this->drupalPost('user/'.$user->uid.'/edit', $edit, t('Save'));
$picture_dir = variable_get('user_picture_path', 'pictures');
$picture = $picture_dir .'/picture-'.$user->uid.'.png';
// get full url to the user's image
$picture_url = file_create_url($picture);
$picture_path = file_create_path($picture);
// check if image is displayed in user's profile page
$this->assertRaw($picture_url, "Image is displayed in user's profile page");
// check if file is located in proper directory
$this->assertTrue(is_file($picture_path), "File is located in proper directory");
// RESTORING:
variable_set('user_picture_file_size', $old_size);
variable_set('user_picture_dimensions', $old_dim);
variable_set('user_pictures', $old_pic_set);
}
}
/*
* Do the test:
* GD Toolkit is not installed
* Picture has invalid size
*
* results: The image shouldn't be uploaded
*/
function tstWithoutGDinvalidDimension() {
if ($this->_directory_test)
if (!image_get_toolkit()) {
// PREPARE:
$old_pic_set = variable_get('user_pictures', 0);
variable_set('user_pictures', 1);
/* Prepare a user to do the stuff */
$user = $this->drupalCreateUser(array('access content'));
$this->drupalLogin($user);
// changing actual setting;
$old_dim = variable_get('user_picture_dimensions', '85x85');
$old_size = variable_get('user_picture_file_size', '30');
$img_path = realpath(drupal_get_path('module', 'simpletest'). "/files/image-2.jpg");
$info = image_get_info($img_path);
// set new variables;
$test_size = floor(filesize($img_path) / 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);
// Create pictures folder
$file_dir = 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');
// TEST:
$edit = array('picture' => $img_path);
$this->drupalPost('user/'.$user->uid.'/edit', $edit, t('Save'));
$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, 'Checking response on invalid image (dimensions).');
// check if file is not uploaded
$file_dir = variable_get('file_directory_path', 'files');
$picture_dir = variable_get('user_picture_path', 'pictures');
$pic_path = $file_dir .'/'.$picture_dir .'/picture-'.$user->uid.'.jpg';
$this->assertFalse(is_file($pic_path), "File is not uploaded");
// restore variables;
variable_set('user_picture_file_size', $old_size);
variable_set('user_picture_dimensions', $old_dim);
variable_set('user_pictures', $old_pic_set);
}
}
/*
* Do the test:
* GD Toolkit is not installed
* Picture has invalid size
*
* results: The image shouldn't be uploaded
*/
function tstWithoutGDinvalidSize() {
if ($this->_directory_test)
if (!image_get_toolkit()) {
// PREPARE:
$old_pic_set = variable_get('user_pictures', 0);
variable_set('user_pictures', 1);
/* Prepare a user to do the stuff */
$user = $this->drupalCreateUser(array('access content'));
$this->drupalLogin($user);
// changing actual setting;
$old_dim = variable_get('user_picture_dimensions', '85x85');
$old_size = variable_get('user_picture_file_size', '30');
//$img_path = realpath("modules/tests/image-2.jpg");
$img_path = realpath(drupal_get_path('module', 'simpletest'). "/files/image-2.jpg");
$info = image_get_info($img_path);
// invalid size
// restore one and set another
$test_dim = ($info['width'] + 10) . 'x' . ($info['height'] + 10);
$test_size = floor(filesize($img_path) / 1000) - 1;
variable_set('user_picture_dimensions', $test_dim);
variable_set('user_picture_file_size', $test_size);
$edit = array('picture' => $img_path);
$this->drupalPost('user/'.$user->uid.'/edit', $edit, t('Save'));
$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, 'Checking response on invalid image size.');
// check if file is not uploaded
$file_dir = variable_get('file_directory_path', 'files');
$picture_dir = variable_get('user_picture_path', 'pictures');
$pic_path = $file_dir .'/'.$picture_dir .'/picture-'.$user->uid.'.jpg';
$this->assertFalse(is_file($pic_path), "File is not uploaded");
// restore variables;
variable_set('user_picture_file_size', $old_size);
variable_set('user_picture_dimensions', $old_dim);
variable_set('user_pictures', $old_pic_set);
}
}
/*
* Do the test:
* Picture is valid (proper size and dimension)
*
* results: The image should be uploaded
*/
function tstPictureIsValid() {
if ($this->_directory_test) {
// PREPARE:
$old_pic_set = variable_get('user_pictures', 0);
variable_set('user_pictures', 1);
/* Prepare a user to do the stuff */
$user = $this->drupalCreateUser(array('access content'));
$this->drupalLogin($user);
// changing actual setting;
$old_dim = variable_get('user_picture_dimensions', '85x85');
$old_size = variable_get('user_picture_file_size', '30');
$img_path = realpath(drupal_get_path('module', 'simpletest'). "/files/image-2.jpg");
$info = image_get_info($img_path);
// valid size & dimensions
// restore one and set another
$test_dim = ($info['width'] + 10) . 'x' . ($info['height'] + 10);
$test_size = floor(filesize($img_path) / 1000) + 1;
variable_set('user_picture_dimensions', $test_dim);
variable_set('user_picture_file_size', $test_size);
// Create pictures folder
$file_dir = 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');
// TEST:
$edit = array('files[picture_upload]' => $img_path);
$this->drupalPost('user/'.$user->uid.'/edit', $edit, t('Save'));
$picture_dir = variable_get('user_picture_path', 'pictures');
$pic_path = file_directory_path() .'/'.$picture_dir .'/picture-'.$user->uid.'.jpg';
// get full url to the user's image
$picture = file_create_url($pic_path);
// check if image is displayed in user's profile page
$content = $this->drupalGetContent();
$this->assertTrue(strpos($content, $picture), "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");
// RESTORING:
variable_set('user_picture_file_size', $old_size);
variable_set('user_picture_dimensions', $old_dim);
variable_set('user_pictures', $old_pic_set);
// DELETING UPLOADED PIC
file_delete($pic_path);
}
}
}