Version 1
[yaffs-website] / web / core / modules / image / tests / src / Kernel / Migrate / d6 / MigrateImageCacheTest.php
diff --git a/web/core/modules/image/tests/src/Kernel/Migrate/d6/MigrateImageCacheTest.php b/web/core/modules/image/tests/src/Kernel/Migrate/d6/MigrateImageCacheTest.php
new file mode 100644 (file)
index 0000000..d938140
--- /dev/null
@@ -0,0 +1,175 @@
+<?php
+
+namespace Drupal\Tests\image\Kernel\Migrate\d6;
+
+use Drupal\Core\Database\Database;
+use Drupal\image\Entity\ImageStyle;
+use Drupal\migrate\Plugin\MigrationInterface;
+use Drupal\migrate\Exception\RequirementsException;
+use Drupal\Tests\migrate_drupal\Kernel\d6\MigrateDrupal6TestBase;
+
+/**
+ * Tests migration of ImageCache presets to image styles.
+ *
+ * @group image
+ */
+class MigrateImageCacheTest extends MigrateDrupal6TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->installConfig(['image']);
+  }
+
+  /**
+   * Tests that an exception is thrown when ImageCache is not installed.
+   */
+  public function testMissingTable() {
+    $this->sourceDatabase->update('system')
+      ->fields([
+        'status' => 0,
+      ])
+      ->condition('name', 'imagecache')
+      ->condition('type', 'module')
+      ->execute();
+
+    try {
+      $this->getMigration('d6_imagecache_presets')
+        ->getSourcePlugin()
+        ->checkRequirements();
+      $this->fail('Did not catch expected RequirementsException.');
+    }
+    catch (RequirementsException $e) {
+      $this->pass('Caught expected RequirementsException: ' . $e->getMessage());
+    }
+  }
+
+  /**
+   * Test basic passing migrations.
+   */
+  public function testPassingMigration() {
+    $this->executeMigration('d6_imagecache_presets');
+
+    /** @var \Drupal\image\Entity\ImageStyle $style */
+    $style = ImageStyle::load('big_blue_cheese');
+
+    // Check basic Style info.
+    $this->assertIdentical('big_blue_cheese', $style->get('name'), 'ImageStyle name set correctly');
+    $this->assertIdentical('big_blue_cheese', $style->get('label'), 'ImageStyle label set correctly');
+
+    // Test effects.
+    $effects = $style->getEffects();
+
+    // Check crop effect.
+    $this->assertImageEffect($effects, 'image_crop', [
+      'width' => 555,
+      'height' => 5555,
+      'anchor' => 'center-center',
+    ]);
+
+    // Check resize effect.
+    $this->assertImageEffect($effects, 'image_resize', [
+      'width' => 55,
+      'height' => 55,
+    ]);
+
+    // Check rotate effect.
+    $this->assertImageEffect($effects, 'image_rotate', [
+      'degrees' => 55,
+      'random' => FALSE,
+      'bgcolor' => '',
+    ]);
+  }
+
+  /**
+   * Test that missing actions causes failures.
+   */
+  public function testMissingEffectPlugin() {
+    Database::getConnection('default', 'migrate')->insert("imagecache_action")
+      ->fields([
+       'presetid',
+       'weight',
+       'module',
+       'action',
+       'data',
+     ])
+      ->values([
+       'presetid' => '1',
+       'weight' => '0',
+       'module' => 'imagecache',
+       'action' => 'imagecache_deprecated_scale',
+       'data' => 'a:3:{s:3:"fit";s:7:"outside";s:5:"width";s:3:"200";s:6:"height";s:3:"200";}',
+     ])->execute();
+
+    $this->startCollectingMessages();
+    $this->executeMigration('d6_imagecache_presets');
+    $messages = $this->migration->getIdMap()->getMessageIterator();
+    $count = 0;
+    foreach ($messages as $message) {
+      $count++;
+      $this->assertEqual($message->message, 'The "image_deprecated_scale" plugin does not exist.');
+      $this->assertEqual($message->level, MigrationInterface::MESSAGE_ERROR);
+    }
+    // There should be only the one message.
+    $this->assertEqual($count, 1);
+  }
+
+  /**
+   * Test that missing action's causes failures.
+   */
+  public function testInvalidCropValues() {
+    Database::getConnection('default', 'migrate')->insert("imagecache_action")
+      ->fields([
+       'presetid',
+       'weight',
+       'module',
+       'action',
+       'data',
+     ])
+      ->values([
+       'presetid' => '1',
+       'weight' => '0',
+       'module' => 'imagecache',
+       'action' => 'imagecache_crop',
+       'data' => serialize([
+         'xoffset' => '10',
+         'yoffset' => '10',
+       ]),
+     ])->execute();
+
+    $this->startCollectingMessages();
+    $this->executeMigration('d6_imagecache_presets');
+    $this->assertEqual(['error' => [
+     'The Drupal 8 image crop effect does not support numeric values for x and y offsets. Use keywords to set crop effect offsets instead.'
+    ]], $this->migrateMessages);
+  }
+
+  /**
+   * Assert that a given image effect is migrated.
+   *
+   * @param array $collection
+   *   Collection of effects
+   * @param $id
+   *   Id that should exist in the collection.
+   * @param $config
+   *   Expected configuration for the collection.
+   *
+   * @return bool
+   */
+  protected function assertImageEffect($collection, $id, $config) {
+    /** @var \Drupal\image\ConfigurableImageEffectBase $effect */
+    foreach ($collection as $key => $effect) {
+      $effect_config = $effect->getConfiguration();
+
+      if ($effect_config['id'] == $id && $effect_config['data'] == $config) {
+        // We found this effect so succeed and return.
+        return $this->pass('Effect ' . $id . ' imported correctly');
+      }
+    }
+    // The loop did not find the effect so we it was not imported correctly.
+    return $this->fail('Effect ' . $id . ' did not import correctly');
+  }
+
+}