Mercurial > hg > isophonics-drupal-site
diff core/modules/image/src/Tests/ImageThemeFunctionTest.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/modules/image/src/Tests/ImageThemeFunctionTest.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,221 @@ +<?php + +namespace Drupal\image\Tests; + +use Drupal\Core\Field\FieldStorageDefinitionInterface; +use Drupal\Core\Url; +use Drupal\entity_test\Entity\EntityTest; +use Drupal\field\Entity\FieldConfig; +use Drupal\file\Entity\File; +use Drupal\image\Entity\ImageStyle; +use Drupal\simpletest\WebTestBase; +use Drupal\field\Entity\FieldStorageConfig; + +/** + * Tests image theme functions. + * + * @group image + */ +class ImageThemeFunctionTest extends WebTestBase { + + /** + * Modules to enable. + * + * @var array + */ + public static $modules = ['image', 'entity_test']; + + /** + * Created file entity. + * + * @var \Drupal\file\Entity\File + */ + protected $image; + + /** + * @var \Drupal\Core\Image\ImageFactory + */ + protected $imageFactory; + + protected function setUp() { + parent::setUp(); + + FieldStorageConfig::create([ + 'entity_type' => 'entity_test', + 'field_name' => 'image_test', + 'type' => 'image', + 'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED, + ])->save(); + FieldConfig::create([ + 'entity_type' => 'entity_test', + 'field_name' => 'image_test', + 'bundle' => 'entity_test', + ])->save(); + file_unmanaged_copy(\Drupal::root() . '/core/misc/druplicon.png', 'public://example.jpg'); + $this->image = File::create([ + 'uri' => 'public://example.jpg', + ]); + $this->image->save(); + $this->imageFactory = $this->container->get('image.factory'); + } + + /** + * Tests usage of the image field formatters. + */ + public function testImageFormatterTheme() { + /** @var \Drupal\Core\Render\RendererInterface $renderer */ + $renderer = $this->container->get('renderer'); + + // Create an image. + $files = $this->drupalGetTestFiles('image'); + $file = reset($files); + $original_uri = file_unmanaged_copy($file->uri, 'public://', FILE_EXISTS_RENAME); + + // Create a style. + $style = ImageStyle::create(['name' => 'test', 'label' => 'Test']); + $style->save(); + $url = file_url_transform_relative($style->buildUrl($original_uri)); + + // Create a test entity with the image field set. + $entity = EntityTest::create(); + $entity->image_test->target_id = $this->image->id(); + $entity->image_test->alt = NULL; + $entity->image_test->uri = $original_uri; + $image = $this->imageFactory->get('public://example.jpg'); + $entity->save(); + + // Create the base element that we'll use in the tests below. + $path = $this->randomMachineName(); + $base_element = [ + '#theme' => 'image_formatter', + '#image_style' => 'test', + '#item' => $entity->image_test, + '#url' => Url::fromUri('base:' . $path), + ]; + + // Test using theme_image_formatter() with a NULL value for the alt option. + $element = $base_element; + $this->setRawContent($renderer->renderRoot($element)); + $elements = $this->xpath('//a[@href=:path]/img[@class="image-style-test" and @src=:url and @width=:width and @height=:height]', [':path' => base_path() . $path, ':url' => $url, ':width' => $image->getWidth(), ':height' => $image->getHeight()]); + $this->assertEqual(count($elements), 1, 'theme_image_formatter() correctly renders with a NULL value for the alt option.'); + + // Test using theme_image_formatter() without an image title, alt text, or + // link options. + $element = $base_element; + $element['#item']->alt = ''; + $this->setRawContent($renderer->renderRoot($element)); + $elements = $this->xpath('//a[@href=:path]/img[@class="image-style-test" and @src=:url and @width=:width and @height=:height and @alt=""]', [':path' => base_path() . $path, ':url' => $url, ':width' => $image->getWidth(), ':height' => $image->getHeight()]); + $this->assertEqual(count($elements), 1, 'theme_image_formatter() correctly renders without title, alt, or path options.'); + + // Link the image to a fragment on the page, and not a full URL. + $fragment = $this->randomMachineName(); + $element = $base_element; + $element['#url'] = Url::fromRoute('<none>', [], ['fragment' => $fragment]); + $this->setRawContent($renderer->renderRoot($element)); + $elements = $this->xpath('//a[@href=:fragment]/img[@class="image-style-test" and @src=:url and @width=:width and @height=:height and @alt=""]', [ + ':fragment' => '#' . $fragment, + ':url' => $url, + ':width' => $image->getWidth(), + ':height' => $image->getHeight() + ]); + $this->assertEqual(count($elements), 1, 'theme_image_formatter() correctly renders a link fragment.'); + } + + /** + * Tests usage of the image style theme function. + */ + public function testImageStyleTheme() { + /** @var \Drupal\Core\Render\RendererInterface $renderer */ + $renderer = $this->container->get('renderer'); + + // Create an image. + $files = $this->drupalGetTestFiles('image'); + $file = reset($files); + $original_uri = file_unmanaged_copy($file->uri, 'public://', FILE_EXISTS_RENAME); + + // Create a style. + $style = ImageStyle::create(['name' => 'image_test', 'label' => 'Test']); + $style->save(); + $url = file_url_transform_relative($style->buildUrl($original_uri)); + + // Create the base element that we'll use in the tests below. + $base_element = [ + '#theme' => 'image_style', + '#style_name' => 'image_test', + '#uri' => $original_uri, + ]; + + $element = $base_element; + $this->setRawContent($renderer->renderRoot($element)); + $elements = $this->xpath('//img[@class="image-style-image-test" and @src=:url and @alt=""]', [':url' => $url]); + $this->assertEqual(count($elements), 1, 'theme_image_style() renders an image correctly.'); + + // Test using theme_image_style() with a NULL value for the alt option. + $element = $base_element; + $element['#alt'] = NULL; + $this->setRawContent($renderer->renderRoot($element)); + $elements = $this->xpath('//img[@class="image-style-image-test" and @src=:url]', [':url' => $url]); + $this->assertEqual(count($elements), 1, 'theme_image_style() renders an image correctly with a NULL value for the alt option.'); + } + + /** + * Tests image alt attribute functionality. + */ + public function testImageAltFunctionality() { + /** @var \Drupal\Core\Render\RendererInterface $renderer */ + $renderer = $this->container->get('renderer'); + + // Test using alt directly with alt attribute. + $image_with_alt_property = [ + '#theme' => 'image', + '#uri' => '/core/themes/bartik/logo.svg', + '#alt' => 'Regular alt', + '#title' => 'Test title', + '#width' => '50%', + '#height' => '50%', + '#attributes' => ['class' => 'image-with-regular-alt', 'id' => 'my-img'], + ]; + + $this->setRawContent($renderer->renderRoot($image_with_alt_property)); + $elements = $this->xpath('//img[contains(@class, class) and contains(@alt, :alt)]', [":class" => "image-with-regular-alt", ":alt" => "Regular alt"]); + $this->assertEqual(count($elements), 1, 'Regular alt displays correctly'); + + // Test using alt attribute inside attributes. + $image_with_alt_attribute_alt_attribute = [ + '#theme' => 'image', + '#uri' => '/core/themes/bartik/logo.svg', + '#width' => '50%', + '#height' => '50%', + '#attributes' => [ + 'class' => 'image-with-attribute-alt', + 'id' => 'my-img', + 'title' => 'New test title', + 'alt' => 'Attribute alt', + ], + ]; + + $this->setRawContent($renderer->renderRoot($image_with_alt_attribute_alt_attribute)); + $elements = $this->xpath('//img[contains(@class, class) and contains(@alt, :alt)]', [":class" => "image-with-attribute-alt", ":alt" => "Attribute alt"]); + $this->assertEqual(count($elements), 1, 'Attribute alt displays correctly'); + + // Test using alt attribute as property and inside attributes. + $image_with_alt_attribute_both = [ + '#theme' => 'image', + '#uri' => '/core/themes/bartik/logo.svg', + '#width' => '50%', + '#height' => '50%', + '#alt' => 'Kitten sustainable', + '#attributes' => [ + 'class' => 'image-with-attribute-alt', + 'id' => 'my-img', + 'title' => 'New test title', + 'alt' => 'Attribute alt', + ], + ]; + + $this->setRawContent($renderer->renderRoot($image_with_alt_attribute_both)); + $elements = $this->xpath('//img[contains(@class, class) and contains(@alt, :alt)]', [":class" => "image-with-attribute-alt", ":alt" => "Attribute alt"]); + $this->assertEqual(count($elements), 1, 'Attribute alt overrides alt property if both set.'); + } + +}