From 7172e1c5d9997f1923a3cb75d20e6d94e5603d00 Mon Sep 17 00:00:00 2001 From: Jens Schulze Date: Thu, 22 Feb 2018 11:00:26 +0100 Subject: [PATCH] feat(ShoppingList): support add line item by SKU Closes #374 --- src/Core/Model/ShoppingList/LineItemDraft.php | 26 +++++++++++++++++++ .../Command/ShoppingListAddLineItemAction.php | 15 +++++++++++ .../ShoppingListUpdateRequestTest.php | 25 ++++++++++++++++++ 3 files changed, 66 insertions(+) diff --git a/src/Core/Model/ShoppingList/LineItemDraft.php b/src/Core/Model/ShoppingList/LineItemDraft.php index 90f3e416a4..2c054a3c5f 100644 --- a/src/Core/Model/ShoppingList/LineItemDraft.php +++ b/src/Core/Model/ShoppingList/LineItemDraft.php @@ -5,6 +5,7 @@ namespace Commercetools\Core\Model\ShoppingList; +use Commercetools\Core\Model\Common\Context; use Commercetools\Core\Model\Common\JsonObject; use Commercetools\Core\Model\CustomField\CustomFieldObjectDraft; use Commercetools\Core\Model\Common\DateTimeDecorator; @@ -23,6 +24,8 @@ * @method LineItemDraft setCustom(CustomFieldObjectDraft $custom = null) * @method DateTimeDecorator getAddedAt() * @method LineItemDraft setAddedAt(DateTime $addedAt = null) + * @method string getSku() + * @method LineItemDraft setSku(string $sku = null) */ class LineItemDraft extends JsonObject { @@ -37,6 +40,29 @@ public function fieldDefinitions() static::TYPE => DateTime::class, static::DECORATOR => DateTimeDecorator::class ], + 'sku' => [static::TYPE => 'string'], ]; } + + /** + * @param string $productId + * @param Context|callable $context + * @return LineItemDraft + */ + public static function ofProductId($productId, $context = null) + { + $draft = static::of($context); + return $draft->setProductId($productId); + } + + /** + * @param string $sku + * @param Context|callable $context + * @return LineItemDraft + */ + public static function ofSku($sku, $context = null) + { + $draft = static::of($context); + return $draft->setSku($sku); + } } diff --git a/src/Core/Request/ShoppingLists/Command/ShoppingListAddLineItemAction.php b/src/Core/Request/ShoppingLists/Command/ShoppingListAddLineItemAction.php index 46cd33b9d5..2443a581fe 100644 --- a/src/Core/Request/ShoppingLists/Command/ShoppingListAddLineItemAction.php +++ b/src/Core/Request/ShoppingLists/Command/ShoppingListAddLineItemAction.php @@ -9,6 +9,7 @@ use Commercetools\Core\Model\Common\DateTimeDecorator; use Commercetools\Core\Request\AbstractAction; use Commercetools\Core\Model\CustomField\CustomFieldObjectDraft; +use Commercetools\Core\Request\Carts\Command\CartAddLineItemAction; use DateTime; /** @@ -26,6 +27,8 @@ * @method ShoppingListAddLineItemAction setCustom(CustomFieldObjectDraft $custom = null) * @method DateTimeDecorator getAddedAt() * @method ShoppingListAddLineItemAction setAddedAt(DateTime $addedAt = null) + * @method string getSku() + * @method ShoppingListAddLineItemAction setSku(string $sku = null) */ class ShoppingListAddLineItemAction extends AbstractAction { @@ -41,6 +44,7 @@ public function fieldDefinitions() static::DECORATOR => DateTimeDecorator::class ], 'custom' => [static::TYPE => CustomFieldObjectDraft::class], + 'sku' => [static::TYPE => 'string'], ]; } @@ -56,6 +60,17 @@ public static function ofProductIdVariantIdAndQuantity($productId, $variantId, $ return static::of($context)->setProductId($productId)->setVariantId($variantId)->setQuantity($quantity); } + /** + * @param string $sku + * @param Context|callable $context + * @param int $quantity + * @return ShoppingListAddLineItemAction + */ + public static function ofSkuAndQuantity($sku, $quantity, $context = null) + { + return static::of($context)->setSku($sku)->setQuantity($quantity); + } + /** * @param array $data * @param Context|callable $context diff --git a/tests/integration/ShoppingList/ShoppingListUpdateRequestTest.php b/tests/integration/ShoppingList/ShoppingListUpdateRequestTest.php index c1f1ebab9e..ce653e41f3 100644 --- a/tests/integration/ShoppingList/ShoppingListUpdateRequestTest.php +++ b/tests/integration/ShoppingList/ShoppingListUpdateRequestTest.php @@ -503,4 +503,29 @@ public function testSetDeleteDaysAfterLastModification() $this->assertInstanceOf(ShoppingList::class, $result); $this->assertSame($days, $result->getDeleteDaysAfterLastModification()); } + + public function testAddLineItemBySku() + { + $product = $this->getProduct(); + $variant = $product->getMasterData()->getCurrent()->getMasterVariant(); + $draft = $this->getDraft('add-line-item-by-sku'); + $draft->setLineItems(LineItemDraftCollection::of()->add(LineItemDraft::ofSku($variant->getSku()))); + $shoppingList = $this->createShoppingList($draft); + + $this->assertSame(1, $shoppingList->getLineItems()->current()->getQuantity()); + + $request = ShoppingListUpdateRequest::ofIdAndVersion($shoppingList->getId(), $shoppingList->getVersion()) + ->addAction(ShoppingListAddLineItemAction::ofSkuAndQuantity( + $variant->getSku(), + 1 + )) + ; + $response = $request->executeWithClient($this->getClient()); + $result = $request->mapResponse($response); + $this->deleteRequest->setVersion($result->getVersion()); + + $this->assertInstanceOf(ShoppingList::class, $result); + $this->assertSame(2, $result->getLineItems()->current()->getQuantity()); + $this->assertSame($product->getId(), $result->getLineItems()->current()->getProductId()); + } }