function ImageAdminStylesTest::testStyle

Same name and namespace in other branches
  1. 9 core/modules/image/tests/src/Functional/ImageAdminStylesTest.php \Drupal\Tests\image\Functional\ImageAdminStylesTest::testStyle()
  2. 8.9.x core/modules/image/tests/src/Functional/ImageAdminStylesTest.php \Drupal\Tests\image\Functional\ImageAdminStylesTest::testStyle()
  3. 10 core/modules/image/tests/src/Functional/ImageAdminStylesTest.php \Drupal\Tests\image\Functional\ImageAdminStylesTest::testStyle()

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

File

core/modules/image/tests/src/Functional/ImageAdminStylesTest.php, line 80

Class

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

Namespace

Drupal\Tests\image\Functional

Code

public function testStyle() : void {
  $admin_path = 'admin/config/media/image-styles';
  // Setup a style to be created and effects to add to it.
  $style_name = $this->randomMachineName(10);
  $style_label = $this->randomString();
  $style_path = $admin_path . '/manage/' . $style_name;
  $effect_edits = [
    'image_resize' => [
      'width' => 100,
      'height' => 101,
    ],
    'image_scale' => [
      'width' => 110,
      'height' => 111,
      'upscale' => 1,
    ],
    'image_scale_and_crop' => [
      'width' => 120,
      'height' => 121,
    ],
    'image_crop' => [
      'width' => 130,
      'height' => 131,
      'anchor' => 'left-top',
    ],
    'image_desaturate' => [],
    'image_rotate' => [
      'degrees' => 5,
      'random' => 1,
      'bgcolor' => '#FFFF00',
    ],
  ];
  // Add style form.
  $edit = [
    'name' => $style_name,
    'label' => $style_label,
  ];
  $this->drupalGet($admin_path . '/add');
  $this->submitForm($edit, 'Create new style');
  $this->assertSession()
    ->statusMessageContains("Style {$style_label} was created.", 'status');
  // Ensure that the expected entity operations are there.
  $this->drupalGet($admin_path);
  $this->assertSession()
    ->linkByHrefExists($style_path);
  $this->assertSession()
    ->linkByHrefExists($style_path . '/flush');
  $this->assertSession()
    ->linkByHrefExists($style_path . '/delete');
  // Add effect form.
  // Add each sample effect to the style.
  foreach ($effect_edits as $effect => $edit) {
    $edit_data = [];
    foreach ($edit as $field => $value) {
      $edit_data['data[' . $field . ']'] = $value;
    }
    // Add the effect.
    $this->drupalGet($style_path);
    $this->submitForm([
      'new' => $effect,
    ], 'Add');
    if (!empty($edit)) {
      $effect_label = \Drupal::service('plugin.manager.image.effect')->createInstance($effect)
        ->label();
      $this->assertSession()
        ->pageTextContains("Add {$effect_label} effect to style {$style_label}");
      $this->submitForm($edit_data, '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->assertEquals('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->toUrl()
    ->toString();
  $this->assertStringContainsString($style_path, $style_uri_path, 'The image style URI is correct.');
  // Confirm that all effects on the image style have settings that match
  // what was saved.
  $uuids = [];
  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->assertEquals($effect_configuration['data'][$field], $value, "The {$field} field in the {$effect->getPluginId()} effect has the correct value of {$value}.");
    }
  }
  // Assert that every effect was saved.
  foreach (array_keys($effect_edits) as $effect_name) {
    $this->assertTrue(isset($uuids[$effect_name]), "A {$effect_name} effect was saved with ID {$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 = $this->randomMachineName(10);
  $style_label = $this->randomMachineName();
  $weight = count($effect_edits);
  $edit = [
    '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->assertEquals(1, $this->getImageCount($style), "Image style {$style->label()} image {$image_path} successfully generated.");
  $this->drupalGet($style_path);
  $this->submitForm($edit, 'Save');
  // 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->assertSession()
    ->titleEquals("Edit style {$style_label} | Drupal");
  // Check that the available image effects are properly sorted.
  $option = $this->assertSession()
    ->selectExists('edit-new--2')
    ->findAll('css', 'option');
  $this->assertEquals('Ajax test', $option[1]->getText(), '"Ajax test" is the first selectable effect.');
  // 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->assertEquals(0, $this->getImageCount($style), "Image style {$style->label()} was flushed after renaming the style and updating the order of effects.");
  // 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->assertEquals(1, $this->getImageCount($style), "Image style {$style->label()} image {$image_path} successfully generated.");
  // Delete the 'image_crop' effect from the style.
  $this->drupalGet($style_path . '/effects/' . $uuids['image_crop'] . '/delete');
  $this->submitForm([], 'Delete');
  // Confirm that the form submission was successful.
  $this->assertSession()
    ->statusCodeEquals(200);
  $image_crop_effect = $style->getEffect($uuids['image_crop']);
  $this->assertSession()
    ->statusMessageContains("The image effect {$image_crop_effect->label()} has been deleted.", 'status');
  // Confirm that there is no longer a link to the effect.
  $this->assertSession()
    ->linkByHrefNotExists($style_path . '/effects/' . $uuids['image_crop'] . '/delete');
  // Refresh the image style information and verify that the effect was
  // actually deleted.
  $entity_type_manager = $this->container
    ->get('entity_type.manager');
  $style = $entity_type_manager->getStorage('image_style')
    ->loadUnchanged($style->id());
  $this->assertFalse($style->getEffects()
    ->has($uuids['image_crop']), "Effect with ID {$uuids['image_crop']} no longer found on image style {$style->label()}");
  // Additional test on Rotate effect, for transparent background.
  $edit = [
    'data[degrees]' => 5,
    'data[random]' => 0,
    'data[bgcolor]' => '',
  ];
  $this->drupalGet($style_path);
  $this->submitForm([
    'new' => 'image_rotate',
  ], 'Add');
  $this->submitForm($edit, 'Add effect');
  $entity_type_manager = $this->container
    ->get('entity_type.manager');
  $style = $entity_type_manager->getStorage('image_style')
    ->loadUnchanged($style_name);
  $this->assertCount(6, $style->getEffects(), 'Rotate effect with transparent background was added.');
  // Style deletion form.
  // Delete the style.
  $this->drupalGet($style_path . '/delete');
  $this->submitForm([], 'Delete');
  // Confirm the style directory has been removed.
  $directory = 'public://styles/' . $style_name;
  $this->assertDirectoryDoesNotExist($directory);
  $this->assertNull(ImageStyle::load($style_name), "Image style {$style->label()} successfully deleted.");
  // Test empty text when there are no image styles.
  // Delete all image styles.
  foreach (ImageStyle::loadMultiple() as $image_style) {
    $image_style->delete();
  }
  // Confirm that the empty text is correct on the image styles page.
  $this->drupalGet($admin_path);
  $this->assertSession()
    ->pageTextContains("There are currently no styles. Add a new one.");
  $this->assertSession()
    ->linkByHrefExists(Url::fromRoute('image.style_add')->toString());
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.