updated core
This commit is contained in:
@@ -8,8 +8,8 @@ package: Multilingual
|
||||
# core: 8.x
|
||||
configure: language.content_settings_page
|
||||
|
||||
# Information added by Drupal.org packaging script on 2017-11-03
|
||||
version: '8.4.2'
|
||||
# Information added by Drupal.org packaging script on 2018-01-03
|
||||
version: '8.4.4'
|
||||
core: '8.x'
|
||||
project: 'drupal'
|
||||
datestamp: 1509719929
|
||||
datestamp: 1515021228
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
id: d6_taxonomy_term_translation
|
||||
label: Taxonomy terms
|
||||
migration_tags:
|
||||
- Drupal 6
|
||||
source:
|
||||
plugin: d6_taxonomy_term
|
||||
translations: true
|
||||
process:
|
||||
# If you are using this file to build a custom migration consider removing
|
||||
# the tid field to allow incremental migrations.
|
||||
tid: tid
|
||||
langcode: language
|
||||
vid:
|
||||
plugin: migration
|
||||
migration: d6_taxonomy_vocabulary
|
||||
source: vid
|
||||
name: name
|
||||
description: description
|
||||
weight: weight
|
||||
# Only attempt to stub real (non-zero) parents.
|
||||
parent_id:
|
||||
-
|
||||
plugin: skip_on_empty
|
||||
method: process
|
||||
source: parent
|
||||
-
|
||||
plugin: migration
|
||||
migration: d6_taxonomy_term
|
||||
parent:
|
||||
plugin: default_value
|
||||
default_value: 0
|
||||
source: '@parent_id'
|
||||
changed: timestamp
|
||||
destination:
|
||||
plugin: entity:taxonomy_term
|
||||
migration_dependencies:
|
||||
required:
|
||||
- d6_taxonomy_vocabulary
|
||||
- d6_taxonomy_term
|
||||
@@ -27,7 +27,7 @@ class ContentTranslationMetadataWrapper implements ContentTranslationMetadataWra
|
||||
/**
|
||||
* Initializes an instance of the content translation metadata handler.
|
||||
*
|
||||
* @param EntityInterface $translation
|
||||
* @param \Drupal\Core\Entity\EntityInterface $translation
|
||||
* The entity translation to be wrapped.
|
||||
* @param ContentTranslationHandlerInterface $handler
|
||||
* The content translation handler.
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\content_translation\Tests;
|
||||
|
||||
/**
|
||||
* Tests the test content translation UI with the test entity.
|
||||
*
|
||||
* @group content_translation
|
||||
*/
|
||||
class ContentTestTranslationUITest extends ContentTranslationUITestBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected $testHTMLEscapeForAllLanguages = TRUE;
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = array('language', 'content_translation', 'entity_test');
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
// Use the entity_test_mul as this has multilingual property support.
|
||||
$this->entityTypeId = 'entity_test_mul_changed';
|
||||
parent::setUp();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getTranslatorPermissions() {
|
||||
return array_merge(parent::getTranslatorPermissions(), array('administer entity_test content', 'view test entity'));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,177 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\content_translation\Tests;
|
||||
|
||||
use Drupal\Component\Serialization\Json;
|
||||
use Drupal\field\Entity\FieldConfig;
|
||||
use Drupal\language\Entity\ConfigurableLanguage;
|
||||
use Drupal\simpletest\WebTestBase;
|
||||
use Drupal\field\Entity\FieldStorageConfig;
|
||||
|
||||
/**
|
||||
* Tests that contextual links are available for content translation.
|
||||
*
|
||||
* @group content_translation
|
||||
*/
|
||||
class ContentTranslationContextualLinksTest extends WebTestBase {
|
||||
|
||||
/**
|
||||
* The bundle being tested.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $bundle;
|
||||
|
||||
/**
|
||||
* The content type being tested.
|
||||
*
|
||||
* @var \Drupal\node\Entity\NodeType
|
||||
*/
|
||||
protected $contentType;
|
||||
|
||||
/**
|
||||
* The 'translator' user to use during testing.
|
||||
*
|
||||
* @var \Drupal\user\UserInterface
|
||||
*/
|
||||
protected $translator;
|
||||
|
||||
/**
|
||||
* The enabled languages.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $langcodes;
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['content_translation', 'contextual', 'node'];
|
||||
|
||||
/**
|
||||
* The profile to install as a basis for testing.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $profile = 'testing';
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
// Set up an additional language.
|
||||
$this->langcodes = [\Drupal::languageManager()->getDefaultLanguage()->getId(), 'es'];
|
||||
ConfigurableLanguage::createFromLangcode('es')->save();
|
||||
|
||||
// Create a content type.
|
||||
$this->bundle = $this->randomMachineName();
|
||||
$this->contentType = $this->drupalCreateContentType(['type' => $this->bundle]);
|
||||
|
||||
// Add a field to the content type. The field is not yet translatable.
|
||||
FieldStorageConfig::create([
|
||||
'field_name' => 'field_test_text',
|
||||
'entity_type' => 'node',
|
||||
'type' => 'text',
|
||||
'cardinality' => 1,
|
||||
])->save();
|
||||
FieldConfig::create([
|
||||
'entity_type' => 'node',
|
||||
'field_name' => 'field_test_text',
|
||||
'bundle' => $this->bundle,
|
||||
'label' => 'Test text-field',
|
||||
])->save();
|
||||
entity_get_form_display('node', $this->bundle, 'default')
|
||||
->setComponent('field_test_text', [
|
||||
'type' => 'text_textfield',
|
||||
'weight' => 0,
|
||||
])
|
||||
->save();
|
||||
|
||||
// Create a translator user.
|
||||
$permissions = [
|
||||
'access contextual links',
|
||||
'administer nodes',
|
||||
"edit any $this->bundle content",
|
||||
'translate any entity',
|
||||
];
|
||||
$this->translator = $this->drupalCreateUser($permissions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that a contextual link is available for translating a node.
|
||||
*/
|
||||
public function testContentTranslationContextualLinks() {
|
||||
// Create a node.
|
||||
$title = $this->randomString();
|
||||
$this->drupalCreateNode(['type' => $this->bundle, 'title' => $title, 'langcode' => 'en']);
|
||||
$node = $this->drupalGetNodeByTitle($title);
|
||||
|
||||
// Use a UI form submission to make the node type and field translatable.
|
||||
// This tests that caches are properly invalidated.
|
||||
$this->drupalLogin($this->rootUser);
|
||||
$edit = [
|
||||
'entity_types[node]' => TRUE,
|
||||
'settings[node][' . $this->bundle . '][settings][language][language_alterable]' => TRUE,
|
||||
'settings[node][' . $this->bundle . '][translatable]' => TRUE,
|
||||
'settings[node][' . $this->bundle . '][fields][field_test_text]' => TRUE,
|
||||
];
|
||||
$this->drupalPostForm('admin/config/regional/content-language', $edit, t('Save configuration'));
|
||||
$this->drupalLogout();
|
||||
|
||||
// Check that the translate link appears on the node page.
|
||||
$this->drupalLogin($this->translator);
|
||||
$translate_link = 'node/' . $node->id() . '/translations';
|
||||
|
||||
$response = $this->renderContextualLinks(['node:node=1:'], 'node/' . $node->id());
|
||||
$this->assertResponse(200);
|
||||
$json = Json::decode($response);
|
||||
$this->setRawContent($json['node:node=1:']);
|
||||
$this->assertLinkByHref($translate_link, 0, 'The contextual link to translate the node is shown.');
|
||||
|
||||
// Check that the link leads to the translate page.
|
||||
$this->drupalGet($translate_link);
|
||||
$this->assertRaw(t('Translations of %label', ['%label' => $node->label()]), 'The contextual link leads to the translate page.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get server-rendered contextual links for the given contextual link ids.
|
||||
*
|
||||
* Copied from \Drupal\contextual\Tests\ContextualDynamicContextTest::renderContextualLinks().
|
||||
*
|
||||
* @param array $ids
|
||||
* An array of contextual link ids.
|
||||
* @param string $current_path
|
||||
* The Drupal path for the page for which the contextual links are rendered.
|
||||
*
|
||||
* @return string
|
||||
* The response body.
|
||||
*/
|
||||
protected function renderContextualLinks($ids, $current_path) {
|
||||
// Build POST values.
|
||||
$post = [];
|
||||
for ($i = 0; $i < count($ids); $i++) {
|
||||
$post['ids[' . $i . ']'] = $ids[$i];
|
||||
}
|
||||
|
||||
// Serialize POST values.
|
||||
foreach ($post as $key => $value) {
|
||||
// Encode according to application/x-www-form-urlencoded
|
||||
// Both names and values needs to be urlencoded, according to
|
||||
// http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1
|
||||
$post[$key] = urlencode($key) . '=' . urlencode($value);
|
||||
}
|
||||
$post = implode('&', $post);
|
||||
|
||||
// Perform HTTP request.
|
||||
return $this->curlExec([
|
||||
CURLOPT_URL => \Drupal::url('contextual.render', [], ['absolute' => TRUE, 'query' => ['destination' => $current_path]]),
|
||||
CURLOPT_POST => TRUE,
|
||||
CURLOPT_POSTFIELDS => $post,
|
||||
CURLOPT_HTTPHEADER => [
|
||||
'Accept: application/json',
|
||||
'Content-Type: application/x-www-form-urlencoded',
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\content_translation\Tests;
|
||||
|
||||
use Drupal\simpletest\WebTestBase;
|
||||
|
||||
/**
|
||||
* Test enabling content translation module.
|
||||
*
|
||||
* @group content_translation
|
||||
*/
|
||||
class ContentTranslationEnableTest extends WebTestBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static $modules = ['entity_test', 'menu_link_content', 'node'];
|
||||
|
||||
/**
|
||||
* Tests that entity schemas are up-to-date after enabling translation.
|
||||
*/
|
||||
public function testEnable() {
|
||||
$this->drupalLogin($this->rootUser);
|
||||
// Enable modules and make sure the related config entity type definitions
|
||||
// are installed.
|
||||
$edit = [
|
||||
'modules[Multilingual][content_translation][enable]' => TRUE,
|
||||
'modules[Multilingual][language][enable]' => TRUE,
|
||||
];
|
||||
$this->drupalPostForm('admin/modules', $edit, t('Install'));
|
||||
|
||||
// Status messages are shown.
|
||||
$this->assertText(t('This site has only a single language enabled. Add at least one more language in order to translate content.'));
|
||||
$this->assertText(t('Enable translation for content types, taxonomy vocabularies, accounts, or any other element you wish to translate.'));
|
||||
|
||||
// No pending updates should be available.
|
||||
$this->drupalGet('admin/reports/status');
|
||||
$requirement_value = $this->cssSelect("tr.system-status-report__entry th:contains('Entity/field definitions') + td");
|
||||
$this->assertEqual(t('Up to date'), trim((string) $requirement_value[0]));
|
||||
|
||||
$this->drupalGet('admin/config/regional/content-language');
|
||||
// The node entity type should not be an option because it has no bundles.
|
||||
$this->assertNoRaw('entity_types[node]');
|
||||
// Enable content translation on entity types that have will have a
|
||||
// content_translation_uid.
|
||||
$edit = [
|
||||
'entity_types[menu_link_content]' => TRUE,
|
||||
'settings[menu_link_content][menu_link_content][translatable]' => TRUE,
|
||||
'entity_types[entity_test_mul]' => TRUE,
|
||||
'settings[entity_test_mul][entity_test_mul][translatable]' => TRUE,
|
||||
];
|
||||
$this->drupalPostForm(NULL, $edit, t('Save configuration'));
|
||||
|
||||
// No pending updates should be available.
|
||||
$this->drupalGet('admin/reports/status');
|
||||
$requirement_value = $this->cssSelect("tr.system-status-report__entry th:contains('Entity/field definitions') + td");
|
||||
$this->assertEqual(t('Up to date'), trim((string) $requirement_value[0]));
|
||||
|
||||
// Create a node type and check the content translation settings are now
|
||||
// available for nodes.
|
||||
$edit = array(
|
||||
'name' => 'foo',
|
||||
'title_label' => 'title for foo',
|
||||
'type' => 'foo',
|
||||
);
|
||||
$this->drupalPostForm('admin/structure/types/add', $edit, t('Save content type'));
|
||||
$this->drupalGet('admin/config/regional/content-language');
|
||||
$this->assertRaw('entity_types[node]');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\content_translation\Tests;
|
||||
|
||||
use Drupal\simpletest\WebTestBase;
|
||||
|
||||
/**
|
||||
* Tests the content translation behaviours on entity bundle UI.
|
||||
*
|
||||
* @group content_translation
|
||||
*/
|
||||
class ContentTranslationEntityBundleUITest extends WebTestBase {
|
||||
|
||||
public static $modules = array('language', 'content_translation', 'node', 'comment', 'field_ui');
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
$user = $this->drupalCreateUser(array('access administration pages', 'administer languages', 'administer content translation', 'administer content types'));
|
||||
$this->drupalLogin($user);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests content types default translation behaviour.
|
||||
*/
|
||||
public function testContentTypeUI() {
|
||||
// Create first content type.
|
||||
$this->drupalCreateContentType(array('type' => 'article'));
|
||||
// Enable content translation.
|
||||
$edit = array('language_configuration[content_translation]' => TRUE);
|
||||
$this->drupalPostForm('admin/structure/types/manage/article', $edit, 'Save content type');
|
||||
|
||||
// Make sure add page does not inherit translation configuration from first
|
||||
// content type.
|
||||
$this->drupalGet('admin/structure/types/add');
|
||||
$this->assertNoFieldChecked('edit-language-configuration-content-translation');
|
||||
|
||||
// Create second content type and set content translation.
|
||||
$edit = array(
|
||||
'name' => 'Page',
|
||||
'type' => 'page',
|
||||
'language_configuration[content_translation]' => TRUE,
|
||||
);
|
||||
$this->drupalPostForm('admin/structure/types/add', $edit, 'Save and manage fields');
|
||||
|
||||
// Make sure the settings are saved when creating the content type.
|
||||
$this->drupalGet('admin/structure/types/manage/page');
|
||||
$this->assertFieldChecked('edit-language-configuration-content-translation');
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,144 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\content_translation\Tests;
|
||||
|
||||
/**
|
||||
* Tests the Content Translation metadata fields handling.
|
||||
*
|
||||
* @group content_translation
|
||||
*/
|
||||
class ContentTranslationMetadataFieldsTest extends ContentTranslationTestBase {
|
||||
|
||||
/**
|
||||
* The entity type being tested.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $entityTypeId = 'node';
|
||||
|
||||
/**
|
||||
* The bundle being tested.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $bundle = 'article';
|
||||
|
||||
/**
|
||||
* Modules to install.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = array('language', 'content_translation', 'node');
|
||||
|
||||
/**
|
||||
* The profile to install as a basis for testing.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $profile = 'standard';
|
||||
|
||||
/**
|
||||
* Tests skipping setting non translatable metadata fields.
|
||||
*/
|
||||
public function testSkipUntranslatable() {
|
||||
$this->drupalLogin($this->translator);
|
||||
$entity_manager = \Drupal::entityManager();
|
||||
$fields = $entity_manager->getFieldDefinitions($this->entityTypeId, $this->bundle);
|
||||
|
||||
// Turn off translatability for the metadata fields on the current bundle.
|
||||
$metadata_fields = ['created', 'changed', 'uid', 'status'];
|
||||
foreach ($metadata_fields as $field_name) {
|
||||
$fields[$field_name]
|
||||
->getConfig($this->bundle)
|
||||
->setTranslatable(FALSE)
|
||||
->save();
|
||||
}
|
||||
|
||||
// Create a new test entity with original values in the default language.
|
||||
$default_langcode = $this->langcodes[0];
|
||||
$entity_id = $this->createEntity(['title' => $this->randomString()], $default_langcode);
|
||||
$storage = $entity_manager->getStorage($this->entityTypeId);
|
||||
$storage->resetCache();
|
||||
$entity = $storage->load($entity_id);
|
||||
|
||||
// Add a content translation.
|
||||
$langcode = 'it';
|
||||
$values = $entity->toArray();
|
||||
// Apply a default value for the metadata fields.
|
||||
foreach ($metadata_fields as $field_name) {
|
||||
unset($values[$field_name]);
|
||||
}
|
||||
$entity->addTranslation($langcode, $values);
|
||||
|
||||
$metadata_source_translation = $this->manager->getTranslationMetadata($entity->getTranslation($default_langcode));
|
||||
$metadata_target_translation = $this->manager->getTranslationMetadata($entity->getTranslation($langcode));
|
||||
|
||||
$created_time = $metadata_source_translation->getCreatedTime();
|
||||
$changed_time = $metadata_source_translation->getChangedTime();
|
||||
$published = $metadata_source_translation->isPublished();
|
||||
$author = $metadata_source_translation->getAuthor();
|
||||
|
||||
$this->assertEqual($created_time, $metadata_target_translation->getCreatedTime(), 'Metadata created field has the same value for both translations.');
|
||||
$this->assertEqual($changed_time, $metadata_target_translation->getChangedTime(), 'Metadata changed field has the same value for both translations.');
|
||||
$this->assertEqual($published, $metadata_target_translation->isPublished(), 'Metadata published field has the same value for both translations.');
|
||||
$this->assertEqual($author->id(), $metadata_target_translation->getAuthor()->id(), 'Metadata author field has the same value for both translations.');
|
||||
|
||||
$metadata_target_translation->setCreatedTime(time() + 50);
|
||||
$metadata_target_translation->setChangedTime(time() + 50);
|
||||
$metadata_target_translation->setPublished(TRUE);
|
||||
$metadata_target_translation->setAuthor($this->editor);
|
||||
|
||||
$this->assertEqual($created_time, $metadata_target_translation->getCreatedTime(), 'Metadata created field correctly not updated');
|
||||
$this->assertEqual($changed_time, $metadata_target_translation->getChangedTime(), 'Metadata changed field correctly not updated');
|
||||
$this->assertEqual($published, $metadata_target_translation->isPublished(), 'Metadata published field correctly not updated');
|
||||
$this->assertEqual($author->id(), $metadata_target_translation->getAuthor()->id(), 'Metadata author field correctly not updated');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests setting translatable metadata fields.
|
||||
*/
|
||||
public function testSetTranslatable() {
|
||||
$this->drupalLogin($this->translator);
|
||||
$entity_manager = \Drupal::entityManager();
|
||||
$fields = $entity_manager->getFieldDefinitions($this->entityTypeId, $this->bundle);
|
||||
|
||||
// Turn off translatability for the metadata fields on the current bundle.
|
||||
$metadata_fields = ['created', 'changed', 'uid', 'status'];
|
||||
foreach ($metadata_fields as $field_name) {
|
||||
$fields[$field_name]
|
||||
->getConfig($this->bundle)
|
||||
->setTranslatable(TRUE)
|
||||
->save();
|
||||
}
|
||||
|
||||
// Create a new test entity with original values in the default language.
|
||||
$default_langcode = $this->langcodes[0];
|
||||
$entity_id = $this->createEntity(['title' => $this->randomString(), 'status' => FALSE], $default_langcode);
|
||||
$storage = $entity_manager->getStorage($this->entityTypeId);
|
||||
$storage->resetCache();
|
||||
$entity = $storage->load($entity_id);
|
||||
|
||||
// Add a content translation.
|
||||
$langcode = 'it';
|
||||
$values = $entity->toArray();
|
||||
// Apply a default value for the metadata fields.
|
||||
foreach ($metadata_fields as $field_name) {
|
||||
unset($values[$field_name]);
|
||||
}
|
||||
$entity->addTranslation($langcode, $values);
|
||||
|
||||
$metadata_source_translation = $this->manager->getTranslationMetadata($entity->getTranslation($default_langcode));
|
||||
$metadata_target_translation = $this->manager->getTranslationMetadata($entity->getTranslation($langcode));
|
||||
|
||||
$metadata_target_translation->setCreatedTime(time() + 50);
|
||||
$metadata_target_translation->setChangedTime(time() + 50);
|
||||
$metadata_target_translation->setPublished(TRUE);
|
||||
$metadata_target_translation->setAuthor($this->editor);
|
||||
|
||||
$this->assertNotEqual($metadata_source_translation->getCreatedTime(), $metadata_target_translation->getCreatedTime(), 'Metadata created field correctly different on both translations.');
|
||||
$this->assertNotEqual($metadata_source_translation->getChangedTime(), $metadata_target_translation->getChangedTime(), 'Metadata changed field correctly different on both translations.');
|
||||
$this->assertNotEqual($metadata_source_translation->isPublished(), $metadata_target_translation->isPublished(), 'Metadata published field correctly different on both translations.');
|
||||
$this->assertNotEqual($metadata_source_translation->getAuthor()->id(), $metadata_target_translation->getAuthor()->id(), 'Metadata author field correctly different on both translations.');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,157 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\content_translation\Tests;
|
||||
|
||||
use Drupal\language\Entity\ConfigurableLanguage;
|
||||
use Drupal\node\Tests\NodeTestBase;
|
||||
use Drupal\user\Entity\Role;
|
||||
|
||||
/**
|
||||
* Tests the content translation operations available in the content listing.
|
||||
*
|
||||
* @group content_translation
|
||||
*/
|
||||
class ContentTranslationOperationsTest extends NodeTestBase {
|
||||
|
||||
/**
|
||||
* A base user.
|
||||
*
|
||||
* @var \Drupal\user\Entity\User|false
|
||||
*/
|
||||
protected $baseUser1;
|
||||
|
||||
/**
|
||||
* A base user.
|
||||
*
|
||||
* @var \Drupal\user\Entity\User|false
|
||||
*/
|
||||
protected $baseUser2;
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['language', 'content_translation', 'node', 'views', 'block'];
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
// Enable additional languages.
|
||||
$langcodes = ['es', 'ast'];
|
||||
foreach ($langcodes as $langcode) {
|
||||
ConfigurableLanguage::createFromLangcode($langcode)->save();
|
||||
}
|
||||
|
||||
// Enable translation for the current entity type and ensure the change is
|
||||
// picked up.
|
||||
\Drupal::service('content_translation.manager')->setEnabled('node', 'article', TRUE);
|
||||
drupal_static_reset();
|
||||
\Drupal::entityManager()->clearCachedDefinitions();
|
||||
\Drupal::service('router.builder')->rebuild();
|
||||
\Drupal::service('entity.definition_update_manager')->applyUpdates();
|
||||
|
||||
$this->baseUser1 = $this->drupalCreateUser(['access content overview']);
|
||||
$this->baseUser2 = $this->drupalCreateUser(['access content overview', 'create content translations', 'update content translations', 'delete content translations']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that the operation "Translate" is displayed in the content listing.
|
||||
*/
|
||||
public function testOperationTranslateLink() {
|
||||
$node = $this->drupalCreateNode(['type' => 'article', 'langcode' => 'es']);
|
||||
// Verify no translation operation links are displayed for users without
|
||||
// permission.
|
||||
$this->drupalLogin($this->baseUser1);
|
||||
$this->drupalGet('admin/content');
|
||||
$this->assertNoLinkByHref('node/' . $node->id() . '/translations');
|
||||
$this->drupalLogout();
|
||||
// Verify there's a translation operation link for users with enough
|
||||
// permissions.
|
||||
$this->drupalLogin($this->baseUser2);
|
||||
$this->drupalGet('admin/content');
|
||||
$this->assertLinkByHref('node/' . $node->id() . '/translations');
|
||||
|
||||
// Ensure that an unintended misconfiguration of permissions does not open
|
||||
// access to the translation form, see https://www.drupal.org/node/2558905.
|
||||
$this->drupalLogout();
|
||||
user_role_change_permissions(
|
||||
Role::AUTHENTICATED_ID,
|
||||
[
|
||||
'create content translations' => TRUE,
|
||||
'access content' => FALSE,
|
||||
]
|
||||
);
|
||||
$this->drupalLogin($this->baseUser1);
|
||||
$this->drupalGet($node->urlInfo('drupal:content-translation-overview'));
|
||||
$this->assertResponse(403);
|
||||
|
||||
// Ensure that the translation overview is also not accessible when the user
|
||||
// has 'access content', but the node is not published.
|
||||
user_role_change_permissions(
|
||||
Role::AUTHENTICATED_ID,
|
||||
[
|
||||
'create content translations' => TRUE,
|
||||
'access content' => TRUE,
|
||||
]
|
||||
);
|
||||
$node->setPublished(FALSE)->save();
|
||||
$this->drupalGet($node->urlInfo('drupal:content-translation-overview'));
|
||||
$this->assertResponse(403);
|
||||
$this->drupalLogout();
|
||||
|
||||
// Ensure the 'Translate' local task does not show up anymore when disabling
|
||||
// translations for a content type.
|
||||
$node->setPublished(TRUE)->save();
|
||||
user_role_change_permissions(
|
||||
Role::AUTHENTICATED_ID,
|
||||
[
|
||||
'administer content translation' => TRUE,
|
||||
'administer languages' => TRUE,
|
||||
]
|
||||
);
|
||||
$this->drupalPlaceBlock('local_tasks_block');
|
||||
$this->drupalLogin($this->baseUser2);
|
||||
$this->drupalGet('node/' . $node->id());
|
||||
$this->assertLinkByHref('node/' . $node->id() . '/translations');
|
||||
$this->drupalPostForm('admin/config/regional/content-language', ['settings[node][article][translatable]' => FALSE], t('Save configuration'));
|
||||
$this->drupalGet('node/' . $node->id());
|
||||
$this->assertNoLinkByHref('node/' . $node->id() . '/translations');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the access to the overview page for translations.
|
||||
*
|
||||
* @see content_translation_translate_access()
|
||||
*/
|
||||
public function testContentTranslationOverviewAccess() {
|
||||
$access_control_handler = \Drupal::entityManager()->getAccessControlHandler('node');
|
||||
$user = $this->createUser(['create content translations', 'access content']);
|
||||
$this->drupalLogin($user);
|
||||
|
||||
$node = $this->drupalCreateNode(['status' => FALSE, 'type' => 'article']);
|
||||
$this->assertFalse(content_translation_translate_access($node)->isAllowed());
|
||||
$access_control_handler->resetCache();
|
||||
|
||||
$node->setPublished(TRUE);
|
||||
$node->save();
|
||||
$this->assertTrue(content_translation_translate_access($node)->isAllowed());
|
||||
$access_control_handler->resetCache();
|
||||
|
||||
user_role_change_permissions(
|
||||
Role::AUTHENTICATED_ID,
|
||||
[
|
||||
'access content' => FALSE,
|
||||
]
|
||||
);
|
||||
|
||||
$user = $this->createUser(['create content translations']);
|
||||
$this->drupalLogin($user);
|
||||
$this->assertFalse(content_translation_translate_access($node)->isAllowed());
|
||||
$access_control_handler->resetCache();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,298 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\content_translation\Tests;
|
||||
|
||||
use Drupal\comment\Plugin\Field\FieldType\CommentItemInterface;
|
||||
use Drupal\comment\Tests\CommentTestTrait;
|
||||
use Drupal\Core\Field\Entity\BaseFieldOverride;
|
||||
use Drupal\Core\Language\Language;
|
||||
use Drupal\field\Entity\FieldConfig;
|
||||
use Drupal\language\Entity\ContentLanguageSettings;
|
||||
use Drupal\simpletest\WebTestBase;
|
||||
|
||||
/**
|
||||
* Tests the content translation settings UI.
|
||||
*
|
||||
* @group content_translation
|
||||
*/
|
||||
class ContentTranslationSettingsTest extends WebTestBase {
|
||||
|
||||
use CommentTestTrait;
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = array('language', 'content_translation', 'node', 'comment', 'field_ui', 'entity_test');
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
// Set up two content types to test fields shared between different
|
||||
// bundles.
|
||||
$this->drupalCreateContentType(array('type' => 'article'));
|
||||
$this->drupalCreateContentType(array('type' => 'page'));
|
||||
$this->addDefaultCommentField('node', 'article', 'comment_article', CommentItemInterface::OPEN, 'comment_article');
|
||||
$this->addDefaultCommentField('node', 'page', 'comment_page');
|
||||
|
||||
$admin_user = $this->drupalCreateUser(array('access administration pages', 'administer languages', 'administer content translation', 'administer content types', 'administer node fields', 'administer comment fields', 'administer comments', 'administer comment types', 'administer account settings'));
|
||||
$this->drupalLogin($admin_user);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that the settings UI works as expected.
|
||||
*/
|
||||
function testSettingsUI() {
|
||||
// Check for the content_translation_menu_links_discovered_alter() changes.
|
||||
$this->drupalGet('admin/config');
|
||||
$this->assertLink('Content language and translation');
|
||||
$this->assertText('Configure language and translation support for content.');
|
||||
// Test that the translation settings are ignored if the bundle is marked
|
||||
// translatable but the entity type is not.
|
||||
$edit = array('settings[comment][comment_article][translatable]' => TRUE);
|
||||
$this->assertSettings('comment', NULL, FALSE, $edit);
|
||||
|
||||
// Test that the translation settings are ignored if only a field is marked
|
||||
// as translatable and not the related entity type and bundle.
|
||||
$edit = array('settings[comment][comment_article][fields][comment_body]' => TRUE);
|
||||
$this->assertSettings('comment', NULL, FALSE, $edit);
|
||||
|
||||
// Test that the translation settings are not stored if an entity type and
|
||||
// bundle are marked as translatable but no field is.
|
||||
$edit = array(
|
||||
'entity_types[comment]' => TRUE,
|
||||
'settings[comment][comment_article][translatable]' => TRUE,
|
||||
// Base fields are translatable by default.
|
||||
'settings[comment][comment_article][fields][changed]' => FALSE,
|
||||
'settings[comment][comment_article][fields][created]' => FALSE,
|
||||
'settings[comment][comment_article][fields][homepage]' => FALSE,
|
||||
'settings[comment][comment_article][fields][hostname]' => FALSE,
|
||||
'settings[comment][comment_article][fields][mail]' => FALSE,
|
||||
'settings[comment][comment_article][fields][name]' => FALSE,
|
||||
'settings[comment][comment_article][fields][status]' => FALSE,
|
||||
'settings[comment][comment_article][fields][subject]' => FALSE,
|
||||
'settings[comment][comment_article][fields][uid]' => FALSE,
|
||||
);
|
||||
$this->assertSettings('comment', 'comment_article', FALSE, $edit);
|
||||
$xpath_err = '//div[contains(@class, "error")]';
|
||||
$this->assertTrue($this->xpath($xpath_err), 'Enabling translation only for entity bundles generates a form error.');
|
||||
|
||||
// Test that the translation settings are not stored if a non-configurable
|
||||
// language is set as default and the language selector is hidden.
|
||||
$edit = array(
|
||||
'entity_types[comment]' => TRUE,
|
||||
'settings[comment][comment_article][settings][language][langcode]' => Language::LANGCODE_NOT_SPECIFIED,
|
||||
'settings[comment][comment_article][settings][language][language_alterable]' => FALSE,
|
||||
'settings[comment][comment_article][translatable]' => TRUE,
|
||||
'settings[comment][comment_article][fields][comment_body]' => TRUE,
|
||||
);
|
||||
$this->assertSettings('comment', 'comment_article', FALSE, $edit);
|
||||
$this->assertTrue($this->xpath($xpath_err), 'Enabling translation with a fixed non-configurable language generates a form error.');
|
||||
|
||||
// Test that a field shared among different bundles can be enabled without
|
||||
// needing to make all the related bundles translatable.
|
||||
$edit = array(
|
||||
'entity_types[comment]' => TRUE,
|
||||
'settings[comment][comment_article][settings][language][langcode]' => 'current_interface',
|
||||
'settings[comment][comment_article][settings][language][language_alterable]' => TRUE,
|
||||
'settings[comment][comment_article][translatable]' => TRUE,
|
||||
'settings[comment][comment_article][fields][comment_body]' => TRUE,
|
||||
// Override both comment subject fields to untranslatable.
|
||||
'settings[comment][comment_article][fields][subject]' => FALSE,
|
||||
'settings[comment][comment][fields][subject]' => FALSE,
|
||||
);
|
||||
$this->assertSettings('comment', 'comment_article', TRUE, $edit);
|
||||
$definition = $this->entityManager()->getFieldDefinitions('comment', 'comment_article')['comment_body'];
|
||||
$this->assertTrue($definition->isTranslatable(), 'Article comment body is translatable.');
|
||||
$definition = $this->entityManager()->getFieldDefinitions('comment', 'comment_article')['subject'];
|
||||
$this->assertFalse($definition->isTranslatable(), 'Article comment subject is not translatable.');
|
||||
|
||||
$definition = $this->entityManager()->getFieldDefinitions('comment', 'comment')['comment_body'];
|
||||
$this->assertFalse($definition->isTranslatable(), 'Page comment body is not translatable.');
|
||||
$definition = $this->entityManager()->getFieldDefinitions('comment', 'comment')['subject'];
|
||||
$this->assertFalse($definition->isTranslatable(), 'Page comment subject is not translatable.');
|
||||
|
||||
// Test that translation can be enabled for base fields.
|
||||
$edit = array(
|
||||
'entity_types[entity_test_mul]' => TRUE,
|
||||
'settings[entity_test_mul][entity_test_mul][translatable]' => TRUE,
|
||||
'settings[entity_test_mul][entity_test_mul][fields][name]' => TRUE,
|
||||
'settings[entity_test_mul][entity_test_mul][fields][user_id]' => FALSE,
|
||||
);
|
||||
$this->assertSettings('entity_test_mul', 'entity_test_mul', TRUE, $edit);
|
||||
$field_override = BaseFieldOverride::loadByName('entity_test_mul', 'entity_test_mul', 'name');
|
||||
$this->assertTrue($field_override->isTranslatable(), 'Base fields can be overridden with a base field bundle override entity.');
|
||||
$definitions = $this->entityManager()->getFieldDefinitions('entity_test_mul', 'entity_test_mul');
|
||||
$this->assertTrue($definitions['name']->isTranslatable() && !$definitions['user_id']->isTranslatable(), 'Base field bundle overrides were correctly altered.');
|
||||
|
||||
// Test that language settings are correctly stored.
|
||||
$language_configuration = ContentLanguageSettings::loadByEntityTypeBundle('comment', 'comment_article');
|
||||
$this->assertEqual($language_configuration->getDefaultLangcode(), 'current_interface', 'The default language for article comments is set to the interface text language selected for page.');
|
||||
$this->assertTrue($language_configuration->isLanguageAlterable(), 'The language selector for article comments is shown.');
|
||||
|
||||
// Verify language widget appears on comment type form.
|
||||
$this->drupalGet('admin/structure/comment/manage/comment_article');
|
||||
$this->assertField('language_configuration[content_translation]');
|
||||
$this->assertFieldChecked('edit-language-configuration-content-translation');
|
||||
|
||||
// Verify that translation may be enabled for the article content type.
|
||||
$edit = array(
|
||||
'language_configuration[content_translation]' => TRUE,
|
||||
);
|
||||
// Make sure the checkbox is available and not checked by default.
|
||||
$this->drupalGet('admin/structure/types/manage/article');
|
||||
$this->assertField('language_configuration[content_translation]');
|
||||
$this->assertNoFieldChecked('edit-language-configuration-content-translation');
|
||||
$this->drupalPostForm('admin/structure/types/manage/article', $edit, t('Save content type'));
|
||||
$this->drupalGet('admin/structure/types/manage/article');
|
||||
$this->assertFieldChecked('edit-language-configuration-content-translation');
|
||||
|
||||
// Test that the title field of nodes is available in the settings form.
|
||||
$edit = array(
|
||||
'entity_types[node]' => TRUE,
|
||||
'settings[node][article][settings][language][langcode]' => 'current_interface',
|
||||
'settings[node][article][settings][language][language_alterable]' => TRUE,
|
||||
'settings[node][article][translatable]' => TRUE,
|
||||
'settings[node][article][fields][title]' => TRUE
|
||||
);
|
||||
$this->assertSettings('node', NULL, TRUE, $edit);
|
||||
|
||||
foreach (array(TRUE, FALSE) as $translatable) {
|
||||
// Test that configurable field translatability is correctly switched.
|
||||
$edit = array('settings[node][article][fields][body]' => $translatable);
|
||||
$this->assertSettings('node', 'article', TRUE, $edit);
|
||||
$field = FieldConfig::loadByName('node', 'article', 'body');
|
||||
$definitions = \Drupal::entityManager()->getFieldDefinitions('node', 'article');
|
||||
$this->assertEqual($definitions['body']->isTranslatable(), $translatable, 'Field translatability correctly switched.');
|
||||
$this->assertEqual($field->isTranslatable(), $definitions['body']->isTranslatable(), 'Configurable field translatability correctly switched.');
|
||||
|
||||
// Test that also the Field UI form behaves correctly.
|
||||
$translatable = !$translatable;
|
||||
$edit = array('translatable' => $translatable);
|
||||
$this->drupalPostForm('admin/structure/types/manage/article/fields/node.article.body', $edit, t('Save settings'));
|
||||
\Drupal::entityManager()->clearCachedFieldDefinitions();
|
||||
$field = FieldConfig::loadByName('node', 'article', 'body');
|
||||
$definitions = \Drupal::entityManager()->getFieldDefinitions('node', 'article');
|
||||
$this->assertEqual($definitions['body']->isTranslatable(), $translatable, 'Field translatability correctly switched.');
|
||||
$this->assertEqual($field->isTranslatable(), $definitions['body']->isTranslatable(), 'Configurable field translatability correctly switched.');
|
||||
}
|
||||
|
||||
// Test that the order of the language list is similar to other language
|
||||
// lists, such as in Views UI.
|
||||
$this->drupalGet('admin/config/regional/content-language');
|
||||
|
||||
$expected_elements = array(
|
||||
'site_default',
|
||||
'current_interface',
|
||||
'authors_default',
|
||||
'en',
|
||||
'und',
|
||||
'zxx',
|
||||
);
|
||||
$elements = $this->xpath('//select[@id="edit-settings-node-article-settings-language-langcode"]/option');
|
||||
// Compare values inside the option elements with expected values.
|
||||
for ($i = 0; $i < count($elements); $i++) {
|
||||
$this->assertEqual($elements[$i]->attributes()->{'value'}, $expected_elements[$i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the language settings checkbox on account settings page.
|
||||
*/
|
||||
function testAccountLanguageSettingsUI() {
|
||||
// Make sure the checkbox is available and not checked by default.
|
||||
$this->drupalGet('admin/config/people/accounts');
|
||||
$this->assertField('language[content_translation]');
|
||||
$this->assertNoFieldChecked('edit-language-content-translation');
|
||||
|
||||
$edit = array(
|
||||
'language[content_translation]' => TRUE,
|
||||
);
|
||||
$this->drupalPostForm('admin/config/people/accounts', $edit, t('Save configuration'));
|
||||
$this->drupalGet('admin/config/people/accounts');
|
||||
$this->assertFieldChecked('edit-language-content-translation');
|
||||
|
||||
// Make sure account settings can be saved.
|
||||
$this->drupalPostForm('admin/config/people/accounts', array('anonymous' => 'Save me please!'), 'Save configuration');
|
||||
$this->assertFieldByName('anonymous', 'Save me please!', 'Anonymous name has been changed.');
|
||||
$this->assertText('The configuration options have been saved.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts that translatability has the expected value for the given bundle.
|
||||
*
|
||||
* @param string $entity_type
|
||||
* The entity type for which to check translatability.
|
||||
* @param string $bundle
|
||||
* The bundle for which to check translatability.
|
||||
* @param bool $enabled
|
||||
* TRUE if translatability should be enabled, FALSE otherwise.
|
||||
* @param array $edit
|
||||
* An array of values to submit to the content translation settings page.
|
||||
*
|
||||
* @return bool
|
||||
* TRUE if the assertion succeeded, FALSE otherwise.
|
||||
*/
|
||||
protected function assertSettings($entity_type, $bundle, $enabled, $edit) {
|
||||
$this->drupalPostForm('admin/config/regional/content-language', $edit, t('Save configuration'));
|
||||
$args = array('@entity_type' => $entity_type, '@bundle' => $bundle, '@enabled' => $enabled ? 'enabled' : 'disabled');
|
||||
$message = format_string('Translation for entity @entity_type (@bundle) is @enabled.', $args);
|
||||
\Drupal::entityManager()->clearCachedDefinitions();
|
||||
return $this->assertEqual(\Drupal::service('content_translation.manager')->isEnabled($entity_type, $bundle), $enabled, $message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that field setting depends on bundle translatability.
|
||||
*/
|
||||
function testFieldTranslatableSettingsUI() {
|
||||
// At least one field needs to be translatable to enable article for
|
||||
// translation. Create an extra field to be used for this purpose. We use
|
||||
// the UI to test our form alterations.
|
||||
$edit = array(
|
||||
'new_storage_type' => 'text',
|
||||
'label' => 'Test',
|
||||
'field_name' => 'article_text',
|
||||
);
|
||||
$this->drupalPostForm('admin/structure/types/manage/article/fields/add-field', $edit, 'Save and continue');
|
||||
|
||||
// Tests that field doesn't have translatable setting if bundle is not
|
||||
// translatable.
|
||||
$path = 'admin/structure/types/manage/article/fields/node.article.field_article_text';
|
||||
$this->drupalGet($path);
|
||||
$this->assertFieldByXPath('//input[@id="edit-translatable" and @disabled="disabled"]');
|
||||
$this->assertText('To configure translation for this field, enable language support for this type.', 'No translatable setting for field.');
|
||||
|
||||
// Tests that field has translatable setting if bundle is translatable.
|
||||
// Note: this field is not translatable when enable bundle translatability.
|
||||
$edit = array(
|
||||
'entity_types[node]' => TRUE,
|
||||
'settings[node][article][settings][language][language_alterable]' => TRUE,
|
||||
'settings[node][article][translatable]' => TRUE,
|
||||
'settings[node][article][fields][field_article_text]' => TRUE,
|
||||
);
|
||||
$this->assertSettings('node', 'article', TRUE, $edit);
|
||||
$this->drupalGet($path);
|
||||
$this->assertFieldByXPath('//input[@id="edit-translatable" and not(@disabled) and @checked="checked"]');
|
||||
$this->assertNoText('To enable translation of this field, enable language support for this type.', 'Translatable setting for field available.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the translatable settings checkbox for untranslatable entities.
|
||||
*/
|
||||
function testNonTranslatableTranslationSettingsUI() {
|
||||
$this->drupalGet('admin/config/regional/content-language');
|
||||
$this->assertNoField('settings[entity_test][entity_test][translatable]');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the entity manager.
|
||||
*
|
||||
* @return \Drupal\Core\Entity\EntityManagerInterface
|
||||
* The entity manager;
|
||||
*/
|
||||
protected function entityManager() {
|
||||
return $this->container->get('entity.manager');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,84 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\content_translation\Tests;
|
||||
|
||||
use Drupal\simpletest\WebTestBase;
|
||||
|
||||
/**
|
||||
* Tests the Content translation settings using the standard profile.
|
||||
*
|
||||
* @group content_translation
|
||||
*/
|
||||
class ContentTranslationStandardFieldsTest extends WebTestBase {
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = array(
|
||||
'language',
|
||||
'content_translation',
|
||||
'node',
|
||||
'comment',
|
||||
'field_ui',
|
||||
'entity_test',
|
||||
);
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected $profile = 'standard';
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
$admin_user = $this->drupalCreateUser(array(
|
||||
'access administration pages',
|
||||
'administer languages',
|
||||
'administer content translation',
|
||||
'administer content types',
|
||||
'administer node fields',
|
||||
'administer comment fields',
|
||||
'administer comments',
|
||||
'administer comment types',
|
||||
));
|
||||
$this->drupalLogin($admin_user);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that translatable fields are being rendered.
|
||||
*/
|
||||
public function testFieldTranslatableArticle() {
|
||||
|
||||
$path = 'admin/config/regional/content-language';
|
||||
$this->drupalGet($path);
|
||||
|
||||
// Check content block fields.
|
||||
$this->assertFieldByXPath("//input[@id='edit-settings-block-content-basic-fields-body' and @checked='checked']");
|
||||
|
||||
// Check comment fields.
|
||||
$this->assertFieldByXPath("//input[@id='edit-settings-comment-comment-fields-comment-body' and @checked='checked']");
|
||||
|
||||
// Check node fields.
|
||||
$this->assertFieldByXPath("//input[@id='edit-settings-node-article-fields-comment' and @checked='checked']");
|
||||
$this->assertFieldByXPath("//input[@id='edit-settings-node-article-fields-field-image' and @checked='checked']");
|
||||
$this->assertFieldByXPath("//input[@id='edit-settings-node-article-fields-field-tags' and @checked='checked']");
|
||||
|
||||
// Check user fields.
|
||||
$this->assertFieldByXPath("//input[@id='edit-settings-user-user-fields-user-picture' and @checked='checked']");
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that revision_log is not translatable.
|
||||
*/
|
||||
public function testRevisionLogNotTranslatable() {
|
||||
$path = 'admin/config/regional/content-language';
|
||||
$this->drupalGet($path);
|
||||
$this->assertNoFieldByXPath("//input[@id='edit-settings-node-article-fields-revision-log']");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,248 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\content_translation\Tests;
|
||||
|
||||
use Drupal\Core\Entity\EntityInterface;
|
||||
use Drupal\field\Entity\FieldConfig;
|
||||
use Drupal\field\Entity\FieldStorageConfig;
|
||||
use Drupal\file\Entity\File;
|
||||
|
||||
/**
|
||||
* Tests the field synchronization behavior for the image field.
|
||||
*
|
||||
* @group content_translation
|
||||
*/
|
||||
class ContentTranslationSyncImageTest extends ContentTranslationTestBase {
|
||||
|
||||
/**
|
||||
* The cardinality of the image field.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected $cardinality;
|
||||
|
||||
/**
|
||||
* The test image files.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $files;
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = array('language', 'content_translation', 'entity_test', 'image', 'field_ui');
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
$this->files = $this->drupalGetTestFiles('image');
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the test image field.
|
||||
*/
|
||||
protected function setupTestFields() {
|
||||
$this->fieldName = 'field_test_et_ui_image';
|
||||
$this->cardinality = 3;
|
||||
|
||||
FieldStorageConfig::create(array(
|
||||
'field_name' => $this->fieldName,
|
||||
'entity_type' => $this->entityTypeId,
|
||||
'type' => 'image',
|
||||
'cardinality' => $this->cardinality,
|
||||
))->save();
|
||||
|
||||
FieldConfig::create([
|
||||
'entity_type' => $this->entityTypeId,
|
||||
'field_name' => $this->fieldName,
|
||||
'bundle' => $this->entityTypeId,
|
||||
'label' => 'Test translatable image field',
|
||||
'third_party_settings' => array(
|
||||
'content_translation' => array(
|
||||
'translation_sync' => array(
|
||||
'file' => FALSE,
|
||||
'alt' => 'alt',
|
||||
'title' => 'title',
|
||||
),
|
||||
),
|
||||
),
|
||||
])->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getEditorPermissions() {
|
||||
// Every entity-type-specific test needs to define these.
|
||||
return array('administer entity_test_mul fields', 'administer languages', 'administer content translation');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests image field field synchronization.
|
||||
*/
|
||||
function testImageFieldSync() {
|
||||
// Check that the alt and title fields are enabled for the image field.
|
||||
$this->drupalLogin($this->editor);
|
||||
$this->drupalGet('entity_test_mul/structure/' . $this->entityTypeId . '/fields/' . $this->entityTypeId . '.' . $this->entityTypeId . '.' . $this->fieldName);
|
||||
$this->assertFieldChecked('edit-third-party-settings-content-translation-translation-sync-alt');
|
||||
$this->assertFieldChecked('edit-third-party-settings-content-translation-translation-sync-title');
|
||||
$edit = array(
|
||||
'third_party_settings[content_translation][translation_sync][alt]' => FALSE,
|
||||
'third_party_settings[content_translation][translation_sync][title]' => FALSE,
|
||||
);
|
||||
$this->drupalPostForm(NULL, $edit, t('Save settings'));
|
||||
|
||||
// Check that the content translation settings page reflects the changes
|
||||
// performed in the field edit page.
|
||||
$this->drupalGet('admin/config/regional/content-language');
|
||||
$this->assertNoFieldChecked('edit-settings-entity-test-mul-entity-test-mul-columns-field-test-et-ui-image-alt');
|
||||
$this->assertNoFieldChecked('edit-settings-entity-test-mul-entity-test-mul-columns-field-test-et-ui-image-title');
|
||||
$edit = array(
|
||||
'settings[entity_test_mul][entity_test_mul][fields][field_test_et_ui_image]' => TRUE,
|
||||
'settings[entity_test_mul][entity_test_mul][columns][field_test_et_ui_image][alt]' => TRUE,
|
||||
'settings[entity_test_mul][entity_test_mul][columns][field_test_et_ui_image][title]' => TRUE,
|
||||
);
|
||||
$this->drupalPostForm('admin/config/regional/content-language', $edit, t('Save configuration'));
|
||||
$errors = $this->xpath('//div[contains(@class, "messages--error")]');
|
||||
$this->assertFalse($errors, 'Settings correctly stored.');
|
||||
$this->assertFieldChecked('edit-settings-entity-test-mul-entity-test-mul-columns-field-test-et-ui-image-alt');
|
||||
$this->assertFieldChecked('edit-settings-entity-test-mul-entity-test-mul-columns-field-test-et-ui-image-title');
|
||||
$this->drupalLogin($this->translator);
|
||||
|
||||
$default_langcode = $this->langcodes[0];
|
||||
$langcode = $this->langcodes[1];
|
||||
|
||||
// Populate the test entity with some random initial values.
|
||||
$values = array(
|
||||
'name' => $this->randomMachineName(),
|
||||
'user_id' => mt_rand(1, 128),
|
||||
'langcode' => $default_langcode,
|
||||
);
|
||||
$entity = entity_create($this->entityTypeId, $values);
|
||||
|
||||
// Create some file entities from the generated test files and store them.
|
||||
$values = array();
|
||||
for ($delta = 0; $delta < $this->cardinality; $delta++) {
|
||||
// For the default language use the same order for files and field items.
|
||||
$index = $delta;
|
||||
|
||||
// Create the file entity for the image being processed and record its
|
||||
// identifier.
|
||||
$field_values = array(
|
||||
'uri' => $this->files[$index]->uri,
|
||||
'uid' => \Drupal::currentUser()->id(),
|
||||
'status' => FILE_STATUS_PERMANENT,
|
||||
);
|
||||
$file = File::create($field_values);
|
||||
$file->save();
|
||||
$fid = $file->id();
|
||||
$this->files[$index]->fid = $fid;
|
||||
|
||||
// Generate the item for the current image file entity and attach it to
|
||||
// the entity.
|
||||
$item = array(
|
||||
'target_id' => $fid,
|
||||
'alt' => $default_langcode . '_' . $fid . '_' . $this->randomMachineName(),
|
||||
'title' => $default_langcode . '_' . $fid . '_' . $this->randomMachineName(),
|
||||
);
|
||||
$entity->{$this->fieldName}[] = $item;
|
||||
|
||||
// Store the generated values keying them by fid for easier lookup.
|
||||
$values[$default_langcode][$fid] = $item;
|
||||
}
|
||||
$entity = $this->saveEntity($entity);
|
||||
|
||||
// Create some field translations for the test image field. The translated
|
||||
// items will be one less than the original values to check that only the
|
||||
// translated ones will be preserved. In fact we want the same fids and
|
||||
// items order for both languages.
|
||||
$translation = $entity->addTranslation($langcode);
|
||||
for ($delta = 0; $delta < $this->cardinality - 1; $delta++) {
|
||||
// Simulate a field reordering: items are shifted of one position ahead.
|
||||
// The modulo operator ensures we start from the beginning after reaching
|
||||
// the maximum allowed delta.
|
||||
$index = ($delta + 1) % $this->cardinality;
|
||||
|
||||
// Generate the item for the current image file entity and attach it to
|
||||
// the entity.
|
||||
$fid = $this->files[$index]->fid;
|
||||
$item = array(
|
||||
'target_id' => $fid,
|
||||
'alt' => $langcode . '_' . $fid . '_' . $this->randomMachineName(),
|
||||
'title' => $langcode . '_' . $fid . '_' . $this->randomMachineName(),
|
||||
);
|
||||
$translation->{$this->fieldName}[] = $item;
|
||||
|
||||
// Again store the generated values keying them by fid for easier lookup.
|
||||
$values[$langcode][$fid] = $item;
|
||||
}
|
||||
|
||||
// Perform synchronization: the translation language is used as source,
|
||||
// while the default language is used as target.
|
||||
$this->manager->getTranslationMetadata($translation)->setSource($default_langcode);
|
||||
$entity = $this->saveEntity($translation);
|
||||
$translation = $entity->getTranslation($langcode);
|
||||
|
||||
// Check that one value has been dropped from the original values.
|
||||
$assert = count($entity->{$this->fieldName}) == 2;
|
||||
$this->assertTrue($assert, 'One item correctly removed from the synchronized field values.');
|
||||
|
||||
// Check that fids have been synchronized and translatable column values
|
||||
// have been retained.
|
||||
$fids = array();
|
||||
foreach ($entity->{$this->fieldName} as $delta => $item) {
|
||||
$value = $values[$default_langcode][$item->target_id];
|
||||
$source_item = $translation->{$this->fieldName}->get($delta);
|
||||
$assert = $item->target_id == $source_item->target_id && $item->alt == $value['alt'] && $item->title == $value['title'];
|
||||
$this->assertTrue($assert, format_string('Field item @fid has been successfully synchronized.', array('@fid' => $item->target_id)));
|
||||
$fids[$item->target_id] = TRUE;
|
||||
}
|
||||
|
||||
// Check that the dropped value is the right one.
|
||||
$removed_fid = $this->files[0]->fid;
|
||||
$this->assertTrue(!isset($fids[$removed_fid]), format_string('Field item @fid has been correctly removed.', array('@fid' => $removed_fid)));
|
||||
|
||||
// Add back an item for the dropped value and perform synchronization again.
|
||||
$values[$langcode][$removed_fid] = array(
|
||||
'target_id' => $removed_fid,
|
||||
'alt' => $langcode . '_' . $removed_fid . '_' . $this->randomMachineName(),
|
||||
'title' => $langcode . '_' . $removed_fid . '_' . $this->randomMachineName(),
|
||||
);
|
||||
$translation->{$this->fieldName}->setValue(array_values($values[$langcode]));
|
||||
$entity = $this->saveEntity($translation);
|
||||
$translation = $entity->getTranslation($langcode);
|
||||
|
||||
// Check that the value has been added to the default language.
|
||||
$assert = count($entity->{$this->fieldName}->getValue()) == 3;
|
||||
$this->assertTrue($assert, 'One item correctly added to the synchronized field values.');
|
||||
|
||||
foreach ($entity->{$this->fieldName} as $delta => $item) {
|
||||
// When adding an item its value is copied over all the target languages,
|
||||
// thus in this case the source language needs to be used to check the
|
||||
// values instead of the target one.
|
||||
$fid_langcode = $item->target_id != $removed_fid ? $default_langcode : $langcode;
|
||||
$value = $values[$fid_langcode][$item->target_id];
|
||||
$source_item = $translation->{$this->fieldName}->get($delta);
|
||||
$assert = $item->target_id == $source_item->target_id && $item->alt == $value['alt'] && $item->title == $value['title'];
|
||||
$this->assertTrue($assert, format_string('Field item @fid has been successfully synchronized.', array('@fid' => $item->target_id)));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves the passed entity and reloads it, enabling compatibility mode.
|
||||
*
|
||||
* @param \Drupal\Core\Entity\EntityInterface $entity
|
||||
* The entity to be saved.
|
||||
*
|
||||
* @return \Drupal\Core\Entity\EntityInterface
|
||||
* The saved entity.
|
||||
*/
|
||||
protected function saveEntity(EntityInterface $entity) {
|
||||
$entity->save();
|
||||
$entity = entity_test_mul_load($entity->id(), TRUE);
|
||||
return $entity;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\content_translation\Tests;
|
||||
|
||||
use Drupal\simpletest\WebTestBase;
|
||||
|
||||
/**
|
||||
* Tests the content translation UI check skip.
|
||||
*
|
||||
* @group content_translation
|
||||
*/
|
||||
class ContentTranslationUISkipTest extends WebTestBase {
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = array('content_translation_test', 'user', 'node');
|
||||
|
||||
/**
|
||||
* Tests the content_translation_ui_skip key functionality.
|
||||
*/
|
||||
function testUICheckSkip() {
|
||||
$admin_user = $this->drupalCreateUser(array(
|
||||
'translate any entity',
|
||||
'administer content translation',
|
||||
'administer languages'
|
||||
));
|
||||
$this->drupalLogin($admin_user);
|
||||
// Visit the content translation.
|
||||
$this->drupalGet('admin/config/regional/content-language');
|
||||
|
||||
// Check the message regarding UI integration.
|
||||
$this->assertText('Test entity - Translatable skip UI check');
|
||||
$this->assertText('Test entity - Translatable check UI (Translation is not supported)');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,256 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\content_translation\Tests;
|
||||
|
||||
use Drupal\Component\Utility\SafeMarkup;
|
||||
use Drupal\Core\Language\LanguageInterface;
|
||||
use Drupal\Core\Url;
|
||||
use Drupal\user\UserInterface;
|
||||
|
||||
/**
|
||||
* Tests the content translation workflows for the test entity.
|
||||
*
|
||||
* @group content_translation
|
||||
*/
|
||||
class ContentTranslationWorkflowsTest extends ContentTranslationTestBase {
|
||||
|
||||
/**
|
||||
* The entity used for testing.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityInterface
|
||||
*/
|
||||
protected $entity;
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['language', 'content_translation', 'entity_test'];
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
$this->setupEntity();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getTranslatorPermissions() {
|
||||
$permissions = parent::getTranslatorPermissions();
|
||||
$permissions[] = 'view test entity';
|
||||
|
||||
return $permissions;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getEditorPermissions() {
|
||||
return ['administer entity_test content'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a test entity and translate it.
|
||||
*/
|
||||
protected function setupEntity() {
|
||||
$default_langcode = $this->langcodes[0];
|
||||
|
||||
// Create a test entity.
|
||||
$user = $this->drupalCreateUser();
|
||||
$values = [
|
||||
'name' => $this->randomMachineName(),
|
||||
'user_id' => $user->id(),
|
||||
$this->fieldName => [['value' => $this->randomMachineName(16)]],
|
||||
];
|
||||
$id = $this->createEntity($values, $default_langcode);
|
||||
$storage = $this->container->get('entity_type.manager')
|
||||
->getStorage($this->entityTypeId);
|
||||
$storage->resetCache([$id]);
|
||||
$this->entity = $storage->load($id);
|
||||
|
||||
// Create a translation.
|
||||
$this->drupalLogin($this->translator);
|
||||
$add_translation_url = Url::fromRoute("entity.$this->entityTypeId.content_translation_add", [$this->entityTypeId => $this->entity->id(), 'source' => $default_langcode, 'target' => $this->langcodes[2]]);
|
||||
$this->drupalPostForm($add_translation_url, [], t('Save'));
|
||||
$this->rebuildContainer();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test simple and editorial translation workflows.
|
||||
*/
|
||||
public function testWorkflows() {
|
||||
// Test workflows for the editor.
|
||||
$expected_status = [
|
||||
'edit' => 200,
|
||||
'delete' => 200,
|
||||
'overview' => 403,
|
||||
'add_translation' => 403,
|
||||
'edit_translation' => 403,
|
||||
'delete_translation' => 403,
|
||||
];
|
||||
$this->doTestWorkflows($this->editor, $expected_status);
|
||||
|
||||
// Test workflows for the translator.
|
||||
$expected_status = [
|
||||
'edit' => 403,
|
||||
'delete' => 403,
|
||||
'overview' => 200,
|
||||
'add_translation' => 200,
|
||||
'edit_translation' => 200,
|
||||
'delete_translation' => 200,
|
||||
];
|
||||
$this->doTestWorkflows($this->translator, $expected_status);
|
||||
|
||||
// Test workflows for the admin.
|
||||
$expected_status = [
|
||||
'edit' => 200,
|
||||
'delete' => 200,
|
||||
'overview' => 200,
|
||||
'add_translation' => 200,
|
||||
'edit_translation' => 403,
|
||||
'delete_translation' => 403,
|
||||
];
|
||||
$this->doTestWorkflows($this->administrator, $expected_status);
|
||||
|
||||
// Check that translation permissions allow the associated operations.
|
||||
$ops = ['create' => t('Add'), 'update' => t('Edit'), 'delete' => t('Delete')];
|
||||
$translations_url = $this->entity->urlInfo('drupal:content-translation-overview');
|
||||
foreach ($ops as $current_op => $item) {
|
||||
$user = $this->drupalCreateUser([$this->getTranslatePermission(), "$current_op content translations", 'view test entity']);
|
||||
$this->drupalLogin($user);
|
||||
$this->drupalGet($translations_url);
|
||||
|
||||
// Make sure that the user.permissions cache context and the cache tags
|
||||
// for the entity are present.
|
||||
$this->assertCacheContext('user.permissions');
|
||||
foreach ($this->entity->getCacheTags() as $cache_tag) {
|
||||
$this->assertCacheTag($cache_tag);
|
||||
}
|
||||
|
||||
foreach ($ops as $op => $label) {
|
||||
if ($op != $current_op) {
|
||||
$this->assertNoLink($label, format_string('No %op link found.', ['%op' => $label]));
|
||||
}
|
||||
else {
|
||||
$this->assertLink($label, 0, format_string('%op link found.', ['%op' => $label]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that workflows have the expected behaviors for the given user.
|
||||
*
|
||||
* @param \Drupal\user\UserInterface $user
|
||||
* The user to test the workflow behavior against.
|
||||
* @param array $expected_status
|
||||
* The an associative array with the operation name as key and the expected
|
||||
* status as value.
|
||||
*/
|
||||
protected function doTestWorkflows(UserInterface $user, $expected_status) {
|
||||
$default_langcode = $this->langcodes[0];
|
||||
$languages = $this->container->get('language_manager')->getLanguages();
|
||||
$args = ['@user_label' => $user->getUsername()];
|
||||
$options = ['language' => $languages[$default_langcode], 'absolute' => TRUE];
|
||||
$this->drupalLogin($user);
|
||||
|
||||
// Check whether the user is allowed to access the entity form in edit mode.
|
||||
$edit_url = $this->entity->urlInfo('edit-form', $options);
|
||||
$this->drupalGet($edit_url, $options);
|
||||
$this->assertResponse($expected_status['edit'], SafeMarkup::format('The @user_label has the expected edit access.', $args));
|
||||
|
||||
// Check whether the user is allowed to access the entity delete form.
|
||||
$delete_url = $this->entity->urlInfo('delete-form', $options);
|
||||
$this->drupalGet($delete_url, $options);
|
||||
$this->assertResponse($expected_status['delete'], SafeMarkup::format('The @user_label has the expected delete access.', $args));
|
||||
|
||||
// Check whether the user is allowed to access the translation overview.
|
||||
$langcode = $this->langcodes[1];
|
||||
$options['language'] = $languages[$langcode];
|
||||
$translations_url = $this->entity->url('drupal:content-translation-overview', $options);
|
||||
$this->drupalGet($translations_url);
|
||||
$this->assertResponse($expected_status['overview'], SafeMarkup::format('The @user_label has the expected translation overview access.', $args));
|
||||
|
||||
// Check whether the user is allowed to create a translation.
|
||||
$add_translation_url = Url::fromRoute("entity.$this->entityTypeId.content_translation_add", [$this->entityTypeId => $this->entity->id(), 'source' => $default_langcode, 'target' => $langcode], $options);
|
||||
if ($expected_status['add_translation'] == 200) {
|
||||
$this->clickLink('Add');
|
||||
$this->assertUrl($add_translation_url->toString(), [], 'The translation overview points to the translation form when creating translations.');
|
||||
// Check that the translation form does not contain shared elements for
|
||||
// translators.
|
||||
if ($expected_status['edit'] == 403) {
|
||||
$this->assertNoSharedElements();
|
||||
}
|
||||
}
|
||||
else {
|
||||
$this->drupalGet($add_translation_url);
|
||||
}
|
||||
$this->assertResponse($expected_status['add_translation'], SafeMarkup::format('The @user_label has the expected translation creation access.', $args));
|
||||
|
||||
// Check whether the user is allowed to edit a translation.
|
||||
$langcode = $this->langcodes[2];
|
||||
$options['language'] = $languages[$langcode];
|
||||
$edit_translation_url = Url::fromRoute("entity.$this->entityTypeId.content_translation_edit", [$this->entityTypeId => $this->entity->id(), 'language' => $langcode], $options);
|
||||
if ($expected_status['edit_translation'] == 200) {
|
||||
$this->drupalGet($translations_url);
|
||||
$editor = $expected_status['edit'] == 200;
|
||||
|
||||
if ($editor) {
|
||||
$this->clickLink('Edit', 2);
|
||||
// An editor should be pointed to the entity form in multilingual mode.
|
||||
// We need a new expected edit path with a new language.
|
||||
$expected_edit_path = $this->entity->url('edit-form', $options);
|
||||
$this->assertUrl($expected_edit_path, [], 'The translation overview points to the edit form for editors when editing translations.');
|
||||
}
|
||||
else {
|
||||
$this->clickLink('Edit');
|
||||
// While a translator should be pointed to the translation form.
|
||||
$this->assertUrl($edit_translation_url->toString(), [], 'The translation overview points to the translation form for translators when editing translations.');
|
||||
// Check that the translation form does not contain shared elements.
|
||||
$this->assertNoSharedElements();
|
||||
}
|
||||
}
|
||||
else {
|
||||
$this->drupalGet($edit_translation_url);
|
||||
}
|
||||
$this->assertResponse($expected_status['edit_translation'], SafeMarkup::format('The @user_label has the expected translation edit access.', $args));
|
||||
|
||||
// Check whether the user is allowed to delete a translation.
|
||||
$langcode = $this->langcodes[2];
|
||||
$options['language'] = $languages[$langcode];
|
||||
$delete_translation_url = Url::fromRoute("entity.$this->entityTypeId.content_translation_delete", [$this->entityTypeId => $this->entity->id(), 'language' => $langcode], $options);
|
||||
if ($expected_status['delete_translation'] == 200) {
|
||||
$this->drupalGet($translations_url);
|
||||
$editor = $expected_status['delete'] == 200;
|
||||
|
||||
if ($editor) {
|
||||
$this->clickLink('Delete', 2);
|
||||
// An editor should be pointed to the entity deletion form in
|
||||
// multilingual mode. We need a new expected delete path with a new
|
||||
// language.
|
||||
$expected_delete_path = $this->entity->url('delete-form', $options);
|
||||
$this->assertUrl($expected_delete_path, [], 'The translation overview points to the delete form for editors when deleting translations.');
|
||||
}
|
||||
else {
|
||||
$this->clickLink('Delete');
|
||||
// While a translator should be pointed to the translation deletion
|
||||
// form.
|
||||
$this->assertUrl($delete_translation_url->toString(), [], 'The translation overview points to the translation deletion form for translators when deleting translations.');
|
||||
}
|
||||
}
|
||||
else {
|
||||
$this->drupalGet($delete_translation_url);
|
||||
}
|
||||
$this->assertResponse($expected_status['delete_translation'], SafeMarkup::format('The @user_label has the expected translation deletion access.', $args));
|
||||
}
|
||||
|
||||
/**
|
||||
* Assert that the current page does not contain shared form elements.
|
||||
*/
|
||||
protected function assertNoSharedElements() {
|
||||
$language_none = LanguageInterface::LANGCODE_NOT_SPECIFIED;
|
||||
return $this->assertNoFieldByXPath("//input[@name='field_test_text[$language_none][0][value]']", NULL, 'Shared elements are not available on the translation form.');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\content_translation\Tests\Views;
|
||||
|
||||
use Drupal\views_ui\Tests\UITestBase;
|
||||
|
||||
/**
|
||||
* Tests the views UI when content_translation is enabled.
|
||||
*
|
||||
* @group content_translation
|
||||
*/
|
||||
class ContentTranslationViewsUITest extends UITestBase {
|
||||
|
||||
/**
|
||||
* Views used by this test.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $testViews = array('test_view');
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = array('content_translation');
|
||||
|
||||
/**
|
||||
* Tests the views UI.
|
||||
*/
|
||||
public function testViewsUI() {
|
||||
$this->drupalGet('admin/structure/views/view/test_view/edit');
|
||||
$this->assertTitle(t('@label (@table) | @site-name', array('@label' => 'Test view', '@table' => 'Views test data', '@site-name' => $this->config('system.site')->get('name'))));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\content_translation\Tests\Views;
|
||||
|
||||
use Drupal\content_translation\Tests\ContentTranslationTestBase;
|
||||
use Drupal\views\Tests\ViewTestData;
|
||||
use Drupal\Core\Language\Language;
|
||||
use Drupal\user\Entity\User;
|
||||
|
||||
/**
|
||||
* Tests the content translation overview link field handler.
|
||||
*
|
||||
* @group content_translation
|
||||
* @see \Drupal\content_translation\Plugin\views\field\TranslationLink
|
||||
*/
|
||||
class TranslationLinkTest extends ContentTranslationTestBase {
|
||||
|
||||
/**
|
||||
* Views used by this test.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $testViews = array('test_entity_translations_link');
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = array('content_translation_test_views');
|
||||
|
||||
protected function setUp() {
|
||||
// @todo Use entity_type once it is has multilingual Views integration.
|
||||
$this->entityTypeId = 'user';
|
||||
|
||||
parent::setUp();
|
||||
|
||||
// Assign user 1 a language code so that the entity can be translated.
|
||||
$user = User::load(1);
|
||||
$user->langcode = 'en';
|
||||
$user->save();
|
||||
|
||||
// Assign user 2 LANGCODE_NOT_SPECIFIED code so entity can't be translated.
|
||||
$user = User::load(2);
|
||||
$user->langcode = Language::LANGCODE_NOT_SPECIFIED;
|
||||
$user->save();
|
||||
|
||||
ViewTestData::createTestViews(get_class($this), array('content_translation_test_views'));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getTranslatorPermissions() {
|
||||
$permissions = parent::getTranslatorPermissions();
|
||||
$permissions[] = 'access user profiles';
|
||||
return $permissions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the content translation overview link field handler.
|
||||
*/
|
||||
public function testTranslationLink() {
|
||||
$this->drupalGet('test-entity-translations-link');
|
||||
$this->assertLinkByHref('user/1/translations');
|
||||
$this->assertNoLinkByHref('user/2/translations', 'The translations link is not present when content_translation_translate_access() is FALSE.');
|
||||
}
|
||||
|
||||
}
|
||||
+3
-3
@@ -9,8 +9,8 @@ dependencies:
|
||||
- language
|
||||
- entity_test
|
||||
|
||||
# Information added by Drupal.org packaging script on 2017-11-03
|
||||
version: '8.4.2'
|
||||
# Information added by Drupal.org packaging script on 2018-01-03
|
||||
version: '8.4.4'
|
||||
core: '8.x'
|
||||
project: 'drupal'
|
||||
datestamp: 1509719929
|
||||
datestamp: 1515021228
|
||||
|
||||
+3
-3
@@ -8,8 +8,8 @@ dependencies:
|
||||
- content_translation
|
||||
- views
|
||||
|
||||
# Information added by Drupal.org packaging script on 2017-11-03
|
||||
version: '8.4.2'
|
||||
# Information added by Drupal.org packaging script on 2018-01-03
|
||||
version: '8.4.4'
|
||||
core: '8.x'
|
||||
project: 'drupal'
|
||||
datestamp: 1509719929
|
||||
datestamp: 1515021228
|
||||
|
||||
+125
@@ -0,0 +1,125 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\Tests\content_translation\Kernel\Migrate\d6;
|
||||
|
||||
use Drupal\taxonomy\Entity\Term;
|
||||
use Drupal\Tests\migrate_drupal\Kernel\d6\MigrateDrupal6TestBase;
|
||||
use Drupal\taxonomy\TermInterface;
|
||||
|
||||
/**
|
||||
* Test migration of translated taxonomy terms.
|
||||
*
|
||||
* @group migrate_drupal_6
|
||||
*/
|
||||
class MigrateTaxonomyTermTranslationTest extends MigrateDrupal6TestBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static $modules = [
|
||||
'content_translation',
|
||||
'language',
|
||||
'menu_ui',
|
||||
'node',
|
||||
'taxonomy',
|
||||
];
|
||||
|
||||
/**
|
||||
* The cached taxonomy tree items, keyed by vid and tid.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $treeData = [];
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
$this->installEntitySchema('taxonomy_term');
|
||||
$this->installConfig(static::$modules);
|
||||
$this->executeMigrations([
|
||||
'd6_node_type',
|
||||
'd6_field',
|
||||
'd6_taxonomy_vocabulary',
|
||||
'd6_field_instance',
|
||||
'd6_taxonomy_term',
|
||||
'd6_taxonomy_term_translation',
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate a migrated term contains the expected values.
|
||||
*
|
||||
* @param int $id
|
||||
* Entity ID to load and check.
|
||||
* @param string $expected_language
|
||||
* The language code for this term.
|
||||
* @param string $expected_label
|
||||
* The label the migrated entity should have.
|
||||
* @param string $expected_vid
|
||||
* The parent vocabulary the migrated entity should have.
|
||||
* @param string $expected_description
|
||||
* The description the migrated entity should have.
|
||||
* @param string $expected_format
|
||||
* The format the migrated entity should have.
|
||||
* @param int $expected_weight
|
||||
* The weight the migrated entity should have.
|
||||
* @param array $expected_parents
|
||||
* The parent terms the migrated entity should have.
|
||||
* @param int $expected_field_integer_value
|
||||
* The value the migrated entity field should have.
|
||||
* @param int $expected_term_reference_tid
|
||||
* The term reference ID the migrated entity field should have.
|
||||
*/
|
||||
protected function assertEntity($id, $expected_language, $expected_label, $expected_vid, $expected_description = '', $expected_format = NULL, $expected_weight = 0, $expected_parents = [], $expected_field_integer_value = NULL, $expected_term_reference_tid = NULL) {
|
||||
/** @var \Drupal\taxonomy\TermInterface $entity */
|
||||
$entity = Term::load($id);
|
||||
$this->assertInstanceOf(TermInterface::class, $entity);
|
||||
$this->assertSame($expected_language, $entity->language()->getId());
|
||||
$this->assertSame($expected_label, $entity->label());
|
||||
$this->assertSame($expected_vid, $entity->getVocabularyId());
|
||||
$this->assertSame($expected_description, $entity->getDescription());
|
||||
$this->assertSame($expected_format, $entity->getFormat());
|
||||
$this->assertSame($expected_weight, $entity->getWeight());
|
||||
$this->assertHierarchy($expected_vid, $id, $expected_parents);
|
||||
}
|
||||
|
||||
/**
|
||||
* Assert that a term is present in the tree storage, with the right parents.
|
||||
*
|
||||
* @param string $vid
|
||||
* Vocabulary ID.
|
||||
* @param int $tid
|
||||
* ID of the term to check.
|
||||
* @param array $parent_ids
|
||||
* The expected parent term IDs.
|
||||
*/
|
||||
protected function assertHierarchy($vid, $tid, array $parent_ids) {
|
||||
if (!isset($this->treeData[$vid])) {
|
||||
$tree = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid);
|
||||
$this->treeData[$vid] = [];
|
||||
foreach ($tree as $item) {
|
||||
$this->treeData[$vid][$item->tid] = $item;
|
||||
}
|
||||
}
|
||||
|
||||
$this->assertArrayHasKey($tid, $this->treeData[$vid], "Term $tid exists in taxonomy tree");
|
||||
$term = $this->treeData[$vid][$tid];
|
||||
$this->assertEquals($parent_ids, array_filter($term->parents), "Term $tid has correct parents in taxonomy tree");
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the Drupal 6 i18n taxonomy term to Drupal 8 migration.
|
||||
*/
|
||||
public function testTranslatedTaxonomyTerms() {
|
||||
$this->assertEntity(1, 'zu', 'zu - term 1 of vocabulary 1', 'vocabulary_1_i_0_', 'zu - description of term 1 of vocabulary 1', NULL, '0', []);
|
||||
$this->assertEntity(2, 'fr', 'fr - term 2 of vocabulary 2', 'vocabulary_2_i_1_', 'fr - description of term 2 of vocabulary 2', NULL, '3', []);
|
||||
$this->assertEntity(3, 'fr', 'fr - term 3 of vocabulary 2', 'vocabulary_2_i_1_', 'fr - description of term 3 of vocabulary 2', NULL, '4', ['2']);
|
||||
$this->assertEntity(4, 'en', 'term 4 of vocabulary 3', 'vocabulary_3_i_2_', 'description of term 4 of vocabulary 3', NULL, '6', []);
|
||||
$this->assertEntity(5, 'en', 'term 5 of vocabulary 3', 'vocabulary_3_i_2_', 'description of term 5 of vocabulary 3', NULL, '7', ['4']);
|
||||
$this->assertEntity(6, 'en', 'term 6 of vocabulary 3', 'vocabulary_3_i_2_', 'description of term 6 of vocabulary 3', NULL, '8', ['4', '5']);
|
||||
$this->assertEntity(7, 'fr', 'fr - term 2 of vocabulary 1', 'vocabulary_1_i_0_', 'fr - desc of term 2 vocab 1', NULL, '0', []);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user