Eileen has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/383734 )

Change subject: Fix Omnimailing.load job to bypass creating recipients & to use 
internal replace, add test.
......................................................................

Fix Omnimailing.load job to bypass creating recipients & to use internal 
replace, add test.

Yes, passing '_skip_evil_bao_auto_recipients_' really is the key to bypassing 
that function :-)

We don't really want all those mailing_job records either since Civi is not 
doing those mailings.

ALso replace not working as I thought & hence internalising the code to do that

Bug: T178020
Change-Id: Ia5a86ea84548fc10483b01bbfdc8931793ea7d1b
---
M 
sites/default/civicrm/extensions/org.wikimedia.omnimail/api/v3/Omnimailing/Load.php
A 
sites/default/civicrm/extensions/org.wikimedia.omnimail/tests/phpunit/OmnimailingLoadTest.php
2 files changed, 174 insertions(+), 57 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/wikimedia/fundraising/crm 
refs/changes/34/383734/1

diff --git 
a/sites/default/civicrm/extensions/org.wikimedia.omnimail/api/v3/Omnimailing/Load.php
 
b/sites/default/civicrm/extensions/org.wikimedia.omnimail/api/v3/Omnimailing/Load.php
index 44550ab..811e4f2 100644
--- 
a/sites/default/civicrm/extensions/org.wikimedia.omnimail/api/v3/Omnimailing/Load.php
+++ 
b/sites/default/civicrm/extensions/org.wikimedia.omnimail/api/v3/Omnimailing/Load.php
@@ -41,69 +41,73 @@
     $getParams['username'] = $params['username'];
     $getParams['password'] = $params['password'];
   }
