3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.6 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2014 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
29 * File for the CiviCRM APIv3 job functions
31 * @package CiviCRM_APIv3
34 * @copyright CiviCRM LLC (c) 2004-2014
35 * @version $Id: Job.php 30879 2010-11-22 15:45:55Z shot $
38 require_once 'CiviTest/CiviUnitTestCase.php';
41 * Class api_v3_JobTest
43 class api_v3_JobTest
extends CiviUnitTestCase
{
44 protected $_apiversion = 3;
46 public $DBResetRequired = FALSE;
47 public $_entity = 'Job';
48 public $_params = array();
50 public function setUp() {
52 $this->useTransaction(TRUE);
53 $this->_params
= array(
55 'name' => 'API_Test_Job',
56 'description' => 'A long description written by hand in cursive',
57 'run_frequency' => 'Daily',
58 'api_entity' => 'ApiTestEntity',
59 'api_action' => 'apitestaction',
60 'parameters' => 'Semi-formal explanation of runtime job parameters',
68 public function testCreateWithoutName() {
71 $result = $this->callAPIFailure('job', 'create', $params,
72 'Mandatory key(s) missing from params array: run_frequency, name, api_entity, api_action'
77 * Create job with an invalid "run_frequency" value
79 public function testCreateWithInvalidFrequency() {
82 'name' => 'API_Test_Job',
83 'description' => 'A long description written by hand in cursive',
84 'run_frequency' => 'Fortnightly',
85 'api_entity' => 'ApiTestEntity',
86 'api_action' => 'apitestaction',
87 'parameters' => 'Semi-formal explanation of runtime job parameters',
90 $result = $this->callAPIFailure('job', 'create', $params);
96 public function testCreate() {
97 $result = $this->callAPIAndDocument('job', 'create', $this->_params
, __FUNCTION__
, __FILE__
);
98 $this->assertNotNull($result['values'][0]['id'], 'in line ' . __LINE__
);
100 // mutate $params to match expected return value
101 unset($this->_params
['sequential']);
102 //assertDBState compares expected values in $result to actual values in the DB
103 $this->assertDBState('CRM_Core_DAO_Job', $result['id'], $this->_params
);
107 * Check with empty array
109 public function testDeleteEmpty() {
111 $result = $this->callAPIFailure('job', 'delete', $params);
115 * Check with No array
117 public function testDeleteParamsNotArray() {
118 $result = $this->callAPIFailure('job', 'delete', 'string');
122 * Check if required fields are not passed
124 public function testDeleteWithoutRequired() {
126 'name' => 'API_Test_PP',
127 'title' => 'API Test Payment Processor',
128 'class_name' => 'CRM_Core_Payment_APITest',
131 $result = $this->callAPIFailure('job', 'delete', $params);
132 $this->assertEquals($result['error_message'], 'Mandatory key(s) missing from params array: id');
136 * Check with incorrect required fields
138 public function testDeleteWithIncorrectData() {
141 $result = $this->callAPIFailure('job', 'delete', $params);
147 public function testDelete() {
148 $createResult = $this->callAPISuccess('job', 'create', $this->_params
);
149 $params = array('id' => $createResult['id'],);
150 $result = $this->callAPIAndDocument('job', 'delete', $params, __FUNCTION__
, __FILE__
);
151 $this->assertAPIDeleted($this->_entity
, $createResult['id']);
156 public function testCallUpdateGreetingMissingParams() {
157 $result = $this->callAPISuccess($this->_entity, 'update_greeting', array('gt' => 1));
158 $this->assertEquals('Mandatory key(s) missing from params array: ct', $result['error_message']);
161 public function testCallUpdateGreetingIncorrectParams() {
162 $result = $this->callAPISuccess($this->_entity, 'update_greeting', array('gt' => 1, 'ct' => 'djkfhdskjfhds'));
163 $this->assertEquals('ct `djkfhdskjfhds` is not valid.', $result['error_message']);
166 * Note that this test is about tesing the metadata / calling of the function & doesn't test the success of the called function
168 public function testCallUpdateGreetingSuccess() {
169 $result = $this->callAPISuccess($this->_entity
, 'update_greeting', array('gt' => 'postal_greeting', 'ct' => 'Individual'));
172 public function testCallUpdateGreetingCommaSeparatedParamsSuccess() {
173 $gt = 'postal_greeting,email_greeting,addressee';
174 $ct = 'Individual,Household';
175 $result = $this->callAPISuccess($this->_entity
, 'update_greeting', array('gt' => $gt, 'ct' => $ct));
179 * Test the call reminder success sends more than 25 reminders & is not incorrectly limited
180 * Note that this particular test sends the reminders to the additional recipients only
181 * as no real reminder person is configured
183 * Also note that this is testing a 'job' api so is in this class rather than scheduled_reminder - which
184 * seems a cleaner place to build up a collection of scheduled reminder testing functions. However, it seems
185 * that the api itself would need to be moved to the scheduled_reminder fn to do that with the job wrapper being respected for legacy functions
187 public function testCallSendReminderSuccessMoreThanDefaultLimit() {
188 $membershipTypeID = $this->membershipTypeCreate();
189 $this->membershipStatusCreate();
191 for($i = 1; $i <= $createTotal; $i++
) {
192 $contactID = $this->individualCreate();
193 $groupID = $this->groupCreate(array('name' => $i, 'title' => $i));
194 $result = $this->callAPISuccess('action_schedule', 'create', array(
195 'title' => " job $i",
196 'subject' => "job $i",
197 'entity_value' => $membershipTypeID,
199 'start_action_date' => 'membership_join_date',
200 'start_action_offset' => 0,
201 'start_action_condition' => 'before',
202 'start_action_unit' => 'hour',
203 'group_id' => $groupID,
206 $this->callAPISuccess('group_contact', 'create', array('contact_id' => $contactID, 'status' => 'Added', 'group_id' => $groupID));
208 $result = $this->callAPISuccess('job', 'send_reminder', array());
209 $successfulCronCount = CRM_Core_DAO
::singleValueQuery("SELECT count(*) FROM civicrm_action_log");
210 $this->assertEquals($successfulCronCount, $createTotal);
214 * Test scheduled reminders respect limit to (since above identified addition_to handling issue)
215 * We create 3 contacts - 1 is in our group, 1 has our membership & the chosen one has both
216 * & check that only the chosen one got the reminder
218 public function testCallSendReminderLimitTo() {
219 $membershipTypeID = $this->membershipTypeCreate();
220 $this->membershipStatusCreate();
222 $groupID = $this->groupCreate(array('name' => 'Texan drawlers', 'title' => 'a...'));
223 for($i = 1; $i <= $createTotal; $i++
) {
224 $contactID = $this->individualCreate();
226 $theChosenOneID = $contactID;
229 $this->callAPISuccess('group_contact', 'create', array('contact_id' => $contactID, 'status' => 'Added', 'group_id' => $groupID));
232 $this->callAPISuccess('membership', 'create', array(
233 'contact_id' => $contactID,
234 'membership_type_id' => $membershipTypeID,
235 'join_date' => '+ 1 hour',
240 $result = $this->callAPISuccess('action_schedule', 'create', array(
241 'title' => " remind all Texans",
242 'subject' => "drawling renewal",
243 'entity_value' => $membershipTypeID,
245 'start_action_date' => 'membership_join_date',
246 'start_action_offset' => 0,
247 'start_action_condition' => 'before',
248 'start_action_unit' => 'hour',
249 'group_id' => $groupID,
252 $result = $this->callAPISuccess('job', 'send_reminder', array());
253 $successfulCronCount = CRM_Core_DAO
::singleValueQuery("SELECT count(*) FROM civicrm_action_log");
254 $this->assertEquals($successfulCronCount, 1);
255 $sentToID = CRM_Core_DAO
::singleValueQuery("SELECT contact_id FROM civicrm_action_log");
256 $this->assertEquals($sentToID, $theChosenOneID);
259 public function testCallDisableExpiredRelationships() {
260 $individualID = $this->individualCreate();
261 $orgID = $this->organizationCreate();
262 CRM_Utils_Hook_UnitTests
::singleton()->setHook('civicrm_pre', array($this, 'hookPreRelationship'));
263 $relationshipTypeID = $this->callAPISuccess('relationship_type', 'getvalue', array('return' => 'id', 'name_a_b' => 'Employee of'));
264 $result = $this->callAPISuccess('relationship', 'create', array(
265 'relationship_type_id' => $relationshipTypeID,
266 'contact_id_a' => $individualID,
267 'contact_id_b' => $orgID,
269 'end_date' => 'yesterday',
271 $relationshipID = $result['id'];
272 $this->assertEquals('Hooked', $result['values'][$relationshipID]['description']);
273 $this->callAPISuccess($this->_entity
, 'disable_expired_relationships', array());
274 $result = $this->callAPISuccess('relationship', 'get', array());
275 $this->assertEquals('Go Go you good thing', $result['values'][$relationshipID]['description']);
276 $this->contactDelete($individualID);
277 $this->contactDelete($orgID);
282 * @param string $objectName
284 * @param array $params
286 public function hookPreRelationship($op, $objectName, $id, &$params ) {
287 if($op == 'delete') {
290 if($params['is_active']) {
291 $params['description'] = 'Hooked';
294 $params['description'] = 'Go Go you good thing';