]> git.agnieray.net Git - galette.git/blob - tests/Galette/Repository/tests/units/Members.php
Handle advanced filters in their own method, factorize date search
[galette.git] / tests / Galette / Repository / tests / units / Members.php
1 <?php
2
3 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
4
5 /**
6 * Members repository tests
7 *
8 * PHP version 5
9 *
10 * Copyright © 2017 The Galette Team
11 *
12 * This file is part of Galette (http://galette.tuxfamily.org).
13 *
14 * Galette is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation, either version 3 of the License, or
17 * (at your option) any later version.
18 *
19 * Galette is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with Galette. If not, see <http://www.gnu.org/licenses/>.
26 *
27 * @category Repository
28 * @package GaletteTests
29 *
30 * @author Johan Cwiklinski <johan@x-tnd.be>
31 * @copyright 2017 The Galette Team
32 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
33 * @version SVN: $Id$
34 * @link http://galette.tuxfamily.org
35 * @since 2017-04-15
36 */
37
38 namespace Galette\Repository\test\units;
39
40 use atoum;
41
42 /**
43 * Members repository tests
44 *
45 * @category Repository
46 * @name Members
47 * @package GaletteTests
48 * @author Johan Cwiklinski <johan@x-tnd.be>
49 * @copyright 2017 The Galette Team
50 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
51 * @link http://galette.tuxfamily.org
52 * @since 2017-04-15
53 */
54 class Members extends atoum
55 {
56 private $zdb;
57 private $i18n;
58 private $preferences;
59 private $session;
60 private $login;
61 private $history;
62 private $members_fields;
63 private $seed = 335689;
64 private $mids;
65
66 /**
67 * Set up tests
68 *
69 * @param string $testMethod Calling method
70 *
71 * @return void
72 */
73 public function beforeTestMethod($testMethod)
74 {
75 $this->zdb = new \Galette\Core\Db();
76 $this->i18n = new \Galette\Core\I18n(
77 \Galette\Core\I18n::DEFAULT_LANG
78 );
79 $this->preferences = new \Galette\Core\Preferences(
80 $this->zdb
81 );
82 $this->session = new \RKA\Session();
83 $this->login = new \Galette\Core\Login($this->zdb, $this->i18n, $this->session);
84 $this->history = new \Galette\Core\History($this->zdb, $this->login);
85
86 include_once GALETTE_ROOT . 'includes/fields_defs/members_fields.php';
87 $this->members_fields = $members_fields;
88 $this->createMembers();
89 }
90
91 /**
92 * Tear down tests
93 *
94 * @param string $testMethod Calling method
95 *
96 * @return void
97 */
98 public function afterTestMethod($testMethod)
99 {
100 $this->deleteGroups();
101 $this->deleteMembers();
102 }
103
104 /**
105 * Create members and get their id
106 *
107 * @return int[]
108 */
109 private function createMembers()
110 {
111 global $zdb, $login, $hist, $i18n; // globals :(
112 $zdb = $this->zdb;
113 $login = $this->login;
114 $hist = $this->history;
115 $i18n = $this->i18n;
116
117 try {
118 $this->deleteMembers();
119 } catch (\Exception $e) {
120 //empty catch
121 }
122
123 $status = new \Galette\Entity\Status($this->zdb);
124 if (count($status->getList()) === 0) {
125 $res = $status->installInit();
126 $this->boolean($res)->isTrue();
127 }
128
129 $contribtypes = new \Galette\Entity\ContributionsTypes($this->zdb);
130 if (count($contribtypes->getCompleteList()) === 0) {
131 $res = $contribtypes->installInit();
132 $this->boolean($res)->isTrue();
133 }
134
135
136 $tests_members = json_decode(file_get_contents(GALETTE_TESTS_PATH . '/fixtures/tests_members.json'));
137
138 $mids = [];
139 $first = true;
140 foreach ($tests_members as $test_member) {
141 $test_member = (array)$test_member;
142 $member = new \Galette\Entity\Adherent($this->zdb);
143 $member->setDependencies(
144 $this->preferences,
145 $this->members_fields,
146 $this->history
147 );
148
149 $this->boolean($member->check($test_member, [], []))->isTrue();
150 $this->boolean($member->store())->isTrue();
151 $mids[] = $member->id;
152
153 //set first member displayed publically an active and up to date member
154 if ($member->appearsInMembersList() && !$member->isDueFree() && $first === true) {
155 $first = false;
156 $contrib = new \Galette\Entity\Contribution($this->zdb, $this->login);
157
158
159 $now = new \DateTime();
160 $bdate = clone $now;
161 $bdate->modify('-1 day');
162 $edate = clone $bdate;
163 $edate->modify('+1 year');
164
165 $cdata = [
166 \Galette\Entity\Adherent::PK => $member->id,
167 'type_paiement_cotis' => \Galette\Entity\PaymentType::CASH,
168 'montant_cotis' => 20,
169 'date_enreg' => $bdate->format('Y-m-d'),
170 'date_debut_cotis' => $bdate->format('Y-m-d'),
171 'date_fin_cotis' => $edate->format('Y-m-d'),
172 \Galette\Entity\ContributionsTypes::PK => \Galette\Entity\ContributionsTypes::DEFAULT_TYPE
173 ];
174 $check = $contrib->check($cdata, [], []);
175 $this->boolean($contrib->check($cdata, [], []))->isTrue();
176 $this->boolean($contrib->store())->isTrue();
177 }
178
179 //only one member is due free. add him a photo.
180 if ($member->isDueFree()) {
181 $file = GALETTE_TEMPIMAGES_PATH . 'fakephoto.jpg';
182 $url = GALETTE_ROOT . '../tests/fake_image.jpg';
183
184 $copied = copy($url, $file);
185 $this->boolean($copied)->isTrue();
186 $_FILES = array(
187 'photo' => array(
188 'name' => 'fakephoto.jpg',
189 'type' => 'image/jpeg',
190 'size' => filesize($file),
191 'tmp_name' => $file,
192 'error' => 0
193 )
194 );
195 $this->integer((int)$member->picture->store($_FILES['photo'], true))->isGreaterThan(0);
196 }
197 }
198
199 $this->mids = $mids;
200
201 /*$fakedata = new \Galette\Util\FakeData($this->zdb, $this->i18n);
202 $fakedata
203 ->setSeed($this->seed)
204 ->setNbMembers(10)
205 ->setWithPhotos(true)
206 ->setNbGroups(0)
207 ->setNbTransactions(0)
208 ->setMaxContribs(0)
209 ->setDependencies(
210 $this->preferences,
211 $this->members_fields,
212 $this->history,
213 $this->login
214 );
215
216 $fakedata->generate();
217
218 $report = $fakedata->getReport();
219
220 $this->array($report['success'])->hasSize(2);
221 $this->array($report['errors'])->hasSize(0);
222 $this->array($report['warnings'])->hasSize(0);
223
224 $this->mids = $fakedata->getMembersIds();*/
225 }
226
227 /**
228 * Delete member
229 *
230 * @return void
231 */
232 private function deleteMembers()
233 {
234 if (is_array($this->mids) && count($this->mids) > 0) {
235 $delete = $this->zdb->delete(\Galette\Entity\Contribution::TABLE);
236 $delete->where->in(\Galette\Entity\Adherent::PK, $this->mids);
237 $this->zdb->execute($delete);
238 }
239
240 $delete = $this->zdb->delete(\Galette\Entity\Adherent::TABLE);
241 $delete->where(['fingerprint' => 'FAKER' . $this->seed]);
242 $this->zdb->execute($delete);
243
244 //Clean logs
245 $this->zdb->db->query(
246 'TRUNCATE TABLE ' . PREFIX_DB . \Galette\Core\History::TABLE,
247 \Zend\Db\Adapter\Adapter::QUERY_MODE_EXECUTE
248 );
249
250 //FIXME: Photos should be removed, but this fail for now :(
251 $this->zdb->db->query(
252 'TRUNCATE TABLE ' . PREFIX_DB . \Galette\Core\Picture::TABLE,
253 \Zend\Db\Adapter\Adapter::QUERY_MODE_EXECUTE
254 );
255 }
256
257 /**
258 * Delete groups
259 *
260 * @return void
261 */
262 private function deleteGroups()
263 {
264 //clean groups
265 $delete = $this->zdb->delete(\Galette\Entity\Group::GROUPSUSERS_TABLE);
266 $this->zdb->execute($delete);
267
268 $delete = $this->zdb->delete(\Galette\Entity\Group::TABLE);
269 $delete->where->isNotNull('parent_group');
270 $this->zdb->execute($delete);
271
272 $delete = $this->zdb->delete(\Galette\Entity\Group::TABLE);
273 $this->zdb->execute($delete);
274 }
275
276 /**
277 * Test getList
278 *
279 * @return void
280 */
281 public function testGetList()
282 {
283 $members = new \Galette\Repository\Members();
284
285 $list = $members->getList();
286 $this->integer($list->count())->isIdenticalTo(10);
287
288 $list = $members->getEmails($this->zdb);
289 $this->array($list)->hasSize(10)
290 ->hasKeys([
291 'georges.didier@perrot.fr',
292 'marc25@pires.org'
293 ]);
294
295
296 //Filter on active accounts
297 $filters = new \Galette\Filters\MembersList();
298 $filters->filter_account = \Galette\Repository\Members::ACTIVE_ACCOUNT;
299 $members = new \Galette\Repository\Members($filters);
300 $list = $members->getList();
301
302 $this->integer($list->count())->isIdenticalTo(9);
303
304 //Filter on inactive accounts
305 $filters = new \Galette\Filters\MembersList();
306 $filters->filter_account = \Galette\Repository\Members::INACTIVE_ACCOUNT;
307 $members = new \Galette\Repository\Members($filters);
308 $list = $members->getList();
309
310 $this->integer($list->count())->isIdenticalTo(1);
311
312 //Search on address
313 $filters = new \Galette\Filters\MembersList();
314 $filters->filter_str = 'avenue';
315 $filters->field_filter = \Galette\Repository\Members::FILTER_ADDRESS;
316 $members = new \Galette\Repository\Members($filters);
317 $list = $members->getList();
318
319 $this->integer($list->count())->isIdenticalTo(2);
320
321 //search on email
322 $filters = new \Galette\Filters\MembersList();
323 $filters->filter_str = '.fr';
324 $filters->field_filter = \Galette\Repository\Members::FILTER_MAIL;
325 $members = new \Galette\Repository\Members($filters);
326 $list = $members->getList();
327
328 $this->integer($list->count())->isIdenticalTo(6);
329
330 //search on name
331 $filters = new \Galette\Filters\MembersList();
332 $filters->filter_str = 'marc';
333 $filters->field_filter = \Galette\Repository\Members::FILTER_NAME;
334 $members = new \Galette\Repository\Members($filters);
335 $list = $members->getList();
336
337 $this->integer($list->count())->isIdenticalTo(4);
338
339 //serch on contribution date
340 $filters = new \Galette\Filters\AdvancedMembersList();
341 $contribdate = new \DateTime();
342 $contribdate->modify('+2 days');
343 $filters->contrib_begin_date_begin = $contribdate->format('Y-m-d');
344 $members = new \Galette\Repository\Members($filters);
345 $list = $members->getList();
346
347 $this->integer($list->count())->isIdenticalTo(0);
348
349 $contribdate->modify('-5 days');
350 $filters->contrib_begin_date_begin = $contribdate->format('Y-m-d');
351 $members = new \Galette\Repository\Members($filters);
352 $list = $members->getList();
353 $this->integer($list->count())->isIdenticalTo(1);
354
355 //not filtered list
356 $members = new \Galette\Repository\Members();
357 $list = $members->getList(true);
358
359 $this->array($list)
360 ->hasSize(10)
361 ->object[0]->isInstanceOf('\Galette\Entity\Adherent');
362
363 //get list with specified fields
364 $members = new \Galette\Repository\Members();
365 $list = $members->getList(false, ['nom_adh', 'ville_adh']);
366 $this->integer($list->count())->isIdenticalTo(10);
367 $arraylist = $list->toArray();
368 foreach ($arraylist as $array) {
369 $this->array($array)
370 ->hasSize(3)
371 ->keys->isIdenticalTo([
372 'nom_adh',
373 'ville_adh',
374 'id_adh',
375 ]);
376 }
377
378 //Get staff
379 $members = new \Galette\Repository\Members();
380 $list = $members->getStaffMembersList();
381 $this->integer($list->count())->isIdenticalTo(1);
382
383 //Remove 2 members
384 $torm = [];
385 $mids = $this->mids;
386 $torm[] = array_pop($mids);
387 $torm[] = array_pop($mids);
388 $this->mids = $mids;
389
390 $members = new \Galette\Repository\Members();
391 $this->boolean($members->removeMembers('notanid'))->isFalse();
392 $this->boolean($members->removeMembers($torm))->isTrue();
393
394 $list = $members->getList();
395 $this->integer($list->count())->isIdenticalTo(8);
396 }
397
398 /**
399 * Test getPublicList
400 *
401 * @return void
402 */
403 public function testGetPublicList()
404 {
405 $members = new \Galette\Repository\Members();
406
407 $list = $members->getPublicList(false);
408 $this->array($list)->hasSize(2);
409
410 $adh = $list[0];
411
412 $this->object($adh)->isInstanceOf('\Galette\Entity\Adherent');
413 $this->boolean($adh->appearsInMembersList())->isTrue();
414 $this->variable($adh->_picture)->isNull();
415
416 $list = $members->getPublicList(true);
417 $this->array($list)->hasSize(1);
418
419 $adh = $list[0];
420
421 $this->object($adh)->isInstanceOf('\Galette\Entity\Adherent');
422 $this->boolean($adh->appearsInMembersList())->isTrue();
423
424 $this->boolean($adh->hasPicture())->isTrue();
425 }
426
427 /**
428 * Test search on groups
429 *
430 * @return void
431 */
432 public function testGroupsSearch()
433 {
434 $members = new \Galette\Repository\Members();
435 $list = $members->getList(true);
436 $this->integer(count($list))->isIdenticalTo(10);
437
438 $group = new \Galette\Entity\Group();
439 $group->setName('World');
440 $this->boolean($group->store())->isTrue();
441 $world = $group->getId();
442 $this->integer($world)->isGreaterThan(0);
443
444 //cannot be parent of itself
445 $this
446 ->exception(
447 function () use ($group) {
448 $group->setParentGroup($group->getId());
449 }
450 )->hasMessage('Group `World` cannot be set as parent!');
451
452 $group = new \Galette\Entity\Group();
453 $group->setName('Europe')->setParentGroup($world);
454 $this->boolean($group->store())->isTrue();
455 $europe = $group->getId();
456 $this->integer($europe)->isGreaterThan(0);
457 $this->boolean($group->setMembers([$list[0], $list[1]]))->isTrue();
458
459 $group = new \Galette\Entity\Group();
460 $group->setName('Asia')->setParentGroup($world);
461 $this->boolean($group->store())->isTrue();
462 $asia = $group->getId();
463 $this->integer($asia)->isGreaterThan(0);
464 $this->boolean($group->setMembers([$list[2], $list[3]]))->isTrue();
465
466 $group = new \Galette\Entity\Group();
467 $group->setName('Africa')->setParentGroup($world);
468 $this->boolean($group->store())->isTrue();
469 $africa = $group->getId();
470 $this->integer($africa)->isGreaterThan(0);
471 $this->boolean($group->setMembers([$list[4], $list[5]]))->isTrue();
472
473 $group = new \Galette\Entity\Group();
474 $group->setName('America')->setParentGroup($world);
475 $this->boolean($group->store())->isTrue();
476 $america = $group->getId();
477 $this->integer($america)->isGreaterThan(0);
478 $this->boolean($group->setMembers([$list[6], $list[7]]))->isTrue();
479
480 $group = new \Galette\Entity\Group();
481 $group->setName('Antarctica')->setParentGroup($world);
482 $this->boolean($group->store())->isTrue();
483 $antarctica = $group->getId();
484 $this->integer($america)->isGreaterThan(0);
485 $this->boolean($group->setMembers([$list[8], $list[9]]))->isTrue();
486
487 $group = new \Galette\Entity\Group();
488 $group->setName('Activities');
489 $this->boolean($group->store())->isTrue();
490 $activities = $group->getId();
491 $this->integer($activities)->isGreaterThan(0);
492
493 $group = new \Galette\Entity\Group();
494 $group->setName('Pony')->setParentGroup($activities);
495 $this->boolean($group->store())->isTrue();
496 $pony = $group->getId();
497 $this->integer($pony)->isGreaterThan(0);
498 //assign Members to group
499 $members = [];
500 for ($i = 0; $i < 5; ++$i) {
501 $members[] = $list[$i];
502 }
503 $this->boolean($group->setMembers($members))->isTrue();
504 $this->integer(count($group->getMembers()))->isIdenticalTo(5);
505
506 $group = new \Galette\Entity\Group();
507 $group->setName('Swimming pool')->setParentGroup($activities);
508 $this->boolean($group->store())->isTrue();
509 $pool = $group->getId();
510 $this->integer($pool)->isGreaterThan(0);
511 //assign Members to group
512 $members = [$list[0]];
513 for ($i = 5; $i < 10; ++$i) {
514 $members[] = $list[$i];
515 }
516 $this->boolean($group->setMembers($members))->isTrue();
517 $this->integer(count($group->getMembers()))->isIdenticalTo(6);
518
519 //all groups/members are setup. try to find them now.
520 $filters = new \Galette\Filters\AdvancedMembersList();
521 $filters->groups_search_log_op = \Galette\Filters\AdvancedMembersList::OP_OR;
522 $filters->groups_search = ['idx' => 1, 'group' => $europe];
523 $members = new \Galette\Repository\Members($filters);
524 $list = $members->getList();
525
526 $this->integer($list->count())->isIdenticalTo(2);
527
528 $filters->groups_search = ['idx' => 2, 'group' => $pony];
529 $members = new \Galette\Repository\Members($filters);
530 $list = $members->getList();
531
532 $this->integer($list->count())->isIdenticalTo(5);
533
534 $filters->groups_search_log_op = \Galette\Filters\AdvancedMembersList::OP_AND;
535 $members = new \Galette\Repository\Members($filters);
536 $list = $members->getList();
537
538 $this->integer($list->count())->isIdenticalTo(2);
539
540 //another try
541 $filters = new \Galette\Filters\AdvancedMembersList();
542 $filters->groups_search_log_op = \Galette\Filters\AdvancedMembersList::OP_OR;
543 $filters->groups_search = ['idx' => 1, 'group' => $africa];
544 $filters->groups_search = ['idx' => 2, 'group' => $pony];
545 $members = new \Galette\Repository\Members($filters);
546 $list = $members->getList();
547
548 $this->integer($list->count())->isIdenticalTo(6);
549
550 $filters->groups_search_log_op = \Galette\Filters\AdvancedMembersList::OP_AND;
551 $members = new \Galette\Repository\Members($filters);
552 $list = $members->getList();
553
554 $this->integer($list->count())->isIdenticalTo(1);
555 }
556 }