+  if (isset($params['client'])) {
+    $getParams['client'] = $params['client'];
+  }
   $mailings = civicrm_api3('Omnimailing', 'get', $getParams);
 
   foreach ($mailings['values']  as $mailing) {
-    $campaign = civicrm_api3('Campaign', 'replace', array(
-      'name' => 'sp' . $mailing['external_identifier'],
-      'values' => array(
-        array(
-          'title' => 'sp' . $mailing['external_identifier'],
-          'description' => $mailing['subject'],
-          'campaign_type_id' => 'Email',
-          'start_date' => date('Y-m-d H:i:s', $mailing['start_date']),
-          'status_id' => 'Completed',
-        )
-      )
+    $campaign = _civicrm_api3_omnimailing_load_api_replace(
+      'Campaign',
+      array('name' => 'sp' . $mailing['external_identifier']),
+      array(
+        'title' => 'sp' . $mailing['external_identifier'],
+        'description' => $mailing['subject'],
+        'campaign_type_id' => 'Email',
+        'start_date' => date('Y-m-d H:i:s', $mailing['start_date']),
+        'status_id' => 'Completed',
     ));
+
     CRM_Core_PseudoConstant::flush();
-    $result = civicrm_api3('Mailing', 'replace', array(
-      'hash' => 'sp' . $mailing['external_identifier'],
-      'debug' => 1,
-      'values' => array(
-        array(
-          'body_html' => !empty($mailing['body_html']) ? $mailing['body_html'] 
: '',
-          'body_text' => !empty($mailing['body_text']) ? $mailing['body_text'] 
: '',
-          'name' => !empty($mailing['name']) ? $mailing['name'] : 'sp' . 
$mailing['external_identifier'],
-          'subject' => $mailing['subject'],
-          'created_date' => date('Y-m-d H:i:s', $mailing['scheduled_date']),
-          'hash' => 'sp' . $mailing['external_identifier'],
-          'scheduled_date' => date('Y-m-d H:i:s', $mailing['scheduled_date']),
-          'campaign_id' => $campaign['id'],
-          'is_completed' => 1,
-        )
+
+    $result =  _civicrm_api3_omnimailing_load_api_replace(
+      'Mailing',
+      array('hash' => 'sp' . $mailing['external_identifier']),
+      array(
+        'body_html' => !empty($mailing['body_html']) ? $mailing['body_html'] : 
'',
+        'body_text' => !empty($mailing['body_text']) ? $mailing['body_text'] : 
'',
+        'name' => !empty($mailing['name']) ? $mailing['name'] : 'sp' . 
$mailing['external_identifier'],
+        'subject' => $mailing['subject'],
+        'created_date' => date('Y-m-d H:i:s', $mailing['scheduled_date']),
+        'hash' => 'sp' . $mailing['external_identifier'],
+        'scheduled_date' => date('Y-m-d H:i:s', $mailing['scheduled_date']),
+        'campaign_id' => $campaign['id'],
       ),
-    ));
-    $values[] = $result['values'][$result['id']];
-    civicrm_api3('MailingStats', 'replace', array(
-      'mailing_id' => $result['id'],
-      'values' => array(
-        array(
-          'debug' => 1,
-          'mailing_id' => $result['id'],
-          'mailing_name' => !empty($mailing['name']) ? $mailing['name'] : 'sp' 
. $mailing['external_identifier'],
-          'is_completed' => TRUE,
-          'created_date' => date('Y-m-d H:i:s', $mailing['scheduled_date']),
-          'start' => date('Y-m-d H:i:s', $mailing['start_date']),
-          //'finish' =>
-          'recipients' => $mailing['number_sent'],
-          'delivered' => $mailing['number_sent'] - $mailing['number_bounced'],
-          // 'send_rate'
-          'bounced' => $mailing['number_bounced'],
-          'opened_total' => $mailing['number_opened_total'],
-          'opened_unique' => $mailing['number_opened_unique'],
-          'unsubscribed' => $mailing['number_unsubscribed'],
-          'suppressed' => $mailing['number_suppressed'],
-          // 'forwarded'
-          'blocked' => $mailing['number_blocked'],
-          // 'clicked_total' => $stats['NumGrossClick'],
-          'abuse_complaints' => $mailing['number_abuse_complaints'],
-          // 'clicked_contribution_page'
-          // 'contribution_count'
-          // 'contribution_total'
-        )
-      ),
-    ));
+      array(
+        'is_completed' => 1,
+        '_skip_evil_bao_auto_recipients_' => 1,
+        '_skip_evil_bao_auto_schedule_' => 1,
+      )
+    );
+    $values[] = $result;
+
+    _civicrm_api3_omnimailing_load_api_replace(
+      'MailingStats',
+      array('mailing_id' => $result['id']),
+      array(
+        'mailing_id' => $result['id'],
+        'mailing_name' => !empty($mailing['name']) ? $mailing['name'] : 'sp' . 
$mailing['external_identifier'],
+        'is_completed' => TRUE,
+        'created_date' => date('Y-m-d H:i:s', $mailing['scheduled_date']),
+        'start' => date('Y-m-d H:i:s', $mailing['start_date']),
+        //'finish' =>
+        'recipients' => $mailing['number_sent'],
+        'delivered' => $mailing['number_sent'] - $mailing['number_bounced'],
+        // 'send_rate'
+        'bounced' => $mailing['number_bounced'],
+        'opened_total' => $mailing['number_opened_total'],
+        'opened_unique' => $mailing['number_opened_unique'],
+        'unsubscribed' => $mailing['number_unsubscribed'],
+        'suppressed' => $mailing['number_suppressed'],
+        // 'forwarded'
+        'blocked' => $mailing['number_blocked'],
+        // 'clicked_total' => $stats['NumGrossClick'],
+        'abuse_complaints' => $mailing['number_abuse_complaints'],
+        // 'clicked_contribution_page'
+        // 'contribution_count'
+        // 'contribution_total'
+      )
+    );
   }
   return civicrm_api3_create_success($values);
 }
@@ -136,3 +140,37 @@
   );
 
 }
+
+/**
+ * Replace entity with updated version as appropriate.
+ *
+ * This does what I thought 'replace' already did & does a retrieve + an 
insert if needed.
+ *
+ * @todo centralise this somewhere to be available for other calls.
+ *
+ * @param string $entity
+ * @param array $retrieveParams
+ * @param array $updateParams
+ * @param array $extraParams
+ *
+ * @return array
+ *   Entity created or retrieved.
+ */
+function _civicrm_api3_omnimailing_load_api_replace($entity, $retrieveParams, 
$updateParams, $extraParams = array()) {
+  $retrieveParams['return'] = array_keys($updateParams);
+  $preExisting = civicrm_api3($entity, 'get', $retrieveParams);
+  if (isset($preExisting['id'])) {
+    $preExisting = $preExisting['values'][$preExisting['id']];
+    foreach ($updateParams as $key => $updateParam) {
+      if (CRM_Utils_Array::value($key, $preExisting) === $updateParam[$key]) {
+        unset($updateParams[$key]);
+      }
+    }
+    if (empty($updateParams)) {
+      return $preExisting;
+    }
+    $updateParams['id'] = $preExisting['id'];
+  }
+  $created = civicrm_api3($entity, 'create', array_merge($updateParams, 
$extraParams));
+  return $created['values'][$created['id']];
+}
diff --git 
a/sites/default/civicrm/extensions/org.wikimedia.omnimail/tests/phpunit/OmnimailingLoadTest.php
 
