From 5fbde09e2678dc1577f662c0c5fe1fd849a41c26 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Tue, 26 Oct 2021 14:43:48 +0200 Subject: [PATCH] create tests --- Controller/ApiController.php | 60 ++++--- Interfaces/OMS/Exporter.php | 4 +- Interfaces/OMS/Importer.php | 6 +- Models/InterfaceManagerMapper.php | 2 +- tests/Controller/ApiControllerTest.php | 209 +++++++++++++++++++++++++ tests/Interfaces/OMS/ImporterTest.php | 3 +- 6 files changed, 255 insertions(+), 29 deletions(-) create mode 100644 tests/Controller/ApiControllerTest.php diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 91454ce..464a64e 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -26,6 +26,9 @@ use phpOMS\Message\ResponseAbstract; use phpOMS\Model\Message\FormValidation; use phpOMS\System\File\Local\Directory; use phpOMS\System\MimeType; +use phpOMS\Autoloader; +use phpOMS\Localization\L11nManager; +use phpOMS\DataStorage\Database\Connection\NullConnection; /** * Exchange controller class. @@ -85,8 +88,14 @@ final class ApiController extends Controller { /** @var \Modules\Exchange\Models\InterfaceManager $interface */ $interface = InterfaceManagerMapper::get($request->getData('id')); - $class = '\\Modules\\Exchange\\Interfaces\\' . $interface->getInterfacePath() . '\\Importer'; - $importer = new $class($this->app->dbPool->get()); + $dirname = \basename(\dirname($interface->getPath())); + + if (!Autoloader::exists($class = '\\Modules\\Exchange\\Interfaces\\' . $dirname . '\\Importer')) { + return []; + } + + // @todo: implement real remote connection if available + $importer = new $class($this->app->dbPool->get(), new NullConnection(), new L11nManager($this->app->appName)); return $importer->importFromRequest($request); } @@ -135,7 +144,7 @@ final class ApiController extends Controller } $interface = new InterfaceManager( - __DIR__ . '/../Interfaces/' . $request->getData('interface') . '/interface.json' + \realpath(__DIR__ . '/../Interfaces/' . $request->getData('interface') . '/interface.json') ); $interface->load(); @@ -160,11 +169,27 @@ final class ApiController extends Controller public function apiExchangeExport(RequestAbstract $request, HttpResponse $response, $data = null) : void { $export = $this->exportDataFromRequest($request); - foreach ($export['logs'] as $log) { - $this->createModel($request->header->account, $log, ExchangeLogMapper::class, 'export', $request->getOrigin()); + + if (!isset($export['type'], $export['logs'])) { + $response->header->status = RequestStatusCode::R_400; + + $status = NotificationLevel::ERROR; + $message = 'Export failed.'; + + $response->set($request->uri->__toString(), [ + 'status' => $status, + 'title' => 'Exchange', + 'message' => $message, + ]); + + return; } if ($export['type'] === 'file') { + foreach ($export['logs'] as $log) { + $this->createModel($request->header->account, $log, ExchangeLogMapper::class, 'export', $request->getOrigin()); + } + $file = \explode('.', $export['name']); $response->header->setDownloadable($file[0], $file[1]); @@ -179,21 +204,7 @@ final class ApiController extends Controller break; } - $response->set('export', $export['content']); - } else { - $status = NotificationLevel::ERROR; - $message = 'Export failed.'; - - if ($export['status']) { - $status = NotificationLevel::OK; - $message = 'Export succeeded.'; - } - - $response->set($request->uri->__toString(), [ - 'status' => $status, - 'title' => 'Exchange', - 'message' => $message, - ]); + $response->set($request->uri->__toString(), $export['content']); } } @@ -210,8 +221,13 @@ final class ApiController extends Controller { /** @var \Modules\Exchange\Models\InterfaceManager $interface */ $interface = InterfaceManagerMapper::get($request->getData('id')); - $class = '\\Modules\\Exchange\\Interfaces\\' . $interface->getInterfacePath() . '\\Exporter'; - $exporter = new $class($this->app->dbPool->get()); + $dirname = \basename(\dirname($interface->getPath())); + + if (!Autoloader::exists($class = '\\Modules\\Exchange\\Interfaces\\' . $dirname . '\\Exporter')) { + return []; + } + + $exporter = new $class($this->app->dbPool->get(), new L11nManager($this->app->appName)); return $exporter->exportFromRequest($request); } diff --git a/Interfaces/OMS/Exporter.php b/Interfaces/OMS/Exporter.php index 4255b8d..42294d8 100755 --- a/Interfaces/OMS/Exporter.php +++ b/Interfaces/OMS/Exporter.php @@ -114,7 +114,7 @@ final class Exporter extends ExporterAbstract $modules = \scandir($basePath); if ($modules === false) { - return []; + return []; // @codeCoverageIgnore } foreach ($modules as $module) { @@ -168,7 +168,7 @@ final class Exporter extends ExporterAbstract $array = \reset($array); if ($array === false) { - continue; + continue; // @codeCoverageIgnore } if ($len === 3) { diff --git a/Interfaces/OMS/Importer.php b/Interfaces/OMS/Importer.php index 9e0cf47..cbeda65 100755 --- a/Interfaces/OMS/Importer.php +++ b/Interfaces/OMS/Importer.php @@ -131,7 +131,7 @@ final class Importer extends ImporterAbstract $fp = \fopen($upload['file0']['path'] . '/' . $upload['file0']['filename'], 'r'); if ($fp === false) { - return; + return; // @codeCoverageIgnore } $header = \fgetcsv($fp, 0, ';', '"'); @@ -158,7 +158,7 @@ final class Importer extends ImporterAbstract foreach ($supportedLanguages as $index => $language) { if (empty(\trim($language))) { - continue; + continue; // @codeCoverageIgnore } $languageArray[$line[0]][$line[1]][$line[2]][$line[3]][\trim($language)] = $translations[$index]; @@ -185,7 +185,7 @@ final class Importer extends ImporterAbstract $fp = \fopen($langFile, 'w+'); if ($fp === false) { - continue; + continue; // @codeCoverageIgnore } \fwrite($fp, diff --git a/Models/InterfaceManagerMapper.php b/Models/InterfaceManagerMapper.php index 67bd921..94ba99c 100755 --- a/Models/InterfaceManagerMapper.php +++ b/Models/InterfaceManagerMapper.php @@ -35,7 +35,7 @@ final class InterfaceManagerMapper extends DataMapperAbstract protected static array $columns = [ 'exchange_id' => ['name' => 'exchange_id', 'type' => 'int', 'internal' => 'id'], 'exchange_title' => ['name' => 'exchange_title', 'type' => 'string', 'internal' => 'info/name'], - 'exchange_path' => ['name' => 'exchange_path', 'type' => 'string', 'internal' => 'info/path'], + 'exchange_path' => ['name' => 'exchange_path', 'type' => 'string', 'internal' => 'path'], 'exchange_version' => ['name' => 'exchange_version', 'type' => 'string', 'internal' => 'info/version'], 'exchange_export' => ['name' => 'exchange_export', 'type' => 'bool', 'internal' => 'info/export'], 'exchange_import' => ['name' => 'exchange_import', 'type' => 'bool', 'internal' => 'info/import'], diff --git a/tests/Controller/ApiControllerTest.php b/tests/Controller/ApiControllerTest.php new file mode 100644 index 0000000..9d5d717 --- /dev/null +++ b/tests/Controller/ApiControllerTest.php @@ -0,0 +1,209 @@ +app = new class() extends ApplicationAbstract + { + protected string $appName = 'Api'; + }; + + $this->app->dbPool = $GLOBALS['dbpool']; + $this->app->orgId = 1; + $this->app->accountManager = new AccountManager($GLOBALS['session']); + $this->app->appSettings = new CoreSettings(); + $this->app->moduleManager = new ModuleManager($this->app, __DIR__ . '/../../../../Modules/'); + $this->app->dispatcher = new Dispatcher($this->app); + $this->app->eventManager = new EventManager($this->app->dispatcher); + $this->app->eventManager->importFromFile(__DIR__ . '/../../../../Web/Api/Hooks.php'); + $this->app->sessionManager = new HttpSession(36000); + + $account = new Account(); + TestUtils::setMember($account, 'id', 1); + + $permission = new AccountPermission(); + $permission->setUnit(1); + $permission->setApp('backend'); + $permission->setPermission( + PermissionType::READ + | PermissionType::CREATE + | PermissionType::MODIFY + | PermissionType::DELETE + | PermissionType::PERMISSION + ); + + $account->addPermission($permission); + + $this->app->accountManager->add($account); + $this->app->router = new WebRouter(); + + $this->module = $this->app->moduleManager->get('Exchange'); + + TestUtils::setMember($this->module, 'app', $this->app); + } + + /** + * @covers Modules\Exchange\Controller\ApiController + * @group module + */ + public function testInterfaceInstall() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('interface', 'OMS'); + + $this->module->apiInterfaceInstall($request, $response); + self::assertEquals(1, $response->get('')['response']->getId()); + } + + /** + * @covers Modules\Exchange\Controller\ApiController + * @group module + */ + public function testInterfaceInstallInvalidData() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('invalid', '1'); + + $this->module->apiInterfaceInstall($request, $response); + self::assertEquals(RequestStatusCode::R_400, $response->header->status); + } + + /** + * @covers Modules\Exchange\Controller\ApiController + * @group module + */ + public function testExport() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '1'); + $request->setData('type', 'language'); + + $this->module->apiExchangeExport($request, $response); + self::assertTrue(\strlen($response->get('')) > 500); + } + + /** + * @covers Modules\Exchange\Controller\ApiController + * @group module + */ + public function testExportInvalidInterface() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '9999'); + $request->setData('type', 'language'); + + $this->module->apiExchangeExport($request, $response); + self::assertEquals(RequestStatusCode::R_400, $response->header->status); + } + + /** + * @covers Modules\Exchange\Controller\ApiController + * @group module + */ + public function testLanguageImport() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '1'); + $request->setData('type', 'language'); + + if (!\is_file(__DIR__ . '/test_tmp.csv')) { + \copy(__DIR__ . '/../Interfaces/OMS/test.csv', __DIR__ . '/../Interfaces/OMS/test_tmp.csv'); + } + + TestUtils::setMember($request, 'files', [ + 'file0' => [ + 'name' => 'test.csv', + 'type' => 'csv', + 'tmp_name' => __DIR__ . '/../Interfaces/OMS/test_tmp.csv', + 'error' => \UPLOAD_ERR_OK, + 'size' => \filesize(__DIR__ . '/../Interfaces/OMS/test_tmp.csv'), + ], + ]); + + $this->module->apiExchangeImport($request, $response); + self::assertEquals( + \date('Y-m-d'), + \date('Y-m-d', \filemtime(__DIR__ . '/../../../TestModule/Theme/Backend/Lang/en.lang.php')) + ); + } + + /** + * @covers Modules\Exchange\Controller\ApiController + * @group module + */ + public function testImportInvalidInterface() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('id', '9999'); + + $this->module->apiExchangeExport($request, $response); + self::assertEquals(RequestStatusCode::R_400, $response->header->status); + } +} diff --git a/tests/Interfaces/OMS/ImporterTest.php b/tests/Interfaces/OMS/ImporterTest.php index 48a1ad6..fb28191 100644 --- a/tests/Interfaces/OMS/ImporterTest.php +++ b/tests/Interfaces/OMS/ImporterTest.php @@ -19,6 +19,7 @@ use phpOMS\Localization\L11nManager; use phpOMS\DataStorage\Database\Connection\NullConnection; use phpOMS\Uri\HttpUri; use phpOMS\Message\Http\HttpRequest; +use phpOMS\Utils\TestUtils; /** * @internal @@ -47,7 +48,7 @@ final class ImporterTest extends \PHPUnit\Framework\TestCase $request->setData('id', '123'); $request->setData('type', 'language'); - if (!\is_file()) { + if (!\is_file(__DIR__ . '/test_tmp.csv')) { \copy(__DIR__ . '/test.csv', __DIR__ . '/test_tmp.csv'); }