]> git.agnieray.net Git - galette.git/blob - tests/Galette/Controllers/tests/units/PdfController.php
Migrate to phpunit; closes #1674
[galette.git] / tests / Galette / Controllers / tests / units / PdfController.php
1 <?php
2
3 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
4
5 /**
6 * PDF model tests
7 *
8 * PHP version 5
9 *
10 * Copyright © 2020-2023 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 Entity
28 * @package GaletteTests
29 *
30 * @author Johan Cwiklinski <johan@x-tnd.be>
31 * @copyright 2020-2023 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 2020-11-21
36 */
37
38 namespace Galette\Controllers\test\units;
39
40 use PHPUnit\Framework\TestCase;
41 use Galette\GaletteTestCase;
42 use Slim\Psr7\Headers;
43 use Slim\Psr7\Request;
44
45 /**
46 * PDF controller tests
47 *
48 * @category Controllers
49 * @name PdfController
50 * @package GaletteTests
51 * @author Johan Cwiklinski <johan@x-tnd.be>
52 * @copyright 2020-2023 The Galette Team
53 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
54 * @link http://galette.tuxfamily.org
55 * @since 2020-12-06
56 */
57 class PdfController extends GaletteTestCase
58 {
59 protected int $seed = 58144569971203;
60
61 /**
62 * Set up tests
63 *
64 * @return void
65 */
66 public function setUp(): void
67 {
68 parent::setUp();
69
70 $this->initModels();
71 $this->initStatus();
72 $this->initContributionsTypes();
73
74 $this->adh = new \Galette\Entity\Adherent($this->zdb);
75 $this->adh->setDependencies(
76 $this->preferences,
77 $this->members_fields,
78 $this->history
79 );
80 }
81
82 /**
83 * Cleanup after tests
84 *
85 * @return void
86 */
87 public function tearDown(): void
88 {
89 $this->zdb = new \Galette\Core\Db();
90
91 $delete = $this->zdb->delete(\Galette\Entity\Contribution::TABLE);
92 $delete->where(['info_cotis' => 'FAKER' . $this->seed]);
93 $this->zdb->execute($delete);
94
95 $delete = $this->zdb->delete(\Galette\Entity\Adherent::TABLE);
96 $delete->where(['fingerprint' => 'FAKER' . $this->seed]);
97 $this->zdb->execute($delete);
98
99 $this->cleanHistory();
100 }
101
102 /**
103 * Cleanup after class
104 *
105 * @return void
106 */
107 public static function tearDownAfterClass(): void
108 {
109 $self = new self(__METHOD__);
110 $self->tearDown();
111 }
112
113 /**
114 * Test store models
115 *
116 * @return void
117 */
118 public function testStoreModels()
119 {
120 $model = new \Galette\Entity\PdfInvoice($this->zdb, $this->preferences);
121 $this->assertSame('_T("Invoice") {CONTRIBUTION_YEAR}-{CONTRIBUTION_ID}', $model->title);
122
123 $ufactory = new \Slim\Psr7\Factory\UriFactory();
124 $sfactory = new \Slim\Psr7\Factory\StreamFactory();
125
126 $request = new Request(
127 'POST',
128 $ufactory->createUri('http://localhost/models/pdf'),
129 new Headers(['Content-Type' => ['application/json']]),
130 [],
131 [],
132 $sfactory->createStream()
133 );
134 $request = $request->withParsedBody(
135 [
136 'store' => true,
137 'models_id' => \Galette\Entity\PdfModel::INVOICE_MODEL,
138 'model_type' => \Galette\Entity\PdfModel::INVOICE_MODEL,
139 'model_title' => 'DaTitle'
140 ]
141 );
142
143 $response = new \Slim\Psr7\Response();
144 $controller = new \Galette\Controllers\PdfController($this->container);
145
146 $test_response = $controller->storeModels($request, $response);
147 $this->assertSame(
148 [
149 'success_detected' => [
150 'Model has been successfully stored!'
151 ]
152 ],
153 $this->flash_data['slimFlash']
154 );
155
156 $model = new \Galette\Entity\PdfInvoice($this->zdb, $this->preferences);
157 $this->assertSame('DaTitle', $model->title);
158 }
159
160 /**
161 * Test membersCards
162 *
163 * @return void
164 */
165 public function testMembersCards()
166 {
167 $this->getMemberOne();
168
169 $ufactory = new \Slim\Psr7\Factory\UriFactory();
170 $sfactory = new \Slim\Psr7\Factory\StreamFactory();
171
172 $request = new Request(
173 'POST',
174 $ufactory->createUri('/members/card/' . $this->adh->id),
175 new Headers(['Content-Type' => ['text/html']]),
176 [],
177 [],
178 $sfactory->createStream()
179 );
180
181 $response = new \Slim\Psr7\Response();
182 $controller = new \Galette\Controllers\PdfController($this->container);
183
184 //test with non-logged-in user
185 $test_response = $controller->membersCards($request, $response, $this->adh->id);
186 $this->assertSame(['Location' => ['/member/me']], $test_response->getHeaders());
187 $this->assertSame(200, $test_response->getStatusCode());
188 $this->assertSame(
189 [
190 'error_detected' => [
191 'You do not have permission for requested URL.'
192 ]
193 ],
194 $this->flash_data['slimFlash']
195 );
196 $this->flash_data = [];
197
198 //test logged-in as superadmin
199 $this->logSuperAdmin();
200 $test_response = null;
201
202 $this->expectOutputRegex('/^%PDF-\d\.\d\.');
203 $test_response = $controller->membersCards($request, $response, $this->adh->id);
204
205 $this->assertSame(200, $test_response->getStatusCode());
206 $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
207 $this->assertSame('attachment;filename="cards.pdf"', $test_response->getHeader('Content-Disposition')[0]);
208
209 //test no selection
210 $test_response = $controller->membersCards($request, $response);
211 $this->assertSame(['Location' => ['/members']], $test_response->getHeaders());
212 $this->assertSame(301, $test_response->getStatusCode());
213 $this->assertSame(
214 [
215 'error_detected' => [
216 'No member was selected, please check at least one name.'
217 ]
218 ],
219 $this->flash_data['slimFlash']
220 );
221 $this->flash_data = [];
222 }
223
224 /**
225 * Test filtered membersCards
226 *
227 * @return void
228 */
229 public function testFilteredMembersCards()
230 {
231 $this->getMemberOne();
232
233 $ufactory = new \Slim\Psr7\Factory\UriFactory();
234 $sfactory = new \Slim\Psr7\Factory\StreamFactory();
235
236 $request = new Request(
237 'POST',
238 $ufactory->createUri('/members/card/' . $this->adh->id),
239 new Headers(['Content-Type' => ['text/html']]),
240 [],
241 [],
242 $sfactory->createStream()
243 );
244
245 $response = new \Slim\Psr7\Response();
246 $controller = new \Galette\Controllers\PdfController($this->container);
247
248 //test logged-in as superadmin
249 $this->logSuperAdmin();
250
251 //test with filters
252 $filters = new \Galette\Filters\MembersList();
253 $filters->selected = [$this->adh->id];
254 $this->session->filter_members = $filters;
255
256 $this->expectOutputRegex('/^%PDF-\d.\d.');
257 $test_response = $controller->membersCards($request, $response);
258
259 unset($this->session->filter_members);
260 $this->assertSame(200, $test_response->getStatusCode());
261 $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
262 $this->assertSame('attachment;filename="cards.pdf"', $test_response->getHeader('Content-Disposition')[0]);
263 }
264
265 /**
266 * Test membersLabels
267 *
268 * @return void
269 */
270 public function testMembersLabels()
271 {
272 unset($this->session->filter_members);
273 $this->getMemberOne();
274
275 $ufactory = new \Slim\Psr7\Factory\UriFactory();
276 $sfactory = new \Slim\Psr7\Factory\StreamFactory();
277
278 $request = new Request(
279 'POST',
280 $ufactory->createUri('/members/labels'),
281 new Headers(['Content-Type' => ['text/html']]),
282 [],
283 [],
284 $sfactory->createStream()
285 );
286
287 $response = new \Slim\Psr7\Response();
288 $controller = new \Galette\Controllers\PdfController($this->container);
289
290 //test with non-logged-in user
291 $test_response = $controller->membersLabels($request, $response, $this->adh->id);
292 $this->assertSame(['Location' => ['/members']], $test_response->getHeaders());
293 $this->assertSame(301, $test_response->getStatusCode());
294 $this->assertSame(
295 [
296 'error_detected' => [
297 'No member was selected, please check at least one name.'
298 ]
299 ],
300 $this->flash_data['slimFlash']
301 );
302 $this->flash_data = [];
303
304 //test again from filters
305 $test_response = null;
306 $filters = new \Galette\Filters\MembersList();
307 $filters->selected = [$this->adh->id];
308 $this->session->filter_members = $filters;
309
310 $this->expectOutputRegex('/^%PDF-\d\.\d');
311 $test_response = $controller->membersLabels($request, $response);
312
313 $this->assertSame(200, $test_response->getStatusCode());
314 $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
315 $this->assertSame('attachment;filename="labels_print_filename.pdf"', $test_response->getHeader('Content-Disposition')[0]);
316 unset($this->session->filter_members);
317
318 //test logged-in as superadmin
319 $this->logSuperAdmin();
320 //test no selection
321 $test_response = null;
322 $test_response = $controller->membersCards($request, $response);
323 $this->assertSame(['Location' => ['/members']], $test_response->getHeaders());
324 $this->assertSame(301, $test_response->getStatusCode());
325 $this->assertSame(
326 [
327 'error_detected' => [
328 'No member was selected, please check at least one name.'
329 ]
330 ],
331 $this->flash_data['slimFlash']
332 );
333 $this->flash_data = [];
334 }
335
336 /**
337 * Test filtered membersLabels
338 *
339 * @return void
340 */
341 public function testFilteredMembersLabels()
342 {
343 unset($this->session->filter_members);
344 $this->getMemberOne();
345
346 $ufactory = new \Slim\Psr7\Factory\UriFactory();
347 $sfactory = new \Slim\Psr7\Factory\StreamFactory();
348
349 $request = new Request(
350 'POST',
351 $ufactory->createUri('/members/labels'),
352 new Headers(['Content-Type' => ['text/html']]),
353 [],
354 [],
355 $sfactory->createStream()
356 );
357
358 $response = new \Slim\Psr7\Response();
359 $controller = new \Galette\Controllers\PdfController($this->container);
360
361 //test logged-in as superadmin
362 $this->logSuperAdmin();
363
364 //test again from filters
365 $filters = new \Galette\Filters\MembersList();
366 $filters->selected = [$this->adh->id];
367 $this->session->filter_members = $filters;
368
369 $this->expectOutputRegex('/^%PDF-\d\.\d');
370 $test_response = $controller->membersCards($request, $response);
371
372 $this->assertSame(200, $test_response->getStatusCode());
373 $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
374 $this->assertSame('attachment;filename="cards.pdf"', $test_response->getHeader('Content-Disposition')[0]);
375 }
376
377 /**
378 * Test adhesionForm
379 *
380 * @return void
381 */
382 public function testadhesionForm()
383 {
384 unset($this->session->filter_members);
385 $this->getMemberOne();
386
387 $ufactory = new \Slim\Psr7\Factory\UriFactory();
388 $sfactory = new \Slim\Psr7\Factory\StreamFactory();
389
390 $request = new Request(
391 'POST',
392 $ufactory->createUri('/members/labels'),
393 new Headers(['Content-Type' => ['text/html']]),
394 [],
395 [],
396 $sfactory->createStream()
397 );
398
399 $response = new \Slim\Psr7\Response();
400 $controller = new \Galette\Controllers\PdfController($this->container);
401
402 //test with non-logged-in user
403 $test_response = $controller->adhesionForm($request, $response, $this->adh->id);
404 $this->assertSame(['Location' => ['/member/me']], $test_response->getHeaders());
405 $this->assertSame(200, $test_response->getStatusCode());
406 $this->assertSame(
407 [
408 'error_detected' => [
409 'You do not have permission for requested URL.'
410 ]
411 ],
412 $this->flash_data['slimFlash']
413 );
414 $this->flash_data = [];
415
416 //test logged-in as superadmin
417 $this->logSuperAdmin();
418 $test_response = null;
419
420 $this->expectOutputRegex('/^%PDF-\d\.\d/');
421 $test_response = $controller->adhesionForm($request, $response, $this->adh->id);
422
423 $this->assertSame(200, $test_response->getStatusCode());
424 $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
425 $this->assertSame('attachment;filename="adherent_form.' . $this->adh->id . '.pdf"', $test_response->getHeader('Content-Disposition')[0]);
426 }
427
428 /**
429 * Test attendanceSheet
430 *
431 * @return void
432 */
433 public function testAttendanceSheet()
434 {
435 $this->getMemberOne();
436
437 $ufactory = new \Slim\Psr7\Factory\UriFactory();
438 $sfactory = new \Slim\Psr7\Factory\StreamFactory();
439
440 $request = new Request(
441 'POST',
442 $ufactory->createUri('/attendance-sheet'),
443 new Headers(['Content-Type' => ['application/json']]),
444 [],
445 [],
446 $sfactory->createStream()
447 );
448
449 $response = new \Slim\Psr7\Response();
450 $controller = new \Galette\Controllers\PdfController($this->container);
451
452 //test no selection
453 $test_response = null;
454 $test_response = $controller->membersCards($request, $response);
455 $this->assertSame(['Location' => ['/members']], $test_response->getHeaders());
456 $this->assertSame(301, $test_response->getStatusCode());
457 $this->assertSame(
458 [
459 'error_detected' => [
460 'No member was selected, please check at least one name.'
461 ]
462 ],
463 $this->flash_data['slimFlash']
464 );
465 $this->flash_data = [];
466
467 //test with selection
468 $request = $request->withParsedBody(
469 [
470 'selection' => [$this->adh->id]
471 ]
472 );
473
474 $test_response = null;
475
476 $this->expectOutputRegex('/^%PDF-\d\.\d/');
477 $test_response = $controller->attendanceSheet($request, $response);
478
479 $this->assertSame(200, $test_response->getStatusCode());
480 $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
481 $this->assertSame('attachment;filename="attendance_sheet.pdf"', $test_response->getHeader('Content-Disposition')[0]);
482 }
483
484 /**
485 * Test contribution
486 *
487 * @return void
488 */
489 public function testContribution()
490 {
491 $this->getMemberOne();
492 $this->createContribution();
493
494 $ufactory = new \Slim\Psr7\Factory\UriFactory();
495 $sfactory = new \Slim\Psr7\Factory\StreamFactory();
496
497 $request = new Request(
498 'POST',
499 $ufactory->createUri('/contribution/print/' . $this->contrib->id),
500 new Headers(['Content-Type' => ['application/json']]),
501 [],
502 [],
503 $sfactory->createStream()
504 );
505
506 $response = new \Slim\Psr7\Response();
507 $controller = new \Galette\Controllers\PdfController($this->container);
508
509 //test not logged
510 $test_response = $controller->contribution($request, $response, $this->contrib->id);
511 $this->assertSame(['Location' => ['/contributions']], $test_response->getHeaders());
512 $this->assertSame(301, $test_response->getStatusCode());
513 $this->assertSame(
514 [
515 'error_detected' => [
516 'Unable to load contribution #' . $this->contrib->id . '!'
517 ]
518 ],
519 $this->flash_data['slimFlash']
520 );
521 $this->flash_data = [];
522
523 //test superadmin
524 $this->logSuperAdmin();
525 $test_response = null;
526
527 $this->expectOutputRegex('/^%PDF-\d\.\d\/');
528 $test_response = $controller->contribution($request, $response, $this->contrib->id);
529
530 $this->assertSame(200, $test_response->getStatusCode());
531 $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
532 $this->assertSame('attachment;filename="contribution_' . $this->contrib->id . '_invoice.pdf"', $test_response->getHeader('Content-Disposition')[0]);
533 }
534 }