From 1a10c1d6e799cea08f44557f2e29c0dc00372084 Mon Sep 17 00:00:00 2001 From: proggeler Date: Tue, 22 Nov 2022 10:43:39 +0100 Subject: [PATCH] #13: enable case-insensitive extension check as fallback --- src/ReaderBuilder.php | 14 +++++----- tests/ReaderBuilderTest.php | 54 ++++++++++++++++++++++++++++++++----- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/src/ReaderBuilder.php b/src/ReaderBuilder.php index 2ae5dbf..a8add6e 100644 --- a/src/ReaderBuilder.php +++ b/src/ReaderBuilder.php @@ -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')); } } diff --git a/tests/ReaderBuilderTest.php b/tests/ReaderBuilderTest.php index 6f5d4b6..cd6c89f 100644 --- a/tests/ReaderBuilderTest.php +++ b/tests/ReaderBuilderTest.php @@ -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; @@ -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, @@ -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 @@ -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 * @@ -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);