You are here

function ImageAdminStylesTest::testStyle in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 core/modules/image/src/Tests/ImageAdminStylesTest.php \Drupal\image\Tests\ImageAdminStylesTest::testStyle()

General test to add a style, add/remove/edit effects to it, then delete it.

File

core/modules/image/src/Tests/ImageAdminStylesTest.php, line 67
Contains \Drupal\image\Tests\ImageAdminStylesTest.

Class

ImageAdminStylesTest
Tests creation, deletion, and editing of image styles and effects.

Namespace

Drupal\image\Tests

Code

function testStyle() {
  $admin_path = 'admin/config/media/image-styles';

  // Setup a style to be created and effects to add to it.
  $style_name = strtolower($this
    ->randomMachineName(10));
  $style_label = $this
    ->randomString();
  $style_path = $admin_path . '/manage/' . $style_name;
  $effect_edits = array(
    'image_resize' => array(
      'width' => 100,
      'height' => 101,
    ),
    'image_scale' => array(
      'width' => 110,
      'height' => 111,
      'upscale' => 1,
    ),
    'image_scale_and_crop' => array(
      'width' => 120,
      'height' => 121,
    ),
    'image_crop' => array(
      'width' => 130,
      'height' => 131,
      'anchor' => 'left-top',
    ),
    'image_desaturate' => array(),
    'image_rotate' => array(
      'degrees' => 5,
      'random' => 1,
      'bgcolor' => '#FFFF00',
    ),
  );

  // Add style form.
  $edit = array(
    'name' => $style_name,
    'label' => $style_label,
  );
  $this
    ->drupalPostForm($admin_path . '/add', $edit, t('Create new style'));
  $this
    ->assertRaw(t('Style %name was created.', array(
    '%name' => $style_label,
  )));

  // Ensure that the expected entity operations are there.
  $this
    ->drupalGet($admin_path);
  $this
    ->assertLinkByHref($style_path);
  $this
    ->assertLinkByHref($style_path . '/flush');
  $this
    ->assertLinkByHref($style_path . '/delete');

  // Add effect form.
  // Add each sample effect to the style.
  foreach ($effect_edits as $effect => $edit) {
    $edit_data = array();
    foreach ($edit as $field => $value) {
      $edit_data['data[' . $field . ']'] = $value;
    }

    // Add the effect.
    $this
      ->drupalPostForm($style_path, array(
      'new' => $effect,
    ), t('Add'));
    if (!empty($edit)) {
      $this
        ->drupalPostForm(NULL, $edit_data, t('Add effect'));
    }
  }

  // Load the saved image style.
  $style = ImageStyle::load($style_name);

  // Ensure that third party settings were added to the config entity.
  // These are added by a hook_image_style_presave() implemented in
  // image_module_test module.
  $this
    ->assertEqual('bar', $style
    ->getThirdPartySetting('image_module_test', 'foo'), 'Third party settings were added to the image style.');

  // Ensure that the image style URI matches our expected path.
  $style_uri_path = $style
    ->url();
  $this
    ->assertTrue(strpos($style_uri_path, $style_path) !== FALSE, 'The image style URI is correct.');

  // Confirm that all effects on the image style have settings that match
  // what was saved.
  $uuids = array();
  foreach ($style
    ->getEffects() as $uuid => $effect) {

    // Store the uuid for later use.
    $uuids[$effect
      ->getPluginId()] = $uuid;
    $effect_configuration = $effect
      ->getConfiguration();
    foreach ($effect_edits[$effect
      ->getPluginId()] as $field => $value) {
      $this
        ->assertEqual($value, $effect_configuration['data'][$field], SafeMarkup::format('The %field field in the %effect effect has the correct value of %value.', array(
        '%field' => $field,
        '%effect' => $effect
          ->getPluginId(),
        '%value' => $value,
      )));
    }
  }

  // Assert that every effect was saved.
  foreach (array_keys($effect_edits) as $effect_name) {
    $this
      ->assertTrue(isset($uuids[$effect_name]), format_string('A %effect_name effect was saved with ID %uuid', array(
      '%effect_name' => $effect_name,
      '%uuid' => $uuids[$effect_name],
    )));
  }

  // Image style overview form (ordering and renaming).
  // Confirm the order of effects is maintained according to the order we
  // added the fields.
  $effect_edits_order = array_keys($effect_edits);
  $order_correct = TRUE;
  $index = 0;
  foreach ($style
    ->getEffects() as $effect) {
    if ($effect_edits_order[$index] != $effect
      ->getPluginId()) {
      $order_correct = FALSE;
    }
    $index++;
  }
  $this
    ->assertTrue($order_correct, 'The order of the effects is correctly set by default.');

  // Test the style overview form.
  // Change the name of the style and adjust the weights of effects.
  $style_name = strtolower($this
    ->randomMachineName(10));
  $style_label = $this
    ->randomMachineName();
  $weight = count($effect_edits);
  $edit = array(
    'name' => $style_name,
    'label' => $style_label,
  );
  foreach ($style
    ->getEffects() as $uuid => $effect) {
    $edit['effects[' . $uuid . '][weight]'] = $weight;
    $weight--;
  }

  // Create an image to make sure it gets flushed after saving.
  $image_path = $this
    ->createSampleImage($style);
  $this
    ->assertEqual($this
    ->getImageCount($style), 1, format_string('Image style %style image %file successfully generated.', array(
    '%style' => $style
      ->label(),
    '%file' => $image_path,
  )));
  $this
    ->drupalPostForm($style_path, $edit, t('Update style'));

  // Note that after changing the style name, the style path is changed.
  $style_path = 'admin/config/media/image-styles/manage/' . $style_name;

  // Check that the URL was updated.
  $this
    ->drupalGet($style_path);
  $this
    ->assertTitle(t('Edit style @name | Drupal', array(
    '@name' => $style_label,
  )));
  $this
    ->assertResponse(200, format_string('Image style %original renamed to %new', array(
    '%original' => $style
      ->id(),
    '%new' => $style_name,
  )));

  // Check that the image was flushed after updating the style.
  // This is especially important when renaming the style. Make sure that
  // the old image directory has been deleted.
  $this
    ->assertEqual($this
    ->getImageCount($style), 0, format_string('Image style %style was flushed after renaming the style and updating the order of effects.', array(
    '%style' => $style
      ->label(),
  )));

  // Load the style by the new name with the new weights.
  $style = ImageStyle::load($style_name);

  // Confirm the new style order was saved.
  $effect_edits_order = array_reverse($effect_edits_order);
  $order_correct = TRUE;
  $index = 0;
  foreach ($style
    ->getEffects() as $effect) {
    if ($effect_edits_order[$index] != $effect
      ->getPluginId()) {
      $order_correct = FALSE;
    }
    $index++;
  }
  $this
    ->assertTrue($order_correct, 'The order of the effects is correctly set by default.');

  // Image effect deletion form.
  // Create an image to make sure it gets flushed after deleting an effect.
  $image_path = $this
    ->createSampleImage($style);
  $this
    ->assertEqual($this
    ->getImageCount($style), 1, format_string('Image style %style image %file successfully generated.', array(
    '%style' => $style
      ->label(),
    '%file' => $image_path,
  )));

  // Delete the 'image_crop' effect from the style.
  $this
    ->drupalPostForm($style_path . '/effects/' . $uuids['image_crop'] . '/delete', array(), t('Delete'));

  // Confirm that the form submission was successful.
  $this
    ->assertResponse(200);
  $image_crop_effect = $style
    ->getEffect($uuids['image_crop']);
  $this
    ->assertRaw(t('The image effect %name has been deleted.', array(
    '%name' => $image_crop_effect
      ->label(),
  )));

  // Confirm that there is no longer a link to the effect.
  $this
    ->assertNoLinkByHref($style_path . '/effects/' . $uuids['image_crop'] . '/delete');

  // Refresh the image style information and verify that the effect was
  // actually deleted.
  $style = entity_load_unchanged('image_style', $style
    ->id());
  $this
    ->assertFalse($style
    ->getEffects()
    ->has($uuids['image_crop']), format_string('Effect with ID %uuid no longer found on image style %style', array(
    '%uuid' => $uuids['image_crop'],
    '%style' => $style
      ->label(),
  )));

  // Additional test on Rotate effect, for transparent background.
  $edit = array(
    'data[degrees]' => 5,
    'data[random]' => 0,
    'data[bgcolor]' => '',
  );
  $this
    ->drupalPostForm($style_path, array(
    'new' => 'image_rotate',
  ), t('Add'));
  $this
    ->drupalPostForm(NULL, $edit, t('Add effect'));
  $style = entity_load_unchanged('image_style', $style_name);
  $this
    ->assertEqual(count($style
    ->getEffects()), 6, 'Rotate effect with transparent background was added.');

  // Style deletion form.
  // Delete the style.
  $this
    ->drupalPostForm($style_path . '/delete', array(), t('Delete'));

  // Confirm the style directory has been removed.
  $directory = file_default_scheme() . '://styles/' . $style_name;
  $this
    ->assertFalse(is_dir($directory), format_string('Image style %style directory removed on style deletion.', array(
    '%style' => $style
      ->label(),
  )));
  $this
    ->assertFalse(ImageStyle::load($style_name), format_string('Image style %style successfully deleted.', array(
    '%style' => $style
      ->label(),
  )));
}