view_mode_crop-1.0.x-dev/tests/src/Functional/CropImageHelperTest.php

tests/src/Functional/CropImageHelperTest.php
<?php

namespace Drupal\Tests\view_mode_crop\Functional;

use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\image\Entity\ImageStyle;
use Drupal\media\Entity\Media;
use Drupal\node\Entity\Node;
use Drupal\Tests\media\Functional\MediaFunctionalTestBase;
use Drupal\view_mode_crop\ViewModeCropData;

/**
 * Tests the image ViewModeCropMediaLibraryWidget field widget.
 *
 * @group view_mode_crop
 * @requires module webp
 */
class CropImageHelperTest extends MediaFunctionalTestBase {

  /**
   * {@inheritdoc}
   */
  protected $defaultTheme = 'stable';

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'media_library',
    'node',
    'media',
    'text',
    'view_mode_crop',
    'webp',
  ];

  /**
   * PNG image.
   *
   * @var \Drupal\file\FileInterface
   */
  protected $publicPngFile;

  /**
   * Other PNG image.
   *
   * @var \Drupal\file\FileInterface
   */
  protected $otherPublicPngFile;

  /**
   * Test media.
   *
   * @var \Drupal\media\MediaInterface
   */
  protected $media;

  /**
   * Other test media.
   *
   * @var \Drupal\media\MediaInterface
   */
  protected $otherMedia;

  /**
   * Media type image view display.
   *
   * @var \Drupal\Core\Entity\Display\EntityViewDisplayInterface
   */
  protected $mediaTypeImageViewDisplay;

  /**
   * The node entity view display.
   *
   * @var \Drupal\Core\Entity\Display\EntityViewDisplayInterface
   */
  protected $display;

  /**
   * The renderer.
   *
   * @var \Drupal\Core\Render\RendererInterface
   */
  protected $renderer;

  /**
   * {@inheritDoc}
   */
  protected function setUp(): void {
    parent::setUp();
    $this->drupalCreateContentType(['type' => 'article']);
    $user = $this->drupalCreateUser([
      'access media overview',
      'create article content',
      'edit any article content',
      'delete any article content',
    ]);
    $media_type_image = $this->createMediaType('image', [
      'id' => 'image',
      'label' => 'Image',
    ]);

    /** @var \Drupal\file\FileRepositoryInterface $file_repository */
    $file_repository = $this->container->get('file.repository');
    $this->publicPngFile = $file_repository->writeData(file_get_contents(__DIR__ . '/assets/test.png'), 'public://test.png');
    $this->otherPublicPngFile = $file_repository->writeData(file_get_contents(__DIR__ . '/assets/test.png'), 'public://other-test.png');
    $this->media = Media::create([
      'bundle' => 'image',
      'name' => 'Public png image',
      'field_media_image' => [
        [
          'target_id' => $this->publicPngFile->id(),
          'alt' => 'default alt',
          'title' => 'default title',
        ],
      ],
    ]);
    $this->media->save();

    $this->otherMedia = Media::create([
      'bundle' => 'image',
      'name' => 'Other public png image',
      'field_media_image' => [
        [
          'target_id' => $this->otherPublicPngFile->id(),
          'alt' => 'default alt',
          'title' => 'default title',
        ],
      ],
    ]);
    $this->otherMedia->save();

    FieldStorageConfig::create([
      'field_name' => 'field_media',
      'entity_type' => 'node',
      'type' => 'entity_reference',
      'settings' => [
        'target_type' => 'media',
      ],
      'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
    ])->save();

    $field_config = FieldConfig::create([
      'field_name' => 'field_media',
      'label' => 'field_media',
      'entity_type' => 'node',
      'bundle' => 'article',
      'required' => FALSE,
      'settings' => [
        'handler_settings' => [
          'target_bundles' => [
            $media_type_image->id() => $media_type_image->id(),
          ],
        ],
      ],
    ]);
    $field_config->save();

    FieldStorageConfig::create([
      'entity_type' => 'node',
      'field_name' => 'field_public_image',
      'type' => 'image',
      'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
      'settings' => [
        'uri_scheme' => 'public',
      ],
    ])->save();
    FieldConfig::create([
      'entity_type' => 'node',
      'field_name' => 'field_public_image',
      'bundle' => 'article',
      'settings' => [
        'file_extensions' => 'png',
      ],
    ])->save();

    /**
     * @var \Drupal\Core\Entity\EntityDisplayRepositoryInterface $display_repository
     */
    $display_repository = \Drupal::service('entity_display.repository');
    $display_repository->getFormDisplay('node', 'article')
      ->setComponent('field_media', [
        'type' => 'media_library_widget',
        'settings' => [],
      ])
      ->save();
    $this->display = $display_repository->getViewDisplay('node', 'article');

    $this->display->setComponent('field_media', [
      'type' => 'entity_reference_entity_view',
      'settings' => [
        'view_mode' => 'full',
      ],
    ])->setComponent('field_public_image', [
      'type' => 'view_mode_crop_image_url',
      'label' => 'hidden',
      'settings' => [
        'image_style' => '',
      ],
    ])->save();

    $this->mediaTypeImageViewDisplay = $display_repository->getViewDisplay('media', 'image', 'full');
    $this->mediaTypeImageViewDisplay->setComponent('field_media_image', [
      'type' => 'view_mode_crop_image_url',
    ])->save();

    $this->drupalLogin($user);

    $this->renderer = $this->container->get('renderer');
  }

  /**
   * TestGetUri.
   */
  public function testGetUri(): void {
    $crop_data = [
      'default' => new ViewModeCropData('default', 'default', 100, 100, 100, 100),
    ];
    $entity = Node::create([
      'title' => $this->randomMachineName(),
      'type' => 'article',
      'field_public_image' => [
        0 => [
          'target_id' => $this->publicPngFile->id(),
          'view_mode_crop' => json_encode($crop_data),
        ],
        1 => [
          'target_id' => $this->otherPublicPngFile->id(),
          'view_mode_crop' => json_encode($crop_data),
        ],
      ],
      'field_media' => [
        0 => [
          'target_id' => $this->media->id(),
          'view_mode_crop' => json_encode($crop_data),
        ],
        1 => [
          'target_id' => $this->otherMedia->id(),
          'view_mode_crop' => json_encode($crop_data),
        ],
      ],
    ]);
    $entity->save();

    $build = $this->display->build($entity);

    $this->assertStringContainsString('files/crop/node/' . $entity->id() . '/field_public_image/0/default/test.png', $this->renderer->renderPlain($build['field_public_image'][0]));
    $this->assertStringContainsString('files/crop/node/' . $entity->id() . '/field_public_image/1/default/other-test.png', $this->renderer->renderPlain($build['field_public_image'][1]));

    $this->assertStringContainsString('files/crop/node/' . $entity->id() . '/field_media/0/default/test.png', $this->renderer->renderPlain($build['field_media'][0]));
    $this->assertStringContainsString('files/crop/node/' . $entity->id() . '/field_media/1/default/other-test.png', $this->renderer->renderPlain($build['field_media'][1]));
  }

  /**
   * TestGetUriReferencingSameEntities.
   */
  public function testGetUriReferencingSameEntities(): void {
    $crop_data = [
      'default' => new ViewModeCropData('default', 'default', 100, 100, 100, 100),
    ];
    $entity = Node::create([
      'title' => $this->randomMachineName(),
      'type' => 'article',
      'field_public_image' => [
        0 => [
          'target_id' => $this->publicPngFile->id(),
          'view_mode_crop' => json_encode($crop_data),
        ],
        1 => [
          'target_id' => $this->publicPngFile->id(),
          'view_mode_crop' => json_encode($crop_data),
        ],
      ],
      'field_media' => [
        0 => [
          'target_id' => $this->media->id(),
          'view_mode_crop' => json_encode($crop_data),
        ],
        1 => [
          'target_id' => $this->media->id(),
          'view_mode_crop' => json_encode($crop_data),
        ],
      ],
    ]);
    $entity->save();

    $build = $this->display->build($entity);

    $rendered = $this->renderer->renderRoot($build);

    $this->assertStringContainsString('files/crop/node/' . $entity->id() . '/field_public_image/0/default/test.png', $rendered);
    $this->assertStringContainsString('files/crop/node/' . $entity->id() . '/field_public_image/1/default/test.png', $rendered);

    $this->assertStringContainsString('files/crop/node/' . $entity->id() . '/field_media/0/default/test.png', $rendered);
    $this->assertStringContainsString('files/crop/node/' . $entity->id() . '/field_media/1/default/test.png', $rendered);
  }

  /**
   * TestImageStyleDerivatesCleared.
   */
  public function testImageStyleDerivatesCleared(): void {
    $this->display->setComponent('field_public_image', [
      'type' => 'view_mode_crop_image',
      'label' => 'hidden',
      'settings' => [
        'image_style' => 'large',
      ],
    ])->save();

    $crop_data = [
      'default' => new ViewModeCropData('default', 'default', 100, 100, 100, 100),
    ];
    $entity = Node::create([
      'title' => $this->randomMachineName(),
      'type' => 'article',
      'field_public_image' => [
        0 => [
          'target_id' => $this->publicPngFile->id(),
          'view_mode_crop' => json_encode($crop_data),
        ],
      ],
    ]);
    $entity->save();

    $build = $this->display->build($entity);

    $rendered = $this->renderer->renderRoot($build);

    /**
     * @var \Drupal\image\ImageStyleInterface $image_style
     */
    $image_style = ImageStyle::load('large');

    /**
     * @var \Drupal\webp\Webp $webp
     */
    $webp = \Drupal::service('webp.webp');

    $crop_uri = 'crop-public://node/' . $entity->id() . '/field_public_image/0/default/test.png';
    $crop_uri_webp = $webp->getWebpSrcset($crop_uri);
    $image_style_uri = $image_style->buildUri($crop_uri);
    $image_style_uri_webp = $webp->getWebpSrcset($image_style_uri);
    $image_style->createDerivative($crop_uri, $image_style_uri);

    $this->assertStringContainsString('files/styles/large/crop-public/node/' . $entity->id() . '/field_public_image/0/default/test.png', $rendered);

    $this->assertTrue(file_exists($crop_uri));
    $this->assertTrue(file_exists($image_style_uri));
    $this->assertFalse(file_exists($crop_uri_webp));
    $this->assertFalse(file_exists($image_style_uri_webp));

    // Assume webp generated its derivates.
    copy($crop_uri, $crop_uri_webp);
    copy($image_style_uri, $image_style_uri_webp);

    $this->assertTrue(file_exists($crop_uri_webp));
    $this->assertTrue(file_exists($image_style_uri_webp));

    // Remove the cropped file.
    unlink($crop_uri);
    clearstatcache(TRUE, $crop_uri);

    // File_exists will recreate $crop_uri and should remove all derivates.
    $this->assertTrue(file_exists($crop_uri));
    $this->assertFalse(file_exists($image_style_uri));
    $this->assertFalse(file_exists($crop_uri_webp));
    $this->assertFalse(file_exists($image_style_uri_webp));
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc