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
);
145 $test_response = $controller->storeModels($request, $response);
148 'success_detected' => [
149 'Model has been successfully stored!'
152 $this->flash_data
['slimFlash']
155 $model = new \Galette\Entity\
PdfInvoice($this->zdb
, $this->preferences
);
156 $this->assertSame('DaTitle', $model->title
);
164 public function testMembersCards()
166 $this->getMemberOne();
168 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
169 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
171 $request = new Request(
173 $ufactory->createUri('/members/card/' . $this->adh
->id
),
174 new Headers(['Content-Type' => ['text/html']]),
177 $sfactory->createStream()
180 $response = new \Slim\Psr7\
Response();
181 $controller = new \Galette\Controllers\
PdfController($this->container
);
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());
189 'error_detected' => [
190 'You do not have permission for requested URL.'
193 $this->flash_data
['slimFlash']
195 $this->flash_data
= [];
197 //test logged-in as superadmin
198 $this->logSuperAdmin();
199 $test_response = null;
201 $this->expectOutputRegex('/^%PDF-\d\.\d\.');
202 $test_response = $controller->membersCards($request, $response, $this->adh
->id
);
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]);
209 $test_response = $controller->membersCards($request, $response);
210 $this->assertSame(['Location' => ['/members']], $test_response->getHeaders());
211 $this->assertSame(301, $test_response->getStatusCode());
214 'error_detected' => [
215 'No member was selected, please check at least one name.'
218 $this->flash_data
['slimFlash']
220 $this->flash_data
= [];
224 * Test filtered membersCards
228 public function testFilteredMembersCards()
230 $this->getMemberOne();
232 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
233 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
235 $request = new Request(
237 $ufactory->createUri('/members/card/' . $this->adh
->id
),
238 new Headers(['Content-Type' => ['text/html']]),
241 $sfactory->createStream()
244 $response = new \Slim\Psr7\
Response();
245 $controller = new \Galette\Controllers\
PdfController($this->container
);
247 //test logged-in as superadmin
248 $this->logSuperAdmin();
251 $filters = new \Galette\Filters\
MembersList();
252 $filters->selected
= [$this->adh
->id
];
253 $this->session
->filter_members
= $filters;
255 $this->expectOutputRegex('/^%PDF-\d.\d.');
256 $test_response = $controller->membersCards($request, $response);
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]);
269 public function testMembersLabels()
271 unset($this->session
->filter_members
);
272 $this->getMemberOne();
274 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
275 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
277 $request = new Request(
279 $ufactory->createUri('/members/labels'),
280 new Headers(['Content-Type' => ['text/html']]),
283 $sfactory->createStream()
286 $response = new \Slim\Psr7\
Response();
287 $controller = new \Galette\Controllers\
PdfController($this->container
);
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());
295 'error_detected' => [
296 'No member was selected, please check at least one name.'
299 $this->flash_data
['slimFlash']
301 $this->flash_data
= [];
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;
309 $this->expectOutputRegex('/^%PDF-\d\.\d');
310 $test_response = $controller->membersLabels($request, $response);
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
);
317 //test logged-in as superadmin
318 $this->logSuperAdmin();
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());
326 'error_detected' => [
327 'No member was selected, please check at least one name.'
330 $this->flash_data
['slimFlash']
332 $this->flash_data
= [];
336 * Test filtered membersLabels
340 public function testFilteredMembersLabels()
342 unset($this->session
->filter_members
);
343 $this->getMemberOne();
345 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
346 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
348 $request = new Request(
350 $ufactory->createUri('/members/labels'),
351 new Headers(['Content-Type' => ['text/html']]),
354 $sfactory->createStream()
357 $response = new \Slim\Psr7\
Response();
358 $controller = new \Galette\Controllers\
PdfController($this->container
);
360 //test logged-in as superadmin
361 $this->logSuperAdmin();
363 //test again from filters
364 $filters = new \Galette\Filters\
MembersList();
365 $filters->selected
= [$this->adh
->id
];
366 $this->session
->filter_members
= $filters;
368 $this->expectOutputRegex('/^%PDF-\d\.\d');
369 $test_response = $controller->membersCards($request, $response);
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]);
381 public function testadhesionForm()
383 unset($this->session
->filter_members
);
384 $this->getMemberOne();
386 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
387 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
389 $request = new Request(
391 $ufactory->createUri('/members/labels'),
392 new Headers(['Content-Type' => ['text/html']]),
395 $sfactory->createStream()
398 $response = new \Slim\Psr7\
Response();
399 $controller = new \Galette\Controllers\
PdfController($this->container
);
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());
407 'error_detected' => [
408 'You do not have permission for requested URL.'
411 $this->flash_data
['slimFlash']
413 $this->flash_data
= [];
415 //test logged-in as superadmin
416 $this->logSuperAdmin();
417 $test_response = null;
419 $this->expectOutputRegex('/^%PDF-\d\.\d/');
420 $test_response = $controller->adhesionForm($request, $response, $this->adh
->id
);
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]);
428 * Test attendanceSheet
432 public function testAttendanceSheet()
434 $this->getMemberOne();
436 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
437 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
439 $request = new Request(
441 $ufactory->createUri('/attendance-sheet'),
442 new Headers(['Content-Type' => ['application/json']]),
445 $sfactory->createStream()
448 $response = new \Slim\Psr7\
Response();
449 $controller = new \Galette\Controllers\
PdfController($this->container
);
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());
458 'error_detected' => [
459 'No member was selected, please check at least one name.'
462 $this->flash_data
['slimFlash']
464 $this->flash_data
= [];
466 //test with selection
467 $request = $request->withParsedBody(
469 'selection' => [$this->adh
->id
]
473 $test_response = null;
475 $this->expectOutputRegex('/^%PDF-\d\.\d/');
476 $test_response = $controller->attendanceSheet($request, $response);
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]);
488 public function testContribution()
490 $this->getMemberOne();
491 $this->createContribution();
493 $ufactory = new \Slim\Psr7\Factory\
UriFactory();
494 $sfactory = new \Slim\Psr7\Factory\
StreamFactory();
496 $request = new Request(
498 $ufactory->createUri('/contribution/print/' . $this->contrib
->id
),
499 new Headers(['Content-Type' => ['application/json']]),
502 $sfactory->createStream()
505 $response = new \Slim\Psr7\
Response();
506 $controller = new \Galette\Controllers\
PdfController($this->container
);
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());
514 'error_detected' => [
515 'Unable to load contribution #' . $this->contrib
->id
. '!'
518 $this->flash_data
['slimFlash']
520 $this->flash_data
= [];
523 $this->logSuperAdmin();
524 $test_response = null;
526 $this->expectOutputRegex('/^%PDF-\d\.\d\/');
527 $test_response = $controller->contribution($request, $response, $this->contrib
->id
);
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]);