Commit 48659811 authored by Zoltan Attila Horvath's avatar Zoltan Attila Horvath Committed by Zoltan Attila Horvath
Browse files

Issue #3205356 by huzooka, zenphp, gbotis: Migrating Bean without UUID causes...

Issue #3205356 by huzooka, zenphp, gbotis: Migrating Bean without UUID causes SQL Integrity constraint violation
parent 2ed6ad5b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -17,4 +17,5 @@ function bean_migrate_migration_plugins_alter(array &$migrations) {
  MigrationPluginAlterer::copyCoreBlockRegionMappingToBeanBlockPlacement($migrations);
  MigrationPluginAlterer::mapBeanToBlockContent($migrations);
  MigrationPluginAlterer::finalizeDerivedFieldMigrations($migrations);
  MigrationPluginAlterer::removeUuidProcessIfNotNeeded($migrations);
}
+27 −0
Original line number Diff line number Diff line
@@ -309,6 +309,33 @@ class MigrationPluginAlterer {
    }
  }

  /**
   * Remove uuid destination process pipeline from bean migration if not needed.
   *
   * @param array $migration_definitions
   *   An associative array of migrations keyed by migration ID, as passed to
   *   hook_migration_plugins_alter().
   */
  public static function removeUuidProcessIfNotNeeded(array &$migration_definitions): void {
    $bean_source = static::getSourcePlugin('bean_type');
    assert($bean_source instanceof DrupalSqlBase);
    $bean_uuid_enabled = !empty($bean_source->getSystemData()['module']['bean_uuid']['status'] ?? NULL);
    if ($bean_uuid_enabled) {
      return;
    }

    $bean_migrations = array_filter(
      $migration_definitions,
      function (array $definition) {
        return $definition['source']['plugin'] === 'bean';
      }
    );

    foreach (array_keys($bean_migrations) as $plugin_id) {
      unset($migration_definitions[$plugin_id]['process']['uuid']);
    }
  }

  /**
   * Converts a destination process to an associative array.
   *
+16 −0
Original line number Diff line number Diff line
@@ -18,4 +18,20 @@ class BeanMigrateTest extends BeanMigrateTestBase {
    $this->performBeanMigrationAssertions();
  }

  /**
   * Tests bean migrations without bean UUIDs.
   *
   * @depends testMigrations
   */
  public function testMigrationsWithoutUuid() {
    $this->sourceDatabase->update('system')
      ->condition('name', 'bean_uuid')
      ->fields(['status' => 0])
      ->execute();
    $this->sourceDatabase->schema()->dropField('bean', 'uuid');
    $this->sourceDatabase->schema()->dropField('bean_revision', 'vuuid');

    $this->testMigrations();
  }

}
+6 −12
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
namespace Drupal\Tests\bean_migrate\Kernel;

use Drupal\Tests\bean_migrate\Traits\BeanMigrateAssertionsTrait;
use Drupal\Tests\migmag\Traits\MigMagKernelTestDxTrait;
use Drupal\Tests\migrate_drupal\Kernel\MigrateDrupalTestBase;

