Actualización

This commit is contained in:
Xes
2025-04-10 12:24:57 +02:00
parent 8969cc929d
commit 45420b6f0d
39760 changed files with 4303286 additions and 0 deletions

View File

@@ -0,0 +1,281 @@
<?php
namespace Ddeboer\DataImport\Tests\Reader;
use Ddeboer\DataImport\Reader\CsvReader;
class CsvReaderTest extends \PHPUnit_Framework_TestCase
{
public function testReadCsvFileWithColumnHeaders()
{
$file = new \SplFileObject(__DIR__.'/../Fixtures/data_column_headers.csv');
$csvReader = new CsvReader($file);
$csvReader->setHeaderRowNumber(0);
$this->assertEquals(
array(
'id', 'number', 'description'
),
$csvReader->getFields()
);
foreach ($csvReader as $row) {
$this->assertNotNull($row['id']);
$this->assertNotNull($row['number']);
$this->assertNotNull($row['description']);
}
$this->assertEquals(
array(
'id' => 6,
'number' => '456',
'description' => 'Another description'
),
$csvReader->getRow(2)
);
}
public function testReadCsvFileWithoutColumnHeaders()
{
$file = new \SplFileObject(__DIR__.'/../Fixtures/data_no_column_headers.csv');
$csvReader = new CsvReader($file);
$this->assertEmpty($csvReader->getColumnHeaders());
}
public function testReadCsvFileWithManualColumnHeaders()
{
$file = new \SplFileObject(__DIR__.'/../Fixtures/data_no_column_headers.csv');
$csvReader = new CsvReader($file);
$csvReader->setColumnHeaders(array('id', 'number', 'description'));
foreach ($csvReader as $row) {
$this->assertNotNull($row['id']);
$this->assertNotNull($row['number']);
$this->assertNotNull($row['description']);
}
}
public function testReadCsvFileWithTrailingBlankLines()
{
$file = new \SplFileObject(__DIR__.'/../Fixtures/data_blank_lines.csv');
$csvReader = new CsvReader($file);
$csvReader->setColumnHeaders(array('id', 'number', 'description'));
foreach ($csvReader as $row) {
$this->assertNotNull($row['id']);
$this->assertNotNull($row['number']);
$this->assertNotNull($row['description']);
}
}
public function testCountWithoutHeaders()
{
$file = new \SplFileObject(__DIR__.'/../Fixtures/data_no_column_headers.csv');
$csvReader = new CsvReader($file);
$this->assertEquals(3, $csvReader->count());
}
public function testCountWithHeaders()
{
$file = new \SplFileObject(__DIR__.'/../Fixtures/data_column_headers.csv');
$csvReader = new CsvReader($file);
$csvReader->setHeaderRowNumber(0);
$this->assertEquals(3, $csvReader->count(), 'Row count should not include header');
}
public function testCountWithFewerElementsThanColumnHeadersNotStrict()
{
$file = new \SplFileObject(__DIR__.'/../Fixtures/data_fewer_elements_than_column_headers.csv');
$csvReader = new CsvReader($file);
$csvReader->setStrict(false);
$csvReader->setHeaderRowNumber(0);
$this->assertEquals(3, $csvReader->count());
}
public function testCountWithMoreElementsThanColumnHeadersNotStrict()
{
$file = new \SplFileObject(__DIR__.'/../Fixtures/data_more_elements_than_column_headers.csv');
$csvReader = new CsvReader($file);
$csvReader->setStrict(false);
$csvReader->setHeaderRowNumber(0);
$this->assertEquals(3, $csvReader->count());
$this->assertFalse($csvReader->hasErrors());
$this->assertEquals(array(6, 456, 'Another description'), array_values($csvReader->getRow(2)));
}
public function testCountDoesNotMoveFilePointer()
{
$file = new \SplFileObject(__DIR__.'/../Fixtures/data_column_headers.csv');
$csvReader = new CsvReader($file);
$csvReader->setHeaderRowNumber(0);
$key_before_count = $csvReader->key();
$csvReader->count();
$key_after_count = $csvReader->key();
$this->assertEquals($key_after_count, $key_before_count);
}
public function testVaryingElementCountWithColumnHeadersNotStrict()
{
$file = new \SplFileObject(__DIR__.'/../Fixtures/data_column_headers_varying_element_count.csv');
$csvReader = new CsvReader($file);
$csvReader->setStrict(false);
$csvReader->setHeaderRowNumber(0);
$this->assertEquals(4, $csvReader->count());
$this->assertFalse($csvReader->hasErrors());
}
public function testVaryingElementCountWithoutColumnHeadersNotStrict()
{
$file = new \SplFileObject(__DIR__.'/../Fixtures/data_no_column_headers_varying_element_count.csv');
$csvReader = new CsvReader($file);
$csvReader->setStrict(false);
$csvReader->setColumnHeaders(array('id', 'number', 'description'));
$this->assertEquals(5, $csvReader->count());
$this->assertFalse($csvReader->hasErrors());
}
public function testInvalidCsv()
{
$file = new \SplFileObject(__DIR__.'/../Fixtures/data_column_headers_varying_element_count.csv');
$reader = new CsvReader($file);
$reader->setHeaderRowNumber(0);
$this->assertTrue($reader->hasErrors());
$this->assertCount(2, $reader->getErrors());
$errors = $reader->getErrors();
$this->assertEquals(2, key($errors));
$this->assertEquals(array('123', 'test'), current($errors));
next($errors);
$this->assertEquals(3, key($errors));
$this->assertEquals(array('7', '7890', 'Some more info', 'too many columns'), current($errors));
}
public function testLastRowInvalidCsv()
{
$file = new \SplFileObject(__DIR__.'/../Fixtures/data_no_column_headers_varying_element_count.csv');
$reader = new CsvReader($file);
$reader->setColumnHeaders(array('id', 'number', 'description'));
$this->assertTrue($reader->hasErrors());
$this->assertCount(3, $reader->getErrors());
$errors = $reader->getErrors();
$this->assertEquals(1, key($errors));
$this->assertEquals(array('6', 'strictly invalid'), current($errors));
next($errors);
$this->assertEquals(3, key($errors));
$this->assertEquals(array('3','230','Yet more info','Even more info'), current($errors));
next($errors);
$this->assertEquals(4, key($errors));
$this->assertEquals(array('strictly invalid'), current($errors));
}
public function testLineBreaks()
{
$reader = $this->getReader('data_cr_breaks.csv');
$this->assertCount(3, $reader);
}
/**
* @expectedException \Ddeboer\DataImport\Exception\DuplicateHeadersException description
*/
public function testDuplicateHeadersThrowsException()
{
$reader = $this->getReader('data_column_headers_duplicates.csv');
$reader->setHeaderRowNumber(0);
}
public function testDuplicateHeadersIncrement()
{
$reader = $this->getReader('data_column_headers_duplicates.csv');
$reader->setHeaderRowNumber(0, CsvReader::DUPLICATE_HEADERS_INCREMENT);
$reader->rewind();
$current = $reader->current();
$this->assertEquals(
array('id', 'description', 'description1', 'description2', 'details', 'details1', 'last'),
$reader->getColumnHeaders()
);
$this->assertEquals(
array(
'id' => '50',
'description' => 'First',
'description1' => 'Second',
'description2' => 'Third',
'details' => 'Details1',
'details1' => 'Details2',
'last' => 'Last one'
),
$current
);
}
public function testDuplicateHeadersMerge()
{
$reader = $this->getReader('data_column_headers_duplicates.csv');
$reader->setHeaderRowNumber(0, CsvReader::DUPLICATE_HEADERS_MERGE);
$reader->rewind();
$current = $reader->current();
$this->assertCount(4, $reader->getColumnHeaders());
$expected = array(
'id' => '50',
'description' => array('First', 'Second', 'Third'),
'details' => array('Details1', 'Details2'),
'last' => 'Last one'
);
$this->assertEquals($expected, $current);
}
public function testMaximumNesting()
{
if (!function_exists('xdebug_is_enabled')) {
$this->markTestSkipped('xDebug is not installed');
}
$xdebug_start = !xdebug_is_enabled();
if ($xdebug_start) {
xdebug_enable();
}
ini_set('xdebug.max_nesting_level', 200);
$file = new \SplTempFileObject();
for($i = 0; $i < 500; $i++) {
$file->fwrite("1,2,3\n");
}
$reader = new CsvReader($file);
$reader->rewind();
$reader->setStrict(true);
$reader->setColumnHeaders(array('one','two'));
$current = $reader->current();
$this->assertEquals(null, $current);
if ($xdebug_start) {
xdebug_disable();
}
}
protected function getReader($filename)
{
$file = new \SplFileObject(__DIR__.'/../Fixtures/'.$filename);
return new CsvReader($file);
}
}