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