acquia_dam-1.0.0-rc1/tests/src/Kernel/StreamWrapper/FocalPointIntegrationTest.php
tests/src/Kernel/StreamWrapper/FocalPointIntegrationTest.php
<?php
namespace Drupal\Tests\acquia_dam\StreamWrapper;
use Drupal\Core\Extension\ExtensionDiscovery;
use Drupal\image\Entity\ImageStyle;
use Drupal\media\Entity\Media;
use Drupal\media\MediaInterface;
use Drupal\Tests\acquia_dam\Kernel\AcquiaDamKernelTestBase;
/**
* Focal point integration test.
*
* @requires module focal_point
* @requires module crop
*
* @group acquia_dam
*/
class FocalPointIntegrationTest extends AcquiadamKernelTestBase {
/**
* {@inheritdoc}
*/
protected static $modules = [
'crop',
'focal_point',
];
/**
* {@inheritdoc}
*/
protected function setUp(): void {
parent::setUp();
$this->installEntitySchema('crop');
$this->installConfig(['focal_point']);
$this->grantDamDomain();
$this->setDamSiteToken();
}
/**
* Tests external url generation with focal point crop and scale effect.
*
* @param int $crop_width
* Crop width.
* @param int $crop_height
* Crop height.
* @param string $expected_string
* Expected query string.
*
* @testWith [200, 200, "?crop=yes&w=200&h=200"]
* [500, 500, "?crop=yes&w=500&h=500"]
* [100, 50, "?crop=yes&w=100&h=50"]
*
* @throws \Drupal\Core\Entity\EntityStorageException
*/
public function testFocalPointCropAndScale(int $crop_width, int $crop_height, string $expected_string): void {
$image_style = ImageStyle::create(['name' => 'test']);
$image_style->save();
$image_style_id = $image_style->id();
$effect = [
'id' => 'focal_point_scale_and_crop',
'data' => [
'width' => $crop_width,
'height' => $crop_height,
'crop_type' => 'focal_point',
],
];
$image_style->addImageEffect($effect);
$image_style->save();
$derivative_uri = $image_style->buildUri('acquia-dam://56ff14de-02cd-41b5-9a73-c917eab19abf');
self::assertEquals("acquia-dam://styles/$image_style_id/acquia-dam/56ff14de-02cd-41b5-9a73-c917eab19abf", $derivative_uri);
// Build uri attach the extension given in the image style into the URI.
self::assertEquals("acquia-dam://styles/$image_style_id/acquia-dam/56ff14de-02cd-41b5-9a73-c917eab19abf", $derivative_uri);
$wrapper = $this->container->get('stream_wrapper_manager')->getViaUri($derivative_uri);
self::assertEquals("https://laser.widen.net/content/kcnabdscl5/web/Wheel%20Illustration.ai$expected_string", $wrapper->getExternalUrl());
}
/**
* Tests external url generation with focal point crop effect.
*
* @param int $x
* The "x" value of crop position.
* @param int $y
* The "y" value of crop position.
* @param string $expected_string
* Expected query string.
* @param int $crop_width
* Crop width.
* @param int $crop_height
* Crop height.
*
* @dataProvider focalPointDataProvider
*
* @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
* @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
* @throws \Drupal\Core\Entity\EntityStorageException
*/
public function testFocalPointCropEffect(int $x, int $y, string $expected_string, int $crop_width, int $crop_height): void {
$image_style = ImageStyle::create(['name' => 'test']);
$image_style->save();
$image_style_id = $image_style->id();
$effect = [
'id' => 'focal_point_crop',
'data' => [
'width' => $crop_width,
'height' => $crop_height,
'crop_type' => 'focal_point',
],
];
$this->mockCropEntity($x, $y);
$image_style->addImageEffect($effect);
$image_style->save();
$derivative_uri = $image_style->buildUri('acquia-dam://56ff14de-02cd-41b5-9a73-c917eab19abf');
self::assertEquals("acquia-dam://styles/$image_style_id/acquia-dam/56ff14de-02cd-41b5-9a73-c917eab19abf", $derivative_uri);
// Build uri attach the extension given in the image style into the URI.
self::assertEquals("acquia-dam://styles/$image_style_id/acquia-dam/56ff14de-02cd-41b5-9a73-c917eab19abf", $derivative_uri);
$wrapper = $this->container->get('stream_wrapper_manager')->getViaUri($derivative_uri);
self::assertEquals("https://laser.widen.net/content/kcnabdscl5/web/Wheel%20Illustration.ai$expected_string", $wrapper->getExternalUrl());
}
/**
* Tests that a revision inherits existing crop entities.
*/
public function testCropCreatedForNewRevision() {
$image_style = ImageStyle::create(['name' => 'test']);
$image_style->save();
$effect = [
'id' => 'focal_point_crop',
'data' => [
'width' => 50,
'height' => 50,
'crop_type' => 'focal_point',
],
];
$image_style->addImageEffect($effect);
$image_style->save();
$media_type = $this->createImageMediaType();
$media = Media::create([
'bundle' => $media_type->id(),
'name' => 'Wheel Illustration.ai',
'acquia_dam_asset_id' => [
'asset_id' => '56ff14de-02cd-41b5-9a73-c917eab19abf',
'version_id' => '7b67948f-ee7e-405c-a0cd-344a24d8afb2',
],
]);
$media->save();
assert($media instanceof MediaInterface);
$image_style_helper = $this->container->get('acquia_dam.image_style_support');
$uri = $image_style_helper->buildUriForCrop(
$media->get('acquia_dam_asset_id')->asset_id,
$media->get('acquia_dam_asset_id')->version_id,
'test',
);
$image_style_helper->saveCropEntity(
80,
60,
$media,
$image_style->id()
);
$crop_storage = $this->container->get('entity_type.manager')->getStorage('crop');
self::assertEquals(
1,
$crop_storage->getQuery()
->accessCheck(FALSE)
->condition('uri', $uri)
->count()
->execute()
);
$this->container->get('cron')->run();
$media = $this->reloadEntity($media);
$updated_version_id = $media->get('acquia_dam_asset_id')->version_id;
self::assertEquals('9e4e810c-147b-4ac2-85a9-cf64f8fa61e0', $updated_version_id);
$new_version_uri = $image_style_helper->buildUriForCrop(
$media->get('acquia_dam_asset_id')->asset_id,
$media->get('acquia_dam_asset_id')->version_id,
'test',
);
self::assertEquals(
1,
$crop_storage->getQuery()
->accessCheck(FALSE)
->condition('uri', $new_version_uri)
->count()
->execute()
);
}
/**
* Tests the media edit form is altered to include the Focal Point element.
*/
public function testMediaEditForm(): void {
$this->installModule('jquery_ui');
// D9/D10 compatibility check for focal_point.
$listing = new ExtensionDiscovery($this->root);
$module_list = $listing->scan('module');
if (isset($module_list['jquery_ui_draggable'])) {
$this->installModule('jquery_ui_draggable');
}
// Requires date formats and media_library image style.
$this->installConfig(['system', 'media_library']);
$image_style = ImageStyle::create([
'name' => 'test',
'label' => 'Test image style',
]);
$image_style->save();
$effect = [
'id' => 'focal_point_crop',
'data' => [
'width' => 50,
'height' => 50,
'crop_type' => 'focal_point',
],
];
$image_style->addImageEffect($effect);
$image_style->save();
$media_type = $this->createImageMediaType();
$media = Media::create([
'bundle' => $media_type->id(),
'name' => 'Wheel Illustration.ai',
'acquia_dam_asset_id' => [
'asset_id' => '56ff14de-02cd-41b5-9a73-c917eab19abf',
'version_id' => '7b67948f-ee7e-405c-a0cd-344a24d8afb2',
],
]);
$media->save();
assert($media instanceof MediaInterface);
$image_style_helper = $this->container->get('acquia_dam.image_style_support');
$image_style_helper->saveCropEntity(
80,
60,
$media,
$image_style->id()
);
$this->drupalSetUpCurrentUser([], [], TRUE);
$request = $this->getMockedRequest($media->toUrl('edit-form')->toString(), 'GET');
$response = $this->processRequest($request);
self::assertEquals(200, $response->getStatusCode());
$this->assertText('Focal point selection for image style: Test image style');
$focal_point_elements = $this->cssSelect('[data-drupal-selector="edit-test-focal-point"]');
self::assertCount(1, $focal_point_elements);
$focal_point_element = $focal_point_elements[0];
self::assertEquals('80,60', $focal_point_element->attributes()->value[0]);
}
/**
* Data provider for testFocalPointIntegration().
*
* @phpstan-return \Generator<string, []>
*/
public static function focalPointDataProvider(): \Generator {
yield 'crop_middle' => [
80,
60,
'?crop=yes&w=50&h=50&a=55,35',
50,
50,
];
yield 'crop_middle_different_size' => [
80,
60,
'?crop=yes&w=70&h=30&a=45,45',
70,
30,
];
yield 'crop_top_left' => [
0,
0,
'?crop=yes&w=50&h=50&a=0,0',
50,
50,
];
yield 'crop_top_right' => [
157,
0,
'?crop=yes&w=50&h=50&a=107,0',
50,
50,
];
yield 'crop_bottom_left' => [
0,
120,
'?crop=yes&w=50&h=50&a=0,70',
50,
50,
];
yield 'crop_invalid' => [
0,
0,
'',
500,
500,
];
}
/**
* Creates a mock crop entity.
*
* @param int $x
* Crop height.
* @param int $y
* Crop width.
*
* @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
* @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
* @throws \Drupal\Core\Entity\EntityStorageException
*/
protected function mockCropEntity(int $x, int $y): void {
$values = [
'type' => 'focal_point',
'entity_type' => 'file',
'uri' => 'acquia-dam://styles/test/acquia-dam/56ff14de-02cd-41b5-9a73-c917eab19abf',
];
$crop = \Drupal::entityTypeManager()
->getStorage('crop')
->create($values);
$crop->setPosition($x, $y);
$crop->save();
}
}
