drupal/modules/upload/upload.test

214 lines
9.0 KiB
Plaintext

<?php
// $Id$
class UploadTestCase extends DrupalWebTestCase {
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() {
global $base_url;
$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($base_url . '/' . file_directory_path() . '/' . $upload->description, array('external' => TRUE));
$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();
// Attempt to upload .txt file when .html is only extension allowed.
$text_file = current($this->drupalGetTestFiles('text'));
// Select a file that's less than the 1MB upload limit so we only test one
// limit at a time.
$this->uploadFile($node, $text_file->filename, FALSE);
// Test the error message in two steps in case there are additional errors
// that change the error message's format.
$this->assertRaw(t('The specified file %name could not be uploaded.', array('%name' => $text_file->basename)), t('File %filename was not allowed to be uploaded', array('%filename' => $text_file->filename)));
$this->assertRaw(t('Only files with the following extensions are allowed: %files-allowed.', array('%files-allowed' => $settings['upload_extensions'])), t('File extension cited as reason for failure'));
// Attempt to upload .html file when .html is only extension allowed.
$html_files = array_values($this->drupalGetTestFiles('html'));
// Use the HTML file with the .html extension, $html_files[0] has a .txt
// extension.
$html_file = $html_files[1]->filename;
$this->uploadFile($node, $html_file);
$this->assertNoRaw(t('The specified file %name could not be uploaded.', array('%name' => basename($html_file))), t('File '. $html_file . ' was allowed to be uploaded'));
}
/**
* 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.
// Test the error message in two steps in case there are additional errors
// that change the error message's format.
$this->assertRaw(t('The specified file %name could not be uploaded.', array('%name' => $filename)), t('File upload was blocked'));
$this->assertRaw(t('The file is %filesize exceeding the maximum file size of %maxsize.', array('%filesize' => $filesize, '%maxsize' => $maxsize)), t('File size cited as problem with upload'));
}
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) {
global $base_url;
$file = realpath(file_directory_path() . '/' . $filename);
$this->drupalGet($base_url . '/' . file_directory_path() . '/' . $filename, array('external' => TRUE));
$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;
}
}