From b0ed7570e0b9f390c105d7a4ddb6463703136881 Mon Sep 17 00:00:00 2001
From: webchick <webchick@24967.no-reply.drupal.org>
Date: Mon, 18 Nov 2013 09:35:40 -0800
Subject: [PATCH] =?UTF-8?q?Issue=20#2129039=20by=20plach,=20jthorson,=20pf?=
 =?UTF-8?q?renssen,=20nyirocsaba,=20G=C3=A1bor=20Hojtsy:=20Integrity=20con?=
 =?UTF-8?q?straint=20violation=20when=20translating=20body=20field.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../Tests/ContentTranslationTestBase.php      |  9 ++-
 .../node/Tests/NodeTranslationUITest.php      | 59 +++++++++++++++----
 .../Tests/Entity/EntityTranslationTest.php    | 11 ++++
 3 files changed, 66 insertions(+), 13 deletions(-)

diff --git a/core/modules/content_translation/lib/Drupal/content_translation/Tests/ContentTranslationTestBase.php b/core/modules/content_translation/lib/Drupal/content_translation/Tests/ContentTranslationTestBase.php
index 8bd48768733c..d1485d236e3e 100644
--- a/core/modules/content_translation/lib/Drupal/content_translation/Tests/ContentTranslationTestBase.php
+++ b/core/modules/content_translation/lib/Drupal/content_translation/Tests/ContentTranslationTestBase.php
@@ -124,13 +124,20 @@ protected function getEditorPermissions() {
     return array();
   }
 
+  /**
+   * Returns an array of permissions needed for the administrator.
+   */
+  protected function getAdministratorPermissions() {
+    return array_merge($this->getEditorPermissions(), $this->getTranslatorPermissions(), array('administer content translation'));
+  }
+
   /**
    * Creates and activates translator, editor and admin users.
    */
   protected function setupUsers() {
     $this->translator = $this->drupalCreateUser($this->getTranslatorPermissions(), 'translator');
     $this->editor = $this->drupalCreateUser($this->getEditorPermissions(), 'editor');
-    $this->administrator = $this->drupalCreateUser(array_merge($this->getEditorPermissions(), $this->getTranslatorPermissions()), 'administrator');
+    $this->administrator = $this->drupalCreateUser($this->getAdministratorPermissions(), 'administrator');
     $this->drupalLogin($this->translator);
   }
 
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeTranslationUITest.php b/core/modules/node/lib/Drupal/node/Tests/NodeTranslationUITest.php
index bab99961f4be..25cce2307587 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeTranslationUITest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeTranslationUITest.php
@@ -22,6 +22,13 @@ class NodeTranslationUITest extends ContentTranslationUITest {
    */
   public static $modules = array('block', 'language', 'content_translation', 'node', 'datetime', 'field_ui');
 
+  /**
+   * The profile to install as a basis for testing.
+   *
+   * @var string
+   */
+  protected $profile = 'standard';
+
   public static function getInfo() {
     return array(
       'name' => 'Node translation UI',
@@ -34,15 +41,15 @@ function setUp() {
     $this->entityType = 'node';
     $this->bundle = 'article';
     parent::setUp();
+
+    // Ensure the help message is shown even with prefixed paths.
     $this->drupalPlaceBlock('system_help_block', array('region' => 'content'));
-  }
 
-  /**
-   * Overrides \Drupal\content_translation\Tests\ContentTranslationUITest::setupBundle().
-   */
-  protected function setupBundle() {
-    parent::setupBundle();
-    $this->drupalCreateContentType(array('type' => $this->bundle, 'name' => $this->bundle));
+    // Display the language selector.
+    $this->drupalLogin($this->administrator);
+    $edit = array('language_configuration[language_show]' => TRUE);
+    $this->drupalPostForm('admin/structure/types/manage/article', $edit, t('Save content type'));
+    $this->drupalLogin($this->translator);
   }
 
   /**
@@ -52,6 +59,20 @@ protected function getTranslatorPermissions() {
     return array_merge(parent::getTranslatorPermissions(), array('administer nodes', "edit any $this->bundle content"));
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEditorPermissions() {
+    return array('administer nodes', 'create article content');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getAdministratorPermissions() {
+    return array_merge(parent::getAdministratorPermissions(), array('access administration pages', 'administer content types', 'administer node fields', 'access content overview', 'bypass node access'));
+  }
+
   /**
    * Overrides \Drupal\content_translation\Tests\ContentTranslationUITest::getNewEntityValues().
    */
@@ -59,6 +80,22 @@ protected function getNewEntityValues($langcode) {
     return array('title' => $this->randomName()) + parent::getNewEntityValues($langcode);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  protected function createEntity($values, $langcode, $bundle_name = NULL) {
+    $this->drupalLogin($this->editor);
+    $edit = array(
+      'title' => $values['title'],
+      "{$this->fieldName}[0][value]" => $values[$this->fieldName][0]['value'],
+      'langcode' => $langcode,
+    );
+    $this->drupalPostForm('node/add/article', $edit,t('Save and publish'));
+    $this->drupalLogin($this->translator);
+    $node = $this->drupalGetNodeByTitle($values['title']);
+    return $node->id();
+  }
+
   /**
    * Overrides \Drupal\content_translation\Tests\ContentTranslationUITest::getFormSubmitAction().
    */
@@ -136,11 +173,10 @@ protected function doTestAuthoringInfo() {
    * Tests translate link on content admin page.
    */
   function testTranslateLinkContentAdminPage() {
-    $this->admin_user = $this->drupalCreateUser(array('access administration pages', 'access content overview', 'administer nodes', 'bypass node access'));
-    $this->drupalLogin($this->admin_user);
+    $this->drupalLogin($this->administrator);
 
     $page = $this->drupalCreateNode(array('type' => 'page'));
-    $article = $this->drupalCreateNode(array('type' => 'article'));
+    $article = $this->drupalCreateNode(array('type' => 'article', 'langcode' => $this->langcodes[0]));
 
     // Verify translation links.
     $this->drupalGet('admin/content');
@@ -153,8 +189,7 @@ function testTranslateLinkContentAdminPage() {
    * Tests field translation form.
    */
   function testFieldTranslationForm() {
-    $admin_user = $this->drupalCreateUser(array_merge($this->getTranslatorPermissions(), array('access administration pages', 'bypass node access', 'administer node fields')));
-    $this->drupalLogin($admin_user);
+    $this->drupalLogin($this->administrator);
 
     $article = $this->drupalCreateNode(array('type' => 'article', 'langcode' => 'en'));
 
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php
index bc0e1952d958..11903c11c6f9 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php
@@ -483,6 +483,17 @@ function testEntityTranslationAPI() {
     $translation = $cloned->getTranslation($langcode);
     $this->assertNotIdentical($entity, $translation->getUntranslated(), 'A cloned entity object has no reference to the original one.');
 
+    // Check that untranslatable field references keep working after serializing
+    // and cloning the entity.
+    $entity = $this->reloadEntity($entity);
+    $type = $this->randomName();
+    $entity->getTranslation($langcode)->type->value = $type;
+    $entity = unserialize(serialize($entity));
+    $cloned = clone $entity;
+    $translation = $cloned->getTranslation($langcode);
+    $translation->type->value = strrev($type);
+    $this->assertEqual($cloned->type->value, $translation->type->value, 'Untranslatable field references keep working after serializing and cloning the entity.');
+
     // Check that per-language defaults are properly populated.
     $entity = $this->reloadEntity($entity);
     $instance_id = implode('.', array($entity->entityType(), $entity->bundle(), $this->field_name));
-- 
GitLab