Newer
Older
Alex Barth
committed
<?php
/**
* @file
* Test case for Filefield mapper mappers/filefield.inc.
*/
/**
* Class for testing Feeds file mapper.
*
* @todo Add a test for enclosures using a local file that is
* a) in place and that
* b) needs to be copied from one location to another.
*/
class FeedsMapperFileTestCase extends FeedsMapperTestCase {
public static function getInfo() {
return array(
Dave Reid
committed
'name' => 'Mapper: File field',
'description' => 'Test Feeds Mapper support for file fields. <strong>Requires SimplePie library</strong>.',
'group' => 'Feeds',
Alex Barth
committed
);
}
/**
* Basic test loading a single entry CSV file.
*/
public function test() {
$typename = $this->createContentType(array(), array('files' => 'file'));
Alex Barth
committed
// 1) Test mapping remote resources to file field.
Alex Barth
committed
// Create importer configuration.
$this->createImporterConfiguration();
$this->setPlugin('syndication', 'FeedsSimplePieParser');
$this->setSettings('syndication', 'FeedsNodeProcessor', array('content_type' => $typename));
$this->addMappings('syndication', array(
array(
'source' => 'title',
'target' => 'title'
),
array(
'source' => 'timestamp',
'target' => 'created'
),
array(
'source' => 'enclosures',
'target' => 'field_files'
Alex Barth
committed
),
));
$nid = $this->createFeedNode('syndication', $GLOBALS['base_url'] . '/testing/feeds/flickr.xml');
$this->assertText('Created 4 nodes');
$files = $this->testFiles();
$entities = db_select('feeds_item')
->fields('feeds_item', array('entity_id'))
->condition('id', 'syndication')
->execute();
foreach ($entities as $entity) {
$this->drupalGet('node/' . $entity->entity_id . '/edit');
$this->assertText(array_shift($files));
}
// 2) Test mapping local resources to file field.
// Copy directory of files, CSV file expects them in public://images, point
// file field to a 'resources' directory. Feeds should copy files from
// images/ to resources/ on import.
$this->copyDir($this->absolutePath() . '/tests/feeds/assets', 'public://images');
$edit = array(
'instance[settings][file_directory]' => 'resources',
);
$this->drupalPost('admin/structure/types/manage/' . $typename . '/fields/field_files', $edit, t('Save settings'));
// Create a CSV importer configuration.
$this->createImporterConfiguration('Node import from CSV', 'node');
$this->setPlugin('node', 'FeedsCSVParser');
$this->setSettings('node', 'FeedsNodeProcessor', array('content_type' => $typename));
$this->addMappings('node', array(
Alex Barth
committed
array(
'source' => 'title',
'target' => 'title'
),
array(
'source' => 'file',
Alex Barth
committed
'target' => 'field_files'
),
));
$edit = array(
'content_type' => '',
);
$this->drupalPost('admin/structure/feeds/edit/node/settings', $edit, 'Save');
Alex Barth
committed
// Import.
$edit = array(
'feeds[FeedsHTTPFetcher][source]' => $GLOBALS['base_url'] . '/testing/feeds/files.csv',
);
$this->drupalPost('import/node', $edit, 'Import');
Alex Barth
committed
$this->assertText('Created 4 nodes');
// Assert: files should be in resources/.
$files = $this->testFiles();
$entities = db_select('feeds_item')
->fields('feeds_item', array('entity_id'))
->condition('id', 'node')
->execute();
foreach ($entities as $entity) {
$this->drupalGet('node/' . $entity->entity_id . '/edit');
$this->assertRaw('resources/' . array_shift($files));
Alex Barth
committed
}
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
// 3) Test mapping of local resources, this time leave files in place.
$this->drupalPost('import/node/delete-items', array(), 'Delete');
// Setting the fields file directory to images will make copying files
// obsolete.
$edit = array(
'instance[settings][file_directory]' => 'images',
);
$this->drupalPost('admin/structure/types/manage/' . $typename . '/fields/field_files', $edit, t('Save settings'));
$edit = array(
'feeds[FeedsHTTPFetcher][source]' => $GLOBALS['base_url'] . '/testing/feeds/files.csv',
);
$this->drupalPost('import/node', $edit, 'Import');
$this->assertText('Created 4 nodes');
// Assert: files should be in images/ now.
$files = $this->testFiles();
$entities = db_select('feeds_item')
->fields('feeds_item', array('entity_id'))
->condition('id', 'node')
->execute();
foreach ($entities as $entity) {
$this->drupalGet('node/' . $entity->entity_id . '/edit');
$this->assertRaw('images/' . array_shift($files));
}
// Deleting all imported items will delete the files from the images/ dir.
// @todo: for some reason the first file does not get deleted.
// $this->drupalPost('import/node/delete-items', array(), 'Delete');
// foreach ($this->testFiles() as $file) {
// $this->assertFalse(is_file("public://images/$file"));
// }
}
/**
* Lists test files.
*/
public function testFiles() {
return array('tubing.jpeg', 'foosball.jpeg', 'attersee.jpeg', 'hstreet.jpeg');
Alex Barth
committed
}
/**
* Handle file field widgets.
*/
public function selectFieldWidget($fied_name, $field_type) {
if ($field_type == 'file') {
return 'file_generic';
}
else {
return parent::selectFieldWidget($fied_name, $field_type);
}
}
}