summaryrefslogtreecommitdiff
path: root/modules/field/tests
diff options
context:
space:
mode:
authorDries Buytaert <dries@buytaert.net>2010-03-25 11:46:21 +0000
committerDries Buytaert <dries@buytaert.net>2010-03-25 11:46:21 +0000
commitcfe7f8e69f9156284e1daf57921d89de256abda2 (patch)
tree0fbf95426b255f46aa8df99c9db7bcbca3859b54 /modules/field/tests
parent85969b0590391aae9b2995248d3dec5780b379da (diff)
downloadbrdo-cfe7f8e69f9156284e1daf57921d89de256abda2.tar.gz
brdo-cfe7f8e69f9156284e1daf57921d89de256abda2.tar.bz2
- Patch #657972 by plach, Berdir: make field fallback logic actually reusable.
Diffstat (limited to 'modules/field/tests')
-rw-r--r--modules/field/tests/field.test155
-rw-r--r--modules/field/tests/field_test.entity.inc13
-rw-r--r--modules/field/tests/field_test.module20
-rw-r--r--modules/field/tests/field_test.storage.inc4
4 files changed, 115 insertions, 77 deletions
diff --git a/modules/field/tests/field.test b/modules/field/tests/field.test
index f79ebd0b6..3b5cdc7b5 100644
--- a/modules/field/tests/field.test
+++ b/modules/field/tests/field.test
@@ -2604,8 +2604,7 @@ class FieldInstanceCrudTestCase extends FieldTestCase {
* Unit test class for the multilanguage fields logic.
*
* The following tests will check the multilanguage logic of _field_invoke() and
- * that only the correct values are returned by
- * field_multilingual_available_languages().
+ * that only the correct values are returned by field_available_languages().
*/
class FieldTranslationsTestCase extends FieldTestCase {
public static function getInfo() {
@@ -2628,9 +2627,6 @@ class FieldTranslationsTestCase extends FieldTestCase {
'type' => 'test_field',
'cardinality' => 4,
'translatable' => TRUE,
- 'settings' => array(
- 'test_hook_in' => FALSE,
- ),
);
field_create_field($field);
$this->field = field_read_field($this->field_name);
@@ -2639,19 +2635,6 @@ class FieldTranslationsTestCase extends FieldTestCase {
'field_name' => $this->field_name,
'object_type' => $this->obj_type,
'bundle' => 'test_bundle',
- 'label' => $this->randomName() . '_label',
- 'description' => $this->randomName() . '_description',
- 'weight' => mt_rand(0, 127),
- 'settings' => array(
- 'test_instance_setting' => $this->randomName(),
- ),
- 'widget' => array(
- 'type' => 'test_field_widget',
- 'label' => 'Test Field',
- 'settings' => array(
- 'test_widget_setting' => $this->randomName(),
- ),
- ),
);
field_create_instance($instance);
$this->instance = field_read_instance('test_entity', $this->field_name, 'test_bundle');
@@ -2663,64 +2646,34 @@ class FieldTranslationsTestCase extends FieldTestCase {
}
/**
- * Ensure that only valid values are returned by field_multilingual_available_languages().
+ * Ensures that only valid values are returned by field_available_languages().
*/
function testFieldAvailableLanguages() {
// Test 'translatable' fieldable info.
field_test_entity_info_translatable('test_entity', FALSE);
$field = $this->field;
$field['field_name'] .= '_untranslatable';
- $langcode = language_default();
- $suggested_languages = array($langcode->language);
- $available_languages = field_multilingual_available_languages($this->obj_type, $field, $suggested_languages);
- $this->assertTrue(count($available_languages) == 1 && $available_languages[0] === LANGUAGE_NONE, t('Untranslatable entity: suggested language ignored.'));
// Enable field translations for the entity.
field_test_entity_info_translatable('test_entity', TRUE);
// Test hook_field_languages() invocation on a translatable field.
- $this->field['settings']['test_hook_in'] = TRUE;
- $enabled_languages = array_keys(language_list());
- $available_languages = field_multilingual_available_languages($this->obj_type, $this->field);
- $this->assertTrue(in_array(LANGUAGE_NONE, $available_languages), t('%language is an available language.', array('%language' => LANGUAGE_NONE)));
+ variable_set('field_test_field_available_languages_alter', TRUE);
+ $enabled_languages = field_content_languages();
+ $available_languages = field_available_languages($this->obj_type, $this->field);
foreach ($available_languages as $delta => $langcode) {
- if ($langcode != LANGUAGE_NONE) {
+ if ($langcode != 'xx' && $langcode != 'en') {
$this->assertTrue(in_array($langcode, $enabled_languages), t('%language is an enabled language.', array('%language' => $langcode)));
}
}
- $this->assertFalse(in_array('xx', $available_languages), t('No invalid language was made available.'));
- $this->assertTrue(count($available_languages) == count($enabled_languages), t('An enabled language was successfully made unavailable.'));
+ $this->assertTrue(in_array('xx', $available_languages), t('%language was made available.', array('%language' => 'xx')));
+ $this->assertFalse(in_array('en', $available_languages), t('%language was made unavailable.', array('%language' => 'en')));
- // Test field_multilingual_available_languages() behavior for untranslatable fields.
+ // Test field_available_languages() behavior for untranslatable fields.
$this->field['translatable'] = FALSE;
$this->field_name = $this->field['field_name'] = $this->instance['field_name'] = drupal_strtolower($this->randomName() . '_field_name');
- $available_languages = field_multilingual_available_languages($this->obj_type, $this->field);
- $this->assertTrue(count($available_languages) == 1 && $available_languages[0] === LANGUAGE_NONE, t('For untranslatable fields only neutral language is available.'));
-
- // Test language suggestions.
- $this->field['settings']['test_hook_in'] = FALSE;
- $this->field['translatable'] = TRUE;
- $this->field_name = $this->field['field_name'] = $this->instance['field_name'] = drupal_strtolower($this->randomName() . '_field_name');
- $suggested_languages = array();
- $lang_count = mt_rand(1, count($enabled_languages) - 1);
- for ($i = 0; $i < $lang_count; ++$i) {
- do {
- $langcode = $enabled_languages[mt_rand(0, $lang_count)];
- }
- while (in_array($langcode, $suggested_languages));
- $suggested_languages[] = $langcode;
- }
-
- $available_languages = field_multilingual_available_languages($this->obj_type, $this->field, $suggested_languages);
- $this->assertEqual(count($available_languages), count($suggested_languages), t('Suggested languages were successfully made available.'));
- foreach ($available_languages as $langcode) {
- $this->assertTrue(in_array($langcode, $available_languages), t('Suggested language %language is available.', array('%language' => $langcode)));
- }
-
- $this->field_name = $this->field['field_name'] = $this->instance['field_name'] = drupal_strtolower($this->randomName() . '_field_name');
- $suggested_languages = array('xx');
- $available_languages = field_multilingual_available_languages($this->obj_type, $this->field, $suggested_languages);
- $this->assertTrue(empty($available_languages), t('An invalid suggested language was not made available.'));
+ $available_languages = field_available_languages($this->obj_type, $this->field);
+ $this->assertTrue(count($available_languages) == 1 && $available_languages[0] === LANGUAGE_NONE, t('For untranslatable fields only LANGUAGE_NONE is available.'));
}
/**
@@ -2731,10 +2684,10 @@ class FieldTranslationsTestCase extends FieldTestCase {
$entity = field_test_create_stub_entity(0, 0, $this->instance['bundle']);
// Populate some extra languages to check if _field_invoke() correctly uses
- // the result of field_multilingual_available_languages().
+ // the result of field_available_languages().
$values = array();
$extra_languages = mt_rand(1, 4);
- $languages = $available_languages = field_multilingual_available_languages($this->obj_type, $this->field);
+ $languages = $available_languages = field_available_languages($this->obj_type, $this->field);
for ($i = 0; $i < $extra_languages; ++$i) {
$languages[] = $this->randomString(2);
}
@@ -2765,14 +2718,14 @@ class FieldTranslationsTestCase extends FieldTestCase {
$entities = array();
$entity_type = 'test_entity';
$entity_count = mt_rand(1, 5);
- $available_languages = field_multilingual_available_languages($this->obj_type, $this->field);
+ $available_languages = field_available_languages($this->obj_type, $this->field);
for ($id = 1; $id <= $entity_count; ++$id) {
$entity = field_test_create_stub_entity($id, $id, $this->instance['bundle']);
$languages = $available_languages;
// Populate some extra languages to check whether _field_invoke()
- // correctly uses the result of field_multilingual_available_languages().
+ // correctly uses the result of field_available_languages().
$extra_languages = mt_rand(1, 4);
for ($i = 0; $i < $extra_languages; ++$i) {
$languages[] = $this->randomString(2);
@@ -2815,7 +2768,7 @@ class FieldTranslationsTestCase extends FieldTestCase {
$entity_type = 'test_entity';
$entity = field_test_create_stub_entity($eid, $evid, $this->instance['bundle']);
$field_translations = array();
- $available_languages = field_multilingual_available_languages($entity_type, $this->field);
+ $available_languages = field_available_languages($entity_type, $this->field);
$this->assertTrue(count($available_languages) > 1, t('Field is translatable.'));
foreach ($available_languages as $langcode) {
$field_translations[$langcode] = $this->_generateTestFieldValues($this->field['cardinality']);
@@ -2836,6 +2789,82 @@ class FieldTranslationsTestCase extends FieldTestCase {
$this->assertTrue($result, t('%language translation correctly handled.', array('%language' => $langcode)));
}
}
+
+ /**
+ * Tests display language logic for translatable fields.
+ */
+ function testFieldDisplayLanguage() {
+ $field_name = drupal_strtolower($this->randomName() . '_field_name');
+ $entity_type = 'test_entity';
+
+ // We need an additional field here to properly test display language
+ // suggestions.
+ $field = array(
+ 'field_name' => $field_name,
+ 'type' => 'test_field',
+ 'cardinality' => 2,
+ 'translatable' => TRUE,
+ );
+ field_create_field($field);
+
+ $instance = array(
+ 'field_name' => $field['field_name'],
+ 'object_type' => $entity_type,
+ 'bundle' => 'test_bundle',
+ );
+ field_create_instance($instance);
+
+ $entity = field_test_create_stub_entity(1, 1, $this->instance['bundle']);
+ list(, , $bundle) = entity_extract_ids($entity_type, $entity);
+ $instances = field_info_instances($entity_type, $bundle);
+
+ $enabled_languages = field_content_languages();
+ $languages = array();
+
+ // Generate field translations for languages different from the first
+ // enabled.
+ foreach ($instances as $instance) {
+ $field_name = $instance['field_name'];
+ $field = field_info_field($field_name);
+ do {
+ // Index 0 is reserved for the requested language, this way we ensure
+ // that no field is actually populated with it.
+ $langcode = $enabled_languages[mt_rand(1, count($enabled_languages) - 1)];
+ }
+ while (isset($languages[$langcode]));
+ $languages[$langcode] = TRUE;
+ $entity->{$field_name}[$langcode] = $this->_generateTestFieldValues($field['cardinality']);
+ }
+
+ // Test multiple-fields display languages for untranslatable entities.
+ field_test_entity_info_translatable($entity_type, FALSE);
+ drupal_static_reset('field_language');
+ $requested_language = $enabled_languages[0];
+ $display_language = field_language($entity_type, $entity, NULL, $requested_language);
+ foreach ($instances as $instance) {
+ $field_name = $instance['field_name'];
+ $this->assertTrue($display_language[$field_name] == LANGUAGE_NONE, t('The display language for field %field_name is %language.', array('%field_name' => $field_name, '%language' => LANGUAGE_NONE)));
+ }
+
+ // Test multiple-fields display languages for translatable entities.
+ field_test_entity_info_translatable($entity_type, TRUE);
+ drupal_static_reset('field_language');
+ $display_language = field_language($entity_type, $entity, NULL, $requested_language);
+
+ foreach ($instances as $instance) {
+ $field_name = $instance['field_name'];
+ $langcode = $display_language[$field_name];
+ // As the requested language was not assinged to any field, if the
+ // returned language is defined for the current field, core fallback rules
+ // were successfully applied.
+ $this->assertTrue(isset($entity->{$field_name}[$langcode]) && $langcode != $requested_language, t('The display language for the field %field_name is %language.', array('%field_name' => $field_name, '%language' => $langcode)));
+ }
+
+ // Test single-field display language.
+ drupal_static_reset('field_language');
+ $langcode = field_language($entity_type, $entity, $this->field_name, $requested_language);
+ $this->assertTrue(isset($entity->{$this->field_name}[$langcode]) && $langcode != $requested_language, t('The display language for the (single) field %field_name is %language.', array('%field_name' => $field_name, '%language' => $langcode)));
+ }
}
/**
diff --git a/modules/field/tests/field_test.entity.inc b/modules/field/tests/field_test.entity.inc
index 3196ebd19..eef3dbf73 100644
--- a/modules/field/tests/field_test.entity.inc
+++ b/modules/field/tests/field_test.entity.inc
@@ -64,6 +64,19 @@ function field_test_entity_info_alter(&$entity_info) {
}
/**
+ * Helper function to enable entity translations.
+ */
+function field_test_entity_info_translatable($entity_type = NULL, $translatable = NULL) {
+ drupal_static_reset('field_has_translation_handler');
+ $stored_value = &drupal_static(__FUNCTION__, array());
+ if (isset($entity_type)) {
+ $stored_value[$entity_type] = $translatable;
+ entity_info_cache_clear();
+ }
+ return $stored_value;
+}
+
+/**
* Creates a new bundle for test_entity entities.
*
* @param $bundle
diff --git a/modules/field/tests/field_test.module b/modules/field/tests/field_test.module
index 7d0b8366d..51cd0df70 100644
--- a/modules/field/tests/field_test.module
+++ b/modules/field/tests/field_test.module
@@ -87,27 +87,23 @@ function field_test_field_test_op_multiple($entity_type, $entities, $field, $ins
}
/**
- * Implements hook_field_languages().
+ * Implements hook_field_available_languages_alter().
*/
-function field_test_field_languages($entity_type, $field, &$languages) {
- if ($field['settings']['test_hook_in']) {
+function field_test_field_available_languages_alter(&$languages, $context) {
+ if (variable_get('field_test_field_available_languages_alter', FALSE)) {
// Add an unavailable language.
$languages[] = 'xx';
// Remove an available language.
- unset($languages[0]);
+ $index = array_search('en', $languages);
+ unset($languages[$index]);
}
}
/**
- * Helper function to enable entity translations.
+ * Implements hook_field_language_alter().
*/
-function field_test_entity_info_translatable($entity_type = NULL, $translatable = NULL) {
- $stored_value = &drupal_static(__FUNCTION__, array());
- if (isset($entity_type)) {
- $stored_value[$entity_type] = $translatable;
- entity_info_cache_clear();
- }
- return $stored_value;
+function field_test_field_language_alter(&$display_language, $context) {
+ locale_field_language_fallback($display_language, $context['entity'], $context['language']);
}
/**
diff --git a/modules/field/tests/field_test.storage.inc b/modules/field/tests/field_test.storage.inc
index 617e3b6ae..6ce272040 100644
--- a/modules/field/tests/field_test.storage.inc
+++ b/modules/field/tests/field_test.storage.inc
@@ -95,7 +95,7 @@ function field_test_field_storage_load($entity_type, $entities, $age, $fields, $
foreach ($field_data[$sub_table] as $row) {
if ($row->type == $entity_type && (!$row->deleted || $options['deleted'])) {
if (($load_current && in_array($row->entity_id, $ids)) || (!$load_current && in_array($row->revision_id, $ids))) {
- if (in_array($row->language, field_multilingual_available_languages($entity_type, $field))) {
+ if (in_array($row->language, field_available_languages($entity_type, $field))) {
if (!isset($delta_count[$row->entity_id][$row->language])) {
$delta_count[$row->entity_id][$row->language] = 0;
}
@@ -127,7 +127,7 @@ function field_test_field_storage_write($entity_type, $entity, $op, $fields) {
$field_name = $field['field_name'];
$field_data = &$data[$field_id];
- $all_languages = field_multilingual_available_languages($entity_type, $field);
+ $all_languages = field_available_languages($entity_type, $field);
$field_languages = array_intersect($all_languages, array_keys((array) $entity->$field_name));
// Delete and insert, rather than update, in case a value was added.