parser_csv.test in Feeds 7.2
Same filename and directory in other branches
Tests for ParserCSV library.
File
tests/parser_csv.testView source
<?php
/**
* @file
* Tests for ParserCSV library.
*/
/**
* Test aggregating a feed as node items.
*
* Using DrupalWebTestCase as DrupalUnitTestCase is broken in SimpleTest 2.8.
* Not inheriting from Feeds base class as ParserCSV should be moved out of
* Feeds at some time.
*/
class ParserCSVTest extends DrupalWebTestCase {
protected $profile = 'testing';
/**
* {@inheritdoc}
*/
public static function getInfo() {
return array(
'name' => 'CSV Parser unit tests',
'description' => 'Base level test for Feeds\' built in CSV parser.',
'group' => 'Feeds',
);
}
/**
* Test method.
*/
public function test() {
drupal_load('module', 'feeds');
feeds_include_library('ParserCSV.inc', 'ParserCSV');
$this
->_testSimple();
$this
->_testBatching();
$this
->_testEncodingConversion();
$this
->_testEncodingConversionFailure();
}
/**
* Simple test of parsing functionality.
*/
protected function _testSimple() {
// Pull in the $control_result array.
include $this
->absolutePath() . '/tests/feeds/nodes.csv.php';
$delimiters = $this
->getDelimiters();
foreach ($delimiters as $delimiterType => $delimiter) {
$file = $this
->absolutePath() . '/tests/feeds/nodes_' . $delimiterType . '.csv';
$iterator = new ParserCSVIterator($file);
$parser = new ParserCSV();
$parser
->setDelimiter($delimiter);
$rows = $parser
->parse($iterator);
$this
->assertFalse($parser
->lastLinePos(), t('CSV reports all lines parsed, with delimiter: ') . $delimiterType);
$this
->assertEqual(md5(serialize($rows)), md5(serialize($control_result)), t('Parsed result matches control result.'));
}
}
/**
* Simple test of encoding conversion prior to parsing.
*/
protected function _testEncodingConversion() {
// Pull in the $control_result array.
include $this
->absolutePath() . '/tests/feeds/encoding.csv.php';
$encodings = $this
->getEncodings();
foreach ($encodings as $encoding) {
$file = $this
->absolutePath() . "/tests/feeds/encoding_{$encoding}.csv";
$iterator = new ParserCSVIterator($file);
$parser = new ParserCSV();
$parser
->setDelimiter(',');
$parser
->setEncoding($encoding);
$rows = $parser
->parse($iterator);
$this
->assertFalse($parser
->lastLinePos(), format_string('CSV reports all lines parsed, with encoding: %encoding', array(
'%encoding' => $encoding,
)));
$this
->assertEqual(md5(serialize($rows)), md5(serialize($control_result)), 'Converted and parsed result matches control result.');
}
}
/**
* Simple test of failed encoding conversion prior to parsing.
*/
protected function _testEncodingConversionFailure() {
// Pull in the $control_result array.
include $this
->absolutePath() . '/tests/feeds/encoding.csv.php';
$encodings = $this
->getEncodings();
foreach ($encodings as $encoding) {
$file = $this
->absolutePath() . "/tests/feeds/encoding_{$encoding}.csv";
$iterator = new ParserCSVIterator($file);
$parser = new ParserCSV();
$parser
->setDelimiter(',');
// Attempt to read file as UTF-8.
$parser
->setEncoding('UTF-8');
try {
$rows = $parser
->parse($iterator);
$this
->fail('Incorrect conversion attempt throws exception.');
} catch (ParserCSVEncodingException $e) {
$this
->assertNotNull($e
->getMessage(), 'Incorrect conversion attempt throws exception.');
}
}
}
/**
* Test batching.
*/
protected function _testBatching() {
// Pull in the $control_result array.
include $this
->absolutePath() . '/tests/feeds/nodes.csv.php';
$delimiters = $this
->getDelimiters();
foreach ($delimiters as $delimiterType => $delimiter) {
$file = $this
->absolutePath() . '/tests/feeds/nodes_' . $delimiterType . '.csv';
// Set up parser with 2 lines to parse per call.
$iterator = new ParserCSVIterator($file);
$parser = new ParserCSV();
$parser
->setDelimiter($delimiter);
$parser
->setLineLimit(2);
$rows = array();
$pos = 0;
// Call parser until all lines are parsed, then compare to control result.
do {
$parser
->setStartByte($pos);
$rows = array_merge($rows, $parser
->parse($iterator));
$pos = $parser
->lastLinePos();
$this
->assertTrue($parser
->lastLinePos() || count($rows) == 10, t('Parser reports line limit correctly'));
} while ($pos = $parser
->lastLinePos());
$this
->assertEqual(md5(serialize($rows)), md5(serialize($control_result)), t('Batch parsed result matches control result for delimiter: ') . $delimiterType);
}
}
/**
* Absolute path to feeds.
*/
public function absolutePath() {
return DRUPAL_ROOT . '/' . drupal_get_path('module', 'feeds');
}
/**
* {@inheritdoc}
*/
public static function getDelimiters() {
return array(
'comma' => ',',
'pipe' => '|',
'semicolon' => ';',
'plus' => '+',
'tab' => "\t",
);
}
/**
* {@inheritdoc}
*/
public static function getEncodings() {
return array(
'SJIS-win',
'SJIS',
);
}
}
Classes
Name | Description |
---|---|
ParserCSVTest | Test aggregating a feed as node items. |