3 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
6 * Members repository tests
10 * Copyright © 2017 The Galette Team
12 * This file is part of Galette (http://galette.tuxfamily.org).
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.
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.
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/>.
27 * @category Repository
28 * @package GaletteTests
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
34 * @link http://galette.tuxfamily.org
38 namespace Galette\Repository\test\units
;
43 * Members repository tests
45 * @category Repository
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
54 class Members
extends atoum
62 private $members_fields;
63 private $seed = 335689;
69 * @param string $testMethod Calling method
73 public function beforeTestMethod($testMethod)
75 $this->zdb
= new \Galette\Core\
Db();
76 $this->i18n
= new \Galette\Core\
I18n(
77 \Galette\Core\I18n
::DEFAULT_LANG
79 $this->preferences
= new \Galette\Core\
Preferences(
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
);
86 include_once GALETTE_ROOT
. 'includes/fields_defs/members_fields.php';
87 $this->members_fields
= $members_fields;
88 $this->createMembers();
94 * @param string $testMethod Calling method
98 public function afterTestMethod($testMethod)
100 $this->deleteGroups();
101 $this->deleteMembers();
105 * Create members and get their id
109 private function createMembers()
111 global $zdb, $login, $hist, $i18n; // globals :(
113 $login = $this->login
;
114 $hist = $this->history
;
118 $this->deleteMembers();
119 } catch (\Exception
$e) {
123 $status = new \Galette\Entity\
Status($this->zdb
);
124 if (count($status->getList()) === 0) {
125 $res = $status->installInit();
126 $this->boolean($res)->isTrue();
129 $contribtypes = new \Galette\Entity\
ContributionsTypes($this->zdb
);
130 if (count($contribtypes->getCompleteList()) === 0) {
131 $res = $contribtypes->installInit();
132 $this->boolean($res)->isTrue();
136 $tests_members = json_decode(file_get_contents(GALETTE_TESTS_PATH
. '/fixtures/tests_members.json'));
140 foreach ($tests_members as $test_member) {
141 $test_member = (array)$test_member;
142 $member = new \Galette\Entity\
Adherent($this->zdb
);
143 $member->setDependencies(
145 $this->members_fields
,
149 $this->boolean($member->check($test_member, [], []))->isTrue();
150 $this->boolean($member->store())->isTrue();
151 $mids[] = $member->id
;
153 //set first member displayed publically an active and up to date member
154 if ($member->appearsInMembersList() && !$member->isDueFree() && $first === true) {
156 $contrib = new \Galette\Entity\
Contribution($this->zdb
, $this->login
);
159 $now = new \
DateTime();
161 $bdate->modify('-1 day');
162 $edate = clone $bdate;
163 $edate->modify('+1 year');
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
174 $check = $contrib->check($cdata, [], []);
175 $this->boolean($contrib->check($cdata, [], []))->isTrue();
176 $this->boolean($contrib->store())->isTrue();
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';
184 $copied = copy($url, $file);
185 $this->boolean($copied)->isTrue();
188 'name' => 'fakephoto.jpg',
189 'type' => 'image/jpeg',
190 'size' => filesize($file),
195 $this->integer((int)$member->picture
->store($_FILES['photo'], true))->isGreaterThan(0);
201 /*$fakedata = new \Galette\Util\FakeData($this->zdb, $this->i18n);
203 ->setSeed($this->seed)
205 ->setWithPhotos(true)
207 ->setNbTransactions(0)
211 $this->members_fields,
216 $fakedata->generate();
218 $report = $fakedata->getReport();
220 $this->array($report['success'])->hasSize(2);
221 $this->array($report['errors'])->hasSize(0);
222 $this->array($report['warnings'])->hasSize(0);
224 $this->mids = $fakedata->getMembersIds();*/
232 private function deleteMembers()
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);
240 $delete = $this->zdb
->delete(\Galette\Entity\Adherent
::TABLE
);
241 $delete->where(['fingerprint' => 'FAKER' . $this->seed
]);
242 $this->zdb
->execute($delete);
245 $this->zdb
->db
->query(
246 'TRUNCATE TABLE ' . PREFIX_DB
. \Galette\Core\History
::TABLE
,
247 \Zend\Db\Adapter\Adapter
::QUERY_MODE_EXECUTE
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
262 private function deleteGroups()
265 $delete = $this->zdb
->delete(\Galette\Entity\Group
::GROUPSUSERS_TABLE
);
266 $this->zdb
->execute($delete);
268 $delete = $this->zdb
->delete(\Galette\Entity\Group
::TABLE
);
269 $delete->where
->isNotNull('parent_group');
270 $this->zdb
->execute($delete);
272 $delete = $this->zdb
->delete(\Galette\Entity\Group
::TABLE
);
273 $this->zdb
->execute($delete);
281 public function testGetList()
283 $members = new \Galette\Repository\
Members();
285 $list = $members->getList();
286 $this->integer($list->count())->isIdenticalTo(10);
288 $list = $members->getEmails($this->zdb
);
289 $this->array($list)->hasSize(10)
291 'georges.didier@perrot.fr',
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();
302 $this->integer($list->count())->isIdenticalTo(9);
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();
310 $this->integer($list->count())->isIdenticalTo(1);
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();
319 $this->integer($list->count())->isIdenticalTo(2);
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();
328 $this->integer($list->count())->isIdenticalTo(6);
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();
337 $this->integer($list->count())->isIdenticalTo(4);
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();
347 $this->integer($list->count())->isIdenticalTo(0);
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);
356 $members = new \Galette\Repository\
Members();
357 $list = $members->getList(true);
361 ->object[0]->isInstanceOf('\Galette\Entity\Adherent');
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) {
371 ->keys
->isIdenticalTo([
379 $members = new \Galette\Repository\
Members();
380 $list = $members->getStaffMembersList();
381 $this->integer($list->count())->isIdenticalTo(1);
386 $torm[] = array_pop($mids);
387 $torm[] = array_pop($mids);
390 $members = new \Galette\Repository\
Members();
391 $this->boolean($members->removeMembers('notanid'))->isFalse();
392 $this->boolean($members->removeMembers($torm))->isTrue();
394 $list = $members->getList();
395 $this->integer($list->count())->isIdenticalTo(8);
403 public function testGetPublicList()
405 $members = new \Galette\Repository\
Members();
407 $list = $members->getPublicList(false);
408 $this->array($list)->hasSize(2);
412 $this->object($adh)->isInstanceOf('\Galette\Entity\Adherent');
413 $this->boolean($adh->appearsInMembersList())->isTrue();
414 $this->variable($adh->_picture
)->isNull();
416 $list = $members->getPublicList(true);
417 $this->array($list)->hasSize(1);
421 $this->object($adh)->isInstanceOf('\Galette\Entity\Adherent');
422 $this->boolean($adh->appearsInMembersList())->isTrue();
424 $this->boolean($adh->hasPicture())->isTrue();
428 * Test search on groups
432 public function testGroupsSearch()
434 $members = new \Galette\Repository\
Members();
435 $list = $members->getList(true);
436 $this->integer(count($list))->isIdenticalTo(10);
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);
444 //cannot be parent of itself
447 function () use ($group) {
448 $group->setParentGroup($group->getId());
450 )->hasMessage('Group `World` cannot be set as parent!');
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();
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();
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();
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();
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();
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);
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
500 for ($i = 0; $i < 5; ++
$i) {
501 $members[] = $list[$i];
503 $this->boolean($group->setMembers($members))->isTrue();
504 $this->integer(count($group->getMembers()))->isIdenticalTo(5);
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];
516 $this->boolean($group->setMembers($members))->isTrue();
517 $this->integer(count($group->getMembers()))->isIdenticalTo(6);
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();
526 $this->integer($list->count())->isIdenticalTo(2);
528 $filters->groups_search
= ['idx' => 2, 'group' => $pony];
529 $members = new \Galette\Repository\
Members($filters);
530 $list = $members->getList();
532 $this->integer($list->count())->isIdenticalTo(5);
534 $filters->groups_search_log_op
= \Galette\Filters\AdvancedMembersList
::OP_AND
;
535 $members = new \Galette\Repository\
Members($filters);
536 $list = $members->getList();
538 $this->integer($list->count())->isIdenticalTo(2);
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();
548 $this->integer($list->count())->isIdenticalTo(6);
550 $filters->groups_search_log_op
= \Galette\Filters\AdvancedMembersList
::OP_AND
;
551 $members = new \Galette\Repository\
Members($filters);
552 $list = $members->getList();
554 $this->integer($list->count())->isIdenticalTo(1);