123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053 |
- <?php
- /**
- * @file
- * Contains FeedsMapperMultilingualFieldsTestCase.
- */
- /**
- * Tests field mapping with multiple languages.
- */
- class FeedsMapperMultilingualFieldsTestCase extends FeedsMapperTestCase {
- /**
- * Name of created content type.
- *
- * @var string
- */
- private $contentType;
- /**
- * @var array
- */
- protected $fields = array();
- public static function getInfo() {
- return array(
- 'name' => 'Mapper: Multilingual fields',
- 'description' => 'Tests Feeds multilingual support.',
- 'group' => 'Feeds',
- 'dependencies' => array('date', 'entity_translation', 'i18n_taxonomy', 'link'),
- );
- }
- public function setUp() {
- $modules = array(
- 'locale',
- 'entity_translation',
- 'date',
- 'link',
- 'list',
- 'number',
- );
- $permissions = array(
- 'administer entity translation',
- 'translate any entity',
- 'administer languages',
- );
- parent::setUp($modules, $permissions);
- // Include FeedsProcessor.inc so processor related constants are available.
- module_load_include('inc', 'feeds', 'plugins/FeedsProcessor');
- // Add French language.
- $this->addLanguage('fr', 'French');
- // Add Categories vocabulary.
- $edit = array(
- 'name' => 'Categories',
- 'machine_name' => 'categories',
- );
- $this->drupalPost('admin/structure/taxonomy/add', $edit, 'Save');
- // Create content type.
- $this->fields = array(
- 'date' => array(
- 'type' => 'date',
- 'settings' => array(
- 'field[settings][granularity][hour]' => FALSE,
- 'field[settings][granularity][minute]' => FALSE,
- 'field[settings][tz_handling]' => 'none',
- ),
- ),
- 'datestamp' => array(
- 'type' => 'datestamp',
- 'settings' => array(
- 'field[settings][granularity][second]' => TRUE,
- 'field[settings][tz_handling]' => 'utc',
- ),
- ),
- 'datetime' => array(
- 'type' => 'datetime',
- 'settings' => array(
- 'field[settings][granularity][second]' => TRUE,
- 'field[settings][tz_handling]' => 'utc',
- ),
- ),
- 'image' => array(
- 'type' => 'image',
- 'instance_settings' => array(
- 'instance[settings][alt_field]' => 1,
- 'instance[settings][title_field]' => 1,
- ),
- ),
- 'link' => 'link_field',
- 'list_boolean' => 'list_boolean',
- 'number_integer' => 'number_integer',
- 'number_decimal' => 'number_decimal',
- 'number_float' => 'number_float',
- 'text' => 'text',
- );
- $this->contentType = $this->createContentType(array(), $this->fields);
- // Create term reference field.
- $field = array(
- 'field_name' => 'field_category',
- 'type' => 'taxonomy_term_reference',
- 'cardinality' => FIELD_CARDINALITY_UNLIMITED,
- 'settings' => array(
- 'allowed_values' => array(
- array(
- 'vocabulary' => 'categories',
- 'parent' => 0,
- ),
- ),
- ),
- );
- field_create_field($field);
- // Add term reference field to article bundle.
- $this->instance = array(
- 'field_name' => 'field_category',
- 'bundle' => $this->contentType,
- 'entity_type' => 'node',
- 'widget' => array(
- 'type' => 'taxonomy_autocomplete',
- ),
- 'display' => array(
- 'default' => array(
- 'type' => 'taxonomy_term_reference_link',
- ),
- ),
- );
- field_create_instance($this->instance);
- // Make content type and fields multilingual.
- $field_names = array(
- 'body',
- 'field_category',
- );
- foreach ($this->fields as $field_name => $field_type) {
- $field_names[] = 'field_' . $field_name;
- }
- $this->setupMultilingual($this->contentType, $field_names);
- // Copy directory of source files, CSV file expects them in public://images.
- $this->copyDir($this->absolutePath() . '/tests/feeds/assets', 'public://images');
- // Create an importer configuration with basic mapping.
- $this->createImporterConfiguration('Test multilingual fields import from CSV', 'node');
- $this->setPlugin('node', 'FeedsCSVParser');
- $this->setPlugin('node', 'FeedsFileFetcher');
- $this->setSettings('node', 'FeedsNodeProcessor', array(
- 'bundle' => $this->contentType,
- 'language' => 'en',
- ));
- // Add language neutral mappings.
- $this->addMappings('node', array(
- 0 => array(
- 'source' => 'guid',
- 'target' => 'guid',
- 'unique' => 1,
- ),
- 1 => array(
- 'source' => 'title',
- 'target' => 'title',
- ),
- ));
- }
- /**
- * Tests multilingual mappings to translatable fields (entity translation).
- */
- public function testMultilingualFieldMappings() {
- // Add English mappers.
- $index = 2;
- $mappings = $this->getMappingsInLanguage('en', $index);
- // Append "_en" to each source name.
- foreach ($mappings as &$mapping) {
- $mapping['source'] .= '_en';
- }
- $this->addMappings('node', $mappings);
- $index += count($mappings);
- // Add French mappers.
- $mappings = $this->getMappingsInLanguage('fr', $index);
- // Append "_fr" to each source name.
- foreach ($mappings as &$mapping) {
- $mapping['source'] .= '_fr';
- }
- $this->addMappings('node', $mappings);
- // Import file that has items with both English and French field values.
- $this->importFile('node', $this->absolutePath() . '/tests/feeds/multilingual_en_fr.csv');
- $this->assertText(t('Created 1 node'));
- // Load node.
- $node = node_load(1, NULL, TRUE);
- // Inspect availability of English values.
- $english = $this->getEnglishValues($node) + array(
- 'field_category' => array(
- 'expected' => 1,
- 'actual' => $node->field_category['en'][0]['tid'],
- ),
- );
- foreach ($english as $field_name => $value) {
- $this->assertEqual($value['expected'], $value['actual'], format_string('The English field %field has the expected value (actual: @actual).', array('%field' => $field_name, '@actual' => $value['actual'])));
- }
- // Inspect availability of French values.
- $french = $this->getFrenchValues($node) + array(
- 'field_category' => array(
- 'expected' => 2,
- 'actual' => $node->field_category['fr'][0]['tid'],
- ),
- );
- foreach ($french as $field_name => $value) {
- $this->assertEqual($value['expected'], $value['actual'], format_string('The French field %field has the expected value (actual: @actual).', array('%field' => $field_name, '@actual' => $value['actual'])));
- }
- }
- /**
- * Tests if values of fields in other languages are kept when not importing
- * in that language.
- */
- public function testChangedLanguageImport() {
- // Add Dutch language.
- $this->addLanguage('nl', 'Dutch');
- // Import an item first in the Dutch language.
- $this->setSettings('node', 'FeedsNodeProcessor', array(
- 'language' => 'nl',
- ));
- $mappings = $this->getMappingsInLanguage('nl', 2);
- $this->addMappings('node', $mappings);
- $this->importFile('node', $this->absolutePath() . '/tests/feeds/multilingual_nl.csv');
- $this->assertText(t('Created 1 node'));
- // Assert that Dutch values were created.
- $node = node_load(1, NULL, TRUE);
- $dutch = $this->getDutchValues($node) + array(
- 'field_category' => array(
- 'expected' => 1,
- 'actual' => $node->field_category['nl'][0]['tid'],
- ),
- );
- foreach ($dutch as $field_name => $value) {
- $this->assertEqual($value['expected'], $value['actual'], format_string('The Dutch field %field has the expected value (actual: @actual).', array('%field' => $field_name, '@actual' => $value['actual'])));
- }
- // Set import to update existing nodes.
- $this->setSettings('node', 'FeedsNodeProcessor', array(
- 'update_existing' => FEEDS_UPDATE_EXISTING,
- ));
- // Change mappers language to French.
- $path = 'admin/structure/feeds/node/mapping';
- foreach ($mappings as $i => $mapping) {
- $this->drupalPostAJAX($path, array(), 'mapping_settings_edit_' . $i);
- $edit = array("config[$i][settings][field_language]" => 'fr');
- $this->drupalPostAJAX(NULL, $edit, 'mapping_settings_update_' . $i);
- $this->drupalPost(NULL, array(), t('Save'));
- }
- // Import French item.
- $this->importFile('node', $this->absolutePath() . '/tests/feeds/multilingual_fr.csv');
- $this->assertText(t('Updated 1 node'));
- // Assert that French values were created.
- $node = node_load(1, NULL, TRUE);
- $french = $this->getFrenchValues($node) + array(
- 'field_category' => array(
- 'expected' => 2,
- 'actual' => $node->field_category['fr'][0]['tid'],
- ),
- );
- foreach ($french as $field_name => $value) {
- $this->assertEqual($value['expected'], $value['actual'], format_string('The French field %field has the expected value (actual: @actual).', array('%field' => $field_name, '@actual' => $value['actual'])));
- }
- // Assert that Dutch values still exist.
- $dutch = $this->getDutchValues($node) + array(
- 'field_category' => array(
- 'expected' => 1,
- 'actual' => $node->field_category['nl'][0]['tid'],
- ),
- );
- foreach ($dutch as $field_name => $value) {
- $this->assertEqual($value['expected'], $value['actual'], format_string('The Dutch field %field has the expected value (actual: @actual).', array('%field' => $field_name, '@actual' => $value['actual'])));
- }
- }
- /**
- * Tests if values of fields in other languages are kept when not importing
- * in that language for nodes that were not created by Feeds.
- */
- public function testChangedLanguageImportForExistingNode() {
- // Add Dutch language.
- $this->addLanguage('nl', 'Dutch');
- // Date settings.
- foreach (array('datestamp', 'datetime') as $field) {
- $field = 'field_' . $field;
- $edit = array(
- 'field[settings][granularity][second]' => 1,
- );
- $this->drupalPost('admin/structure/types/manage/' . $this->contentType . '/fields/' . $field . '/field-settings', $edit, 'Save field settings');
- }
- // Hack to get date fields to not round to every 15 seconds.
- foreach (array('date', 'datestamp', 'datetime') as $field) {
- $field = 'field_' . $field;
- $edit = array(
- 'widget_type' => 'date_select',
- );
- $this->drupalPost('admin/structure/types/manage/' . $this->contentType . '/fields/' . $field . '/widget-type', $edit, 'Continue');
- $edit = array(
- 'instance[widget][settings][increment]' => 1,
- 'field[settings][enddate_get]' => 1,
- );
- $this->drupalPost('admin/structure/types/manage/' . $this->contentType . '/fields/' . $field, $edit, 'Save settings');
- $edit = array(
- 'widget_type' => 'date_text',
- );
- $this->drupalPost('admin/structure/types/manage/' . $this->contentType . '/fields/' . $field . '/widget-type', $edit, 'Continue');
- }
- // Create a node with Dutch values.
- $edit = array(
- 'title' => 'Teste Feeds Multilingue 1',
- 'body[und][0][value]' => 'Dit is de berichttekst',
- 'field_date[und][0][value][date]' => '07/29/1985',
- 'field_datestamp[und][0][value][date]' => '07/29/1985 - 04:48:12',
- 'field_datetime[und][0][value][date]' => '07/29/1985 - 04:48:12',
- 'field_link[und][0][url]' => 'http://google.nl',
- 'field_list_boolean[und]' => '1',
- 'field_number_decimal[und][0][value]' => '30.3',
- 'field_number_float[und][0][value]' => '30.2795',
- 'field_number_integer[und][0][value]' => '30',
- 'field_text[und][0][value]' => 'Wortelen',
- 'files[field_image_und_0]' => drupal_realpath('public://images/attersee.jpeg'),
- 'field_category[und]' => 'Nieuws',
- 'language' => 'nl',
- );
- $this->drupalPost('node/add/' . $this->contentType, $edit, t('Save'));
- // Add alt/title to the image.
- $edit = array(
- 'field_image[nl][0][alt]' => 'Bij het zien',
- 'field_image[nl][0][title]' => 'Bij het zien van de groene vloeistof',
- );
- $this->drupalPost('node/1/edit/nl', $edit, t('Save'));
- $this->drupalGet('node/1/edit/nl');
- // Assert that the Dutch values were put in as expected.
- $node = node_load(1, NULL, TRUE);
- $dutch = $this->getDutchValues($node) + array(
- 'field_category' => array(
- 'expected' => 1,
- 'actual' => $node->field_category['nl'][0]['tid'],
- ),
- );
- foreach ($dutch as $field_name => $value) {
- $this->assertEqual($value['expected'], $value['actual'], format_string('The Dutch field %field has the expected value (actual: @actual).', array('%field' => $field_name, '@actual' => $value['actual'])));
- }
- // Change unique target from guid (0) to title (1).
- $path = 'admin/structure/feeds/node/mapping';
- $this->drupalPostAJAX($path, array(), 'mapping_settings_edit_0');
- $edit = array("config[0][settings][unique]" => FALSE);
- $this->drupalPostAJAX(NULL, $edit, 'mapping_settings_update_0');
- $this->drupalPost(NULL, array(), t('Save'));
- $this->drupalPostAJAX($path, array(), 'mapping_settings_edit_1');
- $edit = array("config[1][settings][unique]" => 1);
- $this->drupalPostAJAX(NULL, $edit, 'mapping_settings_update_1');
- $this->drupalPost(NULL, array(), t('Save'));
- // Update this item with Feeds.
- $this->setSettings('node', 'FeedsNodeProcessor', array(
- 'update_existing' => FEEDS_UPDATE_EXISTING,
- ));
- $this->addMappings('node', $this->getMappingsInLanguage('fr'));
- $this->importFile('node', $this->absolutePath() . '/tests/feeds/multilingual_fr.csv');
- $this->assertText(t('Updated 1 node'));
- // Assert that French values were created.
- $node = node_load(1, NULL, TRUE);
- $french = $this->getFrenchValues($node) + array(
- 'field_category' => array(
- 'expected' => 2,
- 'actual' => $node->field_category['fr'][0]['tid'],
- ),
- );
- foreach ($french as $field_name => $value) {
- $this->assertEqual($value['expected'], $value['actual'], format_string('The French field %field has the expected value (actual: @actual).', array('%field' => $field_name, '@actual' => $value['actual'])));
- }
- // Assert that Dutch values still exist.
- $dutch = $this->getDutchValues($node) + array(
- 'field_category' => array(
- 'expected' => 1,
- 'actual' => $node->field_category['nl'][0]['tid'],
- ),
- );
- foreach ($dutch as $field_name => $value) {
- $this->assertEqual($value['expected'], $value['actual'], format_string('The Dutch field %field has the expected value (actual: @actual).', array('%field' => $field_name, '@actual' => $value['actual'])));
- }
- }
- /**
- * Tests if fields still are imported in their language when the
- * entity_translation module gets disabled.
- *
- * The entity_translation module is mainly an UI module for configuring field
- * language and disabling that module should not have effect on importing
- * values in a specific language for fields.
- */
- public function testWithDisabledEntityTranslationModule() {
- module_disable(array('entity_translation'));
- // Make sure that entity info is reset.
- drupal_flush_all_caches();
- drupal_static_reset();
- // Configure importer to import in French language.
- $this->setSettings('node', 'FeedsNodeProcessor', array(
- 'language' => 'fr',
- ));
- $this->addMappings('node', $this->getMappingsInLanguage('fr'));
- // Import content.
- $this->importFile('node', $this->absolutePath() . '/tests/feeds/multilingual_fr.csv');
- $this->assertText(t('Created 1 node'));
- // Assert that the fields were all created in French.
- $node = node_load(1, NULL, TRUE);
- $french = $this->getFrenchValues($node) + array(
- 'field_category' => array(
- 'expected' => 1,
- 'actual' => $node->field_category['fr'][0]['tid'],
- ),
- );
- foreach ($french as $field_name => $value) {
- $this->assertEqual($value['expected'], $value['actual'], format_string('The field %field has the expected value (actual: @actual).', array('%field' => $field_name, '@actual' => $value['actual'])));
- }
- }
- /**
- * Tests if fields are still imported in their language when the
- * entity_translation module gets uninstalled.
- *
- * @see testWithDisabledEntityTranslationModule()
- */
- public function testWithUninstalledEntityTranslationModule() {
- module_disable(array('entity_translation'));
- drupal_uninstall_modules(array('entity_translation'));
- // Make sure that entity info is reset.
- drupal_flush_all_caches();
- drupal_static_reset();
- // Configure importer to import in French language.
- $this->setSettings('node', 'FeedsNodeProcessor', array(
- 'language' => 'fr',
- ));
- $this->addMappings('node', $this->getMappingsInLanguage('fr'));
- // Import content.
- $this->importFile('node', $this->absolutePath() . '/tests/feeds/multilingual_fr.csv');
- $this->assertText(t('Created 1 node'));
- // Assert that the fields were all created in French.
- $node = node_load(1, NULL, TRUE);
- $french = $this->getFrenchValues($node) + array(
- 'field_category' => array(
- 'expected' => 1,
- 'actual' => $node->field_category['fr'][0]['tid'],
- ),
- );
- foreach ($french as $field_name => $value) {
- $this->assertEqual($value['expected'], $value['actual'], format_string('The field %field has the expected value (actual: @actual).', array('%field' => $field_name, '@actual' => $value['actual'])));
- }
- }
- /**
- * Tests if fields are imported in LANGUAGE_NONE if the field's language gets
- * disabled after configuring.
- */
- public function testDisabledLanguage() {
- // Configure importer to import in French language.
- $this->setSettings('node', 'FeedsNodeProcessor', array(
- 'language' => 'fr',
- ));
- $this->addMappings('node', $this->getMappingsInLanguage('fr'));
- // Now disable the French language.
- $path = 'admin/config/regional/language';
- $edit = array(
- 'enabled[fr]' => FALSE,
- );
- $this->drupalPost($path, $edit, t('Save configuration'));
- // Reset static cache to update the available languages.
- drupal_static_reset();
- // Ensure no error messages are shown on the mappings page.
- $this->drupalGet('admin/structure/feeds/node/mapping');
- // Import content.
- $this->importFile('node', $this->absolutePath() . '/tests/feeds/multilingual_fr.csv');
- $this->assertText(t('Created 1 node'));
- // Assert that the fields were all created in LANGUAGE_NONE.
- $node = node_load(1, NULL, TRUE);
- $french = $this->getFrenchValues($node, LANGUAGE_NONE) + array(
- 'field_category' => array(
- 'expected' => 1,
- 'actual' => $node->field_category[LANGUAGE_NONE][0]['tid'],
- ),
- );
- foreach ($french as $field_name => $value) {
- $this->assertEqual($value['expected'], $value['actual'], format_string('The field %field has the expected value (actual: @actual).', array('%field' => $field_name, '@actual' => $value['actual'])));
- }
- }
- /**
- * Tests if fields are imported in LANGUAGE_NONE if the field's language gets
- * removed after configuring.
- */
- public function testRemovedLanguage() {
- // Configure importer to import in French language.
- $this->setSettings('node', 'FeedsNodeProcessor', array(
- 'language' => 'fr',
- ));
- $this->addMappings('node', $this->getMappingsInLanguage('fr'));
- // Now remove the French language.
- $path = 'admin/config/regional/language/delete/fr';
- $this->drupalPost($path, array(), t('Delete'));
- // Reset static cache to update the available languages.
- drupal_static_reset();
- // Import content.
- $this->importFile('node', $this->absolutePath() . '/tests/feeds/multilingual_fr.csv');
- $this->assertText(t('Created 1 node'));
- // Assert that the fields were all created in LANGUAGE_NONE.
- $node = node_load(1, NULL, TRUE);
- $french = $this->getFrenchValues($node, LANGUAGE_NONE) + array(
- 'field_category' => array(
- 'expected' => 1,
- 'actual' => $node->field_category[LANGUAGE_NONE][0]['tid'],
- ),
- );
- foreach ($french as $field_name => $value) {
- $this->assertEqual($value['expected'], $value['actual'], format_string('The field %field has the expected value (actual: @actual).', array('%field' => $field_name, '@actual' => $value['actual'])));
- }
- }
- /**
- * Tests if autocreated terms are in the language that was set on the target configuration
- * in case the taxonomy is multilingual.
- */
- public function testAutocreatedTermLanguage() {
- module_enable(array('i18n_taxonomy'));
- // Make sure that entity info is reset.
- drupal_flush_all_caches();
- drupal_static_reset();
- // Enable multilingual taxonomy.
- $edit = array('i18n_mode' => 4);
- $this->drupalPost('admin/structure/taxonomy/categories/edit', $edit, 'Save');
- // Configure importer to import in French language.
- $this->setSettings('node', 'FeedsNodeProcessor', array(
- 'language' => 'fr',
- ));
- $this->addMappings('node', array(
- 2 => array(
- 'source' => 'term',
- 'target' => 'field_category',
- 'autocreate' => TRUE,
- 'field_language' => 'fr',
- ),
- ));
- // Import French item.
- $this->importFile('node', $this->absolutePath() . '/tests/feeds/multilingual_fr.csv');
- $this->assertText(t('Created 1 node'));
- // Assert that the created term is in the French language.
- $term = taxonomy_term_load(1);
- $this->assertEqual('fr', entity_language('taxonomy_term', $term));
- }
- /**
- * Tests if values are cleared out when an empty value or no value is
- * provided.
- */
- public function testClearOutValues() {
- // Set to update existing nodes.
- $this->setSettings('node', 'FeedsNodeProcessor', array(
- 'update_existing' => FEEDS_UPDATE_EXISTING,
- ));
- // Add English mappers.
- $index = 2;
- $mappings = $this->getMappingsInLanguage('en', $index);
- // Append "_en" to each source name.
- foreach ($mappings as &$mapping) {
- $mapping['source'] .= '_en';
- }
- $this->addMappings('node', $mappings);
- $index += count($mappings);
- // Add French mappers.
- $mappings = $this->getMappingsInLanguage('fr', $index);
- // Append "_fr" to each source name.
- foreach ($mappings as &$mapping) {
- $mapping['source'] .= '_fr';
- }
- $this->addMappings('node', $mappings);
- // Import file that has items with both English and French field values.
- $this->importFile('node', $this->absolutePath() . '/tests/feeds/multilingual_en_fr.csv');
- $this->assertText(t('Created 1 node'));
- // Now import a file where the French remained, but the English values were
- // removed.
- $this->importFile('node', $this->absolutePath() . '/tests/feeds/multilingual_en_fr_empty.csv');
- $this->assertText(t('Updated 1 node'));
- // Load node.
- $node = node_load(1, NULL, TRUE);
- // Check that the English values are gone, but the French values are still
- // there.
- $fields = array(
- 'body',
- 'field_date',
- 'field_datestamp',
- 'field_datetime',
- 'field_image',
- 'field_link',
- 'field_list_boolean',
- 'field_number_decimal',
- 'field_number_float',
- 'field_number_integer',
- 'field_category',
- 'field_text',
- );
- foreach ($fields as $field_name) {
- $this->assertTrue(empty($node->{$field_name}['en']), format_string('The field %field is empty.', array('%field' => $field_name)));
- }
- // Inspect availability of French values.
- $french = $this->getFrenchValues($node) + array(
- 'field_category' => array(
- 'expected' => 2,
- 'actual' => $node->field_category['fr'][0]['tid'],
- ),
- );
- // Since the image was placed on the node again, its file name is now
- // "la fayette_0.jpeg."
- $french['field_image']['expected'] = 'la fayette_0.jpeg';
- foreach ($french as $field_name => $value) {
- $this->assertEqual($value['expected'], $value['actual'], format_string('The French field %field has the expected value (actual: @actual).', array('%field' => $field_name, '@actual' => $value['actual'])));
- }
- }
- /**
- * Tests if values are cleared out when an empty value is provided for a
- * language that got disabled.
- */
- public function testClearOutValuesWithDisabledLanguage() {
- // Set to update existing nodes.
- $this->setSettings('node', 'FeedsNodeProcessor', array(
- 'update_existing' => FEEDS_UPDATE_EXISTING,
- ));
- // Configure importer to import in French language.
- $this->setSettings('node', 'FeedsNodeProcessor', array(
- 'language' => 'fr',
- ));
- $this->addMappings('node', $this->getMappingsInLanguage('fr'));
- // Now disable the French language.
- $path = 'admin/config/regional/language';
- $edit = array(
- 'enabled[fr]' => FALSE,
- );
- $this->drupalPost($path, $edit, t('Save configuration'));
- // Ensure no error messages are shown on the mappings page.
- $this->drupalGet('admin/structure/feeds/node/mapping');
- // Import content. Since the French language was disabled, the content
- // should be imported as LANGUAGE_NONE.
- // @see ::testDisabledLanguage()
- $this->importFile('node', $this->absolutePath() . '/tests/feeds/multilingual_fr.csv');
- $this->assertText(t('Created 1 node'));
- // Now import a file with empty values.
- $this->importFile('node', $this->absolutePath() . '/tests/feeds/multilingual_empty.csv');
- $this->assertText(t('Updated 1 node'));
- // Load node.
- $node = node_load(1, NULL, TRUE);
- // Check that the values in LANGUAGE_NONE are gone.
- $fields = array(
- 'body',
- 'field_date',
- 'field_datestamp',
- 'field_datetime',
- 'field_image',
- 'field_link',
- 'field_list_boolean',
- 'field_number_decimal',
- 'field_number_float',
- 'field_number_integer',
- 'field_category',
- 'field_text',
- );
- foreach ($fields as $field_name) {
- $this->assertTrue(empty($node->{$field_name}[LANGUAGE_NONE]), format_string('The field %field is empty.', array('%field' => $field_name)));
- }
- }
- /**
- * Adds a language to test with.
- *
- * @param string $langcode
- * The language's langcode.
- * @param string $label
- * The language human readable name.
- */
- protected function addLanguage($langcode, $label) {
- $edit = array(
- 'langcode' => $langcode,
- );
- $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
- $this->assertText(format_string('The language @language has been created and can now be used.', array('@language' => $label)));
- }
- /**
- * Sets given content type and fields to be translatable.
- *
- * @param string $typename
- * The machine name of the node type.
- * @param array $field_names
- * The fields to enable multilingual support for.
- */
- protected function setupMultilingual($typename, array $field_names) {
- // Enable entity field translation for content type.
- $edit = array(
- 'language_content_type' => 4,
- 'entity_translation_hide_translation_links' => 1,
- 'entity_translation_node_metadata' => 0,
- );
- $this->drupalPost('admin/structure/types/manage/' . $typename, $edit, t('Save content type'));
- // Enable field translation on fields.
- $edit = array(
- 'field[translatable]' => 1,
- );
- foreach ($field_names as $field_name) {
- $this->drupalPost("admin/structure/types/manage/{$typename}/fields/{$field_name}", $edit, t('Save settings'));
- }
- // Reset static cache so that all languages are available when
- // field_available_languages() is called during node_load().
- drupal_static_reset();
- }
- /**
- * Adds mappings for each field in specified language.
- *
- * @param string $langcode
- * The code of the desired language.
- * @param int $start
- * The index number to start the array with. This must be
- * specified in order to add mappings to the right index when
- * calling FeedsWebTestCase::addMappings().
- */
- protected function getMappingsInLanguage($langcode, $start = 2) {
- $mappings = array(
- $start => array(
- 'source' => 'body',
- 'target' => 'body',
- ),
- array(
- 'source' => 'date',
- 'target' => 'field_date:start',
- ),
- array(
- 'source' => 'datestamp',
- 'target' => 'field_datestamp:start',
- ),
- array(
- 'source' => 'datetime',
- 'target' => 'field_datetime:start',
- ),
- array(
- 'source' => 'image',
- 'target' => 'field_image:uri',
- ),
- array(
- 'source' => 'image_alt',
- 'target' => 'field_image:alt',
- ),
- array(
- 'source' => 'image_title',
- 'target' => 'field_image:title',
- ),
- array(
- 'source' => 'link',
- 'target' => 'field_link:url',
- ),
- array(
- 'source' => 'list_boolean',
- 'target' => 'field_list_boolean',
- ),
- array(
- 'source' => 'number_decimal',
- 'target' => 'field_number_decimal',
- ),
- array(
- 'source' => 'number_float',
- 'target' => 'field_number_float',
- ),
- array(
- 'source' => 'number_integer',
- 'target' => 'field_number_integer',
- ),
- array(
- 'source' => 'term',
- 'target' => 'field_category',
- 'autocreate' => TRUE,
- ),
- array(
- 'source' => 'text',
- 'target' => 'field_text',
- ),
- );
- foreach ($mappings as &$mapping) {
- $mapping['field_language'] = $langcode;
- }
- return $mappings;
- }
- /**
- * Returns expected and actual values of given node for the Dutch language.
- *
- * @param object $node
- * The multilingual node.
- * @param string $langcode
- * The used language code.
- *
- * @return array
- * The expected and actual Dutch values.
- */
- protected function getDutchValues($node, $langcode = 'nl') {
- return array(
- 'body' => array(
- 'expected' => 'Dit is de berichttekst',
- 'actual' => $node->body[$langcode][0]['value'],
- ),
- 'field_date' => array(
- 'expected' => '1985-07-29T00:00:00',
- 'actual' => $node->field_date[$langcode][0]['value'],
- ),
- 'field_datestamp' => array(
- 'expected' => '491460492',
- 'actual' => $node->field_datestamp[$langcode][0]['value'],
- ),
- 'field_datetime' => array(
- 'expected' => '1985-07-29 04:48:12',
- 'actual' => $node->field_datetime[$langcode][0]['value'],
- ),
- 'field_image' => array(
- 'expected' => 'attersee.jpeg',
- 'actual' => $node->field_image[$langcode][0]['filename'],
- ),
- 'field_image:alt' => array(
- 'expected' => 'Bij het zien',
- 'actual' => $node->field_image[$langcode][0]['alt'],
- ),
- 'field_image:title' => array(
- 'expected' => 'Bij het zien van de groene vloeistof',
- 'actual' => $node->field_image[$langcode][0]['title'],
- ),
- 'field_link' => array(
- 'expected' => 'http://google.nl',
- 'actual' => $node->field_link[$langcode][0]['url'],
- ),
- 'field_list_boolean' => array(
- 'expected' => '1',
- 'actual' => $node->field_list_boolean[$langcode][0]['value'],
- ),
- 'field_number_decimal' => array(
- 'expected' => 30.3,
- 'actual' => $node->field_number_decimal[$langcode][0]['value'],
- ),
- 'field_number_float' => array(
- 'expected' => 30.2795,
- 'actual' => $node->field_number_float[$langcode][0]['value'],
- ),
- 'field_number_integer' => array(
- 'expected' => 30,
- 'actual' => $node->field_number_integer[$langcode][0]['value'],
- ),
- 'field_text' => array(
- 'expected' => 'Wortelen',
- 'actual' => $node->field_text[$langcode][0]['value'],
- ),
- );
- }
- /**
- * Returns expected and actual values of given node for the English language.
- *
- * @param object $node
- * The multilingual node.
- * @param string $langcode
- * The used language code.
- *
- * @return array
- * The expected and actual English values.
- */
- protected function getEnglishValues($node, $langcode = 'en') {
- return array(
- 'body' => array(
- 'expected' => 'This is the body',
- 'actual' => $node->body[$langcode][0]['value'],
- ),
- 'field_date' => array(
- 'expected' => '2015-10-21T00:00:00',
- 'actual' => $node->field_date[$langcode][0]['value'],
- ),
- 'field_datestamp' => array(
- 'expected' => '1445470140',
- 'actual' => $node->field_datestamp[$langcode][0]['value'],
- ),
- 'field_datetime' => array(
- 'expected' => '2015-10-21 23:29:00',
- 'actual' => $node->field_datetime[$langcode][0]['value'],
- ),
- 'field_image' => array(
- 'expected' => 'foosball.jpeg',
- 'actual' => $node->field_image[$langcode][0]['filename'],
- ),
- 'field_image:alt' => array(
- 'expected' => 'Foosball',
- 'actual' => $node->field_image[$langcode][0]['alt'],
- ),
- 'field_image:title' => array(
- 'expected' => 'Foosball played by two guys',
- 'actual' => $node->field_image[$langcode][0]['title'],
- ),
- 'field_link' => array(
- 'expected' => 'http://google.ca',
- 'actual' => $node->field_link[$langcode][0]['url'],
- ),
- 'field_list_boolean' => array(
- 'expected' => '0',
- 'actual' => $node->field_list_boolean[$langcode][0]['value'],
- ),
- 'field_number_decimal' => array(
- 'expected' => 4.2,
- 'actual' => $node->field_number_decimal[$langcode][0]['value'],
- ),
- 'field_number_float' => array(
- 'expected' => 3.1416,
- 'actual' => $node->field_number_float[$langcode][0]['value'],
- ),
- 'field_number_integer' => array(
- 'expected' => 1000,
- 'actual' => $node->field_number_integer[$langcode][0]['value'],
- ),
- 'field_text' => array(
- 'expected' => 'Carrots',
- 'actual' => $node->field_text[$langcode][0]['value'],
- ),
- );
- }
- /**
- * Returns expected and actual values of given node for the French language.
- *
- * @param object $node
- * The multilingual node.
- * @param string $langcode
- * The used language code.
- *
- * @return array
- * The expected and actual French values.
- */
- protected function getFrenchValues($node, $langcode = 'fr') {
- return array(
- 'body' => array(
- 'expected' => 'Ceci est la corps',
- 'actual' => $node->body[$langcode][0]['value'],
- ),
- 'field_date' => array(
- 'expected' => '1955-11-05T00:00:00',
- 'actual' => $node->field_date[$langcode][0]['value'],
- ),
- 'field_datestamp' => array(
- 'expected' => '-446731187',
- 'actual' => $node->field_datestamp[$langcode][0]['value'],
- ),
- 'field_datetime' => array(
- 'expected' => '1955-11-05 12:00:13',
- 'actual' => $node->field_datetime[$langcode][0]['value'],
- ),
- 'field_image' => array(
- 'expected' => 'la fayette.jpeg',
- 'actual' => $node->field_image[$langcode][0]['filename'],
- ),
- 'field_image:alt' => array(
- 'expected' => 'La Fayette',
- 'actual' => $node->field_image[$langcode][0]['alt'],
- ),
- 'field_image:title' => array(
- 'expected' => 'la Fayette dans les bois',
- 'actual' => $node->field_image[$langcode][0]['title'],
- ),
- 'field_link' => array(
- 'expected' => 'http://google.fr',
- 'actual' => $node->field_link[$langcode][0]['url'],
- ),
- 'field_list_boolean' => array(
- 'expected' => '1',
- 'actual' => $node->field_list_boolean[$langcode][0]['value'],
- ),
- 'field_number_decimal' => array(
- 'expected' => 1.2,
- 'actual' => $node->field_number_decimal[$langcode][0]['value'],
- ),
- 'field_number_float' => array(
- 'expected' => 5.6295,
- 'actual' => $node->field_number_float[$langcode][0]['value'],
- ),
- 'field_number_integer' => array(
- 'expected' => 2000,
- 'actual' => $node->field_number_integer[$langcode][0]['value'],
- ),
- 'field_text' => array(
- 'expected' => 'Carottes',
- 'actual' => $node->field_text[$langcode][0]['value'],
- ),
- );
- }
- }
|