b/sites/default/civicrm/extensions/org.wikimedia.omnimail/tests/phpunit/OmnimailingLoadTest.php
new file mode 100644
index 0000000..57e2c96
--- /dev/null
+++ 
b/sites/default/civicrm/extensions/org.wikimedia.omnimail/tests/phpunit/OmnimailingLoadTest.php
@@ -0,0 +1,79 @@
+<?php
+
+use Civi\Test\EndToEndInterface;
+use Civi\Test\TransactionalInterface;
+
+require_once __DIR__ . '/OmnimailBaseTestClass.php';
+
+/**
+ * FIXME - Add test description.
+ *
+ * Tips:
+ *  - With HookInterface, you may implement CiviCRM hooks directly in the test 
class.
+ *    Simply create corresponding functions (e.g. "hook_civicrm_post(...)" or 
similar).
+ *  - With TransactionalInterface, any data changes made by setUp() or 
test****() functions will
+ *    rollback automatically -- as long as you don't manipulate schema or 
truncate tables.
+ *    If this test needs to manipulate schema or truncate tables, then either:
+ *       a. Do all that using setupHeadless() and Civi\Test.
+ *       b. Disable TransactionalInterface, and handle all setup/teardown 
yourself.
+ *
+ * @group e2e
+ */
+class OmnimailingLoadTest extends OmnimailBaseTestClass implements 
EndToEndInterface, TransactionalInterface {
+
+  public function setUpHeadless() {
+    // Civi\Test has many helpers, like install(), uninstall(), sql(), and 
sqlFile().
+    // See: 
https://github.com/civicrm/org.civicrm.testapalooza/blob/master/civi-test.md
+    return \Civi\Test::e2e()
+      ->installMe(__DIR__)
+      ->apply();
+  }
+
+  public function setUp() {
+    parent::setUp();
+  }
+
+  public function tearDown() {
+    parent::tearDown();
+  }
+
+  /**
+   * Example: Test that a version is returned.
+   */
+  public function testOmnimailingLoad() {
+    $mailings = $this->loadMailings();
+    $this->assertEquals(2, $mailings['count']);
+    $mailing = civicrm_api3('Mailing', 'getsingle', array('hash' => 'sp7877'));
+    $this->assertEquals(1, $mailing['is_completed']);
+
+    $this->loadMailings();
+
+    $mailingReloaded = civicrm_api3('Mailing', 'getsingle', array('hash' => 
'sp7877'));
+
+    $this->assertEquals($mailingReloaded['id'], $mailing['id']);
+    $mailingJobs = civicrm_api3('MailingJob', 'get', array('mailing_id' => 
$mailing['id']));
+    $this->assertEquals(0, $mailingJobs['count']);
+
+  }
+
+  /**
+   * @return array
+   */
+  protected function loadMailings() {
+    $responses = array(
+      file_get_contents(__DIR__ . '/Responses/MailingGetResponse1.txt'),
+      file_get_contents(__DIR__ . '/Responses/AggregateGetResponse1.txt'),
+      file_get_contents(__DIR__ . '/Responses/GetMailingTemplateResponse.txt'),
+      file_get_contents(__DIR__ . 
'/Responses/GetMailingTemplateResponse2.txt'),
+      file_get_contents(__DIR__ . 
'/Responses/GetMailingTemplateResponse2.txt'),
+    );
+    $mailings = civicrm_api3('Omnimailing', 'load', array(
+      'mail_provider' => 'Silverpop',
+      'client' => $this->getMockRequest($responses),
+      'username' => 'Donald',
+      'password' => 'quack'
+    ));
+    return $mailings;
+  }
+
+}

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia5a86ea84548fc10483b01bbfdc8931793ea7d1b
Gerrit-PatchSet: 1
Gerrit-Project: wikimedia/fundraising/crm
Gerrit-Branch: master
Gerrit-Owner: Eileen <emcnaugh...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to