Skip to content
This repository has been archived by the owner on Oct 24, 2023. It is now read-only.

Commit

Permalink
feat(Cart): Support cart replication
Browse files Browse the repository at this point in the history
Closes #392
  • Loading branch information
nikossvnk authored and Jens Schulze committed Apr 10, 2018
1 parent 543746d commit 52d9448
Show file tree
Hide file tree
Showing 5 changed files with 219 additions and 1 deletion.
54 changes: 54 additions & 0 deletions src/Core/Model/Cart/ReplicaCartDraft.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?php
/**
* @author @jenschude <jens.schulze@commercetools.de>
*/

namespace Commercetools\Core\Model\Cart;

use Commercetools\Core\Model\Common\Context;
use Commercetools\Core\Model\Common\JsonObject;
use Commercetools\Core\Model\Common\LocaleTrait;
use Commercetools\Core\Model\Common\Reference;
use Commercetools\Core\Model\CustomerGroup\CustomerGroupReference;
use Commercetools\Core\Model\CustomField\CustomFieldObjectDraft;
use Commercetools\Core\Model\Common\Address;
use Commercetools\Core\Model\Order\OrderReference;
use Commercetools\Core\Model\ShippingMethod\ShippingMethodReference;
use Commercetools\Core\Model\TaxCategory\ExternalTaxRateDraft;

/**
* @package Commercetools\Core\Model\Cart
* @link https://docs.commercetools.com/http-api-projects-carts.html#replicacartdraft
* @method Reference getReference()
* @method ReplicaCartDraft setReference(Reference $reference = null)
*/
class ReplicaCartDraft extends JsonObject
{
public function fieldDefinitions()
{
return [
'reference' => [static::TYPE => Reference::class]
];
}

/**
* @param OrderReference $order
* @param Context|callable $context
* @return ReplicaCartDraft
*/
public static function ofOrder(OrderReference $order, $context = null)
{
return static::of($context)->setReference($order);
}


/**
* @param CartReference $cart
* @param Context|callable $context
* @return ReplicaCartDraft
*/
public static function ofCart(CartReference $cart, $context = null)
{
return static::of($context)->setReference($cart);
}
}
94 changes: 94 additions & 0 deletions src/Core/Request/Carts/CartReplicateRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
<?php
/**
* @author @jenschude <jens.schulze@commercetools.de>
*/

namespace Commercetools\Core\Request\Carts;

use Commercetools\Core\Model\Cart\Cart;
use Commercetools\Core\Model\Cart\CartReference;
use Commercetools\Core\Model\Cart\ReplicaCartDraft;
use Commercetools\Core\Model\Common\Context;
use Commercetools\Core\Model\Order\OrderReference;
use Commercetools\Core\Request\AbstractCreateRequest;
use Commercetools\Core\Response\ApiResponseInterface;
use Commercetools\Core\Model\MapperInterface;

