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