1.20.x file.test FileReplaceTestCase::testReplaceFile()

@todo Test image dimensions for an image field are reset when a file is replaced. @todo Test image styles are cleared when an image is updated.

File

modules/file/tests/file.test, line 2749
Tests for file.module.

Class

FileReplaceTestCase
Tests replacing the file associated with a file entity.

Code

function testReplaceFile() {
  // Select the first text test file to use.
  $file = $this->createFile(array('type' => 'document'));

  // Create a user with file edit permissions.
  $user = $this->backdropCreateUser(array('edit any document files'));
  // $this->backdropLogin($user); // Todo: check permissions.

  // Test that the Upload widget appears for a local file.
  $this->backdropGet('file/' . $file->fid . '/manage');
  $this->assertFieldByName('files[replace_upload]');

  // Test that file saves without uploading a file.
  $this->backdropPost(NULL, array(), t('Save'));
  $this->assertText(t('File: @file has been updated.', array('@file' => $file->filename)), 'File was updated without file upload.');

  // Get a text file to use as a replacement.
  $original = clone $file;
  $replacement = $this->getTestFile('text');

  // Test that the file saves when uploading a replacement file.
  $edit = array();
  $edit['files[replace_upload]'] = backdrop_realpath($replacement->uri);
  $this->backdropPost('file/' . $file->fid . '/manage', $edit, t('Save'));
  $this->assertText(t('File: @file has been updated.', array('@file' => $file->filename)), 'File was updated with file upload.');

  // Re-load the file from the database.
  $file = file_load($file->fid);

  // Test how file properties changed after the file has been replaced.
  $this->assertEqual($file->filename, $original->filename, 'Updated file name did not change.');
  $this->assertNotEqual($file->filesize, $original->filesize, 'Updated file size changed from previous file.');
  $this->assertEqual($file->filesize, $replacement->filesize, 'Updated file size matches uploaded file.');
  $this->assertEqual(file_get_contents($file->uri), file_get_contents($replacement->uri), 'Updated file contents matches uploaded file.');
  $this->assertFalse(entity_load('file', FALSE, array('status' => 0)), 'Temporary file used for replacement was deleted.');

  // Get an image file.
  $image = $this->getTestFile('image');
  $edit['files[replace_upload]'] = backdrop_realpath($image->uri);

  // Test that validation works by uploading a non-text file as a replacement.
  $this->backdropPost('file/' . $file->fid . '/manage', $edit, t('Save'));
  $this->assertRaw(t('The specified file %file could not be uploaded. Only files with the following extensions are allowed:', array('%file' => $image->filename)), 'File validation works, upload failed correctly.');

  // Create a non-local file record.
  $file2 = new stdClass();
  $file2->uri = 'oembed://' . $this->randomName();
  $file2->filename = backdrop_basename($file2->uri);
  $file2->filemime = 'image/oembed';
  $file2->type = 'image';
  $file2->uid = 1;
  $file2->timestamp = REQUEST_TIME;
  $file2->filesize = 0;
  $file2->status = 0;
  // Write the record directly rather than calling file_save() so we don't
  // invoke the hooks.
  $this->assertTrue(backdrop_write_record('file_managed', $file2), 'Non-local file was added to the database.');

  // Test that Upload widget does not appear for non-local file.
  $this->backdropGet('file/' . $file2->fid . '/manage');
  $this->assertNoFieldByName('files[replace_upload]');
}