Newer
Older
Alex Barth
committed
<?php
/**
* @file
* Helper module for Feeds tests.
*/
Alex Barth
committed
/**
* Implements hook_menu().
*/
function feeds_tests_menu() {
$items['testing/feeds/flickr.xml'] = array(
'page callback' => 'feeds_tests_flickr',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
$items['testing/feeds/files.csv'] = array(
'page callback' => 'feeds_tests_files',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
Chris Leppanen
committed
$items['testing/feeds/files-remote.csv'] = array(
'page callback' => 'feeds_tests_files_remote',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
$items['testing/feeds/files-empty-alt-title.csv'] = array(
'page callback' => 'feeds_tests_files_empty_alt_title',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
$items['testing/feeds/files-empty.csv'] = array(
'page callback' => 'feeds_tests_files_empty',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
Alex Barth
committed
return $items;
}
/**
* Implements hook_theme().
*/
function feeds_tests_theme() {
return array(
'feeds_tests_flickr' => array(
'variables' => array('image_urls' => array()),
'path' => drupal_get_path('module', 'feeds_tests') . '/feeds',
'template' => 'feeds-tests-flickr',
),
'feeds_tests_files' => array(
'variables' => array('files' => array()),
'path' => drupal_get_path('module', 'feeds_tests') . '/feeds',
'template' => 'feeds-tests-files',
),
'feeds_tests_files_empty' => array(
'variables' => array('files' => array()),
'path' => drupal_get_path('module', 'feeds_tests') . '/feeds',
'template' => 'feeds-tests-files-empty',
),
Alex Barth
committed
);
}
drothstein
committed
/**
* Implements hook_cron_queue_alter().
*
* Changes runtime limit for feeds_source_import queue.
*
* @see FeedsFileFetcherTestCase::testRemoveFileAfterImportInBackground()
*/
function feeds_tests_cron_queue_info_alter(&$queues) {
$feeds_source_import_queue_time = variable_get('feeds_tests_feeds_source_import_queue_time', FALSE);
if ($feeds_source_import_queue_time && isset($queues['feeds_source_import'])) {
$queues['feeds_source_import']['time'] = $feeds_source_import_queue_time;
}
}
Alex Barth
committed
/**
* Outputs flickr test feed.
*/
function feeds_tests_flickr() {
$images = array(
0 => "tubing.jpeg",
1 => "foosball.jpeg",
2 => "attersee.jpeg",
3 => "hstreet.jpeg",
4 => "la fayette.jpeg",
Alex Barth
committed
);
$path = drupal_get_path('module', 'feeds_tests') . '/feeds/assets';
foreach ($images as &$image) {
Chris Leppanen
committed
$image = file_create_url("$path/$image");
Alex Barth
committed
}
drupal_add_http_header('Content-Type', 'application/rss+xml; charset=utf-8');
print theme('feeds_tests_flickr', array('image_urls' => $images));
}
/**
* Outputs a CSV file pointing to files.
*/
function feeds_tests_files() {
$images = array(
0 => "tubing.jpeg",
1 => "foosball.jpeg",
2 => "attersee.jpeg",
3 => "hstreet.jpeg",
4 => "la fayette.jpeg",
);
foreach ($images as &$image) {
$image = "public://images/$image";
}
drupal_add_http_header('Content-Type', 'text/plain; charset=utf-8');
print theme('feeds_tests_files', array('files' => $images));
}
niklas
committed
/**
Chris Leppanen
committed
* Outputs a CSV file pointing to files to download.
*/
function feeds_tests_files_remote() {
$images = array(
0 => 'tubing.jpeg',
1 => 'foosball.jpeg',
2 => 'attersee.jpeg',
3 => 'hstreet.jpeg',
4 => 'la fayette.jpeg',
);
$path = drupal_get_path('module', 'feeds_tests') . '/feeds/assets';
foreach ($images as &$image) {
$image = file_create_url("$path/$image");
}
drupal_add_http_header('Content-Type', 'text/plain; charset=utf-8');
print theme('feeds_tests_files', array('files' => $images));
}
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/**
* Outputs a CSV file pointing to files without alt/title.
*
* This is used to test if alt/title attributes are removed on a second import.
*/
function feeds_tests_files_empty_alt_title() {
$images = array(
0 => 'tubing.jpeg',
1 => 'foosball.jpeg',
2 => 'attersee.jpeg',
3 => 'hstreet.jpeg',
4 => 'la fayette.jpeg',
);
$path = drupal_get_path('module', 'feeds_tests') . '/feeds/assets';
foreach ($images as &$image) {
$image = file_create_url("$path/$image");
}
drupal_add_http_header('Content-Type', 'text/plain; charset=utf-8');
print theme('feeds_tests_files_empty', array('files' => $images));
}
/**
* Outputs a CSV file pointing to no files.
*
* This is used to test if files are removed on a second import.
*/
function feeds_tests_files_empty() {
$images = array(
0 => '',
1 => '',
2 => '',
3 => '',
4 => '',
);
drupal_add_http_header('Content-Type', 'text/plain; charset=utf-8');
print theme('feeds_tests_files_empty', array('files' => $images));
}
Chris Leppanen
committed
/**
* Implements hook_feeds_processor_targets().
niklas
committed
*/
function feeds_tests_feeds_processor_targets($entity_type, $bundle) {
$targets = array();
// Tests that old keys still work.
$targets['test_target_compat'] = array(
'name' => t('Old style target'),
'callback' => 'feeds_tests_mapper_set_target',
'summary_callback' => 'feeds_tests_mapper_summary',
'form_callback' => 'feeds_tests_mapper_form',
);
niklas
committed
$targets['test_target'] = array(
'name' => t('Test Target'),
'description' => t('This is a test target.'),
'callback' => 'feeds_tests_mapper_set_target',
'summary_callbacks' => array('feeds_tests_mapper_summary', 'feeds_tests_mapper_summary_2'),
'form_callbacks' => array('feeds_tests_mapper_form', 'feeds_tests_mapper_form_2'),
'preprocess_callbacks' => array(array(new FeedsTestsPreprocess(), 'callback')),
niklas
committed
);
Chris Leppanen
committed
$targets['test_unique_target'] = array(
'name' => t('Test unique target'),
'description' => t('This is a unique test target.'),
'callback' => 'feeds_tests_mapper_set_target',
'optional_unique' => TRUE,
'unique_callbacks' => array('feeds_tests_mapper_unique'),
'preprocess_callbacks' => array(
array('FeedsTestsPreprocess', 'callback'),
// Make sure that invalid callbacks are filtered.
'__feeds_tests_invalid_callback',
),
Chris Leppanen
committed
);
return $targets;
}
/**
* Implements hook_feeds_processor_targets_alter().
*/
function feeds_tests_feeds_processor_targets_alter(array &$targets, $entity_type, $bundle) {
if (!isset($targets['test_target'])) {
return;
}
$targets['test_target']['description'] = t('The target description was altered.');
}
/**
* Preprocess callback for test_target.
*
* @see feeds_tests_feeds_processor_targets()
*/
function feeds_tests_preprocess_callback(array $target, array &$mapping) {
$mapping['required_value'] = TRUE;
niklas
committed
}
/**
* Set target value on entity.
*
* @see my_module_set_target()
*/
function feeds_tests_mapper_set_target(FeedsSource $source, $entity, $target, array $values, array $mapping) {
if (empty($mapping['required_value'])) {
trigger_error('The required value was not set.', E_USER_ERROR);
}
Chris Leppanen
committed
$entity->body['und'][0]['value'] = serialize($mapping);
niklas
committed
}
/**
* Provides setting summary for the mapper.
*
* @see my_module_summary_callback()
*/
function feeds_tests_mapper_summary(array $mapping, $target, array $form, array $form_state) {
niklas
committed
$options = array(
Chris Leppanen
committed
'option1' => t('Option 1'),
niklas
committed
'option2' => t('Another Option'),
Chris Leppanen
committed
'option3' => t('Option for select'),
'option4' => t('Another One'),
niklas
committed
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
);
$items = array();
if (!empty($mapping['checkbox']) && $mapping['checkbox']) {
$items[] = t('Checkbox active.');
}
else {
$items[] = t('Checkbox inactive.');
}
if (!empty($mapping['textfield'])) {
$items[] = t('<strong>Textfield value</strong>: %textfield', array('%textfield' => $mapping['textfield']));
}
if (!empty($mapping['textarea'])) {
$items[] = t('<strong>Textarea value</strong>: %textarea', array('%textarea' => $mapping['textarea']));
}
if (!empty($mapping['radios'])) {
$items[] = t('<strong>Radios value</strong>: %radios', array('%radios' => $options[$mapping['radios']]));
}
if (!empty($mapping['select'])) {
$items[] = t('<strong>Select value</strong>: %select', array('%select' => $options[$mapping['select']]));
}
$list = array(
'#type' => 'ul',
'#theme' => 'item_list',
'#items' => $items,
);
return drupal_render($list);
}
/**
* Provides a second summary callback.
*
* @see my_module_summary_callback()
*/
function feeds_tests_mapper_summary_2(array $mapping, $target, array $form, array $form_state) {
$mapping += array('second_value' => '');
return t('Second summary: @value', array('@value' => $mapping['second_value']));
}
Chris Leppanen
committed
/**
niklas
committed
* Provides the form with mapper settings.
*/
function feeds_tests_mapper_form(array $mapping, $target, array $form, array $form_state) {
niklas
committed
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
$mapping += array(
'checkbox' => FALSE,
'textfield' => '',
'textarea' => '',
'radios' => NULL,
'select' => NULL,
);
return array(
'checkbox' => array(
'#type' => 'checkbox',
'#title' => t('A checkbox'),
'#default_value' => !empty($mapping['checkbox']),
),
'textfield' => array(
'#type' => 'textfield',
'#title' => t('A text field'),
'#default_value' => $mapping['textfield'],
'#required' => TRUE,
),
'textarea' => array(
'#type' => 'textarea',
'#title' => t('A textarea'),
'#default_value' => $mapping['textarea'],
),
'radios' => array(
'#type' => 'radios',
'#title' => t('Some radios'),
'#options' => array('option1' => t('Option 1'), 'option2' => t('Another Option')),
'#default_value' => $mapping['radios'],
),
'select' => array(
'#type' => 'select',
'#title' => t('A select list'),
'#options' => array('option3' => t('Option for select'), 'option4' => t('Another One')),
'#default_value' => $mapping['select'],
),
);
}
Chris Leppanen
committed
/**
* Provides a second settings form.
*/
function feeds_tests_mapper_form_2(array $mapping, $target, array $form, array $form_state) {
return array(
'second_value' => array(
'#type' => 'textfield',
'#title' => t('The second callback value'),
'#default_value' => !empty($mapping['second_value']) ? $mapping['second_value'] : '',
),
);
}
Chris Leppanen
committed
/**
* Callback for unique_callbacks for test_target mapper.
*
* @see feeds_tests_feeds_processor_targets()
Chris Leppanen
committed
*/
function feeds_tests_mapper_unique(FeedsSource $source, $entity_type, $bundle, $target, array $values) {
$query = new EntityFieldQuery();
$result = $query
->entityCondition('entity_type', $entity_type)
->entityCondition('bundle', $bundle)
->fieldCondition('field_alpha', 'value', $values)
->execute();
if (!empty($result[$entity_type])) {
return key($result[$entity_type]);
}
}
/**
* Implements hook_feeds_after_parse().
*/
function feeds_tests_feeds_after_parse(FeedsSource $source, FeedsParserResult $result) {
// Empties the list of items to import in case the test says that there are
// items in there with encoding issues. These items can not be processed
// during tests without having a test failure because in < PHP 5.4 that would
// produce the following warning:
// htmlspecialchars(): Invalid multibyte sequence in argument
// @see FeedsCSVParserTestCase::testMbstringExtensionDisabled()
if (variable_get('feeds_tests_feeds_after_parse_empty_items', FALSE)) {
// Remove all items. No items will be processed.
$result->items = array();
}
if ($source->id == 'user_import') {
foreach ($result->items as &$item) {
if (!empty($item['roles']) && strpos($item['roles'], '|')) {
// Convert roles value to multiple values.
// @see FeedsCSVtoUsersTest::testRoleTargetWithoutRoleCreation()
// @see FeedsCSVtoUsersTest::testRoleTargetWithRoleCreation()
// @see FeedsCSVtoUsersTest::testRoleTargetWithAllowedRoles()
$item['roles'] = explode('|', $item['roles']);
}
if (!empty($item['rids']) && strpos($item['rids'], '|')) {
// Convert roles value to multiple values.
// @see FeedsCSVtoUsersTest::testRoleTargetRids()
$item['rids'] = explode('|', $item['rids']);
}
}
}
}
drothstein
committed
/**
* Implements hook_feeds_after_save().
*
* @see FeedsFileFetcherTestCase::testRemoveFileAfterImportInBackground()
*/
function feeds_tests_feeds_after_save() {
$sleep = variable_get('feeds_tests_feeds_after_save_sleep', FALSE);
if ($sleep) {
sleep($sleep);
}
}
/**
* Helper class to ensure callbacks can be objects.
*/
class FeedsTestsPreprocess {
/**
* Preprocess callback for test_target.
*
* @see feeds_tests_feeds_processor_targets()
*/
public static function callback(array $target, array &$mapping) {