diff --git a/Application/Model/ExportRenderer/Pretty.php b/Application/Model/ExportRenderer/Pretty.php index 9029853..8700d2f 100644 --- a/Application/Model/ExportRenderer/Pretty.php +++ b/Application/Model/ExportRenderer/Pretty.php @@ -27,10 +27,19 @@ class Pretty implements RendererInterface */ public function getContent($rows, $fieldNames) : string { - $renderer = oxNew(ArrayToTextTable::class, $rows); + $renderer = $this->getArrayToTextTableInstance($rows); return $renderer->getTable(); } + /** + * @param $rows + * @return ArrayToTextTable + */ + public function getArrayToTextTableInstance($rows) + { + return oxNew(ArrayToTextTable::class, $rows); + } + /** * @return string */ diff --git a/tests/reports/logfile.xml b/tests/reports/logfile.xml deleted file mode 100644 index c7f9b6c..0000000 --- a/tests/reports/logfile.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/unit/Application/Controller/Admin/d3AdminControllerTest.php b/tests/unit/Application/Controller/Admin/d3AdminControllerTest.php index 7be5e8e..c8130a6 100644 --- a/tests/unit/Application/Controller/Admin/d3AdminControllerTest.php +++ b/tests/unit/Application/Controller/Admin/d3AdminControllerTest.php @@ -69,7 +69,8 @@ abstract class d3AdminControllerTest extends d3ModCfgUnitTestCase } /** - * @covers d3ActionWizard::runTask() + * @covers \D3\DataWizard\Application\Controller\Admin\d3ActionWizard::runTask() + * @covers \D3\DataWizard\Application\Controller\Admin\d3ExportWizard::runTask() * @test * @throws ReflectionException */ @@ -90,7 +91,8 @@ abstract class d3AdminControllerTest extends d3ModCfgUnitTestCase } /** - * @covers d3ActionWizard::runTask() + * @covers \D3\DataWizard\Application\Controller\Admin\d3ActionWizard::runTask() + * @covers \D3\DataWizard\Application\Controller\Admin\d3ExportWizard::runTask() * @test * @param $exceptionClass * @throws ReflectionException @@ -146,7 +148,8 @@ abstract class d3AdminControllerTest extends d3ModCfgUnitTestCase } /** - * @covers d3ActionWizard::execute() + * @covers \D3\DataWizard\Application\Controller\Admin\d3ActionWizard::execute() + * @covers \D3\DataWizard\Application\Controller\Admin\d3ExportWizard::execute() * @test * @throws ReflectionException * @dataProvider executePassDataProvider @@ -207,7 +210,8 @@ abstract class d3AdminControllerTest extends d3ModCfgUnitTestCase } /** - * @covers d3ActionWizard::getUserMessages() + * @covers \D3\DataWizard\Application\Controller\Admin\d3ActionWizard::getUserMessages() + * @covers \D3\DataWizard\Application\Controller\Admin\d3ExportWizard::getUserMessages() * @test * @throws ReflectionException */ @@ -222,7 +226,8 @@ abstract class d3AdminControllerTest extends d3ModCfgUnitTestCase } /** - * @covers d3ActionWizard::getHelpURL() + * @covers \D3\DataWizard\Application\Controller\Admin\d3ActionWizard::getHelpURL() + * @covers \D3\DataWizard\Application\Controller\Admin\d3ExportWizard::getHelpURL() * @test * @throws ReflectionException */ diff --git a/tests/unit/Application/Model/ExportRenderer/CsvTest.php b/tests/unit/Application/Model/ExportRenderer/CsvTest.php new file mode 100644 index 0000000..51d9a97 --- /dev/null +++ b/tests/unit/Application/Model/ExportRenderer/CsvTest.php @@ -0,0 +1,111 @@ + + * @link https://www.oxidmodule.com + */ + +declare(strict_types=1); + +namespace D3\DataWizard\tests\unit\Application\Model\ExportRenderer; + +use D3\DataWizard\Application\Model\Exceptions\RenderException; +use D3\DataWizard\Application\Model\ExportRenderer\Csv; +use League\Csv\Exception; +use League\Csv\Writer; +use PHPUnit\Framework\MockObject\MockObject; + +class CsvTest extends ExportRendererTest +{ + /** @var Csv */ + protected $_oModel; + + public function setUp() : void + { + parent::setUp(); + + $this->_oModel = oxNew(Csv::class); + } + + /** + * @covers \D3\DataWizard\Application\Model\ExportRenderer\Csv::getContent + * @test + * @throws \ReflectionException + * @dataProvider canGetContentDataProvider + */ + public function canGetContent($blThrowException) + { + $expected = 'expectedReturn'; + $fieldList = ['field1', 'field2']; + $valueList = ['value1', 'value2']; + + /** @var Writer|MockObject $csvMock */ + $csvMockBuilder = $this->getMockBuilder(Writer::class); + $csvMockBuilder->disableOriginalConstructor(); + $onlyMethods = ['insertOne', 'insertAll']; + if (method_exists($csvMockBuilder->getMock(), 'getContent')) { + $onlyMethods[] = 'getContent'; + } else { + $csvMockBuilder->addMethods(['getContent']); + } + $csvMockBuilder->onlyMethods($onlyMethods); + $csvMock = $csvMockBuilder->getMock(); + + if ($blThrowException) { + $csvMock->expects($this->atLeastOnce())->method('getContent')->willThrowException(oxNew(Exception::class)); + $this->expectException(RenderException::class); + } else { + $csvMock->expects($this->atLeastOnce())->method('getContent')->willReturn($expected); + } + $csvMock->expects($this->atLeastOnce())->method('insertOne')->with($fieldList)->willReturn(1); + $csvMock->expects($this->atLeastOnce())->method('insertAll')->with($valueList)->willReturn(1); + + /** @var Csv|MockObject $modelMock */ + $modelMock = $this->getMockBuilder(Csv::class) + ->onlyMethods(['getCsv']) + ->getMock(); + $modelMock->expects($this->atLeastOnce())->method('getCsv')->willReturn($csvMock); + $this->_oModel = $modelMock; + + $this->assertSame( + $expected, + $this->callMethod( + $this->_oModel, + 'getContent', + [$valueList, $fieldList] + ) + ); + } + + /** + * @return array + */ + public function canGetContentDataProvider(): array + { + return [ + 'exception' => [true], + 'no exception' => [false] + ]; + } + /** + * @covers \D3\DataWizard\Application\Model\ExportRenderer\Csv::getCsv + * @test + * @throws \ReflectionException + */ + public function canGetCsv() + { + $this->assertInstanceOf( + Writer::class, + $this->callMethod( + $this->_oModel, + 'getCsv' + ) + ); + } +} \ No newline at end of file diff --git a/tests/unit/Application/Model/ExportRenderer/ExportRendererTest.php b/tests/unit/Application/Model/ExportRenderer/ExportRendererTest.php new file mode 100644 index 0000000..f89dede --- /dev/null +++ b/tests/unit/Application/Model/ExportRenderer/ExportRendererTest.php @@ -0,0 +1,65 @@ + + * @link https://www.oxidmodule.com + */ + +namespace D3\DataWizard\tests\unit\Application\Model\ExportRenderer; + +use D3\DataWizard\Application\Model\ExportRenderer\RendererInterface; +use D3\ModCfg\Tests\unit\d3ModCfgUnitTestCase; + +abstract class ExportRendererTest extends d3ModCfgUnitTestCase +{ + /** @var RendererInterface */ + protected $_oModel; + + public function tearDown() : void + { + parent::tearDown(); + + unset($this->_oModel); + } + + /** + * @covers \D3\DataWizard\Application\Model\ExportRenderer\Csv::getFileExtension + * @covers \D3\DataWizard\Application\Model\ExportRenderer\Json::getFileExtension + * @covers \D3\DataWizard\Application\Model\ExportRenderer\Pretty::getFileExtension + * @test + * @throws \ReflectionException + */ + public function canGetFileExtension() + { + $this->assertRegExp( + "/^[a-z0-9._-]*$/i", + $this->callMethod( + $this->_oModel, + 'getFileExtension' + ) + ); + } + + /** + * @covers \D3\DataWizard\Application\Model\ExportRenderer\Csv::getTitleTranslationId + * @covers \D3\DataWizard\Application\Model\ExportRenderer\Json::getTitleTranslationId + * @covers \D3\DataWizard\Application\Model\ExportRenderer\Pretty::getTitleTranslationId + * @test + * @throws \ReflectionException + */ + public function canGetTitleTranslationId() + { + $this->assertIsString( + $this->callMethod( + $this->_oModel, + 'getTitleTranslationId' + ) + ); + } +} \ No newline at end of file diff --git a/tests/unit/Application/Model/ExportRenderer/JsonTest.php b/tests/unit/Application/Model/ExportRenderer/JsonTest.php new file mode 100644 index 0000000..a7e04c2 --- /dev/null +++ b/tests/unit/Application/Model/ExportRenderer/JsonTest.php @@ -0,0 +1,50 @@ + + * @link https://www.oxidmodule.com + */ + +declare(strict_types=1); + +namespace D3\DataWizard\tests\unit\Application\Model\ExportRenderer; + +use D3\DataWizard\Application\Model\ExportRenderer\Json; + +class JsonTest extends ExportRendererTest +{ + /** @var Json */ + protected $_oModel; + + public function setUp() : void + { + parent::setUp(); + + $this->_oModel = oxNew(Json::class); + } + + /** + * @covers \D3\DataWizard\Application\Model\ExportRenderer\Json::getContent + * @test + * @throws \ReflectionException + */ + public function canGetContent() + { + $fieldList = ['field1', 'field2']; + $valueList = ['value1', 'value2']; + + $this->assertJson( + $this->callMethod( + $this->_oModel, + 'getContent', + [$valueList, $fieldList] + ) + ); + } +} \ No newline at end of file diff --git a/tests/unit/Application/Model/ExportRenderer/PrettyTest.php b/tests/unit/Application/Model/ExportRenderer/PrettyTest.php new file mode 100644 index 0000000..481d9ec --- /dev/null +++ b/tests/unit/Application/Model/ExportRenderer/PrettyTest.php @@ -0,0 +1,85 @@ + + * @link https://www.oxidmodule.com + */ + +declare(strict_types=1); + +namespace D3\DataWizard\tests\unit\Application\Model\ExportRenderer; + +use D3\DataWizard\Application\Model\ExportRenderer\Pretty; +use MathieuViossat\Util\ArrayToTextTable; +use PHPUnit\Framework\MockObject\MockObject; + +class PrettyTest extends ExportRendererTest +{ + /** @var Pretty */ + protected $_oModel; + + public function setUp() : void + { + parent::setUp(); + + $this->_oModel = oxNew(Pretty::class); + } + + /** + * @covers \D3\DataWizard\Application\Model\ExportRenderer\Pretty::getContent + * @test + * @throws \ReflectionException + */ + public function canGetContent() + { + $expected = 'expectedReturn'; + $fieldList = ['field1', 'field2']; + $valueList = ['value1', 'value2']; + + /** @var ArrayToTextTable|MockObject $csvMock */ + $arrayToTextTableMock = $this->getMockBuilder(ArrayToTextTable::class) + ->disableOriginalConstructor() + ->onlyMethods(['getTable']) + ->getMock(); + $arrayToTextTableMock->expects($this->atLeastOnce())->method('getTable')->willReturn($expected); + + /** @var Pretty|MockObject $modelMock */ + $modelMock = $this->getMockBuilder(Pretty::class) + ->onlyMethods(['getArrayToTextTableInstance']) + ->getMock(); + $modelMock->expects($this->atLeastOnce())->method('getArrayToTextTableInstance')->willReturn($arrayToTextTableMock); + $this->_oModel = $modelMock; + + $this->assertSame( + $expected, + $this->callMethod( + $this->_oModel, + 'getContent', + [$valueList, $fieldList] + ) + ); + } + + /** + * @covers \D3\DataWizard\Application\Model\ExportRenderer\Pretty::getArrayToTextTableInstance + * @test + * @throws \ReflectionException + */ + public function canGetArrayToTextTableInstance() + { + $this->assertInstanceOf( + ArrayToTextTable::class, + $this->callMethod( + $this->_oModel, + 'getArrayToTextTableInstance', + [['field1', 'field2']] + ) + ); + } +} \ No newline at end of file diff --git a/tests/unit/Application/Model/ExportRenderer/RendererBridgeTest.php b/tests/unit/Application/Model/ExportRenderer/RendererBridgeTest.php new file mode 100644 index 0000000..c7c5c07 --- /dev/null +++ b/tests/unit/Application/Model/ExportRenderer/RendererBridgeTest.php @@ -0,0 +1,151 @@ + + * @link https://www.oxidmodule.com + */ + +declare(strict_types=1); + +namespace D3\DataWizard\tests\unit\Application\Model\ExportRenderer; + +use D3\DataWizard\Application\Model\Exceptions\NoSuitableRendererException; +use D3\DataWizard\Application\Model\ExportRenderer\Csv; +use D3\DataWizard\Application\Model\ExportRenderer\Json; +use D3\DataWizard\Application\Model\ExportRenderer\Pretty; +use D3\DataWizard\Application\Model\ExportRenderer\RendererBridge; +use D3\DataWizard\Application\Model\ExportRenderer\RendererInterface; +use D3\ModCfg\Tests\unit\d3ModCfgUnitTestCase; +use PHPUnit\Framework\MockObject\MockObject; + +class RendererBridgeTest extends d3ModCfgUnitTestCase +{ + /** @var RendererBridge */ + protected $_oModel; + + public function setUp() : void + { + parent::setUp(); + + $this->_oModel = oxNew(RendererBridge::class); + } + + public function tearDown(): void + { + parent::tearDown(); + + unset($this->_oModel); + } + + /** + * @covers \D3\DataWizard\Application\Model\ExportRenderer\RendererBridge::getRendererList + * @test + * @throws \ReflectionException + */ + public function canGetRendererList() + { + $list = $this->callMethod( + $this->_oModel, + 'getRendererList' + ); + + $this->assertIsArray($list); + $this->assertTrue((bool) count($list)); + } + + /** + * @covers \D3\DataWizard\Application\Model\ExportRenderer\RendererBridge::getTranslatedRendererIdList + * @test + * @throws \ReflectionException + */ + public function canGetTranslatedRendererIdList() + { + $utlist = $this->callMethod( + $this->_oModel, + 'getRendererList' + ); + + $list = $this->callMethod( + $this->_oModel, + 'getTranslatedRendererIdList' + ); + + $this->assertIsArray($list); + $this->assertTrue((bool) count($list)); + $this->assertSame(count($utlist), count($list)); + } + + /** + * @covers \D3\DataWizard\Application\Model\ExportRenderer\RendererBridge::translateRendererId + * @test + * @throws \ReflectionException + */ + public function canTranslateRendererId() + { + $expected = "expectedTranslation"; + + /** @var RendererInterface|MockObject $renderMock */ + $renderMock = $this->getMockBuilder(Pretty::class) + ->onlyMethods(['getTitleTranslationId']) + ->getMock(); + $renderMock->expects($this->atLeastOnce())->method('getTitleTranslationId')->willReturn($expected); + + $this->callMethod( + $this->_oModel, + 'translateRendererId', + [$renderMock] + ); + } + + /** + * @covers \D3\DataWizard\Application\Model\ExportRenderer\RendererBridge::getRenderer + * @test + * @param $format + * @param $blThrowException + * @throws \ReflectionException + * @dataProvider canGetRendererDataProvider + */ + public function canGetRenderer($format, $blThrowException) + { + /** @var RendererBridge|MockObject $modelMock */ + $modelMock = $this->getMockBuilder(RendererBridge::class) + ->onlyMethods(['getRendererList']) + ->getMock(); + $modelMock->expects($this->atLeastOnce())->method('getRendererList')->willReturn( + [ + 'CSV' => $this->getMockBuilder(Csv::class)->getMock(), + 'Pretty' => $this->getMockBuilder(Pretty::class)->getMock(), + 'JSON' => $this->getMockBuilder(Json::class)->getMock() + ] + ); + + $this->_oModel = $modelMock; + + if ($blThrowException) { + $this->expectException(NoSuitableRendererException::class); + } + + $this->callMethod( + $this->_oModel, + 'getRenderer', + [$format] + ); + } + + /** + * @return array + */ + public function canGetRendererDataProvider(): array + { + return [ + 'existing renderer'=> [RendererBridge::FORMAT_JSON, false], + 'unknown renderer'=> ['unknownRenderer', true] + ]; + } +} \ No newline at end of file