From ecd6148ee5248b82b8389c18312da992d8ed74e6 Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Thu, 27 Oct 2016 22:01:17 -0700
Subject: [PATCH] =?UTF-8?q?Issue=20#2806285=20by=20maxocub,=20G=C3=A1bor?=
 =?UTF-8?q?=20Hojtsy,=20quietone,=20catch:=20If=20the=20default=20language?=
 =?UTF-8?q?=20is=20not=20set,=20the=20migration=20log=20show=20an=20error?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../migration_templates/default_language.yml  | 17 +++++++++--
 .../Migrate/MigrateDefaultLanguageTrait.php   | 28 ++++++++++++++++---
 .../Migrate/d6/MigrateDefaultLanguageTest.php |  7 +++++
 .../Migrate/d7/MigrateDefaultLanguageTest.php |  7 +++++
 4 files changed, 53 insertions(+), 6 deletions(-)

diff --git a/core/modules/language/migration_templates/default_language.yml b/core/modules/language/migration_templates/default_language.yml
index d7e52adf1072..6d7604deed38 100644
--- a/core/modules/language/migration_templates/default_language.yml
+++ b/core/modules/language/migration_templates/default_language.yml
@@ -10,9 +10,22 @@ source:
 process:
   default_langcode:
     -
-      plugin: callback
-      callable: get_object_vars
+      plugin: default_value
       source: language_default
+      default_value:
+        'language': 'en'
+    # Encode and decode to turn the default_language variable, which is
+    # an stdClass, into an array so it can be passed to extract.
+    -
+      plugin: callback
+      callable:
+        - '\Drupal\Component\Serialization\Json'
+        - 'encode'
+    -
+      plugin: callback
+      callable:
+        - '\Drupal\Component\Serialization\Json'
+        - 'decode'
     -
       plugin: extract
       index:
diff --git a/core/modules/language/tests/src/Kernel/Migrate/MigrateDefaultLanguageTrait.php b/core/modules/language/tests/src/Kernel/Migrate/MigrateDefaultLanguageTrait.php
index deb60206ea2c..94bb02d33965 100644
--- a/core/modules/language/tests/src/Kernel/Migrate/MigrateDefaultLanguageTrait.php
+++ b/core/modules/language/tests/src/Kernel/Migrate/MigrateDefaultLanguageTrait.php
@@ -38,7 +38,7 @@ protected function doTestMigration($langcode, $existing = TRUE) {
       // default_langcode config should be set.
       $default_language = ConfigurableLanguage::load($langcode);
       $this->assertNotNull($default_language);
-      $this->assertIdentical($langcode, $this->config('system.site')->get('default_langcode'));
+      $this->assertSame($langcode, $this->config('system.site')->get('default_langcode'));
     }
     else {
       // Otherwise, the migration log should contain an error message.
@@ -46,11 +46,31 @@ protected function doTestMigration($langcode, $existing = TRUE) {
       $count = 0;
       foreach ($messages as $message) {
         $count++;
-        $this->assertEqual($message->message, "The language '$langcode' does not exist on this site.");
-        $this->assertEqual($message->level, MigrationInterface::MESSAGE_ERROR);
+        $this->assertSame($message->message, "The language '$langcode' does not exist on this site.");
+        $this->assertSame((int) $message->level, MigrationInterface::MESSAGE_ERROR);
       }
-      $this->assertEqual($count, 1);
+      $this->assertSame($count, 1);
     }
   }
 
+  /**
+   * Helper method to test migrating the default language when no default language is set.
+   */
+  protected function doTestMigrationWithUnsetVariable() {
+    // Delete the language_default variable.
+    $this->sourceDatabase->delete('variable')
+      ->condition('name', 'language_default' )
+      ->execute();
+
+    $this->startCollectingMessages();
+    $this->executeMigrations(['language', 'default_language']);
+    $messages = $this->migration->getIdMap()->getMessageIterator()->fetchAll();
+
+    // Make sure there's no migration exceptions.
+    $this->assertEmpty($messages);
+
+    // Make sure the default langcode is 'en', since it was the default on D6 & D7.
+    $this->assertSame('en', $this->config('system.site')->get('default_langcode'));
+  }
+
 }
diff --git a/core/modules/language/tests/src/Kernel/Migrate/d6/MigrateDefaultLanguageTest.php b/core/modules/language/tests/src/Kernel/Migrate/d6/MigrateDefaultLanguageTest.php
index 20beb96bf7e3..645af29fe57b 100644
--- a/core/modules/language/tests/src/Kernel/Migrate/d6/MigrateDefaultLanguageTest.php
+++ b/core/modules/language/tests/src/Kernel/Migrate/d6/MigrateDefaultLanguageTest.php
@@ -33,4 +33,11 @@ public function testMigrationWithNonExistentLanguage() {
     $this->doTestMigration('tv', FALSE);
   }
 
+  /**
+   * Tests language_default migration with unset variable.
+   */
+  public function testMigrationWithUnsetVariable() {
+    $this->doTestMigrationWithUnsetVariable();
+  }
+
 }
diff --git a/core/modules/language/tests/src/Kernel/Migrate/d7/MigrateDefaultLanguageTest.php b/core/modules/language/tests/src/Kernel/Migrate/d7/MigrateDefaultLanguageTest.php
index 0e584e53b231..79769bc00d13 100644
--- a/core/modules/language/tests/src/Kernel/Migrate/d7/MigrateDefaultLanguageTest.php
+++ b/core/modules/language/tests/src/Kernel/Migrate/d7/MigrateDefaultLanguageTest.php
@@ -33,4 +33,11 @@ public function testMigrationWithNonExistentLanguage() {
     $this->doTestMigration('tv', FALSE);
   }
 
+  /**
+   * Tests language_default migration with unset variable.
+   */
+  public function testMigrationWithUnsetVariable() {
+    $this->doTestMigrationWithUnsetVariable();
+  }
+
 }
-- 
GitLab