'Upload functionality', 'description' => 'Check content uploaded to nodes.', 'group' => '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 own 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)->filepath, next($text_files)->filepath); $this->uploadFile($node, $files[0]); $this->uploadFile($node, $files[1]); // Check to see that uploaded file is listed in detail page 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])); // Check that files are also accessible when using private files. variable_set('file_downloads', FILE_DOWNLOADS_PRIVATE); $this->checkUploadedFile(basename($files[0])); $this->checkUploadedFile(basename($files[1])); // Assure that the attachment link appears on teaser view and has correct count. $node = node_load($node->nid); $teaser = drupal_render(node_build($node, 'teaser')); $this->assertTrue(strpos($teaser, format_plural(2, '1 attachment', '@count attachments')), 'Attachments link found on node teaser.'); // Fetch db record and use fid to rename and delete file. $upload = db_query('SELECT fid, description FROM {upload} WHERE nid = :nid', array(':nid' => $node->nid))->fetchObject(); 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 own 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->filepath, 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->filename)), t('File %filepath was not allowed to be uploaded', array('%filepath' => $text_file->filepath))); $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]->filepath; $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)->filepath; $admin_user = $this->drupalCreateUser(array('administer site configuration')); $web_user = $this->drupalCreateUser(array('access content', 'edit own 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 verify. */ function checkUploadedFile($filename) { global $base_url; $file = file_directory_path() . '/' . $filename; $this->drupalGet(file_create_url($file), array('external' => TRUE)); $this->assertResponse(array(200), 'Uploaded ' . $filename . ' is accessible.'); $this->assertTrue(strpos($this->drupalGetHeader('Content-Type'), 'text/plain') === 0, t('MIME type is text/plain.')); $this->assertEqual(file_get_contents($file), $this->drupalGetContent(), 'Uploaded contents of ' . $filename . ' verified.'); // Verify file actually is readable and writeable by PHP. $this->assertTrue(is_readable($file), t('Uploaded file is readable.')); $this->assertTrue(is_writeable($file), t('Uploaded file is writeable.')); } /** * Get the role id of the 'simpletest' role associated with a SimpleTest test user. * * @param object $user User object. * @return integer SimpleTest role id. */ function getSimpletestRoleId($user) { foreach ($user->roles as $rid => $role) { if (preg_match('/s\d+/', $role)) { return $rid; } } return NULL; } }