3 +--------------------------------------------------------------------+
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2019 |
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 * Class CRM_Core_BAO_RecurringEntityTest
32 class CRM_Core_BAO_RecurringEntityTest
extends CiviUnitTestCase
{
35 * Sets up the fixture, for example, opens a network connection.
36 * This method is called before a test is executed.
38 protected function setUp() {
43 * Tears down the fixture, for example, closes a network connection.
44 * This method is called after a test is executed.
46 protected function tearDown() {
50 * Testing Activity Generation through Entity Recursion.
52 public function testActivityGeneration() {
53 //Activity set initial params
54 $daoActivity = new CRM_Activity_DAO_Activity();
55 $daoActivity->activity_type_id
= 1;
56 $daoActivity->subject
= "Initial Activity";
57 $daoActivity->activity_date_time
= '20141002103000';
60 $recursion = new CRM_Core_BAO_RecurringEntity();
61 $recursion->entity_id
= $daoActivity->id
;
62 $recursion->entity_table
= 'civicrm_activity';
63 $recursion->dateColumns
= array('activity_date_time');
64 $recursion->schedule
= array(
65 'entity_value' => $daoActivity->id
,
66 'start_action_date' => $daoActivity->activity_date_time
,
67 'entity_status' => 'fourth saturday',
68 'repetition_frequency_unit' => 'month',
69 'repetition_frequency_interval' => 3,
70 'start_action_offset' => 5,
71 'used_for' => 'activity',
74 $generatedEntities = $recursion->generate();
75 $this->assertEquals(5, count($generatedEntities['civicrm_activity']), "Cehck if number of iterations are 5");
76 $expectedDates = array(
83 foreach ($generatedEntities['civicrm_activity'] as $entityID) {
84 $this->assertDBNotNull('CRM_Activity_DAO_Activity', $entityID, 'id',
85 'id', 'Check DB if repeating activities were created'
89 // set mode to ALL, i.e any change to changing activity affects all related recurring activities
92 // lets change subject of initial activity that we created in beginning
93 $daoActivity->find(TRUE);
94 $daoActivity->subject
= 'Changed Activity';
97 // check if other activities were affected
98 $actualDates = array();
99 foreach ($generatedEntities['civicrm_activity'] as $entityID) {
100 $this->assertDBCompareValue('CRM_Activity_DAO_Activity', $entityID, 'subject', 'id', 'Changed Activity', 'Check if subject was updated');
101 $actualDates[] = date('YmdHis', strtotime(CRM_Core_DAO
::getFieldValue('CRM_Activity_DAO_Activity', $entityID, 'activity_date_time', 'id')));
103 $resultDates = array_diff($actualDates, $expectedDates);
104 $this->assertEquals(0, count($resultDates), "Check if all the value in expected array matches actual array");
109 * Creating action schedule
111 private function createActionSchedule($entity_id, $entity_table) {
113 "used_for" => $entity_table,
114 "entity_value" => $entity_id,
115 "start_action_date" => date("YmdHis"),
116 "repetition_frequency_unit" => "week",
117 "repetition_frequency_interval" => "3",
118 "start_action_condition" => "monday,tuesday,wednesday,thursday,friday,saturday",
119 "start_action_offset" => "2",
121 $actionScheduleObj = CRM_Core_BAO_ActionSchedule
::add($params);
122 return $actionScheduleObj;
126 * Creating recurring entities
128 private function createRecurringEntities($actionScheduleObj, $entity_id, $entity_table) {
129 $recursion = new CRM_Core_BAO_RecurringEntity();
130 $recursion->dateColumns
= array(
133 $recursion->scheduleId
= $actionScheduleObj->id
;
134 $recursion->entity_id
= $entity_id;
135 $recursion->entity_table
= $entity_table;
136 $recursion->linkedEntities
= array(
138 "table" => "civicrm_price_set_entity",
139 "findCriteria" => array(
140 "entity_id" => $entity_id,
141 "entity_table" => $entity_table,
143 "linkedColumns" => array(
146 "isRecurringEntityRecord" => FALSE,
149 return $recursion->generate();
153 * Testing Event Generation through Entity Recursion.
155 public function testRepeatEventCreation() {
156 $event = $this->eventCreate();
157 $entity_table = "civicrm_event";
158 $entity_id = $event["id"];
159 CRM_Price_BAO_PriceSet
::addTo($entity_table, $entity_id, 1);
160 $actionScheduleObj = $this->createActionSchedule($entity_id, $entity_table);
161 $recurringEntities = $this->createRecurringEntities($actionScheduleObj, $entity_id, $entity_table);
162 $finalResult = CRM_Core_BAO_RecurringEntity
::updateModeAndPriceSet($entity_id, $entity_table, CRM_Core_BAO_RecurringEntity
::MODE_ALL_ENTITY_IN_SERIES
, array(), 2);
163 $this->assertEquals(2, count($recurringEntities["civicrm_event"]), "Recurring events not created.");
164 $this->assertEquals(2, count($recurringEntities["civicrm_price_set_entity"]), "Recurring price sets not created.");
165 $priceSetOne = CRM_Price_BAO_PriceSet
::getFor($entity_table, $recurringEntities["civicrm_price_set_entity"][0]);
166 $priceSetTwo = CRM_Price_BAO_PriceSet
::getFor($entity_table, $recurringEntities["civicrm_price_set_entity"][1]);
167 $this->assertEquals(2, $priceSetOne, "Price set id of the recurring event is not updated.");
168 $this->assertEquals(2, $priceSetTwo, "Price set id of the recurring event is not updated.");
172 * Testing Event Generation through Entity Recursion.
174 public function testEventGeneration() {
175 //Event set initial params
176 $daoEvent = new CRM_Event_DAO_Event();
177 $daoEvent->title
= 'Test event for Recurring Entity';
178 $daoEvent->event_type_id
= 3;
179 $daoEvent->is_public
= 1;
180 $daoEvent->start_date
= date('YmdHis', strtotime('2014-10-26 10:30:00'));
181 $daoEvent->end_date
= date('YmdHis', strtotime('2014-10-28 10:30:00'));
182 $daoEvent->created_date
= date('YmdHis');
183 $daoEvent->is_active
= 1;
185 $this->assertDBNotNull('CRM_Event_DAO_Event', $daoEvent->id
, 'id', 'id', 'Check DB if event was created');
187 //Create tell a friend for event
188 $daoTellAFriend = new CRM_Friend_DAO_Friend();
189 $daoTellAFriend->entity_table
= 'civicrm_event';
190 $daoTellAFriend->entity_id
= $daoEvent->id
; // join with event
191 $daoTellAFriend->title
= 'Testing tell a friend';
192 $daoTellAFriend->is_active
= 1;
193 $daoTellAFriend->save();
194 $this->assertDBNotNull('CRM_Friend_DAO_Friend', $daoTellAFriend->id
, 'id', 'id', 'Check DB if tell a friend was created');
196 // time to use recursion
197 $recursion = new CRM_Core_BAO_RecurringEntity();
198 $recursion->entity_id
= $daoEvent->id
;
199 $recursion->entity_table
= 'civicrm_event';
200 $recursion->dateColumns
= array('start_date');
201 $recursion->schedule
= array(
202 'entity_value' => $daoEvent->id
,
203 'start_action_date' => $daoEvent->start_date
,
204 'start_action_condition' => 'monday',
205 'repetition_frequency_unit' => 'week',
206 'repetition_frequency_interval' => 1,
207 'start_action_offset' => 4,
208 'used_for' => 'event',
211 $recursion->linkedEntities
= array(
213 'table' => 'civicrm_tell_friend',
214 'findCriteria' => array(
215 'entity_id' => $recursion->entity_id
,
216 'entity_table' => 'civicrm_event',
218 'linkedColumns' => array('entity_id'),
219 'isRecurringEntityRecord' => TRUE,
223 $interval = $recursion->getInterval($daoEvent->start_date
, $daoEvent->end_date
);
224 $recursion->intervalDateColumns
= array('end_date' => $interval);
225 $generatedEntities = $recursion->generate();
226 $this->assertArrayHasKey('civicrm_event', $generatedEntities, 'Check if generatedEntities has civicrm_event as required key');
227 $expectedDates = array(
228 '20141027103000' => '20141029103000',
229 '20141103103000' => '20141105103000',
230 '20141110103000' => '20141112103000',
231 '20141117103000' => '20141119103000',
234 $this->assertCount($recursion->schedule
['start_action_offset'], $generatedEntities['civicrm_event'], 'Check if the number of events created are right');
235 $actualDates = array();
236 foreach ($generatedEntities['civicrm_event'] as $key => $val) {
237 $this->assertDBNotNull('CRM_Event_DAO_Event', $val, 'id', 'id', 'Check if repeating events were created.');
238 $startDate = date('YmdHis', strtotime(CRM_Core_DAO
::getFieldValue('CRM_Event_DAO_Event', $val, 'start_date', 'id')));
239 $endDate = date('YmdHis', strtotime(CRM_Core_DAO
::getFieldValue('CRM_Event_DAO_Event', $val, 'end_date', 'id')));
240 $actualDates[$startDate] = $endDate;
243 $resultDates = array_diff($actualDates, $expectedDates);
244 $this->assertEquals(0, count($resultDates), "Check if all the value in expected array matches actual array");
246 foreach ($generatedEntities['civicrm_tell_friend'] as $key => $val) {
247 $this->assertDBNotNull('CRM_Friend_DAO_Friend', $val, 'id', 'id', 'Check if friends were created in loop');
248 $this->assertDBCompareValue('CRM_Friend_DAO_Friend', $val, 'entity_id', 'id', $generatedEntities['civicrm_event'][$key], 'Check DB if correct FK was maintained with event for Friend');
250 $this->assertCount($recursion->schedule
['start_action_offset'], $generatedEntities['civicrm_tell_friend'], 'Check if the number of tell a friend records are right');
252 // set mode to ALL, i.e any change to changing event affects all related recurring activities
255 $daoEvent->find(TRUE);
256 $daoEvent->title
= 'Event Changed';
259 // check if other events were affected
260 foreach ($generatedEntities['civicrm_event'] as $entityID) {
261 $this->assertDBCompareValue('CRM_Event_DAO_Event', $entityID, 'title', 'id', 'Event Changed', 'Check if title was updated');
264 end($generatedEntities['civicrm_event']);
265 $key = key($generatedEntities['civicrm_event']);
267 end($generatedEntities['civicrm_tell_friend']);
268 $actKey = key($generatedEntities['civicrm_tell_friend']);
270 //Check if both(event/tell a friend) keys are same
271 $this->assertEquals($key, $actKey, "Check if both the keys are same");
273 //Cross check event exists before we test deletion
274 $searchParamsEventBeforeDelete = array(
275 'entity_id' => $generatedEntities['civicrm_event'][$key],
276 'entity_table' => 'civicrm_event',
278 $expectedValuesEventBeforeDelete = array(
279 'entity_id' => $generatedEntities['civicrm_event'][$key],
280 'entity_table' => 'civicrm_event',
282 $this->assertDBCompareValues('CRM_Core_DAO_RecurringEntity', $searchParamsEventBeforeDelete, $expectedValuesEventBeforeDelete);
284 //Cross check event exists before we test deletion
285 $searchParamsTellAFriendBeforeDelete = array(
286 'entity_id' => $generatedEntities['civicrm_tell_friend'][$actKey],
287 'entity_table' => 'civicrm_tell_friend',
289 $expectedValuesTellAFriendBeforeDelete = array(
290 'entity_id' => $generatedEntities['civicrm_tell_friend'][$actKey],
291 'entity_table' => 'civicrm_tell_friend',
293 $this->assertDBCompareValues('CRM_Core_DAO_RecurringEntity', $searchParamsTellAFriendBeforeDelete, $expectedValuesTellAFriendBeforeDelete);
295 //Delete an event from recurring set and respective linked entity should be deleted from civicrm_recurring_entity_table
296 $daoRecurEvent = new CRM_Event_DAO_Event();
297 $daoRecurEvent->id
= $generatedEntities['civicrm_event'][$key];
298 if ($daoRecurEvent->find(TRUE)) {
299 $daoRecurEvent->delete();
300 $daoRecurEvent->free();
303 //Check if this event_id was deleted
304 $this->assertDBNull('CRM_Event_DAO_Event', $generatedEntities['civicrm_event'][$key], 'id', 'id', 'Check if event was deleted');
305 $searchParams = array(
306 'entity_id' => $generatedEntities['civicrm_event'][$key],
307 'entity_table' => 'civicrm_event',
309 $compareParams = array();
310 $this->assertDBCompareValues('CRM_Core_DAO_RecurringEntity', $searchParams, $compareParams);
312 //Find tell_a_friend id if that was deleted from civicrm
313 $searchActParams = array(
314 'entity_id' => $generatedEntities['civicrm_tell_friend'][$actKey],
315 'entity_table' => 'civicrm_tell_friend',
317 $compareActParams = array();
318 $this->assertDBCompareValues('CRM_Friend_DAO_Friend', $searchActParams, $compareActParams);