diff --git a/Admin/Install/db.json b/Admin/Install/db.json index 994ff68..8c9c4a4 100755 --- a/Admin/Install/db.json +++ b/Admin/Install/db.json @@ -15,6 +15,11 @@ "null": false, "unique": true }, + "itemmgmt_item_status": { + "name": "itemmgmt_item_status", + "type": "TINYINT(1)", + "null": false + }, "itemmgmt_item_info": { "name": "itemmgmt_item_info", "type": "TEXT", diff --git a/Controller/ApiController.php b/Controller/ApiController.php index df59ac9..e00e2b2 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -39,6 +39,7 @@ use phpOMS\Message\NotificationLevel; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; use phpOMS\Model\Message\FormValidation; +use phpOMS\Localization\ISO639x1Enum; /** * ItemManagement class. @@ -223,7 +224,7 @@ final class ApiController extends Controller private function createItemAttributeTypeL11nFromRequest(RequestAbstract $request) : ItemAttributeTypeL11n { $attrL11n = new ItemAttributeTypeL11n(); - $attrL11n->setType((int) ($request->getData('type') ?? 0)); + $attrL11n->type = (int) ($request->getData('type') ?? 0); $attrL11n->setLanguage((string) ( $request->getData('language') ?? $request->getLanguage() )); @@ -276,7 +277,6 @@ final class ApiController extends Controller } $attrType = $this->createItemAttributeTypeFromRequest($request); - $attrType->setL11n($request->getData('title'), $request->getData('language')); $this->createModel($request->header->account, $attrType, ItemAttributeTypeMapper::class, 'attr_type', $request->getOrigin()); $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Attribute type', 'Attribute type successfully created', $attrType); @@ -294,9 +294,9 @@ final class ApiController extends Controller private function createItemAttributeTypeFromRequest(RequestAbstract $request) : ItemAttributeType { $attrType = new ItemAttributeType(); - $attrType->name = (string) ($request->getData('name') ?? ''); + $attrType->setL11n((string) ($request->getData('title') ?? ''), $request->getData('language') ?? ISO639x1Enum::_EN); $attrType->setFields((int) ($request->getData('fields') ?? 0)); - $attrType->setCustom((bool) ($request->getData('custom') ?? false)); + $attrType->custom = (bool) ($request->getData('custom') ?? false); return $attrType; } @@ -313,8 +313,7 @@ final class ApiController extends Controller private function validateItemAttributeTypeCreate(RequestAbstract $request) : array { $val = []; - if (($val['name'] = empty($request->getData('name'))) - || ($val['title'] = empty($request->getData('title'))) + if (($val['title'] = empty($request->getData('title'))) ) { return $val; } @@ -567,6 +566,13 @@ final class ApiController extends Controller */ public function apiFileCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { + if (!empty($val = $this->validateFileCreate($request))) { + $response->set('item_file_create', new FormValidation($val)); + $response->header->status = RequestStatusCode::R_400; + + return; + } + $uploadedFiles = $request->getFiles() ?? []; if (empty($uploadedFiles)) { @@ -599,6 +605,26 @@ final class ApiController extends Controller $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Image', 'Image successfully updated', $uploaded); } + /** + * Validate item note create request + * + * @param RequestAbstract $request Request + * + * @return array + * + * @since 1.0.0 + */ + private function validateFileCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['item'] = empty($request->getData('item'))) + ) { + return $val; + } + + return []; + } + /** * Api method to create item files * @@ -614,10 +640,41 @@ final class ApiController extends Controller */ public function apiNoteCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { + if (!empty($val = $this->validateNoteCreate($request))) { + $response->set('item_note_create', new FormValidation($val)); + $response->header->status = RequestStatusCode::R_400; + + return; + } + $request->setData('virtualpath', '/Modules/ItemManagement/Articles/' . $request->getData('id'), true); $this->app->moduleManager->get('Editor')->apiEditorCreate($request, $response, $data); + if ($response->header->status !== RequestStatusCode::R_200) { + return; + } + $model = $response->get($request->uri->__toString())['response']; $this->createModelRelation($request->header->account, $request->getData('id'), $model->getId(), ItemMapper::class, 'notes', '', $request->getOrigin()); } + + /** + * Validate item note create request + * + * @param RequestAbstract $request Request + * + * @return array + * + * @since 1.0.0 + */ + private function validateNoteCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['id'] = empty($request->getData('id'))) + ) { + return $val; + } + + return []; + } } diff --git a/Models/Item.php b/Models/Item.php index 950c84f..19ed55e 100755 --- a/Models/Item.php +++ b/Models/Item.php @@ -47,7 +47,7 @@ class Item public int $successor = 0; - private int $type = 0; + private int $status = ItemStatus::ACTIVE; public Money $salesPrice; @@ -125,32 +125,6 @@ class Item return $this->id; } - /** - * Set the successor item - * - * @param int $successor Successor item - * - * @return void - * - * @since 1.0.0 - */ - public function setSuccessor(int $successor) : void - { - $this->successor = $successor; - } - - /** - * Get the successor item - * - * @return int - * - * @since 1.0.0 - */ - public function getSuccessor() : int - { - return $this->successor; - } - /** * Add item l11n * @@ -185,6 +159,32 @@ class Item return new NullItemL11n(); } + /** + * Get status. + * + * @return int + * + * @since 1.0.0 + */ + public function getStatus() : int + { + return $this->status; + } + + /** + * Set status. + * + * @param int $status Status + * + * @return void + * + * @since 1.0.0 + */ + public function setStatus(int $status) : void + { + $this->status = $status; + } + /** * Add media to item * @@ -266,13 +266,13 @@ class Item /** * Get media file by type * - * @param string $type Media type + * @param null|int $type Media type * * @return Media * * @since 1.0.0 */ - public function getFileByType(string $type) : Media + public function getFileByType(int $type = null) : Media { foreach ($this->files as $file) { if ($file->type === $type) { @@ -286,13 +286,13 @@ class Item /** * Get all media files by type * - * @param string $type Media type + * @param null|int $type Media type * * @return Media[] * * @since 1.0.0 */ - public function getFilesByType(string $type) : array + public function getFilesByType(int $type = null) : array { $files = []; foreach ($this->files as $file) { @@ -303,4 +303,25 @@ class Item return $files; } + + /** + * {@inheritdoc} + */ + public function toArray() : array + { + return [ + 'id' => $this->id, + 'number' => $this->number, + 'status' => $this->status, + 'info' => $this->info, + ]; + } + + /** + * {@inheritdoc} + */ + public function jsonSerialize() + { + return $this->toArray(); + } } diff --git a/Models/ItemAttribute.php b/Models/ItemAttribute.php index e5bdaf7..224a7a0 100755 --- a/Models/ItemAttribute.php +++ b/Models/ItemAttribute.php @@ -58,6 +58,17 @@ class ItemAttribute implements \JsonSerializable, ArrayableInterface */ public ItemAttributeValue $value; + /** + * Constructor. + * + * @since 1.0.0 + */ + public function __construct() + { + $this->type = new NullItemAttributeType(); + $this->value = new NullItemAttributeValue(); + } + /** * Get id * @@ -75,7 +86,11 @@ class ItemAttribute implements \JsonSerializable, ArrayableInterface */ public function toArray() : array { - return []; + return [ + 'id' => $this->id, + 'type' => $this->type, + 'value' => $this->value, + ]; } /** diff --git a/Models/ItemAttributeType.php b/Models/ItemAttributeType.php index ac2874c..4b42699 100755 --- a/Models/ItemAttributeType.php +++ b/Models/ItemAttributeType.php @@ -57,7 +57,7 @@ class ItemAttributeType implements \JsonSerializable, ArrayableInterface * @var bool * @since 1.0.0 */ - protected bool $custom = false; + public bool $custom = false; public string $validationPattern = ''; @@ -68,14 +68,14 @@ class ItemAttributeType implements \JsonSerializable, ArrayableInterface * * @var ItemAttributeTypeL11n */ - protected string | ItemAttributeTypeL11n $l11n; + private string | ItemAttributeTypeL11n $l11n; /** * Possible default attribute values * * @var array */ - protected array $defaults = []; + private array $defaults = []; /** * Constructor. @@ -148,26 +148,18 @@ class ItemAttributeType implements \JsonSerializable, ArrayableInterface $this->fields = $fields; } - /** - * Set custom - * - * @param bool $custom FieldsCustom - * - * @return void - * - * @since 1.0.0 - */ - public function setCustom(bool $custom) : void - { - $this->custom = $custom; - } - /** * {@inheritdoc} */ public function toArray() : array { - return []; + return [ + 'id' => $this->id, + 'name' => $this->name, + 'validationPattern' => $this->validationPattern, + 'custom' => $this->custom, + 'isRequired' => $this->isRequired, + ]; } /** diff --git a/Models/ItemAttributeTypeL11n.php b/Models/ItemAttributeTypeL11n.php index 9e2d000..54525c9 100755 --- a/Models/ItemAttributeTypeL11n.php +++ b/Models/ItemAttributeTypeL11n.php @@ -41,7 +41,7 @@ class ItemAttributeTypeL11n implements \JsonSerializable, ArrayableInterface * @var int|ItemAttributeType * @since 1.0.0 */ - protected int | ItemAttributeType $type = 0; + public int | ItemAttributeType $type = 0; /** * Language. @@ -88,29 +88,15 @@ class ItemAttributeTypeL11n implements \JsonSerializable, ArrayableInterface } /** - * Get attribute type + * Get language * - * @return int|ItemAttributeType + * @return string * * @since 1.0.0 */ - public function getType() : int | ItemAttributeType + public function getLanguage() : string { - return $this->type; - } - - /** - * Set type. - * - * @param int $type Type id - * - * @return void - * - * @since 1.0.0 - */ - public function setType(int $type) : void - { - $this->type = $type; + return $this->language; } /** @@ -132,7 +118,12 @@ class ItemAttributeTypeL11n implements \JsonSerializable, ArrayableInterface */ public function toArray() : array { - return []; + return [ + 'id' => $this->id, + 'title' => $this->title, + 'type' => $this->type, + 'language' => $this->language, + ]; } /** diff --git a/Models/ItemAttributeValue.php b/Models/ItemAttributeValue.php index e27af22..b470524 100755 --- a/Models/ItemAttributeValue.php +++ b/Models/ItemAttributeValue.php @@ -140,7 +140,7 @@ class ItemAttributeValue implements \JsonSerializable, ArrayableInterface * * @since 1.0.0 */ - public function setValue($value) : void + public function setValue(mixed $value) : void { if (\is_string($value)) { $this->valueStr = $value; @@ -189,6 +189,18 @@ class ItemAttributeValue implements \JsonSerializable, ArrayableInterface $this->language = $language; } + /** + * Get language + * + * @return string + * + * @since 1.0.0 + */ + public function getLanguage() : string + { + return $this->language; + } + /** * Set country * @@ -203,12 +215,34 @@ class ItemAttributeValue implements \JsonSerializable, ArrayableInterface $this->country = $country; } + /** + * Get country + * + * @return string + * + * @since 1.0.0 + */ + public function getCountry() : string + { + return $this->country; + } + /** * {@inheritdoc} */ public function toArray() : array { - return []; + return [ + 'id' => $this->id, + 'type' => $this->type, + 'valueInt' => $this->valueInt, + 'valueStr' => $this->valueStr, + 'valueDec' => $this->valueDec, + 'valueDat' => $this->valueDat, + 'isDefault' => $this->isDefault, + 'language' => $this->language, + 'country' => $this->country, + ]; } /** diff --git a/Models/ItemL11nType.php b/Models/ItemL11nType.php index 9c4041e..1e02ee2 100755 --- a/Models/ItemL11nType.php +++ b/Models/ItemL11nType.php @@ -71,7 +71,10 @@ class ItemL11nType implements \JsonSerializable, ArrayableInterface */ public function toArray() : array { - return []; + return [ + 'id' => $this->id, + 'title' => $this->title, + ]; } /** diff --git a/Models/ItemMapper.php b/Models/ItemMapper.php index 158c929..1a5b2cb 100755 --- a/Models/ItemMapper.php +++ b/Models/ItemMapper.php @@ -37,6 +37,7 @@ final class ItemMapper extends DataMapperAbstract protected static array $columns = [ 'itemmgmt_item_id' => ['name' => 'itemmgmt_item_id', 'type' => 'int', 'internal' => 'id'], 'itemmgmt_item_no' => ['name' => 'itemmgmt_item_no', 'type' => 'string', 'internal' => 'number', 'autocomplete' => true], + 'itemmgmt_item_status' => ['name' => 'itemmgmt_item_status', 'type' => 'int', 'internal' => 'status'], 'itemmgmt_item_info' => ['name' => 'itemmgmt_item_info', 'type' => 'string', 'internal' => 'info'], 'itemmgmt_item_salesprice' => ['name' => 'itemmgmt_item_salesprice', 'type' => 'Serializable', 'internal' => 'salesPrice'], 'itemmgmt_item_purchaseprice' => ['name' => 'itemmgmt_item_purchaseprice', 'type' => 'Serializable', 'internal' => 'purchasePrice'], diff --git a/Models/ItemStatus.php b/Models/ItemStatus.php new file mode 100644 index 0000000..b28f37a --- /dev/null +++ b/Models/ItemStatus.php @@ -0,0 +1,34 @@ +id = $id; } } diff --git a/tests/Controller/Api/ApiControllerAttributeTrait.php b/tests/Controller/Api/ApiControllerAttributeTrait.php new file mode 100644 index 0000000..0cc8620 --- /dev/null +++ b/tests/Controller/Api/ApiControllerAttributeTrait.php @@ -0,0 +1,287 @@ +header->account = 1; + $request->setData('title', 'TestItemL11nType'); + + $this->module->apiItemL11nTypeCreate($request, $response); + self::assertGreaterThan(0, $response->get('')['response']->getId()); + } + + /** + * @covers Modules\ItemManagement\Controller\ApiController + * @group module + */ + public function testApiItemL11nCreate() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('item', '1'); + $request->setData('type', '1'); + $request->setData('description', 'Description'); + + $this->module->apiItemL11nCreate($request, $response); + self::assertGreaterThan(0, $response->get('')['response']->getId()); + } + + /** + * @covers Modules\ItemManagement\Controller\ApiController + * @group module + */ + public function testApiItemAttributeTypeCreate() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('title', 'EN:1'); + $request->setData('language', ISO639x1Enum::_EN); + + $this->module->apiItemAttributeTypeCreate($request, $response); + self::assertGreaterThan(0, $response->get('')['response']->getId()); + } + + /** + * @covers Modules\ItemManagement\Controller\ApiController + * @group module + */ + public function testApiItemAttributeTypeL11nCreate() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('title', 'DE:2'); + $request->setData('type', '1'); + $request->setData('language', ISO639x1Enum::_DE); + + $this->module->apiItemAttributeTypeL11nCreate($request, $response); + self::assertGreaterThan(0, $response->get('')['response']->getId()); + } + + /** + * @covers Modules\ItemManagement\Controller\ApiController + * @group module + */ + public function testApiItemAttributeValueIntCreate() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('default', '1'); + $request->setData('attributetype', '1'); + $request->setData('type', AttributeValueType::_INT); + $request->setData('value', '1'); + $request->setData('language', ISO639x1Enum::_DE); + $request->setData('country', ISO3166TwoEnum::_DEU); + + $this->module->apiItemAttributeValueCreate($request, $response); + self::assertGreaterThan(0, $response->get('')['response']->getId()); + } + + /** + * @covers Modules\ItemManagement\Controller\ApiController + * @group module + */ + public function testApiItemAttributeValueStrCreate() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('type', AttributeValueType::_STRING); + $request->setData('value', '1'); + $request->setData('language', ISO639x1Enum::_DE); + $request->setData('country', ISO3166TwoEnum::_DEU); + + $this->module->apiItemAttributeValueCreate($request, $response); + self::assertGreaterThan(0, $response->get('')['response']->getId()); + } + + /** + * @covers Modules\ItemManagement\Controller\ApiController + * @group module + */ + public function testApiItemAttributeValueFloatCreate() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('type', AttributeValueType::_FLOAT); + $request->setData('value', '1.1'); + $request->setData('language', ISO639x1Enum::_DE); + $request->setData('country', ISO3166TwoEnum::_DEU); + + $this->module->apiItemAttributeValueCreate($request, $response); + self::assertGreaterThan(0, $response->get('')['response']->getId()); + } + + /** + * @covers Modules\ItemManagement\Controller\ApiController + * @group module + */ + public function testApiItemAttributeValueDatCreate() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('type', AttributeValueType::_DATETIME); + $request->setData('value', '2020-08-02'); + $request->setData('language', ISO639x1Enum::_DE); + $request->setData('country', ISO3166TwoEnum::_DEU); + + $this->module->apiItemAttributeValueCreate($request, $response); + self::assertGreaterThan(0, $response->get('')['response']->getId()); + } + + /** + * @covers Modules\ItemManagement\Controller\ApiController + * @group module + */ + public function testApiItemAttributeCreate() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('item', '1'); + $request->setData('value', '1'); + $request->setData('type', '1'); + + $this->module->apiItemAttributeCreate($request, $response); + self::assertGreaterThan(0, $response->get('')['response']->getId()); + } + + /** + * @covers Modules\ItemManagement\Controller\ApiController + * @group module + */ + public function testApiItemAttributeValueCreateInvalidData() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('invalid', '1'); + + $this->module->apiItemAttributeValueCreate($request, $response); + self::assertEquals(RequestStatusCode::R_400, $response->header->status); + } + + /** + * @covers Modules\ItemManagement\Controller\ApiController + * @group module + */ + public function testApiItemAttributeTypeCreateInvalidData() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('invalid', '1'); + + $this->module->apiItemAttributeTypeCreate($request, $response); + self::assertEquals(RequestStatusCode::R_400, $response->header->status); + } + + /** + * @covers Modules\ItemManagement\Controller\ApiController + * @group module + */ + public function testApiItemAttributeTypeL11nCreateInvalidData() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('invalid', '1'); + + $this->module->apiItemAttributeTypeL11nCreate($request, $response); + self::assertEquals(RequestStatusCode::R_400, $response->header->status); + } + + /** + * @covers Modules\ItemManagement\Controller\ApiController + * @group module + */ + public function testApiItemAttributeCreateInvalidData() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('invalid', '1'); + + $this->module->apiItemAttributeCreate($request, $response); + self::assertEquals(RequestStatusCode::R_400, $response->header->status); + } + + /** + * @covers Modules\ItemManagement\Controller\ApiController + * @group module + */ + public function testApiItemL11nTypeCreateInvalidData() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('invalid', '1'); + + $this->module->apiItemL11nTypeCreate($request, $response); + self::assertEquals(RequestStatusCode::R_400, $response->header->status); + } + + /** + * @covers Modules\ItemManagement\Controller\ApiController + * @group module + */ + public function testApiItemL11nCreateInvalidData() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('invalid', '1'); + + $this->module->apiItemL11nCreate($request, $response); + self::assertEquals(RequestStatusCode::R_400, $response->header->status); + } +} diff --git a/tests/Controller/Api/ApiControllerItemTrait.php b/tests/Controller/Api/ApiControllerItemTrait.php new file mode 100644 index 0000000..206f684 --- /dev/null +++ b/tests/Controller/Api/ApiControllerItemTrait.php @@ -0,0 +1,184 @@ +header->account = 1; + $request->setData('number', '123456'); + $request->setData('info', 'Info text'); + + $this->module->apiItemCreate($request, $response); + self::assertGreaterThan(0, $response->get('')['response']->getId()); + } + + /** + * @covers Modules\ItemManagement\Controller\ApiController + * @group module + */ + public function testApiItemCreateInvalidData() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('invalid', '1'); + + $this->module->apiItemCreate($request, $response); + self::assertEquals(RequestStatusCode::R_400, $response->header->status); + } + + /** + * @covers Modules\ItemManagement\Controller\ApiController + * @group module + */ + public function testApiItemProfileImageCreate() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + \copy(__DIR__ . '/m_icon.png', __DIR__ . '/m_icon_tmp.png'); + + $request->header->account = 1; + $request->setData('name', '123456 backend'); + $request->setData('item', 1); + $request->setData('type', 'backend_image'); + + TestUtils::setMember($request, 'files', [ + 'file1' => [ + 'name' => '123456.png', + 'type' => MimeType::M_PNG, + 'tmp_name' => __DIR__ . '/m_icon_tmp.png', + 'error' => \UPLOAD_ERR_OK, + 'size' => \filesize(__DIR__ . '/m_icon_tmp.png'), + ], + ]); + + $this->module->apiFileCreate($request, $response); + $file = $response->get('')['response']; + self::assertGreaterThan(0, \reset($file)->getId()); + } + + /** + * @covers Modules\ItemManagement\Controller\ApiController + * @group module + */ + public function testApiItemFileCreate() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + \copy(__DIR__ . '/Test file.txt', __DIR__ . '/Test file_tmp.txt'); + + $request->header->account = 1; + $request->setData('name', 'test file backend'); + $request->setData('item', 1); + + TestUtils::setMember($request, 'files', [ + 'file1' => [ + 'name' => 'Test file.txt', + 'type' => MimeType::M_TXT, + 'tmp_name' => __DIR__ . '/Test file_tmp.txt', + 'error' => \UPLOAD_ERR_OK, + 'size' => \filesize(__DIR__ . '/Test file_tmp.txt'), + ], + ]); + + $this->module->apiFileCreate($request, $response); + $file = $response->get('')['response']; + self::assertGreaterThan(0, \reset($file)->getId()); + } + + /** + * @covers Modules\ItemManagement\Controller\ApiController + * @group module + */ + public function testApiItemNoteCreate() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + + $MARKDOWN = "# Test Title\n\nThis is **some** text."; + + $request->setData('id', 1); + $request->setData('title', \trim(\strtok($MARKDOWN, "\n"), ' #')); + $request->setData('plain', \preg_replace('/^.+\n/', '', $MARKDOWN)); + + $this->module->apiNoteCreate($request, $response); + self::assertGreaterThan(0, $response->get('')['response']->getId()); + } + + /** + * @covers Modules\ItemManagement\Controller\ApiController + * @group module + */ + public function testApiFileCreateInvalidData() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('invalid', '1'); + + $this->module->apiFileCreate($request, $response); + self::assertEquals(RequestStatusCode::R_400, $response->header->status); + } + + /** + * @covers Modules\ItemManagement\Controller\ApiController + * @group module + */ + public function testApiNoteCreateInvalidData() : void + { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + $request->header->account = 1; + $request->setData('invalid', '1'); + + $this->module->apiNoteCreate($request, $response); + self::assertEquals(RequestStatusCode::R_400, $response->header->status); + } +} diff --git a/tests/Controller/Api/Test file.txt b/tests/Controller/Api/Test file.txt new file mode 100644 index 0000000..bdf08de --- /dev/null +++ b/tests/Controller/Api/Test file.txt @@ -0,0 +1 @@ +test file \ No newline at end of file diff --git a/tests/Controller/Api/m_icon.png b/tests/Controller/Api/m_icon.png new file mode 100644 index 0000000..587d4f9 Binary files /dev/null and b/tests/Controller/Api/m_icon.png differ diff --git a/tests/Controller/ApiControllerTest.php b/tests/Controller/ApiControllerTest.php new file mode 100644 index 0000000..42dadb5 --- /dev/null +++ b/tests/Controller/ApiControllerTest.php @@ -0,0 +1,98 @@ +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('ItemManagement'); + + TestUtils::setMember($this->module, 'app', $this->app); + } + + use ApiControllerItemTrait; + use ApiControllerAttributeTrait; +} diff --git a/tests/Models/ItemAttributeTest.php b/tests/Models/ItemAttributeTest.php new file mode 100644 index 0000000..6dd029a --- /dev/null +++ b/tests/Models/ItemAttributeTest.php @@ -0,0 +1,60 @@ +attr = new ItemAttribute(); + } + + /** + * @covers Modules\ItemManagement\Models\ItemAttribute + * @group module + */ + public function testDefault() : void + { + self::assertEquals(0, $this->attr->getId()); + self::assertInstanceOf('Modules\ItemManagement\Models\ItemAttributeType', $this->attr->type); + self::assertInstanceOf('Modules\ItemManagement\Models\ItemAttributeValue', $this->attr->value); + } + + /** + * @covers Modules\ItemManagement\Models\ItemAttribute + * @group module + */ + public function testSerialize() : void + { + self::assertEquals( + [ + 'id', + 'type', + 'value', + ], + \array_keys($this->attr->jsonSerialize()) + ); + } +} diff --git a/tests/Models/ItemAttributeTypeL11nTest.php b/tests/Models/ItemAttributeTypeL11nTest.php new file mode 100644 index 0000000..9e79ad1 --- /dev/null +++ b/tests/Models/ItemAttributeTypeL11nTest.php @@ -0,0 +1,87 @@ +l11n = new ItemAttributeTypeL11n(); + } + + /** + * @covers Modules\ItemManagement\Models\ItemAttributeTypeL11n + * @group module + */ + public function testDefault() : void + { + self::assertEquals(0, $this->l11n->getId()); + self::assertEquals('', $this->l11n->title); + self::assertEquals(0, $this->l11n->type); + self::assertEquals(ISO639x1Enum::_EN, $this->l11n->getLanguage()); + } + + /** + * @covers Modules\ItemManagement\Models\ItemAttributeTypeL11n + * @group module + */ + public function testNameInputOutput() : void + { + $this->l11n->title = 'TestName'; + self::assertEquals('TestName', $this->l11n->title); + } + + /** + * @covers Modules\ItemManagement\Models\ItemAttributeTypeL11n + * @group module + */ + public function testLanguageInputOutput() : void + { + $this->l11n->setLanguage(ISO639x1Enum::_DE); + self::assertEquals(ISO639x1Enum::_DE, $this->l11n->getLanguage()); + } + + /** + * @covers Modules\ItemManagement\Models\ItemAttributeTypeL11n + * @group module + */ + public function testSerialize() : void + { + $this->l11n->title = 'Title'; + $this->l11n->type = 2; + $this->l11n->setLanguage(ISO639x1Enum::_DE); + + self::assertEquals( + [ + 'id' => 0, + 'title' => 'Title', + 'type' => 2, + 'language' => ISO639x1Enum::_DE, + ], + $this->l11n->jsonSerialize() + ); + } +} diff --git a/tests/Models/ItemAttributeTypeTest.php b/tests/Models/ItemAttributeTypeTest.php new file mode 100644 index 0000000..66f2f1f --- /dev/null +++ b/tests/Models/ItemAttributeTypeTest.php @@ -0,0 +1,84 @@ +attr = new ItemAttributeType(); + } + + /** + * @covers Modules\ItemManagement\Models\ItemAttributeType + * @group module + */ + public function testDefault() : void + { + self::assertEquals(0, $this->attr->getId()); + self::assertEquals('', $this->attr->name); + self::assertEquals('', $this->attr->validationPattern); + self::assertFalse($this->attr->custom); + self::assertFalse($this->attr->isRequired); + self::assertEquals('', $this->attr->getL11n()); + } + + /** + * @covers Modules\ItemManagement\Models\ItemAttributeType + * @group module + */ + public function testL11nInputOutput() : void + { + $this->attr->setL11n('Test'); + self::assertEquals('Test', $this->attr->getL11n()); + + $this->attr->setL11n(new ItemAttributeTypeL11n(0, 'NewTest')); + self::assertEquals('NewTest', $this->attr->getL11n()); + } + + /** + * @covers Modules\ItemManagement\Models\ItemAttributeType + * @group module + */ + public function testSerialize() : void + { + $this->attr->name = 'Test'; + $this->attr->validationPattern = 'Pattern'; + $this->attr->custom = true; + $this->attr->isRequired = true; + + self::assertEquals( + [ + 'id' => 0, + 'name' => 'Test', + 'validationPattern' => 'Pattern', + 'custom' => true, + 'isRequired' => true, + ], + $this->attr->jsonSerialize() + ); + } +} diff --git a/tests/Models/ItemAttributeValueTest.php b/tests/Models/ItemAttributeValueTest.php new file mode 100644 index 0000000..020caa7 --- /dev/null +++ b/tests/Models/ItemAttributeValueTest.php @@ -0,0 +1,135 @@ +attr = new ItemAttributeValue(); + } + + /** + * @covers Modules\ItemManagement\Models\ItemAttributeValue + * @group module + */ + public function testDefault() : void + { + self::assertEquals(0, $this->attr->getId()); + self::assertEquals(0, $this->attr->type); + self::assertEquals(null, $this->attr->getValue()); + self::assertFalse($this->attr->isDefault); + } + + /** + * @covers Modules\ItemManagement\Models\ItemAttributeValue + * @group module + */ + public function testLanguageInputOutput() : void + { + $this->attr->setLanguage(ISO639x1Enum::_DE); + self::assertEquals(ISO639x1Enum::_DE, $this->attr->getLanguage()); + } + + /** + * @covers Modules\ItemManagement\Models\ItemAttributeValue + * @group module + */ + public function testCountryInputOutput() : void + { + $this->attr->setCountry(ISO3166TwoEnum::_DEU); + self::assertEquals(ISO3166TwoEnum::_DEU, $this->attr->getCountry()); + } + + /** + * @covers Modules\ItemManagement\Models\ItemAttributeValue + * @group module + */ + public function testValueIntInputOutput() : void + { + $this->attr->setValue(1); + self::assertEquals(1, $this->attr->getValue()); + } + + /** + * @covers Modules\ItemManagement\Models\ItemAttributeValue + * @group module + */ + public function testValueFloatInputOutput() : void + { + $this->attr->setValue(1.1); + self::assertEquals(1.1, $this->attr->getValue()); + } + + /** + * @covers Modules\ItemManagement\Models\ItemAttributeValue + * @group module + */ + public function testValueStringInputOutput() : void + { + $this->attr->setValue('test'); + self::assertEquals('test', $this->attr->getValue()); + } + + /** + * @covers Modules\ItemManagement\Models\ItemAttributeValue + * @group module + */ + public function testValueDateInputOutput() : void + { + $this->attr->setValue($dat = new \DateTime('now')); + self::assertEquals($dat->format('Y-m-d'), $this->attr->getValue()->format('Y-m-d')); + } + + /** + * @covers Modules\ItemManagement\Models\ItemAttributeValue + * @group module + */ + public function testSerialize() : void + { + $this->attr->type = 1; + $this->attr->setValue('test'); + $this->attr->isDefault = true; + $this->attr->setLanguage(ISO639x1Enum::_DE); + $this->attr->setCountry(ISO3166TwoEnum::_DEU); + + self::assertEquals( + [ + 'id' => 0, + 'type' => 1, + 'valueInt' => null, + 'valueStr' => 'test', + 'valueDec' => null, + 'valueDat' => null, + 'isDefault' => true, + 'language' => ISO639x1Enum::_DE, + 'country' => ISO3166TwoEnum::_DEU, + ], + $this->attr->jsonSerialize() + ); + } +} diff --git a/tests/Models/ItemL11nTest.php b/tests/Models/ItemL11nTest.php new file mode 100644 index 0000000..094993f --- /dev/null +++ b/tests/Models/ItemL11nTest.php @@ -0,0 +1,78 @@ +l11n = new ItemL11n(); + } + + /** + * @covers Modules\ItemManagement\Models\ItemL11n + * @group module + */ + public function testDefault() : void + { + self::assertEquals(0, $this->l11n->getId()); + self::assertEquals('', $this->l11n->description); + self::assertEquals(0, $this->l11n->item); + self::assertEquals(ISO639x1Enum::_EN, $this->l11n->getLanguage()); + self::assertInstanceOf('Modules\ItemManagement\Models\ItemL11nType', $this->l11n->type); + } + + /** + * @covers Modules\ItemManagement\Models\ItemL11n + * @group module + */ + public function testNameInputOutput() : void + { + $this->l11n->description = 'TestName'; + self::assertEquals('TestName', $this->l11n->description); + } + + /** + * @covers Modules\ItemManagement\Models\ItemL11n + * @group module + */ + public function testSerialize() : void + { + $this->l11n->description = 'Title'; + $this->l11n->item = 2; + $this->l11n->setLanguage(ISO639x1Enum::_DE); + + self::assertEquals( + [ + 'id' => 0, + 'description' => 'Title', + 'item' => 2, + 'language' => ISO639x1Enum::_DE, + ], + $this->l11n->jsonSerialize() + ); + } +} diff --git a/tests/Models/ItemL11nTypeTest.php b/tests/Models/ItemL11nTypeTest.php new file mode 100644 index 0000000..f9e3ae4 --- /dev/null +++ b/tests/Models/ItemL11nTypeTest.php @@ -0,0 +1,70 @@ +l11n = new ItemL11nType(); + } + + /** + * @covers Modules\ItemManagement\Models\ItemL11nType + * @group module + */ + public function testDefault() : void + { + self::assertEquals(0, $this->l11n->getId()); + self::assertEquals('', $this->l11n->title); + } + + /** + * @covers Modules\ItemManagement\Models\ItemL11nType + * @group module + */ + public function testTitleInputOutput() : void + { + $this->l11n->title = 'TestName'; + self::assertEquals('TestName', $this->l11n->title); + } + + /** + * @covers Modules\ItemManagement\Models\ItemL11nType + * @group module + */ + public function testSerialize() : void + { + $this->l11n->title = 'Title'; + + self::assertEquals( + [ + 'id' => 0, + 'title' => 'Title', + ], + $this->l11n->jsonSerialize() + ); + } +} diff --git a/tests/Models/ItemMapperTest.php b/tests/Models/ItemMapperTest.php index 44e72fc..a270e0f 100755 --- a/tests/Models/ItemMapperTest.php +++ b/tests/Models/ItemMapperTest.php @@ -35,19 +35,4 @@ final class ItemMapperTest extends \PHPUnit\Framework\TestCase self::assertGreaterThan(0, $item->getId()); self::assertEquals($id, $item->getId()); } - - /** - * @group volume - * @group module - * @coversNothing - */ - public function testItemVolume() : void - { - for ($i = 0; $i < 100; ++$i) { - $item = new Item(); - $item->number = (string) \mt_rand(100000, 999999); - - ItemMapper::create($item); - } - } } diff --git a/tests/Models/ItemTest.php b/tests/Models/ItemTest.php new file mode 100644 index 0000000..8cf0ab5 --- /dev/null +++ b/tests/Models/ItemTest.php @@ -0,0 +1,133 @@ +item = new Item(); + } + + /** + * @covers Modules\ItemManagement\Models\Item + * @group module + */ + public function testDefault() : void + { + self::assertEquals(0, $this->item->getId()); + self::assertEquals('', $this->item->number); + self::assertEquals(0, $this->item->successor); + self::assertEquals('', $this->item->info); + self::assertEquals(ItemStatus::ACTIVE, $this->item->getStatus()); + self::assertEquals([], $this->item->getNotes()); + self::assertEquals([], $this->item->getFiles()); + self::assertInstanceOf('\Modules\Media\Models\Media', $this->item->getFileByType()); + self::assertEquals([], $this->item->getFilesByType()); + self::assertEquals([], $this->item->getAttributes()); + self::assertInstanceOf('Modules\ItemManagement\Models\ItemL11n', $this->item->getL11n('')); + self::assertInstanceOf('phpOMS\Localization\Money', $this->item->salesPrice); + self::assertInstanceOf('phpOMS\Localization\Money', $this->item->purchasePrice); + } + + /** + * @covers Modules\ItemManagement\Models\Item + * @group module + */ + public function testStatusInputOutput() : void + { + $this->item->setStatus(ItemStatus::INACTIVE); + self::assertEquals(ItemStatus::INACTIVE, $this->item->getStatus()); + } + + /** + * @covers Modules\ItemManagement\Models\Item + * @group module + */ + public function testFileInputOutput() : void + { + $this->item->addFile($temp = new Media()); + self::assertCount(1, $this->item->getFiles()); + self::assertEquals($temp, $this->item->getFileByType()); + self::assertEquals([$temp], $this->item->getFilesByType()); + } + + /** + * @covers Modules\ItemManagement\Models\Item + * @group module + */ + public function testNoteInputOutput() : void + { + $this->item->addNote(new EditorDoc()); + self::assertCount(1, $this->item->getNotes()); + } + + /** + * @covers Modules\ItemManagement\Models\Item + * @group module + */ + public function testAttributeInputOutput() : void + { + $this->item->addAttribute(new ItemAttribute()); + self::assertCount(1, $this->item->getAttributes()); + } + + /** + * @covers Modules\ItemManagement\Models\Item + * @group module + */ + public function testL11nInputOutput() : void + { + $this->item->addL11n($t = new ItemL11n()); // has by default '' as type + self::assertEquals($t, $this->item->getL11n('')); + } + + /** + * @covers Modules\ItemManagement\Models\Item + * @group module + */ + public function testSerialize() : void + { + $this->item->number = '123456'; + $this->item->setStatus(ItemStatus::INACTIVE); + $this->item->info = 'Test info'; + + self::assertEquals( + [ + 'id' => 0, + 'number' => '123456', + 'status' => ItemStatus::INACTIVE, + 'info' => 'Test info', + ], + $this->item->jsonSerialize() + ); + } +} diff --git a/tests/phpunit_default.xml b/tests/phpunit_default.xml index 722365c..9208c99 100755 --- a/tests/phpunit_default.xml +++ b/tests/phpunit_default.xml @@ -1,5 +1,5 @@ - + *vendor*