/**
* @package Commercetools\Core\Request\Carts
* @link https://docs.commercetools.com/http-api-projects-carts.html#replicate-existing-cart-or-order-to-a-new-cart
* @method Cart mapResponse(ApiResponseInterface $response)
* @method Cart mapFromResponse(ApiResponseInterface $response, MapperInterface $mapper = null)
*/
class CartReplicateRequest extends AbstractCreateRequest
{
protected $resultClass = Cart::class;

/**
* @param ReplicaCartDraft $replicaCartDraft
* @param Context $context
*/
public function __construct(ReplicaCartDraft $replicaCartDraft, Context $context = null)
{
parent::__construct(CartsEndpoint::endpoint(), $replicaCartDraft, $context);
}

/**
* @param ReplicaCartDraft $replicaCartDraft
* @param Context $context
* @return static
*/
public static function ofReplicaCartDraft(ReplicaCartDraft $replicaCartDraft, Context $context = null)
{
return new static($replicaCartDraft, $context);
}

/**
* @param CartReference $cart
* @param Context $context
* @return static
*/
public static function ofCartReference(CartReference $cart, Context $context = null)
{
return static::ofReplicaCartDraft(ReplicaCartDraft::ofCart($cart, $context), $context);
}

/**
* @param $id
* @param Context $context
* @return static
*/
public static function ofCartId($id, Context $context = null)
{
return static::ofCartReference(CartReference::ofId($id, $context), $context);
}

/**
* @param OrderReference $order
* @param Context $context
* @return static
*/
public static function ofOrderReference(OrderReference $order, Context $context = null)
{
return static::ofReplicaCartDraft(ReplicaCartDraft::ofOrder($order, $context), $context);
}

/**
* @param $id
* @param Context $context
* @return static
*/
public static function ofOrderId($id, Context $context = null)
{
return static::ofOrderReference(OrderReference::ofId($id, $context), $context);
}

/**
* @return string
* @internal
*/
protected function getPath()
{
return (string)$this->getEndpoint() . '/replicate' . $this->getParamString();
}
}
45 changes: 44 additions & 1 deletion tests/integration/Cart/CartCreateRequestTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,15 @@
use Commercetools\Core\ApiTestCase;
use Commercetools\Core\Model\Cart\Cart;
use Commercetools\Core\Model\Cart\CartDraft;
use Commercetools\Core\Model\Cart\CartReference;
use Commercetools\Core\Model\Cart\CartState;
use Commercetools\Core\Model\Cart\ReplicaCartDraft;
use Commercetools\Core\Request\Carts\CartCreateRequest;
use Commercetools\Core\Request\Carts\CartUpdateRequest;
use Commercetools\Core\Request\Carts\CartDeleteRequest;
use Commercetools\Core\Request\Carts\CartReplicateRequest;
use Commercetools\Core\Request\Carts\Command\CartAddLineItemAction;


class CartCreateRequestTest extends ApiTestCase
{
Expand All @@ -30,7 +37,7 @@ protected function createCart(CartDraft $draft)
$cart = $request->mapResponse($response);

if ($cart != null) {
$this->cleanupRequests[] = CartDeleteRequest::ofIdAndVersion($cart->getId(), $cart->getVersion());
$this->cleanupRequests[] = $this->deleteRequest = CartDeleteRequest::ofIdAndVersion($cart->getId(), $cart->getVersion());
}

return $cart;
Expand Down Expand Up @@ -68,4 +75,40 @@ public function testCreateOriginCustom($originType, $successful)
$this->assertNull($cart);
}
}

public function testCreateReplicaCartFromCart()
{
$draft = $this->getDraft();
$cart = $this->createCart($draft);

$product = $this->getProduct();
$variant = $product->getMasterData()->getCurrent()->getMasterVariant();

$request = CartUpdateRequest::ofIdAndVersion($cart->getId(), $cart->getVersion())
->addAction(
CartAddLineItemAction::ofProductIdVariantIdAndQuantity($product->getId(), $variant->getId(), 1)
)
;

$response = $request->executeWithClient($this->getClient());
$cart = $request->mapResponse($response);
$this->assertFalse($response->isError());

$this->deleteRequest->setVersion($cart->getVersion());

$request = CartReplicateRequest::ofCartId($cart->getId());

$response = $request->executeWithClient($this->getClient());
$replicaCart = $request->mapResponse($response);
$this->cleanupRequests[] = CartDeleteRequest::ofIdAndVersion($replicaCart->getId(), $replicaCart->getVersion());

$this->assertNotEmpty($replicaCart->getLineItems());

$cartLineItem = $cart->getLineItems()->current()->getProductId();
$replicaCartLineItem = $replicaCart->getLineItems()->current()->getProductId();

$this->assertSame($cartLineItem, $replicaCartLineItem);
$this->assertNotSame($cart->getId(), $replicaCart->getId());
$this->assertSame(CartState::ACTIVE, $replicaCart->getCartState());
}
}
2 changes: 2 additions & 0 deletions tests/integration/Cart/CartUpdateRequestTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Commercetools\Core\ApiTestCase;
use Commercetools\Core\Model\Cart\Cart;
use Commercetools\Core\Model\Cart\CartDraft;
use Commercetools\Core\Model\Cart\CartReference;
use Commercetools\Core\Model\Cart\CartState;
use Commercetools\Core\Model\Cart\CustomLineItemDraft;
use Commercetools\Core\Model\Cart\CustomLineItemDraftCollection;
Expand All @@ -17,6 +18,7 @@
use Commercetools\Core\Model\Cart\LineItemCollection;
use Commercetools\Core\Model\Cart\LineItemDraft;
use Commercetools\Core\Model\Cart\LineItemDraftCollection;
use Commercetools\Core\Model\Cart\ReplicaCartDraft;
use Commercetools\Core\Model\Cart\ScoreShippingRateInput;
use Commercetools\Core\Model\CartDiscount\AbsoluteCartDiscountValue;
use Commercetools\Core\Model\CartDiscount\CartDiscountDraft;
Expand Down
25 changes: 25 additions & 0 deletions tests/integration/Order/OrderUpdateRequestTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@

