From 31b34ad3609277200949940f56624b2b78fcc15d Mon Sep 17 00:00:00 2001 From: Yaroslav Rogoza Date: Thu, 16 May 2019 18:35:46 -0700 Subject: [PATCH 1/6] Shopping cart discount concept --- .../Model/Resolver/CartPrices.php | 16 ++++++ .../Magento/QuoteGraphQl/etc/schema.graphqls | 6 +++ .../GraphQl/Quote/Guest/CartTotalsTest.php | 36 ++++++++++++- .../_files/cart_rule_discount_no_coupon.php | 52 +++++++++++++++++++ .../cart_rule_discount_no_coupon_rollback.php | 26 ++++++++++ .../cart_rule_100_percent_off_rollback.php | 16 ++++-- 6 files changed, 147 insertions(+), 5 deletions(-) create mode 100644 dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php create mode 100644 dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon_rollback.php diff --git a/app/code/Magento/QuoteGraphQl/Model/Resolver/CartPrices.php b/app/code/Magento/QuoteGraphQl/Model/Resolver/CartPrices.php index 7a9bdd926764..d708af3d45a0 100644 --- a/app/code/Magento/QuoteGraphQl/Model/Resolver/CartPrices.php +++ b/app/code/Magento/QuoteGraphQl/Model/Resolver/CartPrices.php @@ -56,6 +56,7 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value 'value' => $cartTotals->getSubtotalWithDiscount(), 'currency' => $currency ], 'applied_taxes' => $this->getAppliedTaxes($cartTotals, $currency), + 'discount' => $this->getDiscount($cartTotals, $currency), 'model' => $quote ]; } @@ -84,4 +85,19 @@ private function getAppliedTaxes(Total $total, string $currency): array } return $appliedTaxesData; } + + /** + * Returns information about an applied discount + * + * @param Total $total + * @param string $currency + * @return array + */ + private function getDiscount(Total $total, string $currency) + { + return [ + 'label' => $total->getDiscountDescription(), + 'amount' => ['value' => $total->getDiscountAmount(), "currency" => $currency] + ]; + } } diff --git a/app/code/Magento/QuoteGraphQl/etc/schema.graphqls b/app/code/Magento/QuoteGraphQl/etc/schema.graphqls index 9e9c83b35820..be725240789a 100644 --- a/app/code/Magento/QuoteGraphQl/etc/schema.graphqls +++ b/app/code/Magento/QuoteGraphQl/etc/schema.graphqls @@ -142,6 +142,7 @@ type CartPrices { grand_total: Money subtotal_including_tax: Money subtotal_excluding_tax: Money + discount: CartDiscountItem subtotal_with_discount_excluding_tax: Money applied_taxes: [CartTaxItem] } @@ -151,6 +152,11 @@ type CartTaxItem { label: String! } +type CartDiscountItem { + amount: Money! + label: String! +} + type SetPaymentMethodOnCartOutput { cart: Cart! } diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/CartTotalsTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/CartTotalsTest.php index ee2d6a2b31de..58c5c9d23f7a 100644 --- a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/CartTotalsTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/CartTotalsTest.php @@ -87,7 +87,6 @@ public function testGetTotalsWithNoTaxApplied() * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/guest/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php - * @group recent */ public function testGetCartTotalsWithNoAddressSet() { @@ -125,6 +124,34 @@ public function testGetSelectedShippingMethodFromCustomerCart() $this->graphQlQuery($query); } + /** + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php + * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/guest/create_empty_cart.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php + * @group recent + */ + public function testGetDiscountInformation() + { + $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); + $query = $this->getQuery($maskedQuoteId); + $response = $this->graphQlQuery($query); + + $discountResponse = $response['cart']['prices']['discount']; + self::assertEquals(-20, $discountResponse['amount']['value']); + self::assertEquals('100% Off for all orders', $discountResponse['label']); + } + + public function testGetDiscountInformationWithTwoRulesApplied() + { + self::fail(); + } + + public function testGetDiscountInformationForRuleWithNoLabel() + { + self::fail(); + } + /** * Generates GraphQl query for retrieving cart totals * @@ -160,6 +187,13 @@ private function getQuery(string $maskedQuoteId): string currency } } + discount { + label + amount { + value + currency + } + } } } } diff --git a/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php b/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php new file mode 100644 index 000000000000..335fe758953a --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php @@ -0,0 +1,52 @@ +get(RuleRepositoryInterface::class); +/** @var DataObjectHelper $dataObjectHelper */ +$dataObjectHelper = Bootstrap::getObjectManager()->get(DataObjectHelper::class); +$ruleLabel = $objectManager->create(\Magento\SalesRule\Api\Data\RuleLabelInterface::class); +$ruleLabelFactory = $objectManager->get(\Magento\SalesRule\Model\Data\RuleLabelFactory::class); + + +/** @var RuleData $salesRule */ +$salesRule = $objectManager->create(RuleData::class); +/** @var \Magento\SalesRule\Api\Data\RuleLabelInterface $ruleLabel */ +$ruleLabel = $ruleLabelFactory->create(); +$ruleLabel->setStoreId(0); +$ruleLabel->setStoreLabel('50% Off for all orders'); +$ruleData = [ + 'name' => '50% Off for all orders', + 'is_active' => 1, + 'customer_group_ids' => [CustomerGroupManagement::NOT_LOGGED_IN_ID], + 'coupon_type' => RuleData::COUPON_TYPE_NO_COUPON, + 'conditions' => [], + 'simple_action' => 'by_percent', + 'discount_amount' => 50, + 'discount_step' => 0, + 'website_ids' => [ + $objectManager->get( + StoreManagerInterface::class + )->getWebsite()->getId(), + ], + 'discount_qty' => 0, + 'apply_to_shipping' => 1, + 'simple_free_shipping' => 1, +]; +$dataObjectHelper->populateWithArray($salesRule, $ruleData, \Magento\SalesRule\Api\Data\RuleInterface::class); +$salesRule->setStoreLabels([$ruleLabel]); + +$ruleRepository->save($salesRule); diff --git a/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon_rollback.php b/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon_rollback.php new file mode 100644 index 000000000000..4fbc390d869d --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon_rollback.php @@ -0,0 +1,26 @@ +get(RuleRepositoryInterface::class); +/** @var RuleResource $ruleResource */ +$ruleResource = $objectManager->get(RuleResource::class); +/** @var RuleFactory $ruleFactory */ +$ruleFactory = $objectManager->get(RuleFactory::class); +$salesRule = $ruleFactory->create(); + +$ruleResource->load($salesRule, '50% Off for all orders', 'name'); +// FIXME: the rule cannot be found for some reason +if ($salesRule->getRuleId()) { + $ruleRepository->deleteById($salesRule->getRuleId()); +} diff --git a/dev/tests/integration/testsuite/Magento/SalesRule/_files/cart_rule_100_percent_off_rollback.php b/dev/tests/integration/testsuite/Magento/SalesRule/_files/cart_rule_100_percent_off_rollback.php index c7d95455c78d..e747cc38522a 100644 --- a/dev/tests/integration/testsuite/Magento/SalesRule/_files/cart_rule_100_percent_off_rollback.php +++ b/dev/tests/integration/testsuite/Magento/SalesRule/_files/cart_rule_100_percent_off_rollback.php @@ -5,11 +5,19 @@ */ declare(strict_types=1); +use Magento\Framework\Registry; +use Magento\SalesRule\Api\RuleRepositoryInterface; +use Magento\TestFramework\Helper\Bootstrap; + +$objectManager = Bootstrap::getObjectManager(); /** @var Magento\Framework\Registry $registry */ -$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(\Magento\Framework\Registry::class); +$registry = Bootstrap::getObjectManager()->get(Registry::class); +/** @var RuleRepositoryInterface $ruleRepository */ +$ruleRepository = $objectManager->get(RuleRepositoryInterface::class); /** @var Magento\SalesRule\Model\Rule $rule */ -$rule = $registry->registry('cart_rule_100_percent_off'); -if ($rule) { - $rule->delete(); +$ruleId = $registry->registry('Magento/SalesRule/_files/cart_rule_100_percent_off'); + +if ($ruleId) { + $ruleRepository->deleteById($ruleId); } From 8515566a16cbf8167036a0c3e8fce4d332101060 Mon Sep 17 00:00:00 2001 From: Yaroslav Rogoza Date: Sun, 19 May 2019 17:42:46 +0200 Subject: [PATCH 2/6] Api-functional tests for guest added --- .../GraphQl/Quote/Guest/CartTotalsTest.php | 24 ++++++++++++------- .../_files/cart_rule_discount_no_coupon.php | 14 +++++++---- .../cart_rule_discount_no_coupon_rollback.php | 17 +++++-------- .../_files/coupon_code_with_wildcard.php | 1 + 4 files changed, 32 insertions(+), 24 deletions(-) diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/CartTotalsTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/CartTotalsTest.php index 58c5c9d23f7a..37b75ffd413c 100644 --- a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/CartTotalsTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/CartTotalsTest.php @@ -129,7 +129,6 @@ public function testGetSelectedShippingMethodFromCustomerCart() * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/guest/create_empty_cart.php * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php - * @group recent */ public function testGetDiscountInformation() { @@ -138,18 +137,27 @@ public function testGetDiscountInformation() $response = $this->graphQlQuery($query); $discountResponse = $response['cart']['prices']['discount']; - self::assertEquals(-20, $discountResponse['amount']['value']); - self::assertEquals('100% Off for all orders', $discountResponse['label']); + self::assertEquals(-10, $discountResponse['amount']['value']); + self::assertEquals('50% Off for all orders', $discountResponse['label']); } + /** + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php + * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php + * @magentoApiDataFixture Magento/SalesRule/_files/coupon_code_with_wildcard.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/guest/create_empty_cart.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/apply_coupon.php + */ public function testGetDiscountInformationWithTwoRulesApplied() { - self::fail(); - } + $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); + $query = $this->getQuery($maskedQuoteId); + $response = $this->graphQlQuery($query); - public function testGetDiscountInformationForRuleWithNoLabel() - { - self::fail(); + $discountResponse = $response['cart']['prices']['discount']; + self::assertEquals(-15, $discountResponse['amount']['value']); + self::assertEquals('50% Off for all orders, 5$ fixed discount on whole cart', $discountResponse['label']); } /** diff --git a/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php b/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php index 335fe758953a..a8b284fe1549 100644 --- a/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php +++ b/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php @@ -7,9 +7,12 @@ use Magento\Customer\Model\GroupManagement as CustomerGroupManagement; use Magento\Framework\Api\DataObjectHelper; +use Magento\SalesRule\Api\Data\RuleInterface; +use Magento\SalesRule\Api\Data\RuleLabelInterface; use Magento\SalesRule\Api\RuleRepositoryInterface; use Magento\SalesRule\Model\Data\Rule as RuleData; -use Magento\Store\Model\StoreManagerInterface as StoreManagerInterface; +use Magento\SalesRule\Model\Data\RuleLabelFactory; +use Magento\Store\Model\StoreManagerInterface; use Magento\TestFramework\Helper\Bootstrap; @@ -18,13 +21,13 @@ $ruleRepository = $objectManager->get(RuleRepositoryInterface::class); /** @var DataObjectHelper $dataObjectHelper */ $dataObjectHelper = Bootstrap::getObjectManager()->get(DataObjectHelper::class); -$ruleLabel = $objectManager->create(\Magento\SalesRule\Api\Data\RuleLabelInterface::class); -$ruleLabelFactory = $objectManager->get(\Magento\SalesRule\Model\Data\RuleLabelFactory::class); +$ruleLabel = $objectManager->create(RuleLabelInterface::class); +$ruleLabelFactory = $objectManager->get(RuleLabelFactory::class); /** @var RuleData $salesRule */ $salesRule = $objectManager->create(RuleData::class); -/** @var \Magento\SalesRule\Api\Data\RuleLabelInterface $ruleLabel */ +/** @var RuleLabelInterface $ruleLabel */ $ruleLabel = $ruleLabelFactory->create(); $ruleLabel->setStoreId(0); $ruleLabel->setStoreLabel('50% Off for all orders'); @@ -45,8 +48,9 @@ 'discount_qty' => 0, 'apply_to_shipping' => 1, 'simple_free_shipping' => 1, + 'stop_rules_processing' => 0 ]; -$dataObjectHelper->populateWithArray($salesRule, $ruleData, \Magento\SalesRule\Api\Data\RuleInterface::class); +$dataObjectHelper->populateWithArray($salesRule, $ruleData, RuleInterface::class); $salesRule->setStoreLabels([$ruleLabel]); $ruleRepository->save($salesRule); diff --git a/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon_rollback.php b/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon_rollback.php index 4fbc390d869d..b94365c4a2c2 100644 --- a/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon_rollback.php +++ b/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon_rollback.php @@ -6,21 +6,16 @@ declare(strict_types=1); use Magento\SalesRule\Api\RuleRepositoryInterface; -use Magento\SalesRule\Model\ResourceModel\Rule as RuleResource; -use Magento\SalesRule\Model\RuleFactory as RuleFactory; +use Magento\SalesRule\Model\ResourceModel\Rule\CollectionFactory as RuleCollectionFactory; use Magento\TestFramework\Helper\Bootstrap; $objectManager = Bootstrap::getObjectManager(); /** @var RuleRepositoryInterface $ruleRepository */ $ruleRepository = $objectManager->get(RuleRepositoryInterface::class); -/** @var RuleResource $ruleResource */ -$ruleResource = $objectManager->get(RuleResource::class); -/** @var RuleFactory $ruleFactory */ -$ruleFactory = $objectManager->get(RuleFactory::class); -$salesRule = $ruleFactory->create(); +/** @var RuleCollectionFactory $ruleCollectionFactory */ +$ruleCollectionFactory = $objectManager->get(RuleCollectionFactory::class); +$ruleCollection = $ruleCollectionFactory->create(); -$ruleResource->load($salesRule, '50% Off for all orders', 'name'); -// FIXME: the rule cannot be found for some reason -if ($salesRule->getRuleId()) { - $ruleRepository->deleteById($salesRule->getRuleId()); +foreach ($ruleCollection->getItems() as $rule) { + $ruleRepository->deleteById($rule->getRuleId()); } diff --git a/dev/tests/integration/testsuite/Magento/SalesRule/_files/coupon_code_with_wildcard.php b/dev/tests/integration/testsuite/Magento/SalesRule/_files/coupon_code_with_wildcard.php index 9005284f984c..61fe3e9ea74f 100644 --- a/dev/tests/integration/testsuite/Magento/SalesRule/_files/coupon_code_with_wildcard.php +++ b/dev/tests/integration/testsuite/Magento/SalesRule/_files/coupon_code_with_wildcard.php @@ -27,6 +27,7 @@ 'discount_amount' => 5, 'discount_step' => 0, 'stop_rules_processing' => 1, + 'store_labels' => [0 => '5$ fixed discount on whole cart'], 'website_ids' => [ $objectManager->get(StoreManagerInterface::class)->getWebsite()->getId(), ], From fe708a28f0a3c6691098f6dd08cf55c5cdcf404c Mon Sep 17 00:00:00 2001 From: Yaroslav Rogoza Date: Sun, 19 May 2019 18:10:31 +0200 Subject: [PATCH 3/6] Api-functional tests for customer added --- .../GraphQl/Quote/Customer/CartTotalsTest.php | 45 +++++++++++++++++++ .../discount_10percent_generalusers.php | 1 + .../_files/cart_rule_discount_no_coupon.php | 2 +- 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/CartTotalsTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/CartTotalsTest.php index bb8acfce629f..12eb69d755bf 100644 --- a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/CartTotalsTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/CartTotalsTest.php @@ -153,6 +153,44 @@ public function testGetTotalsFromAnotherCustomerCart() $this->graphQlQuery($query, [], '', $this->getHeaderMap('customer3@search.example.com')); } + /** + * @magentoApiDataFixture Magento/Customer/_files/customer.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php + * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php + */ + public function testGetDiscountInformation() + { + $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); + $query = $this->getQuery($maskedQuoteId); + $response = $this->graphQlQuery($query, [], '', $this->getHeaderMap()); + + $discountResponse = $response['cart']['prices']['discount']; + self::assertEquals(-10, $discountResponse['amount']['value']); + self::assertEquals('50% Off for all orders', $discountResponse['label']); + } + + /** + * @magentoApiDataFixture Magento/Customer/_files/customer.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php + * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php + * @magentoApiDataFixture Magento/Checkout/_files/discount_10percent_generalusers.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/apply_coupon.php + */ + public function testGetDiscountInformationWithTwoRulesApplied() + { + $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); + $query = $this->getQuery($maskedQuoteId); + $response = $this->graphQlQuery($query, [], '', $this->getHeaderMap()); + + $discountResponse = $response['cart']['prices']['discount']; + self::assertEquals(-11, $discountResponse['amount']['value']); + self::assertEquals('50% Off for all orders, Test Coupon for General', $discountResponse['label']); + } + /** * Generates GraphQl query for retrieving cart totals * @@ -188,6 +226,13 @@ private function getQuery(string $maskedQuoteId): string currency } } + discount { + label + amount { + value + currency + } + } } } } diff --git a/dev/tests/integration/testsuite/Magento/Checkout/_files/discount_10percent_generalusers.php b/dev/tests/integration/testsuite/Magento/Checkout/_files/discount_10percent_generalusers.php index e66227a60e8f..f8fb587f32d6 100644 --- a/dev/tests/integration/testsuite/Magento/Checkout/_files/discount_10percent_generalusers.php +++ b/dev/tests/integration/testsuite/Magento/Checkout/_files/discount_10percent_generalusers.php @@ -14,6 +14,7 @@ $data = [ 'name' => 'Test Coupon for General', 'is_active' => true, + 'store_labels' => [0 => 'Test Coupon for General'], 'website_ids' => [ \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get( \Magento\Store\Model\StoreManagerInterface::class diff --git a/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php b/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php index a8b284fe1549..8ed3af2f3497 100644 --- a/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php +++ b/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php @@ -34,7 +34,7 @@ $ruleData = [ 'name' => '50% Off for all orders', 'is_active' => 1, - 'customer_group_ids' => [CustomerGroupManagement::NOT_LOGGED_IN_ID], + 'customer_group_ids' => [CustomerGroupManagement::NOT_LOGGED_IN_ID, 1], 'coupon_type' => RuleData::COUPON_TYPE_NO_COUPON, 'conditions' => [], 'simple_action' => 'by_percent', From 382d41fc416409ddf7e03c9ae5a42bc75c72178b Mon Sep 17 00:00:00 2001 From: Lena Orobei Date: Tue, 11 Jun 2019 13:47:17 -0500 Subject: [PATCH 4/6] magento/graphql-ce#683: Add discount information to Cart --- app/code/Magento/QuoteGraphQl/Model/Resolver/CartPrices.php | 4 ++-- app/code/Magento/QuoteGraphQl/etc/schema.graphqls | 6 +++--- .../Magento/GraphQl/Quote/Customer/CartTotalsTest.php | 4 ++-- .../Magento/GraphQl/Quote/Guest/CartTotalsTest.php | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/code/Magento/QuoteGraphQl/Model/Resolver/CartPrices.php b/app/code/Magento/QuoteGraphQl/Model/Resolver/CartPrices.php index d708af3d45a0..3df692cc406c 100644 --- a/app/code/Magento/QuoteGraphQl/Model/Resolver/CartPrices.php +++ b/app/code/Magento/QuoteGraphQl/Model/Resolver/CartPrices.php @@ -96,8 +96,8 @@ private function getAppliedTaxes(Total $total, string $currency): array private function getDiscount(Total $total, string $currency) { return [ - 'label' => $total->getDiscountDescription(), - 'amount' => ['value' => $total->getDiscountAmount(), "currency" => $currency] + 'label' => explode(', ', $total->getDiscountDescription()), + 'amount' => ['value' => $total->getDiscountAmount(), 'currency' => $currency] ]; } } diff --git a/app/code/Magento/QuoteGraphQl/etc/schema.graphqls b/app/code/Magento/QuoteGraphQl/etc/schema.graphqls index be725240789a..db7a8f38c036 100644 --- a/app/code/Magento/QuoteGraphQl/etc/schema.graphqls +++ b/app/code/Magento/QuoteGraphQl/etc/schema.graphqls @@ -142,7 +142,7 @@ type CartPrices { grand_total: Money subtotal_including_tax: Money subtotal_excluding_tax: Money - discount: CartDiscountItem + discount: CartDiscount subtotal_with_discount_excluding_tax: Money applied_taxes: [CartTaxItem] } @@ -152,9 +152,9 @@ type CartTaxItem { label: String! } -type CartDiscountItem { +type CartDiscount { amount: Money! - label: String! + label: [String!]! } type SetPaymentMethodOnCartOutput { diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/CartTotalsTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/CartTotalsTest.php index 12eb69d755bf..4eb4bdd9a0b1 100644 --- a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/CartTotalsTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/CartTotalsTest.php @@ -168,7 +168,7 @@ public function testGetDiscountInformation() $discountResponse = $response['cart']['prices']['discount']; self::assertEquals(-10, $discountResponse['amount']['value']); - self::assertEquals('50% Off for all orders', $discountResponse['label']); + self::assertEquals(['50% Off for all orders'], $discountResponse['label']); } /** @@ -188,7 +188,7 @@ public function testGetDiscountInformationWithTwoRulesApplied() $discountResponse = $response['cart']['prices']['discount']; self::assertEquals(-11, $discountResponse['amount']['value']); - self::assertEquals('50% Off for all orders, Test Coupon for General', $discountResponse['label']); + self::assertEquals(['50% Off for all orders', 'Test Coupon for General'], $discountResponse['label']); } /** diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/CartTotalsTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/CartTotalsTest.php index 37b75ffd413c..d481a0fa0116 100644 --- a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/CartTotalsTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/CartTotalsTest.php @@ -138,7 +138,7 @@ public function testGetDiscountInformation() $discountResponse = $response['cart']['prices']['discount']; self::assertEquals(-10, $discountResponse['amount']['value']); - self::assertEquals('50% Off for all orders', $discountResponse['label']); + self::assertEquals(['50% Off for all orders'], $discountResponse['label']); } /** @@ -157,7 +157,7 @@ public function testGetDiscountInformationWithTwoRulesApplied() $discountResponse = $response['cart']['prices']['discount']; self::assertEquals(-15, $discountResponse['amount']['value']); - self::assertEquals('50% Off for all orders, 5$ fixed discount on whole cart', $discountResponse['label']); + self::assertEquals(['50% Off for all orders', '5$ fixed discount on whole cart'], $discountResponse['label']); } /** From a1e126c90cc31c62ff6644eb2b0361db679b2d19 Mon Sep 17 00:00:00 2001 From: Lena Orobei Date: Tue, 11 Jun 2019 14:16:11 -0500 Subject: [PATCH 5/6] magento/graphql-ce#683: Add discount information to Cart - code style fixes --- .../GraphQl/Quote/_files/cart_rule_discount_no_coupon.php | 1 - 1 file changed, 1 deletion(-) diff --git a/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php b/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php index 8ed3af2f3497..0735307b0bfb 100644 --- a/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php +++ b/dev/tests/integration/testsuite/Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php @@ -15,7 +15,6 @@ use Magento\Store\Model\StoreManagerInterface; use Magento\TestFramework\Helper\Bootstrap; - $objectManager = Bootstrap::getObjectManager(); /** @var RuleRepositoryInterface $ruleRepository */ $ruleRepository = $objectManager->get(RuleRepositoryInterface::class); From 2d8bc6d4235d542c7b3ba5f5bbb01d84dbecbf53 Mon Sep 17 00:00:00 2001 From: Lena Orobei Date: Wed, 12 Jun 2019 11:04:57 -0500 Subject: [PATCH 6/6] magento/graphql-ce#683: Add discount information to Cart - extracted discount cases to separate test class; - added case for no discount applied; - return `null` for discount node if amount is 0. --- .../Model/Resolver/CartPrices.php | 5 +- .../Quote/Customer/CartDiscountTest.php | 123 ++++++++++++++++++ .../GraphQl/Quote/Customer/CartTotalsTest.php | 45 ------- .../GraphQl/Quote/Guest/CartDiscountTest.php | 101 ++++++++++++++ .../GraphQl/Quote/Guest/CartTotalsTest.php | 43 ------ 5 files changed, 228 insertions(+), 89 deletions(-) create mode 100644 dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/CartDiscountTest.php create mode 100644 dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/CartDiscountTest.php diff --git a/app/code/Magento/QuoteGraphQl/Model/Resolver/CartPrices.php b/app/code/Magento/QuoteGraphQl/Model/Resolver/CartPrices.php index 3df692cc406c..48711ec38c4f 100644 --- a/app/code/Magento/QuoteGraphQl/Model/Resolver/CartPrices.php +++ b/app/code/Magento/QuoteGraphQl/Model/Resolver/CartPrices.php @@ -91,10 +91,13 @@ private function getAppliedTaxes(Total $total, string $currency): array * * @param Total $total * @param string $currency - * @return array + * @return array|null */ private function getDiscount(Total $total, string $currency) { + if ($total->getDiscountAmount() === 0) { + return null; + } return [ 'label' => explode(', ', $total->getDiscountDescription()), 'amount' => ['value' => $total->getDiscountAmount(), 'currency' => $currency] diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/CartDiscountTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/CartDiscountTest.php new file mode 100644 index 000000000000..37c53a62f7d3 --- /dev/null +++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/CartDiscountTest.php @@ -0,0 +1,123 @@ +getMaskedQuoteIdByReservedOrderId = $objectManager->get(GetMaskedQuoteIdByReservedOrderId::class); + $this->customerTokenService = $objectManager->get(CustomerTokenServiceInterface::class); + } + + /** + * @magentoApiDataFixture Magento/Customer/_files/customer.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php + * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php + */ + public function testGetDiscountInformation() + { + $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); + $query = $this->getQuery($maskedQuoteId); + $response = $this->graphQlQuery($query, [], '', $this->getHeaderMap()); + $discountResponse = $response['cart']['prices']['discount']; + self::assertEquals(-10, $discountResponse['amount']['value']); + self::assertEquals(['50% Off for all orders'], $discountResponse['label']); + } + + /** + * @magentoApiDataFixture Magento/Customer/_files/customer.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php + * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php + * @magentoApiDataFixture Magento/Checkout/_files/discount_10percent_generalusers.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/apply_coupon.php + */ + public function testGetDiscountInformationWithTwoRulesApplied() + { + $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); + $query = $this->getQuery($maskedQuoteId); + $response = $this->graphQlQuery($query, [], '', $this->getHeaderMap()); + $discountResponse = $response['cart']['prices']['discount']; + self::assertEquals(-11, $discountResponse['amount']['value']); + self::assertEquals(['50% Off for all orders', 'Test Coupon for General'], $discountResponse['label']); + } + + /** + * @magentoApiDataFixture Magento/Customer/_files/customer.php + * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php + */ + public function testGetDiscountInformationWithNoRulesApplied() + { + $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); + $query = $this->getQuery($maskedQuoteId); + $response = $this->graphQlQuery($query, [], '', $this->getHeaderMap()); + self::assertEquals(null, $response['cart']['prices']['discount']); + } + + /** + * Generates GraphQl query for retrieving cart discount + * + * @param string $maskedQuoteId + * @return string + */ + private function getQuery(string $maskedQuoteId): string + { + return <<customerTokenService->createCustomerAccessToken($username, $password); + $headerMap = ['Authorization' => 'Bearer ' . $customerToken]; + return $headerMap; + } +} diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/CartTotalsTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/CartTotalsTest.php index 4eb4bdd9a0b1..bb8acfce629f 100644 --- a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/CartTotalsTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/CartTotalsTest.php @@ -153,44 +153,6 @@ public function testGetTotalsFromAnotherCustomerCart() $this->graphQlQuery($query, [], '', $this->getHeaderMap('customer3@search.example.com')); } - /** - * @magentoApiDataFixture Magento/Customer/_files/customer.php - * @magentoApiDataFixture Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php - * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php - * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php - * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php - */ - public function testGetDiscountInformation() - { - $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); - $query = $this->getQuery($maskedQuoteId); - $response = $this->graphQlQuery($query, [], '', $this->getHeaderMap()); - - $discountResponse = $response['cart']['prices']['discount']; - self::assertEquals(-10, $discountResponse['amount']['value']); - self::assertEquals(['50% Off for all orders'], $discountResponse['label']); - } - - /** - * @magentoApiDataFixture Magento/Customer/_files/customer.php - * @magentoApiDataFixture Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php - * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php - * @magentoApiDataFixture Magento/Checkout/_files/discount_10percent_generalusers.php - * @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php - * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php - * @magentoApiDataFixture Magento/GraphQl/Quote/_files/apply_coupon.php - */ - public function testGetDiscountInformationWithTwoRulesApplied() - { - $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); - $query = $this->getQuery($maskedQuoteId); - $response = $this->graphQlQuery($query, [], '', $this->getHeaderMap()); - - $discountResponse = $response['cart']['prices']['discount']; - self::assertEquals(-11, $discountResponse['amount']['value']); - self::assertEquals(['50% Off for all orders', 'Test Coupon for General'], $discountResponse['label']); - } - /** * Generates GraphQl query for retrieving cart totals * @@ -226,13 +188,6 @@ private function getQuery(string $maskedQuoteId): string currency } } - discount { - label - amount { - value - currency - } - } } } } diff --git a/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/CartDiscountTest.php b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/CartDiscountTest.php new file mode 100644 index 000000000000..4dc02c343d70 --- /dev/null +++ b/dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/CartDiscountTest.php @@ -0,0 +1,101 @@ +getMaskedQuoteIdByReservedOrderId = $objectManager->get(GetMaskedQuoteIdByReservedOrderId::class); + } + + /** + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php + * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/guest/create_empty_cart.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php + */ + public function testGetDiscountInformation() + { + $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); + $query = $this->getQuery($maskedQuoteId); + $response = $this->graphQlQuery($query); + $discountResponse = $response['cart']['prices']['discount']; + self::assertEquals(-10, $discountResponse['amount']['value']); + self::assertEquals(['50% Off for all orders'], $discountResponse['label']); + } + + /** + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php + * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php + * @magentoApiDataFixture Magento/SalesRule/_files/coupon_code_with_wildcard.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/guest/create_empty_cart.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/apply_coupon.php + */ + public function testGetDiscountInformationWithTwoRulesApplied() + { + $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); + $query = $this->getQuery($maskedQuoteId); + $response = $this->graphQlQuery($query); + $discountResponse = $response['cart']['prices']['discount']; + self::assertEquals(-15, $discountResponse['amount']['value']); + self::assertEquals(['50% Off for all orders', '5$ fixed discount on whole cart'], $discountResponse['label']); + } + + /** + * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/guest/create_empty_cart.php + * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php + */ + public function testGetDiscountInformationWithNoRulesApplied() + { + $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); + $query = $this->getQuery($maskedQuoteId); + $response = $this->graphQlQuery($query); + self::assertEquals(null, $response['cart']['prices']['discount']); + } + + /** + * Generates GraphQl query for retrieving cart discount. + * + * @param string $maskedQuoteId + * @return string + */ + private function getQuery(string $maskedQuoteId): string + { + return <<graphQlQuery($query); } - /** - * @magentoApiDataFixture Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php - * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php - * @magentoApiDataFixture Magento/GraphQl/Quote/_files/guest/create_empty_cart.php - * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php - */ - public function testGetDiscountInformation() - { - $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); - $query = $this->getQuery($maskedQuoteId); - $response = $this->graphQlQuery($query); - - $discountResponse = $response['cart']['prices']['discount']; - self::assertEquals(-10, $discountResponse['amount']['value']); - self::assertEquals(['50% Off for all orders'], $discountResponse['label']); - } - - /** - * @magentoApiDataFixture Magento/GraphQl/Quote/_files/cart_rule_discount_no_coupon.php - * @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php - * @magentoApiDataFixture Magento/SalesRule/_files/coupon_code_with_wildcard.php - * @magentoApiDataFixture Magento/GraphQl/Quote/_files/guest/create_empty_cart.php - * @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php - * @magentoApiDataFixture Magento/GraphQl/Quote/_files/apply_coupon.php - */ - public function testGetDiscountInformationWithTwoRulesApplied() - { - $maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote'); - $query = $this->getQuery($maskedQuoteId); - $response = $this->graphQlQuery($query); - - $discountResponse = $response['cart']['prices']['discount']; - self::assertEquals(-15, $discountResponse['amount']['value']); - self::assertEquals(['50% Off for all orders', '5$ fixed discount on whole cart'], $discountResponse['label']); - } - /** * Generates GraphQl query for retrieving cart totals * @@ -195,13 +159,6 @@ private function getQuery(string $maskedQuoteId): string currency } } - discount { - label - amount { - value - currency - } - } } } }