Commit | Line | Data |
---|---|---|
25b72113 | 1 | <?php |
2 | /* | |
3 | +--------------------------------------------------------------------+ | |
2fe49090 | 4 | | CiviCRM version 5 | |
25b72113 | 5 | +--------------------------------------------------------------------+ |
8c9251b3 | 6 | | Copyright CiviCRM LLC (c) 2004-2018 | |
25b72113 | 7 | +--------------------------------------------------------------------+ |
8 | | This file is a part of CiviCRM. | | |
9 | | | | |
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. | | |
13 | | | | |
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. | | |
18 | | | | |
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 | +--------------------------------------------------------------------+ | |
d25dd0ee | 26 | */ |
25b72113 | 27 | |
25b72113 | 28 | /** |
060402a9 | 29 | * Class CRM_Core_BAO_RecurringEntityTest |
acb109b7 | 30 | * @group headless |
25b72113 | 31 | */ |
060402a9 | 32 | class CRM_Core_BAO_RecurringEntityTest extends CiviUnitTestCase { |
25b72113 | 33 | |
6caeea75 | 34 | /** |
35 | * Sets up the fixture, for example, opens a network connection. | |
36 | * This method is called before a test is executed. | |
6caeea75 | 37 | */ |
38 | protected function setUp() { | |
25b72113 | 39 | parent::setUp(); |
25b72113 | 40 | } |
59d63f8b | 41 | |
6caeea75 | 42 | /** |
43 | * Tears down the fixture, for example, closes a network connection. | |
44 | * This method is called after a test is executed. | |
6caeea75 | 45 | */ |
6c6e6187 TO |
46 | protected function tearDown() { |
47 | } | |
25b72113 | 48 | |
49 | /** | |
eceb18cc | 50 | * Testing Activity Generation through Entity Recursion. |
25b72113 | 51 | */ |
00be9182 | 52 | public function testActivityGeneration() { |
206c0c43 | 53 | //Activity set initial params |
37b28176 | 54 | $daoActivity = new CRM_Activity_DAO_Activity(); |
55 | $daoActivity->activity_type_id = 1; | |
56 | $daoActivity->subject = "Initial Activity"; | |
f5f5a631 | 57 | $daoActivity->activity_date_time = '20141002103000'; |
37b28176 | 58 | $daoActivity->save(); |
25b72113 | 59 | |
37b28176 | 60 | $recursion = new CRM_Core_BAO_RecurringEntity(); |
92915c55 | 61 | $recursion->entity_id = $daoActivity->id; |
690bf076 | 62 | $recursion->entity_table = 'civicrm_activity'; |
92915c55 TO |
63 | $recursion->dateColumns = array('activity_date_time'); |
64 | $recursion->schedule = array( | |
65 | 'entity_value' => $daoActivity->id, | |
66 | 'start_action_date' => $daoActivity->activity_date_time, | |
a1a821bc | 67 | 'entity_status' => 'fourth saturday', |
37b28176 | 68 | 'repetition_frequency_unit' => 'month', |
69 | 'repetition_frequency_interval' => 3, | |
70 | 'start_action_offset' => 5, | |
92915c55 | 71 | 'used_for' => 'activity', |
690bf076 | 72 | ); |
206c0c43 | 73 | |
59d63f8b | 74 | $generatedEntities = $recursion->generate(); |
f5f5a631 | 75 | $this->assertEquals(5, count($generatedEntities['civicrm_activity']), "Cehck if number of iterations are 5"); |
76 | $expectedDates = array( | |
59d63f8b | 77 | '20141025103000', |
78 | '20141227103000', | |
79 | '20150328103000', | |
80 | '20150627103000', | |
21dfd5f5 | 81 | '20150926103000', |
f5f5a631 | 82 | ); |
84f02991 | 83 | foreach ($generatedEntities['civicrm_activity'] as $entityID) { |
37b28176 | 84 | $this->assertDBNotNull('CRM_Activity_DAO_Activity', $entityID, 'id', |
85 | 'id', 'Check DB if repeating activities were created' | |
86 | ); | |
25b72113 | 87 | } |
25b72113 | 88 | |
206c0c43 | 89 | // set mode to ALL, i.e any change to changing activity affects all related recurring activities |
90 | $recursion->mode(3); | |
37b28176 | 91 | |
e4f46be0 | 92 | // lets change subject of initial activity that we created in beginning |
25b72113 | 93 | $daoActivity->find(TRUE); |
690bf076 | 94 | $daoActivity->subject = 'Changed Activity'; |
25b72113 | 95 | $daoActivity->save(); |
25b72113 | 96 | |
37b28176 | 97 | // check if other activities were affected |
f5f5a631 | 98 | $actualDates = array(); |
84f02991 | 99 | foreach ($generatedEntities['civicrm_activity'] as $entityID) { |
690bf076 | 100 | $this->assertDBCompareValue('CRM_Activity_DAO_Activity', $entityID, 'subject', 'id', 'Changed Activity', 'Check if subject was updated'); |
f5f5a631 | 101 | $actualDates[] = date('YmdHis', strtotime(CRM_Core_DAO::getFieldValue('CRM_Activity_DAO_Activity', $entityID, 'activity_date_time', 'id'))); |
6caeea75 | 102 | } |
f5f5a631 | 103 | $resultDates = array_diff($actualDates, $expectedDates); |
104 | $this->assertEquals(0, count($resultDates), "Check if all the value in expected array matches actual array"); | |
59d63f8b | 105 | |
6caeea75 | 106 | } |
59d63f8b | 107 | |
543aa76e AP |
108 | /** |
109 | * Creating action schedule | |
110 | */ | |
111 | private function createActionSchedule($entity_id, $entity_table) { | |
112 | $params = array( | |
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", | |
120 | ); | |
121 | $actionScheduleObj = CRM_Core_BAO_ActionSchedule::add($params); | |
122 | return $actionScheduleObj; | |
123 | } | |
124 | ||
125 | /** | |
126 | * Creating recurring entities | |
127 | */ | |
128 | private function createRecurringEntities($actionScheduleObj, $entity_id, $entity_table) { | |
129 | $recursion = new CRM_Core_BAO_RecurringEntity(); | |
130 | $recursion->dateColumns = array( | |
131 | "start_date", | |
132 | ); | |
133 | $recursion->scheduleId = $actionScheduleObj->id; | |
134 | $recursion->entity_id = $entity_id; | |
135 | $recursion->entity_table = $entity_table; | |
136 | $recursion->linkedEntities = array( | |
137 | array( | |
138 | "table" => "civicrm_price_set_entity", | |
139 | "findCriteria" => array( | |
140 | "entity_id" => $entity_id, | |
141 | "entity_table" => $entity_table, | |
142 | ), | |
143 | "linkedColumns" => array( | |
144 | "entity_id", | |
145 | ), | |
146 | "isRecurringEntityRecord" => FALSE, | |
147 | ), | |
148 | ); | |
149 | return $recursion->generate(); | |
150 | } | |
151 | ||
152 | /** | |
153 | * Testing Event Generation through Entity Recursion. | |
154 | */ | |
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."); | |
169 | } | |
170 | ||
690bf076 | 171 | /** |
eceb18cc | 172 | * Testing Event Generation through Entity Recursion. |
690bf076 | 173 | */ |
00be9182 | 174 | public function testEventGeneration() { |
6c6e6187 | 175 | //Event set initial params |
690bf076 | 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; | |
f5f5a631 | 180 | $daoEvent->start_date = date('YmdHis', strtotime('2014-10-26 10:30:00')); |
92915c55 | 181 | $daoEvent->end_date = date('YmdHis', strtotime('2014-10-28 10:30:00')); |
690bf076 | 182 | $daoEvent->created_date = date('YmdHis'); |
183 | $daoEvent->is_active = 1; | |
184 | $daoEvent->save(); | |
cd3f28a7 | 185 | $this->assertDBNotNull('CRM_Event_DAO_Event', $daoEvent->id, 'id', 'id', 'Check DB if event was created'); |
59d63f8b | 186 | |
cd3f28a7 | 187 | //Create tell a friend for event |
188 | $daoTellAFriend = new CRM_Friend_DAO_Friend(); | |
189 | $daoTellAFriend->entity_table = 'civicrm_event'; | |
fb2120e7 | 190 | $daoTellAFriend->entity_id = $daoEvent->id; // join with event |
cd3f28a7 | 191 | $daoTellAFriend->title = 'Testing tell a friend'; |
192 | $daoTellAFriend->is_active = 1; | |
193 | $daoTellAFriend->save(); | |
f5f5a631 | 194 | $this->assertDBNotNull('CRM_Friend_DAO_Friend', $daoTellAFriend->id, 'id', 'id', 'Check DB if tell a friend was created'); |
690bf076 | 195 | |
fb2120e7 | 196 | // time to use recursion |
690bf076 | 197 | $recursion = new CRM_Core_BAO_RecurringEntity(); |
92915c55 | 198 | $recursion->entity_id = $daoEvent->id; |
690bf076 | 199 | $recursion->entity_table = 'civicrm_event'; |
92915c55 TO |
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', | |
690bf076 | 206 | 'repetition_frequency_interval' => 1, |
92915c55 TO |
207 | 'start_action_offset' => 4, |
208 | 'used_for' => 'event', | |
690bf076 | 209 | ); |
210 | ||
342c3f9e | 211 | $recursion->linkedEntities = array( |
342c3f9e | 212 | array( |
92915c55 TO |
213 | 'table' => 'civicrm_tell_friend', |
214 | 'findCriteria' => array( | |
215 | 'entity_id' => $recursion->entity_id, | |
21dfd5f5 | 216 | 'entity_table' => 'civicrm_event', |
342c3f9e | 217 | ), |
218 | 'linkedColumns' => array('entity_id'), | |
219 | 'isRecurringEntityRecord' => TRUE, | |
220 | ), | |
342c3f9e | 221 | ); |
59d63f8b | 222 | |
f5f5a631 | 223 | $interval = $recursion->getInterval($daoEvent->start_date, $daoEvent->end_date); |
224 | $recursion->intervalDateColumns = array('end_date' => $interval); | |
59d63f8b | 225 | $generatedEntities = $recursion->generate(); |
cd3f28a7 | 226 | $this->assertArrayHasKey('civicrm_event', $generatedEntities, 'Check if generatedEntities has civicrm_event as required key'); |
f5f5a631 | 227 | $expectedDates = array( |
228 | '20141027103000' => '20141029103000', | |
229 | '20141103103000' => '20141105103000', | |
230 | '20141110103000' => '20141112103000', | |
21dfd5f5 | 231 | '20141117103000' => '20141119103000', |
f5f5a631 | 232 | ); |
59d63f8b | 233 | |
fb2120e7 | 234 | $this->assertCount($recursion->schedule['start_action_offset'], $generatedEntities['civicrm_event'], 'Check if the number of events created are right'); |
f5f5a631 | 235 | $actualDates = array(); |
22e263ad | 236 | foreach ($generatedEntities['civicrm_event'] as $key => $val) { |
fb2120e7 | 237 | $this->assertDBNotNull('CRM_Event_DAO_Event', $val, 'id', 'id', 'Check if repeating events were created.'); |
f5f5a631 | 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; | |
cd3f28a7 | 241 | } |
59d63f8b | 242 | |
f5f5a631 | 243 | $resultDates = array_diff($actualDates, $expectedDates); |
244 | $this->assertEquals(0, count($resultDates), "Check if all the value in expected array matches actual array"); | |
59d63f8b | 245 | |
22e263ad | 246 | foreach ($generatedEntities['civicrm_tell_friend'] as $key => $val) { |
fb2120e7 | 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'); | |
cd3f28a7 | 249 | } |
fb2120e7 | 250 | $this->assertCount($recursion->schedule['start_action_offset'], $generatedEntities['civicrm_tell_friend'], 'Check if the number of tell a friend records are right'); |
59d63f8b | 251 | |
206c0c43 | 252 | // set mode to ALL, i.e any change to changing event affects all related recurring activities |
253 | $recursion->mode(3); | |
690bf076 | 254 | |
255 | $daoEvent->find(TRUE); | |
256 | $daoEvent->title = 'Event Changed'; | |
257 | $daoEvent->save(); | |
258 | ||
259 | // check if other events were affected | |
84f02991 | 260 | foreach ($generatedEntities['civicrm_event'] as $entityID) { |
690bf076 | 261 | $this->assertDBCompareValue('CRM_Event_DAO_Event', $entityID, 'title', 'id', 'Event Changed', 'Check if title was updated'); |
262 | } | |
59d63f8b | 263 | |
264 | end($generatedEntities['civicrm_event']); | |
2eac52b6 | 265 | $key = key($generatedEntities['civicrm_event']); |
59d63f8b | 266 | |
2eac52b6 | 267 | end($generatedEntities['civicrm_tell_friend']); |
268 | $actKey = key($generatedEntities['civicrm_tell_friend']); | |
59d63f8b | 269 | |
2eac52b6 | 270 | //Check if both(event/tell a friend) keys are same |
271 | $this->assertEquals($key, $actKey, "Check if both the keys are same"); | |
59d63f8b | 272 | |
2eac52b6 | 273 | //Cross check event exists before we test deletion |
f9f8eda7 | 274 | $searchParamsEventBeforeDelete = array( |
92915c55 | 275 | 'entity_id' => $generatedEntities['civicrm_event'][$key], |
21dfd5f5 | 276 | 'entity_table' => 'civicrm_event', |
f9f8eda7 | 277 | ); |
278 | $expectedValuesEventBeforeDelete = array( | |
92915c55 | 279 | 'entity_id' => $generatedEntities['civicrm_event'][$key], |
21dfd5f5 | 280 | 'entity_table' => 'civicrm_event', |
f9f8eda7 | 281 | ); |
2eac52b6 | 282 | $this->assertDBCompareValues('CRM_Core_DAO_RecurringEntity', $searchParamsEventBeforeDelete, $expectedValuesEventBeforeDelete); |
59d63f8b | 283 | |
2eac52b6 | 284 | //Cross check event exists before we test deletion |
f9f8eda7 | 285 | $searchParamsTellAFriendBeforeDelete = array( |
92915c55 | 286 | 'entity_id' => $generatedEntities['civicrm_tell_friend'][$actKey], |
21dfd5f5 | 287 | 'entity_table' => 'civicrm_tell_friend', |
f9f8eda7 | 288 | ); |
289 | $expectedValuesTellAFriendBeforeDelete = array( | |
92915c55 | 290 | 'entity_id' => $generatedEntities['civicrm_tell_friend'][$actKey], |
21dfd5f5 | 291 | 'entity_table' => 'civicrm_tell_friend', |
f9f8eda7 | 292 | ); |
2eac52b6 | 293 | $this->assertDBCompareValues('CRM_Core_DAO_RecurringEntity', $searchParamsTellAFriendBeforeDelete, $expectedValuesTellAFriendBeforeDelete); |
59d63f8b | 294 | |
2eac52b6 | 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(); | |
301 | } | |
59d63f8b | 302 | |
2eac52b6 | 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'); | |
f9f8eda7 | 305 | $searchParams = array( |
306 | 'entity_id' => $generatedEntities['civicrm_event'][$key], | |
21dfd5f5 | 307 | 'entity_table' => 'civicrm_event', |
f9f8eda7 | 308 | ); |
2eac52b6 | 309 | $compareParams = array(); |
310 | $this->assertDBCompareValues('CRM_Core_DAO_RecurringEntity', $searchParams, $compareParams); | |
f9f8eda7 | 311 | |
2eac52b6 | 312 | //Find tell_a_friend id if that was deleted from civicrm |
f9f8eda7 | 313 | $searchActParams = array( |
314 | 'entity_id' => $generatedEntities['civicrm_tell_friend'][$actKey], | |
21dfd5f5 | 315 | 'entity_table' => 'civicrm_tell_friend', |
f9f8eda7 | 316 | ); |
2eac52b6 | 317 | $compareActParams = array(); |
318 | $this->assertDBCompareValues('CRM_Friend_DAO_Friend', $searchActParams, $compareActParams); | |
690bf076 | 319 | } |
96025800 | 320 | |
25b72113 | 321 | } |