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