View source  
  <?php
class ImageTestCase extends DrupalWebTestCase {
  protected $web_user;
  protected $image;
  protected $another_image;
  function getInfo() {
    return array(
      'name' => t('Image functionality'),
      'description' => t('Test Image module functionality.'),
      'group' => t('Image'),
    );
  }
  function setUp() {
    parent::setUp('image');
    
    $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);
    
    $this->image = 'misc/druplicon.png';
    $this->another_image = 'misc/throbber.gif';
    
    $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);
  }
  
  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 (!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);
    }
  }
  
  function testImageNode() {
    
    $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.'));
    
    $this
      ->drupalGet('node/' . $node->nid, array(
      'query' => 'size=_original',
    ));
    $this
      ->assertPattern('@<img[^>]+?' . $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('@<img[^>]+?' . $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('@<img[^>]+?' . $node->images['thumbnail'] . '[^>]+?>@', t('Image thumbnail displayed on the page.'));
    $this
      ->assertTrue(file_exists($node->images['thumbnail']), t('Image thumbnail exists.'));
    
    $node->promote = TRUE;
    node_save($node);
    $this
      ->drupalGet('node');
    $this
      ->assertPattern('@<img[^>]+?' . $node->images['thumbnail'] . '[^>]+?>@', t('Image thumbnail displayed on the front page teaser.'));
    
    $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.'));
    
    $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.'));
  }
  
  function testImageNodeValidation() {
    
    $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.'));
  }
  
  function testImageNodePreview() {
    
    $edit = array(
      'title' => $this
        ->randomName(),
      'body' => $this
        ->randomName(),
      'files[image]' => realpath($this->image),
    );
    
    $this
      ->drupalGet('node/add/image');
    $this
      ->drupalPost(NULL, $edit, t('Preview'));
    
    $this
      ->drupalPost(NULL, NULL, t('Save'));
    
    $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.'));
  }
  
  function __testImageNodeValidationAsync() {
    
    $edit1 = array(
      'title' => $this
        ->randomName(),
      'body' => $this
        ->randomName(),
      'files[image]' => realpath($this->image),
    );
    
    $edit2 = array(
      'title' => $this
        ->randomName(),
      'body' => $this
        ->randomName(),
      'files[image]' => realpath($this->another_image),
    );
    
    $this
      ->drupalGet('node/add/image');
    $this
      ->drupalPost(NULL, $edit1, t('Preview'));
    
    $this
      ->drupalGet('node/add/image');
    $this
      ->drupalPost(NULL, $edit2, t('Preview'));
    
    $this
      ->drupalPost(NULL, $edit1, t('Save'));
    
    $this
      ->drupalPost('node/add/image', $edit2, t('Save'));
    
    $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.'));
    
    $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.'));
  }
  
  function testImageDerivativePath() {
    
    $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.'));
    
    $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.'));
    
    $second_edit = array(
      'title' => $this
        ->randomName(),
      'body' => $this
        ->randomName(),
      'files[image]' => realpath($this->another_image),
    );
    $this
      ->drupalPost('node/add/image', $second_edit, t('Save'));
    
    $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."));
    
    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.'));
    
    $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.'));
    
    $first_node = node_load(array(
      'title' => $edit['title'],
    ));
    
    $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']}"));
    
    $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.'));
    
    $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.'));
  }
  
  function testImageNodeDeletion() {
    
    $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.'));
    
    $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.'));
  }
  
  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.'));
    
    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.'));
    
    $node_api = node_load($node_api->nid, NULL, TRUE);
    
    $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.'));
    
  }
}