diff --git a/CRM/Activity/BAO/Query.php b/CRM/Activity/BAO/Query.php index f863c9615752..78dccb7b892b 100644 --- a/CRM/Activity/BAO/Query.php +++ b/CRM/Activity/BAO/Query.php @@ -192,6 +192,10 @@ public static function whereClauseSingle(&$values, &$query) { case 'activity_engagement_level': case 'activity_id': case 'activity_campaign_id': + // We no longer expect "subject" as a specific criteria (as of CRM-19447), + // but I'm leaving this case just to reduce the chance of introducing a + // regression. + case 'activity_subject': $qillName = $name; if (in_array($name, array('activity_engagement_level', 'activity_id'))) { diff --git a/CRM/Activity/Form/Search.php b/CRM/Activity/Form/Search.php index 11be078fe148..9f96e5db4343 100644 --- a/CRM/Activity/Form/Search.php +++ b/CRM/Activity/Form/Search.php @@ -195,6 +195,7 @@ public function postProcess() { $specialParams = array( 'activity_type_id', 'status_id', + 'activity_text', ); $changeNames = array('status_id' => 'activity_status_id'); CRM_Contact_BAO_Query::processSpecialFormValue($this->_formValues, $specialParams, $changeNames); diff --git a/tests/phpunit/CRM/Contact/BAO/ActivitySearchTest.php b/tests/phpunit/CRM/Contact/BAO/ActivitySearchTest.php new file mode 100644 index 000000000000..f1adc37f09b3 --- /dev/null +++ b/tests/phpunit/CRM/Contact/BAO/ActivitySearchTest.php @@ -0,0 +1,208 @@ +. + */ + +/** + * Include class definitions + */ + +/** + * Test APIv3 civicrm_activity_* functions + * + * @package CiviCRM_APIv3 + * @subpackage API_Activity + * @group headless + */ +class CRM_Contact_BAO_ActivitySearchTest extends CiviUnitTestCase { + protected $_contactID; + protected $_params; + protected $test_activity_type_value; + + + /** + * Test setup for every test. + * + * Connect to the database, truncate the tables that will be used + * and redirect stdin to a temporary file + */ + public function setUp() { + // Connect to the database + parent::setUp(); + + $this->_contactID = $this->individualCreate(); + //create activity types + $activityTypes = $this->callAPISuccess('option_value', 'create', array( + 'option_group_id' => 2, + 'name' => 'Test activity type', + 'label' => 'Test activity type', + 'sequential' => 1, + )); + $this->test_activity_type_id = $activityTypes['id']; + $this->_params = array( + 'source_contact_id' => $this->_contactID, + 'activity_type_id' => $activityTypes['values'][0]['value'], + 'subject' => 'test activity type id', + 'activity_date_time' => '2011-06-02 14:36:13', + 'status_id' => 2, + 'priority_id' => 1, + 'duration' => 120, + 'location' => 'Pennsylvania', + 'details' => 'a test activity', + ); + // create a logged in USER since the code references it for source_contact_id + $this->createLoggedInUser(); + } + + /** + * Tears down the fixture, for example, closes a network connection. + * + * This method is called after a test is executed. + */ + public function tearDown() { + $tablesToTruncate = array( + 'civicrm_contact', + 'civicrm_activity', + 'civicrm_activity_contact', + 'civicrm_uf_match', + ); + $this->quickCleanup($tablesToTruncate, TRUE); + $type = $this->callAPISuccess('optionValue', 'get', array('id' => $this->test_activity_type_id)); + if (!empty($type['count'])) { + $this->callAPISuccess('option_value', 'delete', array('id' => $this->test_activity_type_id)); + } + } + + /** + * Test that activity.get api works when filtering on subject. + */ + public function testSearchBySubjectOnly() { + $subject = 'test activity ' . __FUNCTION__; + $params = $this->_params; + $params['subject'] = $subject; + $activity = $this->callAPISuccess('Activity', 'Create', $params); + + $case = array( + 'form_value' => array( + 'activity_text' => $subject, + 'activity_option' => 3, + ), + 'expected_count' => 1, + 'expected_contact' => array($this->_contactID), + ); + $query = new CRM_Contact_BAO_Query(CRM_Contact_BAO_Query::convertFormValues($case['form_value'])); + list($select, $from, $where, $having) = $query->query(); + $groupContacts = CRM_Core_DAO::executeQuery("SELECT DISTINCT contact_a.id $from $where")->fetchAll(); + foreach ($groupContacts as $key => $value) { + $groupContacts[$key] = $value['id']; + } + $this->assertEquals($case['expected_count'], count($groupContacts)); + $this->checkArrayEquals($case['expected_contact'], $groupContacts); + } + + /** + * Test that activity.get api works when filtering on subject. + */ + public function testSearchBySubjectBoth() { + $subject = 'test activity ' . __FUNCTION__; + $params = $this->_params; + $params['subject'] = $subject; + $activity = $this->callAPISuccess('Activity', 'Create', $params); + + $case = array( + 'form_value' => array( + 'activity_text' => $subject, + 'activity_option' => 6, + ), + 'expected_count' => 1, + 'expected_contact' => array($this->_contactID), + ); + $query = new CRM_Contact_BAO_Query(CRM_Contact_BAO_Query::convertFormValues($case['form_value'])); + list($select, $from, $where, $having) = $query->query(); + $groupContacts = CRM_Core_DAO::executeQuery("SELECT DISTINCT contact_a.id $from $where")->fetchAll(); + foreach ($groupContacts as $key => $value) { + $groupContacts[$key] = $value['id']; + } + $this->assertEquals($case['expected_count'], count($groupContacts)); + $this->checkArrayEquals($case['expected_contact'], $groupContacts); + } + + /** + * Test that activity.get api works when filtering on subject. + */ + public function testSearchByDetailsOnly() { + $details = 'test activity ' . __FUNCTION__; + $params = $this->_params; + $params['details'] = $details; + $activity = $this->callAPISuccess('Activity', 'Create', $params); + + $case = array( + 'form_value' => array( + 'activity_text' => $details, + 'activity_option' => 2, + ), + 'expected_count' => 1, + 'expected_contact' => array($this->_contactID), + ); + $query = new CRM_Contact_BAO_Query(CRM_Contact_BAO_Query::convertFormValues($case['form_value'])); + list($select, $from, $where, $having) = $query->query(); + $groupContacts = CRM_Core_DAO::executeQuery("SELECT DISTINCT contact_a.id $from $where")->fetchAll(); + foreach ($groupContacts as $key => $value) { + $groupContacts[$key] = $value['id']; + } + $this->assertEquals($case['expected_count'], count($groupContacts)); + $this->checkArrayEquals($case['expected_contact'], $groupContacts); + } + + /** + * Test that activity.get api works when filtering on details. + */ + public function testSearchByDetailsBoth() { + $details = 'test activity ' . __FUNCTION__; + $params = $this->_params; + $params['details'] = $details; + $activity = $this->callAPISuccess('Activity', 'Create', $params); + + $case = array( + 'form_value' => array( + 'activity_text' => $details, + 'activity_option' => 6, + ), + 'expected_count' => 1, + 'expected_contact' => array($this->_contactID), + ); + $query = new CRM_Contact_BAO_Query(CRM_Contact_BAO_Query::convertFormValues($case['form_value'])); + list($select, $from, $where, $having) = $query->query(); + $groupContacts = CRM_Core_DAO::executeQuery("SELECT DISTINCT contact_a.id $from $where")->fetchAll(); + foreach ($groupContacts as $key => $value) { + $groupContacts[$key] = $value['id']; + } + $this->assertEquals($case['expected_count'], count($groupContacts)); + $this->checkArrayEquals($case['expected_contact'], $groupContacts); + } + +}