jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/381498 )

Change subject: Fix bone-headed errors in duplicate invoice handling
......................................................................


Fix bone-headed errors in duplicate invoice handling

Bug: T171349
Change-Id: Ia8eb1b9648da00e4a4022b6c9d85e0ea55958afe
---
M sites/all/modules/queue2civicrm/tests/phpunit/DonationQueueTest.php
M sites/all/modules/wmf_common/WmfQueueConsumer.php
2 files changed, 72 insertions(+), 2 deletions(-)

Approvals:
  XenoRyet: Looks good to me, approved
  jenkins-bot: Verified



diff --git 
a/sites/all/modules/queue2civicrm/tests/phpunit/DonationQueueTest.php 
b/sites/all/modules/queue2civicrm/tests/phpunit/DonationQueueTest.php
index 35dd678..c891ec6 100644
--- a/sites/all/modules/queue2civicrm/tests/phpunit/DonationQueueTest.php
+++ b/sites/all/modules/queue2civicrm/tests/phpunit/DonationQueueTest.php
@@ -1,8 +1,9 @@
 <?php
 
 use queue2civicrm\DonationQueueConsumer;
-use SmashPig\Core\Context;
+use SmashPig\Core\DataStores\DamagedDatabase;
 use SmashPig\Core\DataStores\PendingDatabase;
+use SmashPig\Core\DataStores\QueueWrapper;
 
 /**
  * @group Pipeline
@@ -16,6 +17,11 @@
        protected $pendingDb;
 
        /**
+        * @var DamagedDatabase
+        */
+       protected $damagedDb;
+
+       /**
         * @var DonationQueueConsumer
         */
        protected $queueConsumer;
@@ -23,6 +29,7 @@
        public function setUp() {
                parent::setUp();
                $this->pendingDb = PendingDatabase::get();
+               $this->damagedDb = DamagedDatabase::get();
                $this->queueConsumer = new DonationQueueConsumer( 'test' );
        }
 
@@ -379,4 +386,63 @@
                        ),
                );
        }
+
+       public function testDuplicateHandling() {
+               $message = new TransactionMessage();
+               $message2 = new TransactionMessage(
+                       array(
+                               'contribution_tracking_id' => $message->get( 
'contribution_tracking_id' ),
+                               'order_id' => $message->get( 'order_id' ),
+                               'date' => time(),
+                       )
+               );
+
+               exchange_rate_cache_set( 'USD', $message->get( 'date' ), 1 );
+               exchange_rate_cache_set( $message->get( 'currency' ), 
$message->get( 'date' ), 3 );
+               exchange_rate_cache_set( 'USD', $message2->get( 'date' ), 1 );
+               exchange_rate_cache_set( $message2->get( 'currency' ), 
$message2->get( 'date' ), 3 );
+
+               QueueWrapper::getQueue( 'test' )->push( $message->getBody() );
+               QueueWrapper::getQueue( 'test' )->push( $message2->getBody() );
+
+               $this->queueConsumer->dequeueMessages();
+
+               $this->callAPISuccessGetSingle( 'Contribution', array(
+                       'invoice_id' => $message->get( 'order_id' )
+               ) );
+               $originalOrderId = $message2->get( 'order_id' );
+               $damagedPDO = $this->damagedDb->getDatabase();
+               $result = $damagedPDO->query( "
+                       SELECT * FROM damaged
+                       WHERE gateway = '{$message2->getGateway()}'
+                       AND order_id = '{$originalOrderId}'" );
+               $rows = $result->fetchAll( PDO::FETCH_ASSOC );
+               $this->assertEquals( 1, count( $rows ),
+                       'One row stored and retrieved.' );
+               $expected = array(
+                       // NOTE: This is a db-specific string, sqlite3 in this 
case, and
+                       // you'll have different formatting if using any other 
database.
+                       'original_date' => wmf_common_date_unix_to_sql( 
$message2->get('date') ),
+                       'gateway' => $message2->getGateway(),
+                       'order_id' => $originalOrderId,
+                       'gateway_txn_id' => 
"{$message2->get('gateway_txn_id')}",
+                       'original_queue' => 'test',
+               );
+               $this->assertArraySubset( $expected, $rows[0],
+                       'Stored message had expected contents' );
+               $this->assertNotNull( $rows[0]['retry_date'], 'Should retry' );
+               $storedMessage = json_decode( $rows[0]['message'], true );
+               $storedInvoiceId = $storedMessage['invoice_id'];
+               $storedTags = $storedMessage['contribution_tags'];
+               unset( $storedMessage['invoice_id'] );
+               unset( $storedMessage['contribution_tags'] );
+               $this->assertEquals( $message2->getBody(), $storedMessage );
+
+               $invoiceIdLen = strlen( strval( $originalOrderId ) );
+               $this->assertEquals(
+                       "$originalOrderId|dup-",
+                       substr( $storedInvoiceId, 0, $invoiceIdLen + 5 )
+               );
+               $this->assertEquals( array( 'DuplicateInvoiceId' ), $storedTags 
);
+       }
 }
diff --git a/sites/all/modules/wmf_common/WmfQueueConsumer.php 
b/sites/all/modules/wmf_common/WmfQueueConsumer.php
index f848965..c980ed0 100644
--- a/sites/all/modules/wmf_common/WmfQueueConsumer.php
+++ b/sites/all/modules/wmf_common/WmfQueueConsumer.php
@@ -137,12 +137,16 @@
        }
 
        protected function modifyDuplicateInvoice( $message ) {
+               if ( empty( $message['invoice_id'] ) && isset ( 
$message['order_id'] ) ) {
+                       $message['invoice_id'] = $message['order_id'];
+               }
                $message['invoice_id'] .= '|dup-' . UtcDate::getUtcTimeStamp();
                watchdog(
                        'wmf_civicrm',
                        'Found duplicate invoice ID, changing this one to ' .
                                $message['invoice_id']
                );
-               $msg['contribution_tags'][] = 'DuplicateInvoiceId';
+               $message['contribution_tags'][] = 'DuplicateInvoiceId';
+               return $message;
        }
 }

-- 
To view, visit https://gerrit.wikimedia.org/r/381498
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ia8eb1b9648da00e4a4022b6c9d85e0ea55958afe
Gerrit-PatchSet: 2
Gerrit-Project: wikimedia/fundraising/crm
Gerrit-Branch: master
Gerrit-Owner: Ejegg <[email protected]>
Gerrit-Reviewer: XenoRyet <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to