'Image functionality',
'description' => 'Test Image module functionality.',
'group' => 'Image',
);
}
function setUp() {
parent::setUp('image');
// User to create images.
$this->web_user = $this->drupalCreateUser(array('create images', 'view original images', 'edit own images', 'edit any images',
'delete own images', 'delete any images', 'administer site configuration'));
$this->drupalLogin($this->web_user);
// Uploadable image.
$this->image = 'misc/druplicon.png';
$this->another_image = 'misc/throbber.gif';
// Set small dimensions for testing scale so $this->image is small enough.
$image_sizes = image_get_sizes();
$image_sizes['_original']['operation'] = 'scale';
$image_sizes['thumbnail']['operation'] = 'scale';
$image_sizes['thumbnail']['width'] = 5;
$image_sizes['thumbnail']['height'] = 5;
$image_sizes['preview']['operation'] = 'scale';
$image_sizes['preview']['width'] = 10;
$image_sizes['preview']['height'] = 10;
variable_set('image_sizes', $image_sizes);
}
/**
* Clean-up temporary files.
*
* @see system_cron()
*
* @todo This lets SimpleTest die for any reason.
*/
function __tearDown() {
$result = db_query('SELECT * FROM {files} WHERE status = %d', FILE_STATUS_TEMPORARY);
while ($file = db_fetch_object($result)) {
if (file_exists($file->filepath)) {
// If files that exist cannot be deleted, continue so the database remains
// consistent.
if (!file_delete($file->filepath)) {
$this->error(t('Could not delete temporary file "%path" during garbage collection', array('%path' => $file->filepath)));
continue;
}
}
db_query('DELETE FROM {files} WHERE fid = %d', $file->fid);
}
}
/**
* Verify creating/displaying/editing/deleting image nodes.
*/
function testImageNode() {
// Create an image.
$edit = array(
'title' => $this->randomName(),
'body' => $this->randomName(),
'files[image]' => realpath($this->image),
);
$this->drupalPost('node/add/image', $edit, t('Save'));
$this->assertRaw(t('@type %title has been created.', array('@type' => 'Image', '%title' => $edit['title'])), t('Image node was created.'));
$node = node_load(array('title' => $edit['title']));
$this->assertTrue($node, t('Image node is found in database.'));
// Display an image.
$this->drupalGet('node/' . $node->nid, array('query' => 'size=_original'));
$this->assertPattern('@]+?' . $node->images['_original'] . '[^>]+?>@', t('Original image displayed on the page.'));
$this->assertTrue(file_exists($node->images['_original']), t('Original image exists.'));
$this->drupalGet('node/' . $node->nid);
$this->assertPattern('@]+?' . $node->images['preview'] . '[^>]+?>@', t('Image preview displayed on the page.'));
$this->assertTrue(file_exists($node->images['preview']), t('Image preview exists.'));
$this->drupalGet('node/' . $node->nid, array('query' => 'size=thumbnail'));
$this->assertPattern('@]+?' . $node->images['thumbnail'] . '[^>]+?>@', t('Image thumbnail displayed on the page.'));
$this->assertTrue(file_exists($node->images['thumbnail']), t('Image thumbnail exists.'));
// Promote the node so we can test the thumbnail appears in the teaser.
$node->promote = TRUE;
node_save($node);
$this->drupalGet('node');
$this->assertPattern('@]+?' . $node->images['thumbnail'] . '[^>]+?>@', t('Image thumbnail displayed on the front page teaser.'));
// Edit an image.
$another_edit = array(
'title' => $edit['title'],
'files[image]' => realpath($this->another_image),
);
$this->drupalPost('node/' . $node->nid . '/edit', $another_edit, t('Save'));
$another_node = node_load(array('title' => $edit['title']));
$this->assertFalse(file_exists($node->images['preview']) || file_exists($node->images['_original']) || file_exists($node->images['thumbnail']), t('Previous image derivative files were deleted.'));
// Delete an image.
$this->drupalPost('node/' . $node->nid . '/delete', array(), t('Delete'));
$this->assertRaw(t('@type %title has been deleted.', array('@type' => 'Image', '%title' => $edit['title'])), t('Image node was deleted.'));
$node = node_load(array('title' => $edit['title']));
$this->assertFalse($node, t('Image node is not found in database.'));
$this->assertFalse(file_exists($another_node->images['preview']) || file_exists($another_node->images['_original']) || file_exists($another_node->images['thumbnail']), t('Image file was deleted.'));
}
/**
* Verify that images cannot be created without a file.
*/
function testImageNodeValidation() {
// Create an image node without image file.
$edit = array(
'title' => $this->randomName(),
'body' => $this->randomName(),
);
$this->drupalPost('node/add/image', $edit, t('Save'));
$this->assertRaw(t('You must upload an image.'), t('Refused node creation without image.'));
$node = node_load(array('title' => $edit['title']));
$this->assertFalse($node, t('Image node is not found in database.'));
}
/**
* Verify image previews and proper submission.
*/
function testImageNodePreview() {
// Setup POST data for image.
$edit = array(
'title' => $this->randomName(),
'body' => $this->randomName(),
'files[image]' => realpath($this->image),
);
// Preview image node.
$this->drupalGet('node/add/image');
$this->drupalPost(NULL, $edit, t('Preview'));
// Save image node preview as is.
$this->drupalPost(NULL, NULL, t('Save'));
// Verify image node was properly created.
$node = node_load(array('title' => $edit['title']));
$this->assertTrue($node, t('Image node is found in database.'));
$this->assertTrue(file_exists($node->images['_original']), t('Original image exists.'));
$filename = preg_replace('/_[^\.]+/', '', basename($node->images['_original']));
$this->assertTrue($filename == basename($this->image), t('Image file was properly stored.'));
}
/**
* Verify that images can be created in parallel (session handling).
*
* @todo Doesn't look valid. Can SimpleTest support this at all?
* @todo testImageCreateNodeFrom() fails is this test is run.
*/
function __testImageNodeValidationAsync() {
// Setup POST data for first image.
$edit1 = array(
'title' => $this->randomName(),
'body' => $this->randomName(),
'files[image]' => realpath($this->image),
);
// Setup POST data for second image.
$edit2 = array(
'title' => $this->randomName(),
'body' => $this->randomName(),
'files[image]' => realpath($this->another_image),
);
// Preview the first image node.
$this->drupalGet('node/add/image');
$this->drupalPost(NULL, $edit1, t('Preview'));
// Preview the second image node.
$this->drupalGet('node/add/image');
$this->drupalPost(NULL, $edit2, t('Preview'));
// Save the first image node.
$this->drupalPost(NULL, $edit1, t('Save'));
// Save the second image node.
$this->drupalPost('node/add/image', $edit2, t('Save'));
// Verify first image node contains the first image.
$node = node_load(array('title' => $edit1['title']));
$filename = preg_replace('/_[^\.]+/', '', basename($node->images['_original']));
$this->assertTrue($filename == basename($this->image), t('First image was properly submitted.'));
// Verify second image node contains the second image.
$node = node_load(array('title' => $edit2['title']));
$filename = preg_replace('/_[^\.]+/', '', basename($node->images['_original']));
$this->assertTrue($filename == basename($this->another_image), t('Second image was properly submitted.'));
}
/**
* Verify derivatives take their path from the original image.
*/
function testImageDerivativePath() {
// Create an image.
$edit = array(
'title' => $this->randomName(),
'body' => $this->randomName(),
'files[image]' => realpath($this->image),
);
$this->drupalPost('node/add/image', $edit, t('Save'));
$this->assertRaw(t('@type %title has been created.', array('@type' => 'Image', '%title' => $edit['title'])),
t('Image node was created.'));
$node = node_load(array('title' => $edit['title']));
$this->assertTrue($node, t('Image node is found in database.'));
// Change the file path using admin form.
$config_change = array(
'image_default_path' => 'images_alternate',
);
$this->drupalPost('admin/settings/image', $config_change, t('Save configuration'));
$this->assertRaw(t('The configuration options have been saved.'), t('Image path was changed.'));
// Create another image.
$second_edit = array(
'title' => $this->randomName(),
'body' => $this->randomName(),
'files[image]' => realpath($this->another_image),
);
$this->drupalPost('node/add/image', $second_edit, t('Save'));
// Test that image node was created and that it has the correct path.
$this->assertRaw(t('@type %title has been created.', array('@type' => 'Image', '%title' => $second_edit['title'])),
t('Second image node was created.'));
$second_node = node_load(array('title' => $second_edit['title']));
$this->assertTrue($second_node, t('Second image node is found in database.'));
$this->assertTrue(preg_match('/images_alternate/', $second_node->images['_original']),
t("New path {$second_node->images['_original']} used for second image."));
// Delete physical files for first image's derivatives.
file_delete($node->images['preview']);
$this->assertFalse(file_exists($node->images['preview']), t('First image preview image file deleted.'));
file_delete($node->images['thumbnail']);
$this->assertFalse(file_exists($node->images['thumbnail']), t('First image thumbnail image file deleted.'));
// Edit the first image to rebuild derivatives.
$another_edit = array(
'rebuild_images' => TRUE,
);
$this->drupalPost('node/' . $node->nid . '/edit', $another_edit, t('Save'));
$this->assertRaw(t('@type %title has been updated.', array('@type' => 'Image', '%title' => $edit['title'])),
t('First image node was updated to rebuild derivatives.'));
// Reload first image node.
$first_node = node_load(array('title' => $edit['title']));
// Compare regenerated thumbnail paths with original node.
$this->assertTrue($node->images['thumbnail'] == $first_node->images['thumbnail'], t("Rebuilt derivatives for first image have same thumbnail path as original node: {$node->images['thumbnail']} == regenerated thumbnail path {$first_node->images['thumbnail']}"));
// Check regenerated files physically exist.
$this->assertTrue(file_exists($first_node->images['preview']), t('First image preview file exists.'));
$this->assertTrue(file_exists($first_node->images['thumbnail']), t('First image thumbnail file exists.'));
// Change the file path back using admin form.
$config_change = array(
'image_default_path' => 'images',
);
$this->drupalPost('admin/settings/image', $config_change, t('Save configuration'));
$this->assertRaw(t('The configuration options have been saved.'), t('Image path was changed back.'));
}
/**
* Verify that images with missing file information can be deleted from edit form.
*/
function testImageNodeDeletion() {
// Create an image.
$edit = array(
'title' => $this->randomName(),
'body' => $this->randomName(),
'files[image]' => realpath($this->image),
);
// Create image.
$this->drupalPost('node/add/image', $edit, t('Save'));
$this->assertRaw(t('@type %title has been created.', array('@type' => 'Image', '%title' => $edit['title'])), t('Image node was created.'));
$node = node_load(array('title' => $edit['title']));
$this->assertTrue($node, t('Image node is found in database.'));
// Remove {files} row to create corruption condition.
$this->assertTrue(db_query("DELETE f FROM {files} f INNER JOIN {image} i WHERE f.fid = i.fid AND i.nid = %d", $node->nid), t('Image file information was deleted.'));
$node = node_load(array('title' => $edit['title']));
$this->assertFalse(isset($node->images['_original']), t('Image file information is missing on re-loaded node.'));
$this->drupalPost('node/' . $node->nid . '/edit', array(), t('Delete'));
$this->assertRaw(t('Are you sure you want to delete %title?', array('%title' => $edit['title'])), t('Delete confirmation form is displayed.'));
$this->drupalPost(NULL, array(), t('Delete'));
$this->assertRaw(t('@type %title has been deleted.', array('@type' => 'Image', '%title' => $edit['title'])), t('Image node was deleted.'));
}
/**
* Verify image_create_node_from() works like regular image node creation.
*/
function testImageCreateNodeFrom() {
$edit = array(
'title' => $this->randomName(),
'body' => $this->randomName(),
'files[image]' => realpath($this->image),
);
$this->drupalPost('node/add/image', $edit, t('Save'));
$this->assertRaw(t('@type %title has been created.', array('@type' => 'Image', '%title' => $edit['title'])), t('Image created.'));
$node_post = node_load(array('title' => $edit['title']));
$this->assertTrue($node_post, t('Form created image node found in database.'));
// Copy the image, since image_create_node_from() deletes the original image.
file_copy($edit['files[image]'], file_directory_temp());
$node_api = image_create_node_from(file_directory_temp() . '/' . basename($edit['files[image]']), $edit['title'], $edit['body']);
$this->assertTrue(is_object($node_api) && $node_api->nid, t('API created image node found in database.'));
// Rebuild derivative images.
$node_api = node_load($node_api->nid, NULL, TRUE);
// Verify that both nodes are equal.
$equality = ($node_post->title == $node_api->title);
$this->assertTrue($equality, t('Image node titles are equal.'));
$equality = $equality && (strip_tags($node_post->body) == strip_tags($node_api->body));
$this->assertTrue($equality, t('Image node body texts are equal.'));
$equality = $equality && (filesize($node_post->images['_original']) == filesize($node_api->images['_original']));
$this->assertTrue($equality, t('Original images are equal.'));
/*
// These tests are temporarily commented out as they fail due to
// image_create_node_from() not creative derivatives.
// @see for details.
$equality = $equality && (filesize($node_post->images['preview']) == filesize($node_api->images['preview']));
$this->assertTrue($equality, t('Preview images are equal.'));
$equality = $equality && (filesize($node_post->images['thumbnail']) == filesize($node_api->images['thumbnail']));
$this->assertTrue($equality, t('Preview images are equal.'));
*/
}
}