From ad99e045678f7ccd20a1a9b1d2e09530bebbde6e Mon Sep 17 00:00:00 2001 From: uryvskiy-dima Date: Thu, 12 Jan 2023 13:12:07 +0300 Subject: [PATCH] Add tests for clear cart --- retailcrm/lib/RetailcrmCartUploader.php | 62 ++++++++++++++----------- tests/helpers/RetailcrmTestHelper.php | 13 ++++++ tests/lib/RetailcrmCartUploaderTest.php | 58 ++++++++++++++++------- 3 files changed, 89 insertions(+), 44 deletions(-) diff --git a/retailcrm/lib/RetailcrmCartUploader.php b/retailcrm/lib/RetailcrmCartUploader.php index 941739b..bd48e36 100644 --- a/retailcrm/lib/RetailcrmCartUploader.php +++ b/retailcrm/lib/RetailcrmCartUploader.php @@ -122,7 +122,7 @@ class RetailcrmCartUploader $cartExternalId = RetailcrmTools::getCartOrderExternalId($cart); $cartLastUpdateDate = null; - if (static::isGuestCart($cart) || static::isCartEmpty($cart)) { + if (static::isGuestCart($cart)) { continue; } @@ -138,38 +138,40 @@ class RetailcrmCartUploader } static::populateContextWithCart($cart); -// RetailcrmLogger::writeDebug(__METHOD__, 'Test'); -// RetailcrmLogger::writeDebug(__METHOD__, $cart->getProducts()); - - $response = static::$api->cartGet($cartExternalId, static::$site); + $response = static::$api->cartGet($cart->id_customer, static::$site); if ($response instanceof RetailcrmApiResponse) { - if (empty($response['cart'])) { - // TODO - // Extract address from cart (if exists) and append to customer? - // Or maybe this customer will not order anything, so we don't need it's address... - static::$api->customersCreate(RetailcrmOrderBuilder::buildCrmCustomer(new Customer($cart->id_customer))); + $isExistExternalId = !empty($response['cart']['externalId']); - $crmCart = static::buildCrmCart($cart, $cartExternalId); - - if (empty($crmCart)) { - continue; + if (static::isCartEmpty($cart)) { + if ($isExistExternalId) { + static::$api->cartClear( + [ + 'clearedAt' => date('Y-m-d H:i:s'), + 'customer' => ['externalId' => $cart->id_customer], + ], + static::$site + ); } - if (false !== static::$api->cartSet($crmCart, static::$site)) { + continue; + } + + $crmCart = static::buildCrmCart($cart, $cartExternalId, $isExistExternalId); + + if (empty($crmCart)) { + continue; + } + + $response = static::$api->cartSet($crmCart, static::$site); + + if ($response instanceof RetailcrmApiResponse && $response->isSuccessful()) { + if ($isExistExternalId) { + static::registerAbandonedCartSync($cart->id); + } else { $cart->date_upd = date('Y-m-d H:i:s'); $cart->save(); } - } elseif (!empty($response['cart']['externalId'])) { - $crmCart = static::buildCrmCart($cart, $response['cart']['externalId']); - - if (empty($crmCart)) { - continue; - } - - if (false !== static::$api->ordersEdit($crmCart)) { - static::registerAbandonedCartSync($cart->id); - } } } } @@ -241,22 +243,26 @@ class RetailcrmCartUploader /** * Build order for abandoned cart * - * @param Cart|\CartCore $cart + * @param Cart|CartCore $cart * @param string $cartExternalId + * @param bool $isExistExternalId * * @return array */ - private static function buildCrmCart($cart, $cartExternalId) + private static function buildCrmCart($cart, string $cartExternalId, bool $isExistExternalId) { try { $crmCart = [ - 'externalId' => $cartExternalId, 'customer' => ['externalId' => $cart->id_customer], 'clearAt' => null, 'createdAt' => $cart->date_add, 'droppedAt' => date('Y-m-d H:i:s'), ]; + if (!$isExistExternalId) { + $crmCart['externalId'] = $cartExternalId . uniqid('_', true); + } + if (!empty($cart->date_upd)) { $crmCart['updatedAt'] = $cart->date_upd; } diff --git a/tests/helpers/RetailcrmTestHelper.php b/tests/helpers/RetailcrmTestHelper.php index 877ac3d..32e2f6b 100644 --- a/tests/helpers/RetailcrmTestHelper.php +++ b/tests/helpers/RetailcrmTestHelper.php @@ -73,4 +73,17 @@ class RetailcrmTestHelper 'SELECT MAX(id_customer) FROM `' . _DB_PREFIX_ . 'customer`' ); } + + public static function getAbandonedCartLastSync($cartId) + { + $sql = 'SELECT `last_uploaded` FROM `' . _DB_PREFIX_ . 'retailcrm_abandonedcarts` + WHERE `id_cart` = \'' . pSQL((int) $cartId) . '\''; + $when = Db::getInstance()->getValue($sql); + + if (empty($when)) { + return null; + } + + return DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $when); + } } diff --git a/tests/lib/RetailcrmCartUploaderTest.php b/tests/lib/RetailcrmCartUploaderTest.php index 28563a9..2cd385c 100644 --- a/tests/lib/RetailcrmCartUploaderTest.php +++ b/tests/lib/RetailcrmCartUploaderTest.php @@ -60,16 +60,17 @@ class RetailcrmCartUploaderTest extends RetailcrmTestCase $this->cart = new Cart(); $this->cart->id_lang = (int) Configuration::get('PS_LANG_DEFAULT'); - $this->cart->date_add = self::DEFAULT_UPD_CART_TIME; + $this->cart->date_upd = date('Y-m-d H:i:s'); $this->cart->id_customer = 1; $this->cart->id_currency = 1; $this->cart->save(); - $this->cart->updateQty(1, $this->product['id']); } public function testCreateCart() { + $this->cart->updateQty(1, $this->product['id']); + $this->apiClientMock->expects($this->once()) ->method('cartGet') ->willReturn(new RetailcrmApiResponse('200', json_encode(['cart' => []]))) @@ -84,13 +85,25 @@ class RetailcrmCartUploaderTest extends RetailcrmTestCase RetailcrmCartUploader::run(); $this->assertNotEquals(self::DEFAULT_UPD_CART_TIME, $this->cart->date_upd); + $this->assertEquals(RetailcrmTestHelper::getAbandonedCartLastSync($this->cart->id), null); } public function testUpdateCart() { + $this->cart->updateQty(2, $this->product['id']); + $this->apiClientMock->expects($this->any()) ->method('cartGet') - ->willReturn(new RetailcrmApiResponse('200', json_encode(['cart' => ['externalId' => $this->cart->id]]))) + ->willReturn( + new RetailcrmApiResponse( + '200', + json_encode( + [ + 'cart' => ['externalId' => $this->cart->id_customer], + ] + ) + ) + ) ; $this->apiClientMock->expects($this->any()) @@ -98,27 +111,40 @@ class RetailcrmCartUploaderTest extends RetailcrmTestCase ->willReturn(new RetailcrmApiResponse('200', json_encode(['success' => true]))) ; - $this->cart->updateQty(2, $this->product['id']); - RetailcrmCartUploader::$api = $this->apiMock; RetailcrmCartUploader::run(); $this->assertNotEquals(self::DEFAULT_UPD_CART_TIME, $this->cart->date_upd); - $this->assertNotEquals($this->getAbandonedCartLastSync($this->cart->id), null); + $this->assertNotEquals(RetailcrmTestHelper::getAbandonedCartLastSync($this->cart->id), null); } - private function getAbandonedCartLastSync($cartId) + public function testClearCart() { - $sql = 'SELECT `last_uploaded` FROM `' . _DB_PREFIX_ . 'retailcrm_abandonedcarts` - WHERE `id_cart` = \'' . pSQL((int) $cartId) . '\''; - $when = Db::getInstance()->getValue($sql); + $this->apiClientMock->expects($this->once()) + ->method('cartGet') + ->willReturn( + new RetailcrmApiResponse( + '200', + json_encode( + [ + 'cart' => ['externalId' => $this->cart->id_customer], + ] + ) + ) + ) + ; - if (empty($when)) { - return null; - } + $this->apiClientMock->expects($this->once()) + ->method('cartClear') + ->willReturn(new RetailcrmApiResponse('200', json_encode(['success' => true]))) + ; - return DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $when); + $cartLastUpdate = $this->cart->date_upd; + + RetailcrmCartUploader::$api = $this->apiMock; + RetailcrmCartUploader::run(); + + $this->assertEquals($cartLastUpdate, $this->cart->date_upd); + $this->assertEquals(RetailcrmTestHelper::getAbandonedCartLastSync($this->cart->id), null); } - - // TODO: add method for work cart. }