]> git.agnieray.net Git - galette.git/blob - tests/Galette/Controllers/tests/units/PdfController.php
Properly use injection
[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 $this->container->injectOn($controller);
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 $this->container->injectOn($controller);
184
185 //test with non-logged-in user
186 $test_response = $controller->membersCards($request, $response, $this->adh->id);
187 $this->assertSame(['Location' => ['/member/me']], $test_response->getHeaders());
188 $this->assertSame(200, $test_response->getStatusCode());
189 $this->assertSame(
190 [
191 'error_detected' => [
192 'You do not have permission for requested URL.'
193 ]
194 ],
195 $this->flash_data['slimFlash']
196 );
197 $this->flash_data = [];
198
199 //test logged-in as superadmin
200 $this->logSuperAdmin();
201 $test_response = null;
202
203 $this->expectOutputRegex('/^%PDF-\d\.\d\.');
204 $test_response = $controller->membersCards($request, $response, $this->adh->id);
205
206 $this->assertSame(200, $test_response->getStatusCode());
207 $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
208 $this->assertSame('attachment;filename="cards.pdf"', $test_response->getHeader('Content-Disposition')[0]);
209
210 //test no selection
211 $test_response = $controller->membersCards($request, $response);
212 $this->assertSame(['Location' => ['/members']], $test_response->getHeaders());
213 $this->assertSame(301, $test_response->getStatusCode());
214 $this->assertSame(
215 [
216 'error_detected' => [
217 'No member was selected, please check at least one name.'
218 ]
219 ],
220 $this->flash_data['slimFlash']
221 );
222 $this->flash_data = [];
223 }
224
225 /**
226 * Test filtered membersCards
227 *
228 * @return void
229 */
230 public function testFilteredMembersCards()
231 {
232 $this->getMemberOne();
233
234 $ufactory = new \Slim\Psr7\Factory\UriFactory();
235 $sfactory = new \Slim\Psr7\Factory\StreamFactory();
236
237 $request = new Request(
238 'POST',
239 $ufactory->createUri('/members/card/' . $this->adh->id),
240 new Headers(['Content-Type' => ['text/html']]),
241 [],
242 [],
243 $sfactory->createStream()
244 );
245
246 $response = new \Slim\Psr7\Response();
247 $controller = new \Galette\Controllers\PdfController($this->container);
248 $this->container->injectOn($controller);
249
250 //test logged-in as superadmin
251 $this->logSuperAdmin();
252
253 //test with filters
254 $filters = new \Galette\Filters\MembersList();
255 $filters->selected = [$this->adh->id];
256 $this->session->filter_members = $filters;
257
258 $this->expectOutputRegex('/^%PDF-\d.\d.');
259 $test_response = $controller->membersCards($request, $response);
260
261 unset($this->session->filter_members);
262 $this->assertSame(200, $test_response->getStatusCode());
263 $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
264 $this->assertSame('attachment;filename="cards.pdf"', $test_response->getHeader('Content-Disposition')[0]);
265 }
266
267 /**
268 * Test membersLabels
269 *
270 * @return void
271 */
272 public function testMembersLabels()
273 {
274 unset($this->session->filter_members);
275 $this->getMemberOne();
276
277 $ufactory = new \Slim\Psr7\Factory\UriFactory();
278 $sfactory = new \Slim\Psr7\Factory\StreamFactory();
279
280 $request = new Request(
281 'POST',
282 $ufactory->createUri('/members/labels'),
283 new Headers(['Content-Type' => ['text/html']]),
284 [],
285 [],
286 $sfactory->createStream()
287 );
288
289 $response = new \Slim\Psr7\Response();
290 $controller = new \Galette\Controllers\PdfController($this->container);
291 $this->container->injectOn($controller);
292
293 //test with non-logged-in user
294 $test_response = $controller->membersLabels($request, $response, $this->adh->id);
295 $this->assertSame(['Location' => ['/members']], $test_response->getHeaders());
296 $this->assertSame(301, $test_response->getStatusCode());
297 $this->assertSame(
298 [
299 'error_detected' => [
300 'No member was selected, please check at least one name.'
301 ]
302 ],
303 $this->flash_data['slimFlash']
304 );
305 $this->flash_data = [];
306
307 //test again from filters
308 $test_response = null;
309 $filters = new \Galette\Filters\MembersList();
310 $filters->selected = [$this->adh->id];
311 $this->session->filter_members = $filters;
312
313 $this->expectOutputRegex('/^%PDF-\d\.\d');
314 $test_response = $controller->membersLabels($request, $response);
315
316 $this->assertSame(200, $test_response->getStatusCode());
317 $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
318 $this->assertSame('attachment;filename="labels_print_filename.pdf"', $test_response->getHeader('Content-Disposition')[0]);
319 unset($this->session->filter_members);
320
321 //test logged-in as superadmin
322 $this->logSuperAdmin();
323 //test no selection
324 $test_response = null;
325 $test_response = $controller->membersCards($request, $response);
326 $this->assertSame(['Location' => ['/members']], $test_response->getHeaders());
327 $this->assertSame(301, $test_response->getStatusCode());
328 $this->assertSame(
329 [
330 'error_detected' => [
331 'No member was selected, please check at least one name.'
332 ]
333 ],
334 $this->flash_data['slimFlash']
335 );
336 $this->flash_data = [];
337 }
338
339 /**
340 * Test filtered membersLabels
341 *
342 * @return void
343 */
344 public function testFilteredMembersLabels()
345 {
346 unset($this->session->filter_members);
347 $this->getMemberOne();
348
349 $ufactory = new \Slim\Psr7\Factory\UriFactory();
350 $sfactory = new \Slim\Psr7\Factory\StreamFactory();
351
352 $request = new Request(
353 'POST',
354 $ufactory->createUri('/members/labels'),
355 new Headers(['Content-Type' => ['text/html']]),
356 [],
357 [],
358 $sfactory->createStream()
359 );
360
361 $response = new \Slim\Psr7\Response();
362 $controller = new \Galette\Controllers\PdfController($this->container);
363 $this->container->injectOn($controller);
364
365 //test logged-in as superadmin
366 $this->logSuperAdmin();
367
368 //test again from filters
369 $filters = new \Galette\Filters\MembersList();
370 $filters->selected = [$this->adh->id];
371 $this->session->filter_members = $filters;
372
373 $this->expectOutputRegex('/^%PDF-\d\.\d');
374 $test_response = $controller->membersCards($request, $response);
375
376 $this->assertSame(200, $test_response->getStatusCode());
377 $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
378 $this->assertSame('attachment;filename="cards.pdf"', $test_response->getHeader('Content-Disposition')[0]);
379 }
380
381 /**
382 * Test adhesionForm
383 *
384 * @return void
385 */
386 public function testadhesionForm()
387 {
388 unset($this->session->filter_members);
389 $this->getMemberOne();
390
391 $ufactory = new \Slim\Psr7\Factory\UriFactory();
392 $sfactory = new \Slim\Psr7\Factory\StreamFactory();
393
394 $request = new Request(
395 'POST',
396 $ufactory->createUri('/members/labels'),
397 new Headers(['Content-Type' => ['text/html']]),
398 [],
399 [],
400 $sfactory->createStream()
401 );
402
403 $response = new \Slim\Psr7\Response();
404 $controller = new \Galette\Controllers\PdfController($this->container);
405 $this->container->injectOn($controller);
406
407 //test with non-logged-in user
408 $test_response = $controller->adhesionForm($request, $response, $this->adh->id);
409 $this->assertSame(['Location' => ['/member/me']], $test_response->getHeaders());
410 $this->assertSame(200, $test_response->getStatusCode());
411 $this->assertSame(
412 [
413 'error_detected' => [
414 'You do not have permission for requested URL.'
415 ]
416 ],
417 $this->flash_data['slimFlash']
418 );
419 $this->flash_data = [];
420
421 //test logged-in as superadmin
422 $this->logSuperAdmin();
423 $test_response = null;
424
425 $this->expectOutputRegex('/^%PDF-\d\.\d/');
426 $test_response = $controller->adhesionForm($request, $response, $this->adh->id);
427
428 $this->assertSame(200, $test_response->getStatusCode());
429 $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
430 $this->assertSame('attachment;filename="adherent_form.' . $this->adh->id . '.pdf"', $test_response->getHeader('Content-Disposition')[0]);
431 }
432
433 /**
434 * Test attendanceSheet
435 *
436 * @return void
437 */
438 public function testAttendanceSheet()
439 {
440 $this->getMemberOne();
441
442 $ufactory = new \Slim\Psr7\Factory\UriFactory();
443 $sfactory = new \Slim\Psr7\Factory\StreamFactory();
444
445 $request = new Request(
446 'POST',
447 $ufactory->createUri('/attendance-sheet'),
448 new Headers(['Content-Type' => ['application/json']]),
449 [],
450 [],
451 $sfactory->createStream()
452 );
453
454 $response = new \Slim\Psr7\Response();
455 $controller = new \Galette\Controllers\PdfController($this->container);
456 $this->container->injectOn($controller);
457
458 //test no selection
459 $test_response = null;
460 $test_response = $controller->membersCards($request, $response);
461 $this->assertSame(['Location' => ['/members']], $test_response->getHeaders());
462 $this->assertSame(301, $test_response->getStatusCode());
463 $this->assertSame(
464 [
465 'error_detected' => [
466 'No member was selected, please check at least one name.'
467 ]
468 ],
469 $this->flash_data['slimFlash']
470 );
471 $this->flash_data = [];
472
473 //test with selection
474 $request = $request->withParsedBody(
475 [
476 'selection' => [$this->adh->id]
477 ]
478 );
479
480 $test_response = null;
481
482 $this->expectOutputRegex('/^%PDF-\d\.\d/');
483 $test_response = $controller->attendanceSheet($request, $response);
484
485 $this->assertSame(200, $test_response->getStatusCode());
486 $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
487 $this->assertSame('attachment;filename="attendance_sheet.pdf"', $test_response->getHeader('Content-Disposition')[0]);
488 }
489
490 /**
491 * Test contribution
492 *
493 * @return void
494 */
495 public function testContribution()
496 {
497 $this->getMemberOne();
498 $this->createContribution();
499
500 $ufactory = new \Slim\Psr7\Factory\UriFactory();
501 $sfactory = new \Slim\Psr7\Factory\StreamFactory();
502
503 $request = new Request(
504 'POST',
505 $ufactory->createUri('/contribution/print/' . $this->contrib->id),
506 new Headers(['Content-Type' => ['application/json']]),
507 [],
508 [],
509 $sfactory->createStream()
510 );
511
512 $response = new \Slim\Psr7\Response();
513 $controller = new \Galette\Controllers\PdfController($this->container);
514 $this->container->injectOn($controller);
515
516 //test not logged
517 $test_response = $controller->contribution($request, $response, $this->contrib->id);
518 $this->assertSame(['Location' => ['/contributions']], $test_response->getHeaders());
519 $this->assertSame(301, $test_response->getStatusCode());
520 $this->assertSame(
521 [
522 'error_detected' => [
523 'Unable to load contribution #' . $this->contrib->id . '!'
524 ]
525 ],
526 $this->flash_data['slimFlash']
527 );
528 $this->flash_data = [];
529
530 //test superadmin
531 $this->logSuperAdmin();
532 $test_response = null;
533
534 $this->expectOutputRegex('/^%PDF-\d\.\d\/');
535 $test_response = $controller->contribution($request, $response, $this->contrib->id);
536
537 $this->assertSame(200, $test_response->getStatusCode());
538 $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
539 $this->assertSame('attachment;filename="contribution_' . $this->contrib->id . '_invoice.pdf"', $test_response->getHeader('Content-Disposition')[0]);
540 }
541 }