]> git.agnieray.net Git - galette.git/blob - tests/Galette/Repository/tests/units/Members.php
73d2080d6b099b24d96cc17c9e1fad46db37397d
[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 $fakedata = new \Galette\Util\FakeData($this->zdb, $this->i18n);
136
137 $fakedata
138 ->setSeed($this->seed)
139 ->setNbMembers(10)
140 ->setWithPhotos(true)
141 ->setNbGroups(0)
142 ->setNbTransactions(0)
143 ->setMaxContribs(0)
144 ->setDependencies(
145 $this->preferences,
146 $this->members_fields,
147 $this->history,
148 $this->login
149 );
150
151 $fakedata->generate();
152
153 $report = $fakedata->getReport();
154
155 $this->array($report['success'])->hasSize(2);
156 $this->array($report['errors'])->hasSize(0);
157 $this->array($report['warnings'])->hasSize(0);
158
159 $this->mids = $fakedata->getMembersIds();
160 }
161
162 /**
163 * Delete member
164 *
165 * @return void
166 */
167 private function deleteMembers()
168 {
169 if (is_array($this->mids) && count($this->mids) > 0) {
170 $delete = $this->zdb->delete(\Galette\Entity\Contribution::TABLE);
171 $delete->where->in(\Galette\Entity\Adherent::PK, $this->mids);
172 $this->zdb->execute($delete);
173 }
174
175 $delete = $this->zdb->delete(\Galette\Entity\Adherent::TABLE);
176 $delete->where(['fingerprint' => 'FAKER' . $this->seed]);
177 $this->zdb->execute($delete);
178
179 //Clean logs
180 $this->zdb->db->query(
181 'TRUNCATE TABLE ' . PREFIX_DB . \Galette\Core\History::TABLE,
182 \Zend\Db\Adapter\Adapter::QUERY_MODE_EXECUTE
183 );
184
185 //FIXME: Photos should be removed, but this fail for now :(
186 $this->zdb->db->query(
187 'TRUNCATE TABLE ' . PREFIX_DB . \Galette\Core\Picture::TABLE,
188 \Zend\Db\Adapter\Adapter::QUERY_MODE_EXECUTE
189 );
190 }
191
192 /**
193 * Delete groups
194 *
195 * @return void
196 */
197 private function deleteGroups()
198 {
199 //clean groups
200 $delete = $this->zdb->delete(\Galette\Entity\Group::GROUPSUSERS_TABLE);
201 $this->zdb->execute($delete);
202
203 $delete = $this->zdb->delete(\Galette\Entity\Group::TABLE);
204 $delete->where->isNotNull('parent_group');
205 $this->zdb->execute($delete);
206
207 $delete = $this->zdb->delete(\Galette\Entity\Group::TABLE);
208 $this->zdb->execute($delete);
209 }
210
211 /**
212 * Test getList
213 *
214 * @return void
215 */
216 public function testGetList()
217 {
218 $members = new \Galette\Repository\Members();
219
220 $list = $members->getList();
221 $this->integer($list->count())->isIdenticalTo(10);
222
223 $list = $members->getEmails($this->zdb);
224 $this->array($list)->hasSize(10)
225 ->hasKeys([
226 'georges.didier@perrot.fr',
227 'marc25@pires.org'
228 ]);
229
230
231 //Filter on active accounts
232 $filters = new \Galette\Filters\MembersList;
233 $filters->filter_account = \Galette\Repository\Members::ACTIVE_ACCOUNT;
234 $members = new \Galette\Repository\Members($filters);
235 $list = $members->getList();
236
237 $this->integer($list->count())->isIdenticalTo(9);
238
239 //Filter on inactive accounts
240 $filters = new \Galette\Filters\MembersList;
241 $filters->filter_account = \Galette\Repository\Members::INACTIVE_ACCOUNT;
242 $members = new \Galette\Repository\Members($filters);
243 $list = $members->getList();
244
245 $this->integer($list->count())->isIdenticalTo(1);
246
247 //Search on address
248 $filters = new \Galette\Filters\MembersList;
249 $filters->filter_str = 'avenue';
250 $filters->field_filter = \Galette\Repository\Members::FILTER_ADDRESS;
251 $members = new \Galette\Repository\Members($filters);
252 $list = $members->getList();
253
254 $this->integer($list->count())->isIdenticalTo(2);
255
256 $members = new \Galette\Repository\Members();
257 $list = $members->getList(true);
258
259 $this->array($list)
260 ->hasSize(10)
261 ->object[0]->isInstanceOf('\Galette\Entity\Adherent');
262
263 $members = new \Galette\Repository\Members();
264 $list = $members->getList(false, ['nom_adh', 'ville_adh']);
265 $this->integer($list->count())->isIdenticalTo(10);
266 $arraylist = $list->toArray();
267 foreach ($arraylist as $array) {
268 $this->array($array)
269 ->hasSize(3)
270 ->keys->isIdenticalTo([
271 'nom_adh',
272 'ville_adh',
273 'id_adh',
274 ]);
275 }
276
277 //Get staff
278 $members = new \Galette\Repository\Members();
279 $list = $members->getStaffMembersList();
280 $this->integer($list->count())->isIdenticalTo(1);
281
282 //Remove 2 members
283 $torm = [];
284 $mids = $this->mids;
285 $torm[] = array_pop($mids);
286 $torm[] = array_pop($mids);
287 $this->mids = $mids;
288
289 $members = new \Galette\Repository\Members();
290 $this->boolean($members->removeMembers('notanid'))->isFalse();
291 $this->boolean($members->removeMembers($torm))->isTrue();
292
293 $list = $members->getList();
294 $this->integer($list->count())->isIdenticalTo(8);
295 }
296
297 /**
298 * Test getPublicList
299 *
300 * @return void
301 */
302 public function testGetPublicList()
303 {
304 $members = new \Galette\Repository\Members();
305
306 $list = $members->getPublicList(false);
307 $this->array($list)->hasSize(1);
308
309 $adh = $list[0];
310
311 $this->object($adh)->isInstanceOf('\Galette\Entity\Adherent');
312 $this->boolean($adh->appearsInMembersList())->isTrue();
313 $this->variable($adh->_picture)->isNull();
314
315 $list = $members->getPublicList(true);
316 $this->array($list)->hasSize(1);
317
318 $adh = $list[0];
319
320 $this->object($adh)->isInstanceOf('\Galette\Entity\Adherent');
321 $this->boolean($adh->appearsInMembersList())->isTrue();
322
323 $this->boolean($adh->hasPicture())->isTrue();
324 }
325
326 /**
327 * Test search on groups
328 *
329 * @return void
330 */
331 public function testGroupsSearch()
332 {
333 $members = new \Galette\Repository\Members();
334 $list = $members->getList(true);
335 $this->integer(count($list))->isIdenticalTo(10);
336
337 $group = new \Galette\Entity\Group();
338 $group->setName('World');
339 $this->boolean($group->store())->isTrue();
340 $world = $group->getId();
341 $this->integer($world)->isGreaterThan(0);
342
343 //cannot be parent of itself
344 $this
345 ->exception(
346 function () use ($group) {
347 $group->setParentGroup($group->getId());
348 }
349 )->hasMessage('Group `World` cannot be set as parent!');
350
351 $group = new \Galette\Entity\Group();
352 $group->setName('Europe')->setParentGroup($world);
353 $this->boolean($group->store())->isTrue();
354 $europe = $group->getId();
355 $this->integer($europe)->isGreaterThan(0);
356 $this->boolean($group->setMembers([$list[0], $list[1]]))->isTrue();
357
358 $group = new \Galette\Entity\Group();
359 $group->setName('Asia')->setParentGroup($world);
360 $this->boolean($group->store())->isTrue();
361 $asia = $group->getId();
362 $this->integer($asia)->isGreaterThan(0);
363 $this->boolean($group->setMembers([$list[2], $list[3]]))->isTrue();
364
365 $group = new \Galette\Entity\Group();
366 $group->setName('Africa')->setParentGroup($world);
367 $this->boolean($group->store())->isTrue();
368 $africa = $group->getId();
369 $this->integer($africa)->isGreaterThan(0);
370 $this->boolean($group->setMembers([$list[4], $list[5]]))->isTrue();
371
372 $group = new \Galette\Entity\Group();
373 $group->setName('America')->setParentGroup($world);
374 $this->boolean($group->store())->isTrue();
375 $america = $group->getId();
376 $this->integer($america)->isGreaterThan(0);
377 $this->boolean($group->setMembers([$list[6], $list[7]]))->isTrue();
378
379 $group = new \Galette\Entity\Group();
380 $group->setName('Antarctica')->setParentGroup($world);
381 $this->boolean($group->store())->isTrue();
382 $antarctica = $group->getId();
383 $this->integer($america)->isGreaterThan(0);
384 $this->boolean($group->setMembers([$list[8], $list[9]]))->isTrue();
385
386 $group = new \Galette\Entity\Group();
387 $group->setName('Activities');
388 $this->boolean($group->store())->isTrue();
389 $activities = $group->getId();
390 $this->integer($activities)->isGreaterThan(0);
391
392 $group = new \Galette\Entity\Group();
393 $group->setName('Pony')->setParentGroup($activities);
394 $this->boolean($group->store())->isTrue();
395 $pony = $group->getId();
396 $this->integer($pony)->isGreaterThan(0);
397 //assign Members to group
398 $members = [];
399 for ($i = 0; $i < 5; ++$i) {
400 $members[] = $list[$i];
401 }
402 $this->boolean($group->setMembers($members))->isTrue();
403 $this->integer(count($group->getMembers()))->isIdenticalTo(5);
404
405 $group = new \Galette\Entity\Group();
406 $group->setName('Swimming pool')->setParentGroup($activities);
407 $this->boolean($group->store())->isTrue();
408 $pool = $group->getId();
409 $this->integer($pool)->isGreaterThan(0);
410 //assign Members to group
411 $members = [$list[0]];
412 for ($i = 5; $i < 10; ++$i) {
413 $members[] = $list[$i];
414 }
415 $this->boolean($group->setMembers($members))->isTrue();
416 $this->integer(count($group->getMembers()))->isIdenticalTo(6);
417
418 //all groups/members are setup. try to find them now.
419 $filters = new \Galette\Filters\AdvancedMembersList;
420 $filters->groups_search_log_op = \Galette\Filters\AdvancedMembersList::OP_OR;
421 $filters->groups_search = ['idx' => 1, 'group' => $europe];
422 $members = new \Galette\Repository\Members($filters);
423 $list = $members->getList();
424
425 $this->integer($list->count())->isIdenticalTo(2);
426
427 $filters->groups_search = ['idx' => 2, 'group' => $pony];
428 $members = new \Galette\Repository\Members($filters);
429 $list = $members->getList();
430
431 $this->integer($list->count())->isIdenticalTo(5);
432
433 $filters->groups_search_log_op = \Galette\Filters\AdvancedMembersList::OP_AND;
434 $members = new \Galette\Repository\Members($filters);
435 $list = $members->getList();
436
437 $this->integer($list->count())->isIdenticalTo(2);
438
439 //another try
440 $filters = new \Galette\Filters\AdvancedMembersList;
441 $filters->groups_search_log_op = \Galette\Filters\AdvancedMembersList::OP_OR;
442 $filters->groups_search = ['idx' => 1, 'group' => $africa];
443 $filters->groups_search = ['idx' => 2, 'group' => $pony];
444 $members = new \Galette\Repository\Members($filters);
445 $list = $members->getList();
446
447 $this->integer($list->count())->isIdenticalTo(6);
448
449 $filters->groups_search_log_op = \Galette\Filters\AdvancedMembersList::OP_AND;
450 $members = new \Galette\Repository\Members($filters);
451 $list = $members->getList();
452
453 $this->integer($list->count())->isIdenticalTo(1);
454 }
455 }