diff --git a/plugins/FeedsPlugin.inc b/plugins/FeedsPlugin.inc index ac63f2d46c6477bd1a4a766ee0ed9fb7cf99b3b9..259eedb551f4efadec4bcb5b0c4e4e92f97f85f5 100644 --- a/plugins/FeedsPlugin.inc +++ b/plugins/FeedsPlugin.inc @@ -98,7 +98,7 @@ abstract class FeedsPlugin extends FeedsConfigurable implements FeedsSourceInter * * @todo: Use CTools Plugin API. */ - protected static function loadMappers() { + public static function loadMappers() { static $loaded = FALSE; if (!$loaded) { $path = drupal_get_path('module', 'feeds') . '/mappers'; diff --git a/tests/feeds_mapper_taxonomy.test b/tests/feeds_mapper_taxonomy.test index 94dd188f58cccd21565893f969c9bbf423724215..2c6dfb65cb3dc33568a4cc70870373c230ad8f00 100644 --- a/tests/feeds_mapper_taxonomy.test +++ b/tests/feeds_mapper_taxonomy.test @@ -112,7 +112,7 @@ class FeedsMapperTaxonomyTestCase extends FeedsMapperTestCase { } /** - * Test inheriting taxonomy from the feed node. + * Tests inheriting taxonomy from the feed node. */ function testInheritTaxonomy() { @@ -152,120 +152,165 @@ class FeedsMapperTaxonomyTestCase extends FeedsMapperTestCase { } /** - * Test aggregating RSS categories to taxonomy. + * Tests searching taxonomy terms by name. */ - /* - function testRSSCategoriesToTaxonomy() { - // Add mapping to tags vocabulary. - $this->addMappings('syndication', - array( - array( - 'source' => 'tags', - 'target' => 'taxonomy:1', - ), - ) - ); - - // Aggregate feed node with "Tag" vocabulary. - $nid = $this->createFeedNode(); - // Assert 10 items aggregated after creation of the node. - $this->assertText('Created 10 nodes'); - // There should be 30 terms and 44 term-node relations. - $this->assertEqual(30, db_query("SELECT count(*) FROM {term_data}")->fetchField(), "Found correct number of terms."); - $this->assertEqual(44, db_query("SELECT count(*) FROM {term_node}")->fetchField(), "Found correct number of term-node relations."); - - // Take a look at the actual terms on frontpage. - $this->drupalGet('node'); + public function testSearchByName() { $terms = array( - 'authentication', - 'custom mapping', - 'data visualization', 'Drupal', - 'Drupal planet', - 'faceted search', - 'GeoDC', - 'graphs', - 'interface', - 'intranet', 'localization', 'localization client', 'localization server', - 'map-basec browser', - 'mapbox', - 'microfinance', - 'MIX Market', 'open atrium', - 'open data', - 'open source', - 'Peru', - 'salesforce', - 'siteminder', - 'siteminder module', - 'software freedom day', 'translation', 'translation server', - 'usability', - 'Washington DC', - 'World Bank', + 'Drupal planet', ); + + $this->setSettings('syndication', 'FeedsNodeProcessor', array( + 'skip_hash_check' => TRUE, + 'update_existing' => 2, + )); + $mappings = array( + 5 => array( + 'source' => 'tags', + 'target' => 'field_tags', + 'term_search' => 0, + ), + ); + $this->addMappings('syndication', $mappings); + $nid = $this->createFeedNode('syndication', NULL, 'Syndication'); + $this->assertText('Created 10 nodes.'); + // Check that terms we not auto-created. + $this->drupalGet('node/2'); + foreach ($terms as $term) { + $this->assertNoTaxonomyTerm($term); + } + $this->drupalGet('node/3'); + $this->assertNoTaxonomyTerm('Washington DC'); + + // Change the mapping configuration. + $this->removeMappings('syndication', $mappings); + // Turn on autocreate. + $mappings[5]['autocreate'] = TRUE; + $this->addMappings('syndication', $mappings); + $this->drupalPost('node/' . $nid . '/import', array(), t('Import')); + $this->assertText('Updated 10 nodes.'); + + $this->drupalGet('node/2'); foreach ($terms as $term) { $this->assertTaxonomyTerm($term); } + $this->drupalGet('node/3'); + $this->assertTaxonomyTerm('Washington DC'); - // Delete all items, all associations are gone. - $this->drupalPost("node/$nid/delete-items", array(), 'Delete'); - $this->assertText('Deleted 10 nodes'); - $this->assertEqual(30, db_query("SELECT count(*) FROM {term_data}")->fetchField(), "Found correct number of terms."); - $this->assertEqual(0, db_query("SELECT count(*) FROM {term_node}")->fetchField(), "Found correct number of term-node relations."); + $names = db_query('SELECT name FROM {taxonomy_term_data}')->fetchCol(); + $this->assertEqual(count($names), 31, 'Found correct number of terms in the database.'); - // Remove "Tag" setting, import again. - $edit = array( - 'tags' => FALSE, - ); - $this->drupalPost('admin/content/taxonomy/edit/vocabulary/1', $edit, 'Save'); - $this->drupalPost("node/$nid/import", array(), 'Import'); - $this->assertText('Created 10 nodes'); + // Run import again. This verifys that the terms we found by name. + $this->drupalPost('node/' . $nid . '/import', array(), t('Import')); + $this->assertText('Updated 10 nodes.'); + $names = db_query('SELECT name FROM {taxonomy_term_data}')->fetchCol(); + $this->assertEqual(count($names), 31, 'Found correct number of terms in the database.'); + } - // We should only get one term-node association per node. - $this->assertEqual(30, db_query("SELECT count(*) FROM {term_data}")->fetchField(), "Found correct number of terms."); - $this->assertEqual(10, db_query("SELECT count(*) FROM {term_node}")->fetchField(), "Found correct number of term-node relations."); + /** + * Tests mapping to taxonomy terms by tid. + */ + public function testSearchByID() { + // Create 10 terms. The first one was created in setup. + $terms = array(1); + foreach (range(2, 10) as $i) { + $term = (object) array( + 'name' => 'term' . $i, + 'vid' => 1, + ); + taxonomy_term_save($term); + $terms[] = $term->tid; + } - // Delete all items. - $this->drupalPost("node/$nid/delete-items", array(), 'Delete'); + FeedsPlugin::loadMappers(); - // Set vocabulary to multiple terms, import again. - $edit = array( - 'multiple' => TRUE, + $entity = new stdClass(); + $target = 'field_tags'; + $mapping = array( + 'term_search' => FEEDS_TAXONOMY_SEARCH_TERM_ID, ); - $this->drupalPost('admin/content/taxonomy/edit/vocabulary/1', $edit, 'Save'); - $this->drupalPost("node/$nid/import", array(), 'Import'); - $this->assertText('Created 10 nodes'); - // We should get all term-node associations again. - $this->assertEqual(30, db_query("SELECT count(*) FROM {term_data}")->fetchField(), "Found correct number of terms."); - $this->assertEqual(44, db_query("SELECT count(*) FROM {term_node}")->fetchField(), "Found correct number of term-node relations."); + taxonomy_feeds_set_target(NULL, $entity, $target, $terms, $mapping); + $this->assertEqual(count($entity->field_tags[LANGUAGE_NONE]), 10); - // Delete all items. - $this->drupalPost("node/$nid/delete-items", array(), 'Delete'); + // Test a second mapping with a bogus term id. + taxonomy_feeds_set_target(NULL, $entity, $target, array(1234), $mapping); + $this->assertEqual(count($entity->field_tags[LANGUAGE_NONE]), 10); + } - // Remove a term, import again. - $this->drupalPost('admin/content/taxonomy/edit/term/1', array(), 'Delete'); - $this->drupalPost(NULL, array(), 'Delete'); - $this->assertText('Deleted term'); - $this->drupalPost("node/$nid/import", array(), 'Import'); - $this->assertText('Created 10 nodes'); + /** + * Tests mapping to a taxonomy term's guid. + */ + public function testSearchByGUID() { + // Create 10 terms. The first one was created in setup. + $tids = array(1); + foreach (range(2, 10) as $i) { + $term = (object) array( + 'name' => 'term' . $i, + 'vid' => 1, + ); + taxonomy_term_save($term); + $tids[] = $term->tid; + } + + // Create a bunch of bogus imported terms. + $guids = array(); + foreach ($tids as $tid) { + $guid = 100 * $tid; + $guids[] = $guid; + $record = array( + 'entity_type' => 'taxonomy_term', + 'entity_id' => $tid, + 'id' => 'does_not_exist', + 'feed_nid' => 0, + 'imported' => REQUEST_TIME, + 'url' => '', + 'guid' => $guid, + ); + drupal_write_record('feeds_item', $record); + } + + FeedsPlugin::loadMappers(); + + $entity = new stdClass(); + $target = 'field_tags'; + $mapping = array( + 'term_search' => FEEDS_TAXONOMY_SEARCH_TERM_GUID, + ); + + taxonomy_feeds_set_target(NULL, $entity, $target, $guids, $mapping); + $this->assertEqual(count($entity->field_tags[LANGUAGE_NONE]), 10); + foreach ($entity->field_tags[LANGUAGE_NONE] as $delta => $values) { + $this->assertEqual($tids[$delta], $values['tid'], 'Correct term id foud.'); + } - // This term should now be missing from term-node associations. - $this->assertEqual(29, db_query("SELECT count(*) FROM {term_data}")->fetchField(), "Found correct number of terms."); - $this->assertEqual(39, db_query("SELECT count(*) FROM {term_node}")->fetchField(), "Found correct number of term-node relations."); + // Test a second mapping with a bogus term id. + taxonomy_feeds_set_target(NULL, $entity, $target, array(1234), $mapping); + $this->assertEqual(count($entity->field_tags[LANGUAGE_NONE]), 10); + foreach ($entity->field_tags[LANGUAGE_NONE] as $delta => $values) { + $this->assertEqual($tids[$delta], $values['tid'], 'Correct term id foud.'); + } } - */ /** - * Helper, finds node style taxonomy term markup in DOM. + * Finds node style taxonomy term markup in DOM. */ public function assertTaxonomyTerm($term) { $term = check_plain($term); $this->assertPattern('/<a href="\/.*taxonomy\/term\/[0-9]+">' . $term . '<\/a>/', 'Found ' . $term); } + + /** + * Asserts that the term does not exist on a node page. + */ + public function assertNoTaxonomyTerm($term) { + $term = check_plain($term); + $this->assertNoPattern('/<a href="\/.*taxonomy\/term\/[0-9]+">' . $term . '<\/a>/', 'Did not find ' . $term); + } }