77
88namespace Magento \SalesRule \Api ;
99
10+ use Magento \Framework \App \ResourceConnection ;
11+ use Magento \Framework \DB \Select ;
1012use Magento \Framework \Webapi \Rest \Request ;
13+ use Magento \Quote \Model \Quote ;
14+ use Magento \Quote \Model \ResourceModel \Quote as QuoteResourceModel ;
1115use Magento \TestFramework \Helper \Bootstrap ;
16+ use Magento \TestFramework \MessageQueue \EnvironmentPreconditionException ;
17+ use Magento \TestFramework \MessageQueue \PreconditionFailedException ;
18+ use Magento \TestFramework \MessageQueue \PublisherConsumerController ;
1219use Magento \TestFramework \TestCase \WebapiAbstract ;
1320
1421/**
1522 * Tests disabled cart rules for guest's cart
23+ *
24+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
1625 */
1726class GuestTotalsInformationManagement extends WebapiAbstract
1827{
@@ -23,6 +32,49 @@ class GuestTotalsInformationManagement extends WebapiAbstract
2332 private const QUOTE_RESERVED_ORDER_ID = 'test01 ' ;
2433 private const SALES_RULE_ID = 'Magento/SalesRule/_files/cart_rule_50_percent_off_no_condition/salesRuleId ' ;
2534
35+ /**
36+ * @var PublisherConsumerController
37+ */
38+ private $ publisherConsumerController ;
39+
40+ /**
41+ * @var string[]
42+ */
43+ private $ consumers = ['sales.rule.quote.trigger.recollect ' ];
44+
45+ /**
46+ * @inheritdoc
47+ */
48+ protected function setUp (): void
49+ {
50+ $ objectManager = Bootstrap::getObjectManager ();
51+ /** @var PublisherConsumerController publisherConsumerController */
52+ $ this ->publisherConsumerController = $ objectManager ->create (PublisherConsumerController::class, [
53+ 'consumers ' => $ this ->consumers ,
54+ 'logFilePath ' => TESTS_TEMP_DIR . "/MessageQueueTestLog.txt " ,
55+ 'appInitParams ' => \Magento \TestFramework \Helper \Bootstrap::getInstance ()->getAppInitParams ()
56+ ]);
57+
58+ try {
59+ $ this ->publisherConsumerController ->initialize ();
60+ } catch (EnvironmentPreconditionException $ e ) {
61+ $ this ->markTestSkipped ($ e ->getMessage ());
62+ } catch (PreconditionFailedException $ e ) {
63+ $ this ->fail ($ e ->getMessage ());
64+ }
65+
66+ parent ::setUp ();
67+ }
68+
69+ /**
70+ * @inheritDoc
71+ */
72+ protected function tearDown (): void
73+ {
74+ $ this ->publisherConsumerController ->stopConsumers ();
75+ parent ::tearDown ();
76+ }
77+
2678 /**
2779 * Test sales rule changes should be persisted in the database
2880 *
@@ -31,7 +83,7 @@ class GuestTotalsInformationManagement extends WebapiAbstract
3183 */
3284 public function testCalculate ()
3385 {
34- /** @var \Magento\Quote\Model\ Quote $quote */
86+ /** @var Quote $quote */
3587 /** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */
3688 /** @var \Magento\SalesRule\Model\Rule $salesRule */
3789 /** @var \Magento\Framework\Registry $registry */
@@ -44,8 +96,10 @@ public function testCalculate()
4496 $ salesRule = Bootstrap::getObjectManager ()->create (\Magento \SalesRule \Model \RuleFactory::class)->create ();
4597 $ salesRule ->load ($ salesRuleId );
4698 $ this ->assertContains ($ salesRule ->getRuleId (), str_getcsv ($ quote ->getAppliedRuleIds ()));
99+ $ this ->assertEquals (0 , $ quote ->getTriggerRecollect ());
47100 $ salesRule ->setIsActive (0 );
48101 $ salesRule ->save ();
102+ $ this ->assertQuoteTriggerRecollectIsUpdated ($ quote );
49103 $ response = $ this ->_webApiCall (
50104 [
51105 'rest ' => [
@@ -68,4 +122,31 @@ public function testCalculate()
68122 $ quote ->load (self ::QUOTE_RESERVED_ORDER_ID , 'reserved_order_id ' );
69123 $ this ->assertNotContains ($ salesRule ->getId (), str_getcsv ($ quote ->getAppliedRuleIds ()));
70124 }
125+
126+ /**
127+ * Assert that quote trigger_recollect value was set to 1
128+ *
129+ * @param Quote $quote
130+ * @return void
131+ * @throws \Magento\Framework\Exception\LocalizedException
132+ */
133+ private function assertQuoteTriggerRecollectIsUpdated (Quote $ quote ) : void
134+ {
135+ $ quoteResource = Bootstrap::getObjectManager ()->get (QuoteResourceModel::class);
136+ $ resourceConnection = Bootstrap::getObjectManager ()->get (ResourceConnection::class);
137+ $ select = $ resourceConnection ->getConnection ()
138+ ->select ()
139+ ->from ($ quoteResource ->getMainTable (), ['trigger_recollect ' ])
140+ ->where ('entity_id = ? ' , (int ) $ quote ->getId ());
141+ try {
142+ $ this ->publisherConsumerController ->waitForAsynchronousResult (
143+ function (ResourceConnection $ resourceConnection , Select $ select ) {
144+ return (int ) $ resourceConnection ->getConnection ()->fetchOne ($ select ) === 1 ;
145+ },
146+ [$ resourceConnection , $ select ]
147+ );
148+ } catch (PreconditionFailedException $ e ) {
149+ $ this ->fail ("trigger_recollect was not updated for quote ID {$ quote ->getId ()}" );
150+ }
151+ }
71152}
0 commit comments