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
34 * @link http://galette.tuxfamily.org
38 namespace Galette\Controllers\test\units
;
40 use PHPUnit\Framework\TestCase
;
41 use Galette\GaletteTestCase
;
42 use Slim\Psr7\Headers
;
43 use Slim\Psr7\Request
;
46 * PDF controller tests
48 * @category Controllers
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
57 class PdfController
extends GaletteTestCase
59 protected int $seed = 58144569971203;
66 public function setUp(): void
72 $this->initContributionsTypes();
74 $this->adh
= new \Galette\Entity\
Adherent($this->zdb
);
75 $this->adh
->setDependencies(
77 $this->members_fields
,
87 public function tearDown(): void
89 $this->zdb
= new \Galette\Core\
Db();
91 $delete = $this->zdb
->delete(\Galette\Entity\Contribution
::TABLE
);
92 $delete->where(['info_cotis' => 'FAKER' . $this->seed
]);
93 $this->zdb
->execute($delete);
95 $delete = $this->zdb
->delete(\Galette\Entity\Adherent
::TABLE
);
96 $delete->where(['fingerprint' => 'FAKER' . $this->seed
]);
97 $this->zdb
->execute($delete);
99 $this->cleanHistory();
103 * Cleanup after class
107 public static function tearDownAfterClass(): void
109 $self = new self(__METHOD__
);
118 public function testStoreModels()
120 $model = new \Galette\Entity\
PdfInvoice($this->zdb
, $this->preferences
);
121 $this->assertSame('_T("Invoice") {CONTRIBUTION_YEAR}-{CONTRIBUTION_ID}', $model->title
);
123 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
124 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
126 $request = new Request(
128 $ufactory->createUri('http://localhost/models/pdf'),
129 new Headers(['Content-Type' => ['application/json']]),
132 $sfactory->createStream()
134 $request = $request->withParsedBody(
137 'models_id' => \Galette\Entity\PdfModel
::INVOICE_MODEL
,
138 'model_type' => \Galette\Entity\PdfModel
::INVOICE_MODEL
,
139 'model_title' => 'DaTitle'
143 $response = new \Slim\Psr7\
Response();
144 $controller = new \Galette\Controllers\
PdfController($this->container
);
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
);
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());
190 'error_detected' => [
191 'You do not have permission for requested URL.'
194 $this->flash_data
['slimFlash']
196 $this->flash_data
= [];
198 //test logged-in as superadmin
199 $this->logSuperAdmin();
200 $test_response = null;
202 $this->expectOutputRegex('/^%PDF-\d\.\d\.');
203 $test_response = $controller->membersCards($request, $response, $this->adh
->id
);
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]);
210 $test_response = $controller->membersCards($request, $response);
211 $this->assertSame(['Location' => ['/members']], $test_response->getHeaders());
212 $this->assertSame(301, $test_response->getStatusCode());
215 'error_detected' => [
216 'No member was selected, please check at least one name.'
219 $this->flash_data
['slimFlash']
221 $this->flash_data
= [];
225 * Test filtered membersCards
229 public function testFilteredMembersCards()
231 $this->getMemberOne();
233 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
234 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
236 $request = new Request(
238 $ufactory->createUri('/members/card/' . $this->adh
->id
),
239 new Headers(['Content-Type' => ['text/html']]),
242 $sfactory->createStream()
245 $response = new \Slim\Psr7\
Response();
246 $controller = new \Galette\Controllers\
PdfController($this->container
);
248 //test logged-in as superadmin
249 $this->logSuperAdmin();
252 $filters = new \Galette\Filters\
MembersList();
253 $filters->selected
= [$this->adh
->id
];
254 $this->session
->filter_members
= $filters;
256 $this->expectOutputRegex('/^%PDF-\d.\d.');
257 $test_response = $controller->membersCards($request, $response);
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]);
270 public function testMembersLabels()
272 unset($this->session
->filter_members
);
273 $this->getMemberOne();
275 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
276 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
278 $request = new Request(
280 $ufactory->createUri('/members/labels'),
281 new Headers(['Content-Type' => ['text/html']]),
284 $sfactory->createStream()
287 $response = new \Slim\Psr7\
Response();
288 $controller = new \Galette\Controllers\
PdfController($this->container
);
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());
296 'error_detected' => [
297 'No member was selected, please check at least one name.'
300 $this->flash_data
['slimFlash']
302 $this->flash_data
= [];
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;
310 $this->expectOutputRegex('/^%PDF-\d\.\d');
311 $test_response = $controller->membersLabels($request, $response);
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
);
318 //test logged-in as superadmin
319 $this->logSuperAdmin();
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());
327 'error_detected' => [
328 'No member was selected, please check at least one name.'
331 $this->flash_data
['slimFlash']
333 $this->flash_data
= [];
337 * Test filtered membersLabels
341 public function testFilteredMembersLabels()
343 unset($this->session
->filter_members
);
344 $this->getMemberOne();
346 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
347 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
349 $request = new Request(
351 $ufactory->createUri('/members/labels'),
352 new Headers(['Content-Type' => ['text/html']]),
355 $sfactory->createStream()
358 $response = new \Slim\Psr7\
Response();
359 $controller = new \Galette\Controllers\
PdfController($this->container
);
361 //test logged-in as superadmin
362 $this->logSuperAdmin();
364 //test again from filters
365 $filters = new \Galette\Filters\
MembersList();
366 $filters->selected
= [$this->adh
->id
];
367 $this->session
->filter_members
= $filters;
369 $this->expectOutputRegex('/^%PDF-\d\.\d');
370 $test_response = $controller->membersCards($request, $response);
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]);
382 public function testadhesionForm()
384 unset($this->session
->filter_members
);
385 $this->getMemberOne();
387 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
388 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
390 $request = new Request(
392 $ufactory->createUri('/members/labels'),
393 new Headers(['Content-Type' => ['text/html']]),
396 $sfactory->createStream()
399 $response = new \Slim\Psr7\
Response();
400 $controller = new \Galette\Controllers\
PdfController($this->container
);
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());
408 'error_detected' => [
409 'You do not have permission for requested URL.'
412 $this->flash_data
['slimFlash']
414 $this->flash_data
= [];
416 //test logged-in as superadmin
417 $this->logSuperAdmin();
418 $test_response = null;
420 $this->expectOutputRegex('/^%PDF-\d\.\d/');
421 $test_response = $controller->adhesionForm($request, $response, $this->adh
->id
);
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]);
429 * Test attendanceSheet
433 public function testAttendanceSheet()
435 $this->getMemberOne();
437 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
438 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
440 $request = new Request(
442 $ufactory->createUri('/attendance-sheet'),
443 new Headers(['Content-Type' => ['application/json']]),
446 $sfactory->createStream()
449 $response = new \Slim\Psr7\
Response();
450 $controller = new \Galette\Controllers\
PdfController($this->container
);
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());
459 'error_detected' => [
460 'No member was selected, please check at least one name.'
463 $this->flash_data
['slimFlash']
465 $this->flash_data
= [];
467 //test with selection
468 $request = $request->withParsedBody(
470 'selection' => [$this->adh
->id
]
474 $test_response = null;
476 $this->expectOutputRegex('/^%PDF-\d\.\d/');
477 $test_response = $controller->attendanceSheet($request, $response);
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]);
489 public function testContribution()
491 $this->getMemberOne();
492 $this->createContribution();
494 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
495 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
497 $request = new Request(
499 $ufactory->createUri('/contribution/print/' . $this->contrib
->id
),
500 new Headers(['Content-Type' => ['application/json']]),
503 $sfactory->createStream()
506 $response = new \Slim\Psr7\
Response();
507 $controller = new \Galette\Controllers\
PdfController($this->container
);
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());
515 'error_detected' => [
516 'Unable to load contribution #' . $this->contrib
->id
. '!'
519 $this->flash_data
['slimFlash']
521 $this->flash_data
= [];
524 $this->logSuperAdmin();
525 $test_response = null;
527 $this->expectOutputRegex('/^%PDF-\d\.\d\/');
528 $test_response = $controller->contribution($request, $response, $this->contrib
->id
);
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]);