You are here

function FileFieldRevisionTestCase::testRevisions in FileField 6.3

Test creating multiple revisions of a node and managing the attached files.

Expected behaviors:

  • Adding a new revision will make another entry in the field table, but the original file will not be duplicated.
  • Deleting a revision should not delete the original file if the file is in use by another revision.
  • When the last revision that uses a file is deleted, the original file should be deleted also.

File

tests/filefield.test, line 212

Class

FileFieldRevisionTestCase
Test class to test file handling with node revisions.

Code

function testRevisions() {
  $field_name = 'field_' . strtolower($this
    ->randomName());
  $type = $this
    ->drupalCreateContentType();
  $field_options = array(
    'description_field' => '1',
  );
  $field = $this
    ->createFileField($field_name, $type->name, $field_options);
  $test_file = $this
    ->getTestFile('text');

  // Create a new node with the uploaded file.
  $nid = $this
    ->uploadNodeFile($test_file, $field, $type->name);

  // Check that the file exists on disk and in the database.
  $node = node_load($nid, NULL, TRUE);
  $node_file_r1 = $node->{$field['field_name']}[0];
  $node_vid_r1 = $node->vid;
  $this
    ->assertFileExists($node_file_r1, t('New file saved to disk on node creation.'));
  $this
    ->assertFileEntryExists($node_file_r1, t('File entry exists in database on node creation.'));

  // Upload another file to the same node in a new revision.
  $this
    ->replaceNodeFile($test_file, $field_name, $nid);
  $node = node_load($nid, NULL, TRUE);
  $node_file_r2 = $node->{$field['field_name']}[0];
  $node_vid_r2 = $node->vid;
  $this
    ->assertFileExists($node_file_r2, t('Replacement file exists on disk after creating new revision.'));
  $this
    ->assertFileEntryExists($node_file_r2, t('Replacement file entry exists in database after creating new revision.'));

  // Check that the original file is still in place on the first revision.
  $node = node_load($nid, $node_vid_r1, TRUE);
  $this
    ->assertEqual($node_file_r1, $node->{$field['field_name']}[0], t('Original file still in place after replacing file in new revision.'));
  $this
    ->assertFileExists($node_file_r1, t('Original file still in place after replacing file in new revision.'));
  $this
    ->assertFileEntryExists($node_file_r1, t('Original file entry still in place after replacing file in new revision'));

  // Save a new version of the node without any changes.
  // Check that the file is still the same as the previous revision.
  $this
    ->drupalPost('node/' . $nid . '/edit', array(
    'revision' => '1',
  ), t('Save'));
  $node = node_load($nid, NULL, TRUE);
  $node_file_r3 = $node->{$field['field_name']}[0];
  $node_vid_r3 = $node->vid;

  // FileField Meta's extensive meta data can be difficult to match up exactly
  // (mostly differences between strings and integers). Just compare the
  // descriptions.
  $node_file_r2['data'] = array(
    'description' => $node_file_r2['data']['description'],
  );
  $node_file_r3['data'] = array(
    'description' => $node_file_r3['data']['description'],
  );
  $this
    ->assertEqual($node_file_r2, $node_file_r3, t('Previous revision file still in place after creating a new revision without a new file.'));

  // Revert to the first revision and check that the original file is active.
  $this
    ->drupalPost('node/' . $nid . '/revisions/' . $node_vid_r1 . '/revert', array(), t('Revert'));
  $node = node_load($nid, NULL, TRUE);
  $node_file_r4 = $node->{$field['field_name']}[0];
  $node_vid_r4 = $node->vid;
  $this
    ->assertEqual($node_file_r1, $node_file_r4, t('Original revision file still in place after reverting to the original revision.'));

  // Delete the second revision and check that the file is kept (since it is
  // still being used by the third revision).
  $this
    ->drupalPost('node/' . $nid . '/revisions/' . $node_vid_r2 . '/delete', array(), t('Delete'));
  $this
    ->assertFileExists($node_file_r3, t('Second file is still available after deleting second revision, since it is being used by the third revision.'));
  $this
    ->assertFileEntryExists($node_file_r3, t('Second file entry is still available after deleting second revision, since it is being used by the third revision.'));

  // Delete the third revision and check that the file is deleted also.
  $this
    ->drupalPost('node/' . $nid . '/revisions/' . $node_vid_r3 . '/delete', array(), t('Delete'));
  $this
    ->assertFileNotExists($node_file_r3, t('Second file is now deleted after deleting third revision, since it is no longer being used by any other nodes.'));
  $this
    ->assertFileEntryNotExists($node_file_r3, t('Second file entry is now deleted after deleting third revision, since it is no longer being used by any other nodes.'));

  // Delete the entire node and check that the original file is deleted.
  $this
    ->drupalPost('node/' . $nid . '/delete', array(), t('Delete'));
  $this
    ->assertFileNotExists($node_file_r1, t('Original file is deleted after deleting the entire node with two revisions remaining.'));
  $this
    ->assertFileEntryNotExists($node_file_r1, t('Original file entry is deleted after deleting the entire node with two revisions remaining.'));
}