use Commercetools\Core\ApiTestCase;
use Commercetools\Core\Model\Cart\CartDraft;
use Commercetools\Core\Model\Cart\CartState;
use Commercetools\Core\Model\Cart\CustomLineItemDraft;
use Commercetools\Core\Model\Cart\CustomLineItemDraftCollection;
use Commercetools\Core\Model\Cart\LineItemDraft;
use Commercetools\Core\Model\Cart\LineItemDraftCollection;
use Commercetools\Core\Model\Cart\ReplicaCartDraft;
use Commercetools\Core\Model\Common\Address;
use Commercetools\Core\Model\Common\LocalizedString;
use Commercetools\Core\Model\Common\Money;
Expand All @@ -21,6 +23,7 @@
use Commercetools\Core\Model\Order\DeliveryItemCollection;
use Commercetools\Core\Model\Order\Order;
use Commercetools\Core\Model\Order\OrderState;
use Commercetools\Core\Model\Order\OrderReference;
use Commercetools\Core\Model\Order\Parcel;
use Commercetools\Core\Model\Order\ParcelCollection;
use Commercetools\Core\Model\Order\ParcelMeasurements;
Expand All @@ -36,6 +39,7 @@
use Commercetools\Core\Request\Carts\CartByIdGetRequest;
use Commercetools\Core\Request\Carts\CartCreateRequest;
use Commercetools\Core\Request\Carts\CartDeleteRequest;
use Commercetools\Core\Request\Carts\CartReplicateRequest;
use Commercetools\Core\Request\Orders\Command\OrderAddDeliveryAction;
use Commercetools\Core\Request\Orders\Command\OrderAddParcelToDeliveryAction;
use Commercetools\Core\Request\Orders\Command\OrderAddPaymentAction;
Expand Down Expand Up @@ -1144,4 +1148,25 @@ public function testRemoveParcel()
);
$request->executeWithClient($this->getClient());
}

public function testCreateReplicaCartFromOrder()
{
$cartDraft = $this->getCartDraft();
$order = $this->createOrder($cartDraft);

$request = CartReplicateRequest::ofOrderId($order->getId());

$response = $request->executeWithClient($this->getClient());
$replicaCart = $request->mapResponse($response);
$this->cleanupRequests[] = CartDeleteRequest::ofIdAndVersion($replicaCart->getId(), $replicaCart->getVersion());

$this->assertNotEmpty($replicaCart->getLineItems());

$orderLineItem = $order->getLineItems()->current()->getProductId();
$replicaCartLineItem = $replicaCart->getLineItems()->current()->getProductId();

$this->assertSame($orderLineItem, $replicaCartLineItem);
$this->assertNotNull($replicaCartLineItem);
$this->assertSame(CartState::ACTIVE, $replicaCart->getCartState());
}
}

0 comments on commit 52d9448

Please sign in to comment.