/**
@@ -11,6 +12,7 @@ use Drupal\Tests\migrate_drupal\Kernel\MigrateDrupalTestBase;
abstract class BeanMigrateTestBase extends MigrateDrupalTestBase {

  use BeanMigrateAssertionsTrait;
  use MigMagKernelTestDxTrait;

  /**
   * Multilingual migration test.
@@ -159,7 +161,6 @@ abstract class BeanMigrateTestBase extends MigrateDrupalTestBase {
      'd7_field',
      'd7_node_type',
    ]);
    $this->stopCollectingMessages();

    $this->startCollectingMessages();
    $this->executeMigrations([
@@ -171,10 +172,8 @@ abstract class BeanMigrateTestBase extends MigrateDrupalTestBase {
        'bean_translation_settings',
      ]);
    }
    $this->stopCollectingMessages();
    $this->assertEmpty($this->migrateMessages);
    $this->assertExpectedMigrationMessages();

    $this->startCollectingMessages();
    $this->executeMigrations([
      'block_content_type',
      'block_content_body_field',
@@ -184,7 +183,6 @@ abstract class BeanMigrateTestBase extends MigrateDrupalTestBase {
      'd7_user_role',
      'd7_user',
    ]);
    $this->stopCollectingMessages();

    // Migrate the Bean title related field storage and instance entities.
    $this->startCollectingMessages();
@@ -194,16 +192,14 @@ abstract class BeanMigrateTestBase extends MigrateDrupalTestBase {
      'bean_title_field_formatter',
      'bean_title_field_widget',
    ]);
    $this->stopCollectingMessages();
    $this->assertEmpty($this->migrateMessages);
    $this->assertExpectedMigrationMessages();

    // Migrate the actual content entities.
    $this->startCollectingMessages();
    $this->executeMigrations([
      'bean',
    ]);
    $this->stopCollectingMessages();
    $this->assertEmpty($this->migrateMessages);
    $this->assertExpectedMigrationMessages();

    // Drupal core's Migrate Drupal UI executes d7_custom_block" migrations
    // after bean entity migrations.
@@ -212,7 +208,6 @@ abstract class BeanMigrateTestBase extends MigrateDrupalTestBase {
      'd7_block',
      'd7_node_complete',
    ]);
    $this->stopCollectingMessages();

    // Migrate Bean block placements.
    $this->startCollectingMessages();
@@ -225,8 +220,7 @@ abstract class BeanMigrateTestBase extends MigrateDrupalTestBase {
        'bean_block_translation_et',
      ]);
    }
    $this->stopCollectingMessages();
    $this->assertEmpty($this->migrateMessages);
    $this->assertExpectedMigrationMessages();
  }

}
+41 −0
Original line number Diff line number Diff line
@@ -65,6 +65,11 @@ trait BeanContentAssertionsTrait {
        'content_translation_created' => [],
      ];
    }

    if (!$this->beanUuidsShouldBeMigrated()) {
      unset($expected['uuid']);
    }

    $this->assertEquals($expected, $this->getImportantEntityProperties($default_block_revision));
  }

@@ -117,6 +122,10 @@ trait BeanContentAssertionsTrait {
        'content_translation_created' => [],
      ];
    }
    if (!$this->beanUuidsShouldBeMigrated()) {
      unset($expected['uuid']);
    }

    $this->assertEquals($expected, $this->getImportantEntityProperties($default_block_revision));

    // Test the previous revision.
@@ -150,6 +159,10 @@ trait BeanContentAssertionsTrait {
        'content_translation_created' => [],
      ];
    }
    if (!$this->beanUuidsShouldBeMigrated()) {
      unset($expected['uuid']);
    }

    $this->assertEquals($expected, $this->getImportantEntityProperties(reset($other_revisions)));
  }

@@ -199,6 +212,10 @@ trait BeanContentAssertionsTrait {
        'content_translation_created' => [],
      ];
    }
    if (!$this->beanUuidsShouldBeMigrated()) {
      unset($expected['uuid']);
    }

    $this->assertEquals($expected, $this->getImportantEntityProperties($default_block_revision));
  }

@@ -252,6 +269,10 @@ trait BeanContentAssertionsTrait {
        'content_translation_created' => [],
      ];
    }
    if (!$this->beanUuidsShouldBeMigrated()) {
      unset($expected['uuid']);
    }

    $this->assertEquals($expected, $this->getImportantEntityProperties($default_block_revision));

    // Check the next revision.
@@ -285,6 +306,10 @@ trait BeanContentAssertionsTrait {
        'content_translation_created' => [],
      ];
    }
    if (!$this->beanUuidsShouldBeMigrated()) {
      unset($expected['uuid']);
    }

    $this->assertEquals($expected, $this->getImportantEntityProperties(reset($other_revisions)));
  }

@@ -703,4 +728,20 @@ trait BeanContentAssertionsTrait {
    $this->assertEquals($default_revision_english, $this->getImportantEntityProperties($default_block_revision->getTranslation('en')));
  }

  /**
   * Whether there were bean entity UUIDs to migrate over.
   *
   * @return bool
   *   Whether there were bean entity UUIDs to migrate over.
   */
  protected function beanUuidsShouldBeMigrated(): bool {
    $bean_uuid_installed_in_source = $this->sourceDatabase->select('system', 's')
      ->fields('s', ['status'])
      ->condition('s.name', 'bean_uuid')
      ->execute()
      ->fetchField();

    return $bean_uuid_installed_in_source;
  }

}
Loading