3 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
10 * Copyright © 2020-2023 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/>.
28 * @package GaletteTests
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
37 namespace Galette\Controllers\test\units
;
39 use PHPUnit\Framework\TestCase
;
40 use Galette\GaletteTestCase
;
41 use Slim\Psr7\Headers
;
42 use Slim\Psr7\Request
;
45 * PDF controller tests
47 * @category Controllers
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
56 class PdfController
extends GaletteTestCase
58 protected int $seed = 58144569971203;
65 public function setUp(): void
71 $this->initContributionsTypes();
73 $this->adh
= new \Galette\Entity\
Adherent($this->zdb
);
74 $this->adh
->setDependencies(
76 $this->members_fields
,
86 public function tearDown(): void
88 $this->zdb
= new \Galette\Core\
Db();
90 $delete = $this->zdb
->delete(\Galette\Entity\Contribution
::TABLE
);
91 $delete->where(['info_cotis' => 'FAKER' . $this->seed
]);
92 $this->zdb
->execute($delete);
94 $delete = $this->zdb
->delete(\Galette\Entity\Adherent
::TABLE
);
95 $delete->where(['fingerprint' => 'FAKER' . $this->seed
]);
96 $this->zdb
->execute($delete);
98 $this->cleanHistory();
102 * Cleanup after class
106 public static function tearDownAfterClass(): void
108 $self = new self(__METHOD__
);
117 public function testStoreModels()
119 $model = new \Galette\Entity\
PdfInvoice($this->zdb
, $this->preferences
);
120 $this->assertSame('_T("Invoice") {CONTRIBUTION_YEAR}-{CONTRIBUTION_ID}', $model->title
);
122 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
123 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
125 $request = new Request(
127 $ufactory->createUri('http://localhost/models/pdf'),
128 new Headers(['Content-Type' => ['application/json']]),
131 $sfactory->createStream()
133 $request = $request->withParsedBody(
136 'models_id' => \Galette\Entity\PdfModel
::INVOICE_MODEL
,
137 'model_type' => \Galette\Entity\PdfModel
::INVOICE_MODEL
,
138 'model_title' => 'DaTitle'
142 $response = new \Slim\Psr7\
Response();
143 $controller = new \Galette\Controllers\
PdfController($this->container
);
144 $this->container
->injectOn($controller);
146 $test_response = $controller->storeModels($request, $response);
149 'success_detected' => [
150 'Model has been successfully stored!'
153 $this->flash_data
['slimFlash']
156 $model = new \Galette\Entity\
PdfInvoice($this->zdb
, $this->preferences
);
157 $this->assertSame('DaTitle', $model->title
);
165 public function testMembersCards()
167 $this->getMemberOne();
169 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
170 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
172 $request = new Request(
174 $ufactory->createUri('/members/card/' . $this->adh
->id
),
175 new Headers(['Content-Type' => ['text/html']]),
178 $sfactory->createStream()
181 $response = new \Slim\Psr7\
Response();
182 $controller = new \Galette\Controllers\
PdfController($this->container
);
183 $this->container
->injectOn($controller);
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());
191 'error_detected' => [
192 'You do not have permission for requested URL.'
195 $this->flash_data
['slimFlash']
197 $this->flash_data
= [];
199 //test logged-in as superadmin
200 $this->logSuperAdmin();
201 $test_response = null;
203 $this->expectOutputRegex('/^%PDF-\d\.\d\.');
204 $test_response = $controller->membersCards($request, $response, $this->adh
->id
);
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]);
211 $test_response = $controller->membersCards($request, $response);
212 $this->assertSame(['Location' => ['/members']], $test_response->getHeaders());
213 $this->assertSame(301, $test_response->getStatusCode());
216 'error_detected' => [
217 'No member was selected, please check at least one name.'
220 $this->flash_data
['slimFlash']
222 $this->flash_data
= [];
226 * Test filtered membersCards
230 public function testFilteredMembersCards()
232 $this->getMemberOne();
234 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
235 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
237 $request = new Request(
239 $ufactory->createUri('/members/card/' . $this->adh
->id
),
240 new Headers(['Content-Type' => ['text/html']]),
243 $sfactory->createStream()
246 $response = new \Slim\Psr7\
Response();
247 $controller = new \Galette\Controllers\
PdfController($this->container
);
248 $this->container
->injectOn($controller);
250 //test logged-in as superadmin
251 $this->logSuperAdmin();
254 $filters = new \Galette\Filters\
MembersList();
255 $filters->selected
= [$this->adh
->id
];
256 $this->session
->filter_members
= $filters;
258 $this->expectOutputRegex('/^%PDF-\d.\d.');
259 $test_response = $controller->membersCards($request, $response);
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]);
272 public function testMembersLabels()
274 unset($this->session
->filter_members
);
275 $this->getMemberOne();
277 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
278 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
280 $request = new Request(
282 $ufactory->createUri('/members/labels'),
283 new Headers(['Content-Type' => ['text/html']]),
286 $sfactory->createStream()
289 $response = new \Slim\Psr7\
Response();
290 $controller = new \Galette\Controllers\
PdfController($this->container
);
291 $this->container
->injectOn($controller);
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());
299 'error_detected' => [
300 'No member was selected, please check at least one name.'
303 $this->flash_data
['slimFlash']
305 $this->flash_data
= [];
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;
313 $this->expectOutputRegex('/^%PDF-\d\.\d');
314 $test_response = $controller->membersLabels($request, $response);
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
);
321 //test logged-in as superadmin
322 $this->logSuperAdmin();
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());
330 'error_detected' => [
331 'No member was selected, please check at least one name.'
334 $this->flash_data
['slimFlash']
336 $this->flash_data
= [];
340 * Test filtered membersLabels
344 public function testFilteredMembersLabels()
346 unset($this->session
->filter_members
);
347 $this->getMemberOne();
349 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
350 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
352 $request = new Request(
354 $ufactory->createUri('/members/labels'),
355 new Headers(['Content-Type' => ['text/html']]),
358 $sfactory->createStream()
361 $response = new \Slim\Psr7\
Response();
362 $controller = new \Galette\Controllers\
PdfController($this->container
);
363 $this->container
->injectOn($controller);
365 //test logged-in as superadmin
366 $this->logSuperAdmin();
368 //test again from filters
369 $filters = new \Galette\Filters\
MembersList();
370 $filters->selected
= [$this->adh
->id
];
371 $this->session
->filter_members
= $filters;
373 $this->expectOutputRegex('/^%PDF-\d\.\d');
374 $test_response = $controller->membersCards($request, $response);
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]);
386 public function testadhesionForm()
388 unset($this->session
->filter_members
);
389 $this->getMemberOne();
391 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
392 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
394 $request = new Request(
396 $ufactory->createUri('/members/labels'),
397 new Headers(['Content-Type' => ['text/html']]),
400 $sfactory->createStream()
403 $response = new \Slim\Psr7\
Response();
404 $controller = new \Galette\Controllers\
PdfController($this->container
);
405 $this->container
->injectOn($controller);
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());
413 'error_detected' => [
414 'You do not have permission for requested URL.'
417 $this->flash_data
['slimFlash']
419 $this->flash_data
= [];
421 //test logged-in as superadmin
422 $this->logSuperAdmin();
423 $test_response = null;
425 $this->expectOutputRegex('/^%PDF-\d\.\d/');
426 $test_response = $controller->adhesionForm($request, $response, $this->adh
->id
);
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]);
434 * Test attendanceSheet
438 public function testAttendanceSheet()
440 $this->getMemberOne();
442 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
443 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
445 $request = new Request(
447 $ufactory->createUri('/attendance-sheet'),
448 new Headers(['Content-Type' => ['application/json']]),
451 $sfactory->createStream()
454 $response = new \Slim\Psr7\
Response();
455 $controller = new \Galette\Controllers\
PdfController($this->container
);
456 $this->container
->injectOn($controller);
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());
465 'error_detected' => [
466 'No member was selected, please check at least one name.'
469 $this->flash_data
['slimFlash']
471 $this->flash_data
= [];
473 //test with selection
474 $request = $request->withParsedBody(
476 'selection' => [$this->adh
->id
]
480 $test_response = null;
482 $this->expectOutputRegex('/^%PDF-\d\.\d/');
483 $test_response = $controller->attendanceSheet($request, $response);
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]);
495 public function testContribution()
497 $this->getMemberOne();
498 $this->createContribution();
500 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
501 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
503 $request = new Request(
505 $ufactory->createUri('/contribution/print/' . $this->contrib
->id
),
506 new Headers(['Content-Type' => ['application/json']]),
509 $sfactory->createStream()
512 $response = new \Slim\Psr7\
Response();
513 $controller = new \Galette\Controllers\
PdfController($this->container
);
514 $this->container
->injectOn($controller);
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());
522 'error_detected' => [
523 'Unable to load contribution #' . $this->contrib
->id
. '!'
526 $this->flash_data
['slimFlash']
528 $this->flash_data
= [];
531 $this->logSuperAdmin();
532 $test_response = null;
534 $this->expectOutputRegex('/^%PDF-\d\.\d\/');
535 $test_response = $controller->contribution($request, $response, $this->contrib
->id
);
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]);