Skip to content

Commit

Permalink
#13: enable case-insensitive extension check as fallback
Browse files Browse the repository at this point in the history
  • Loading branch information
proggeler committed Nov 22, 2022
1 parent 59a1100 commit 1a10c1d
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 12 deletions.
14 changes: 8 additions & 6 deletions src/ReaderBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -214,13 +214,15 @@ private function getHandlerTypeForFile(string $file): string
{
$extension = pathinfo($file, PATHINFO_EXTENSION);

if (!array_key_exists($extension, $this->extensionToHandler)) {
throw UnreadableException::unreadable(
$file,
new RuntimeException('no handler found for file type')
);
if (array_key_exists($extension, $this->extensionToHandler)) {
return $this->extensionToHandler[$extension];
}

return $this->extensionToHandler[$extension];
$extension = strtolower($extension);
if (array_key_exists($extension, $this->extensionToHandler)) {
return $this->extensionToHandler[$extension];
}

throw UnreadableException::unreadable($file, new RuntimeException('no handler found for file type'));
}
}
54 changes: 48 additions & 6 deletions tests/ReaderBuilderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

namespace DMT\Test\Import\Reader;

use DMT\Import\Reader\Exceptions\UnreadableException;
use DMT\Import\Reader\Handlers\CsvReaderHandler;
use DMT\Import\Reader\Handlers\JsonReaderHandler;
use DMT\Import\Reader\Handlers\Sanitizers\SanitizerInterface;
use DMT\Import\Reader\Handlers\XmlReaderHandler;
Expand All @@ -12,8 +14,10 @@

class ReaderBuilderTest extends TestCase
{
public function testAddExtensionToHandler(): void
public static function setUpBeforeClass(): void
{
parent::setUpBeforeClass();

$protocol = new class() {
private $mapping = [
'stream_open' => true,
Expand All @@ -26,16 +30,22 @@ public function __call(string $func, array $args) {
};

stream_wrapper_register('dummy', get_class($protocol));
}

public function testAddExtensionToHandler(): void
{
$builder = new ReaderBuilder();
$builder->addExtensionToHandler('cxml', XmlReaderHandler::class);

$this->assertInstanceOf(
XmlReaderHandler::class,
$builder->createHandler('dummy://cars.cxml', [])
);
$this->assertInstanceOf(XmlReaderHandler::class, $builder->createHandler('dummy://cars.cxml', []));
}

stream_wrapper_unregister('dummy');
public function testCreateHandlerFailure()
{
$this->expectExceptionObject(UnreadableException::unreadable('dummy://cars.cxml'));

$builder = new ReaderBuilder();
$builder->createHandler('dummy://cars.cxml', []);
}

public function testAddSanitizer(): void
Expand All @@ -51,6 +61,31 @@ public function testAddSanitizer(): void
$this->assertContainsOnlyInstancesOf('MockSanitizer', $this->getPropertyValue($handler, 'sanitizers'));
}

/**
* @dataProvider provideHandlerDetectionFile
*
* @param string $file
* @param string $handlerClass
*
* @return void
*/
public function testHandlerDetection(string $file, string $handlerClass)
{
$builder = new ReaderBuilder();
$builder->addExtensionToHandler('XML', XmlReaderHandler::class);

$this->assertInstanceOf($handlerClass, $builder->createHandler('dummy://' . $file, []));
}

public function provideHandlerDetectionFile(): iterable
{
return [
'default lookup' => ['Foo.json', JsonReaderHandler::class],
'custom registered extension' => ['Foo.XML', XmlReaderHandler::class],
'fallback to lower case' => ['Foo.Csv', CsvReaderHandler::class],
];
}

/**
* @dataProvider provideOptions
*
Expand Down Expand Up @@ -78,6 +113,13 @@ public function provideOptions(): iterable
];
}

public static function tearDownAfterClass(): void
{
stream_wrapper_unregister('dummy');

parent::tearDownAfterClass();
}

private function getPropertyValue(object $object, $property)
{
$reader = new ReflectionProperty($object, $property);
Expand Down

0 comments on commit 1a10c1d

Please sign in to comment.