*
* PHP version 5
*
- * Copyright © 2020 The Galette Team
+ * Copyright © 2020-2023 The Galette Team
*
* This file is part of Galette (http://galette.tuxfamily.org).
*
* @package GaletteTests
*
* @author Johan Cwiklinski <johan@x-tnd.be>
- * @copyright 2020 The Galette Team
+ * @copyright 2020-2023 The Galette Team
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
- * @version SVN: $Id$
* @link http://galette.tuxfamily.org
* @since 2020-11-21
*/
namespace Galette\Controllers\test\units;
-use atoum;
+use PHPUnit\Framework\TestCase;
+use Galette\GaletteTestCase;
+use Slim\Psr7\Headers;
+use Slim\Psr7\Request;
/**
* PDF controller tests
* @name PdfController
* @package GaletteTests
* @author Johan Cwiklinski <johan@x-tnd.be>
- * @copyright 2020 The Galette Team
+ * @copyright 2020-2023 The Galette Team
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
* @link http://galette.tuxfamily.org
* @since 2020-12-06
*/
-class PdfController extends atoum
+class PdfController extends GaletteTestCase
{
- private $zdb;
- private $preferences;
- private $login;
- private $remove = [];
- private $i18n;
- private $container;
- private $history;
-
- private $adh;
- private $contrib;
- private $members_fields;
-
- private $mocked_router;
- private $session;
- private $flash_data = [];
- private $flash;
+ protected int $seed = 58144569971203;
/**
* Set up tests
*
- * @param string $method Calling method
- *
* @return void
*/
- public function beforeTestMethod($method)
+ public function setUp(): void
{
- $this->zdb = new \Galette\Core\Db();
- $this->preferences = new \Galette\Core\Preferences($this->zdb);
- $this->i18n = new \Galette\Core\I18n(
- \Galette\Core\I18n::DEFAULT_LANG
- );
- $this->login = new \Galette\Core\Login($this->zdb, $this->i18n);
-
- $models = new \Galette\Repository\PdfModels($this->zdb, $this->preferences, $this->login);
- $res = $models->installInit(false);
- $this->boolean($res)->isTrue();
-
- $this->mocked_router = new \mock\Slim\Router();
- $this->calling($this->mocked_router)->pathFor = function ($name, $params) {
- return $name;
- };
+ parent::setUp();
- $this->session = new \RKA\Session();
- $this->history = new \Galette\Core\History($this->zdb, $this->login, $this->preferences);
- $flash_data = [];
- $this->flash_data = &$flash_data;
- $this->flash = new \Slim\Flash\Messages($flash_data);
-
- $_SERVER['HTTP_HOST'] = '';
-
- include_once GALETTE_ROOT . 'includes/fields_defs/members_fields.php';
- $this->members_fields = $members_fields;
+ $this->initModels();
+ $this->initStatus();
+ $this->initContributionsTypes();
$this->adh = new \Galette\Entity\Adherent($this->zdb);
$this->adh->setDependencies(
$this->members_fields,
$this->history
);
-
- $app = new \Slim\App(['router' => $this->mocked_router, 'flash' => $this->flash]);
- $this->container = $app->getContainer();
-
- $this->container['view'] = null;
- $this->container['zdb'] = $this->zdb;
- $this->container['login'] = $this->login;
- $this->container['session'] = $this->session;
- $this->container['preferences'] = $this->preferences;
- $this->container['logo'] = null;
- $this->container['print_logo'] = null;
- $this->container['plugins'] = null;
- $this->container['history'] = $this->history;
- $this->container['i18n'] = null;
- $this->container['fields_config'] = null;
- $this->container['lists_config'] = null;
- $this->container['l10n'] = null;
- $this->container['members_fields'] = $this->members_fields;
- $members_form_fields = $this->members_fields;
- foreach ($members_form_fields as $k => $field) {
- if ($field['position'] == -1) {
- unset($members_form_fields[$k]);
- }
- }
- //$this->members_form_fields = $members_form_fields;
- $this->container['members_form_fields'] = $members_form_fields;
-
- include_once GALETTE_ROOT . 'includes/fields_defs/members_fields_cats.php';
- $this->container['members_fields_cats'] = $members_fields_cats;
-
- global $container, $zdb, $i18n, $login, $hist;
- $zdb = $this->zdb; //globals '(
- $container = $this->container; //globals '(
- $i18n = $this->i18n;
- $login = $this->login;
- $hist = $this->history;
}
/**
- * Tear down tests
+ * Cleanup after tests
*
- * @param string $method Calling method
+ * @return void
+ */
+ public function tearDown(): void
+ {
+ $this->zdb = new \Galette\Core\Db();
+
+ $delete = $this->zdb->delete(\Galette\Entity\Contribution::TABLE);
+ $delete->where(['info_cotis' => 'FAKER' . $this->seed]);
+ $this->zdb->execute($delete);
+
+ $delete = $this->zdb->delete(\Galette\Entity\Adherent::TABLE);
+ $delete->where(['fingerprint' => 'FAKER' . $this->seed]);
+ $this->zdb->execute($delete);
+
+ $this->cleanHistory();
+ }
+
+ /**
+ * Cleanup after class
*
* @return void
*/
- public function afterTestMethod($method)
+ public static function tearDownAfterClass(): void
{
- if (TYPE_DB === 'mysql') {
- $this->array($this->zdb->getWarnings())->isIdenticalTo([]);
- }
+ $self = new self(__METHOD__);
+ $self->tearDown();
}
/**
public function testStoreModels()
{
$model = new \Galette\Entity\PdfInvoice($this->zdb, $this->preferences);
- $this->string($model->title)->isIdenticalTo('_T("Invoice") {CONTRIBUTION_YEAR}-{CONTRIBUTION_ID}');
+ $this->assertSame('_T("Invoice") {CONTRIBUTION_YEAR}-{CONTRIBUTION_ID}', $model->title);
- $environment = \Slim\Http\Environment::mock(
- [
- 'REQUEST_METHOD' => 'POST',
- 'REQUEST_URI' => '/models/pdf'
- ]
- );
- $uri = \Slim\Http\Uri::createFromEnvironment($environment);
- $headers = \Slim\Http\Headers::createFromEnvironment($environment);
- $cookies = [];
- $serverParams = $environment->all();
+ $ufactory = new \Slim\Psr7\Factory\UriFactory();
+ $sfactory = new \Slim\Psr7\Factory\StreamFactory();
- $body = new \Slim\Http\RequestBody();
- $body->write(
- json_encode([
+ $request = new Request(
+ 'POST',
+ $ufactory->createUri('http://localhost/models/pdf'),
+ new Headers(['Content-Type' => ['application/json']]),
+ [],
+ [],
+ $sfactory->createStream()
+ );
+ $request = $request->withParsedBody(
+ [
'store' => true,
'models_id' => \Galette\Entity\PdfModel::INVOICE_MODEL,
'model_type' => \Galette\Entity\PdfModel::INVOICE_MODEL,
'model_title' => 'DaTitle'
- ])
+ ]
);
- $request = new \Slim\Http\Request('POST', $uri, $headers, $cookies, $serverParams, $body);
- $request = $request->withHeader('Content-Type', 'application/json');
- $response = new \Slim\Http\Response();
+ $response = new \Slim\Psr7\Response();
$controller = new \Galette\Controllers\PdfController($this->container);
+ $this->container->injectOn($controller);
$test_response = $controller->storeModels($request, $response);
- $this->array($this->flash_data['slimFlash'])->isIdenticalTo([
- 'success_detected' => [
- 'Model has been successfully stored!'
- ]
- ]);
+ $this->assertSame(
+ [
+ 'success_detected' => [
+ 'Model has been successfully stored!'
+ ]
+ ],
+ $this->flash_data['slimFlash']
+ );
$model = new \Galette\Entity\PdfInvoice($this->zdb, $this->preferences);
- $this->string($model->title)->isIdenticalTo('DaTitle');
+ $this->assertSame('DaTitle', $model->title);
+ }
+
+ /**
+ * Test membersCards
+ *
+ * @return void
+ */
+ public function testMembersCards()
+ {
+ $this->getMemberOne();
+
+ $ufactory = new \Slim\Psr7\Factory\UriFactory();
+ $sfactory = new \Slim\Psr7\Factory\StreamFactory();
+
+ $request = new Request(
+ 'POST',
+ $ufactory->createUri('/members/card/' . $this->adh->id),
+ new Headers(['Content-Type' => ['text/html']]),
+ [],
+ [],
+ $sfactory->createStream()
+ );
+
+ $response = new \Slim\Psr7\Response();
+ $controller = new \Galette\Controllers\PdfController($this->container);
+ $this->container->injectOn($controller);
+
+ //test with non-logged-in user
+ $test_response = $controller->membersCards($request, $response, $this->adh->id);
+ $this->assertSame(['Location' => ['/member/me']], $test_response->getHeaders());
+ $this->assertSame(200, $test_response->getStatusCode());
+ $this->assertSame(
+ [
+ 'error_detected' => [
+ 'You do not have permission for requested URL.'
+ ]
+ ],
+ $this->flash_data['slimFlash']
+ );
+ $this->flash_data = [];
+
+ //test logged-in as superadmin
+ $this->logSuperAdmin();
+ $test_response = null;
+
+ $this->expectOutputRegex('/^%PDF-\d\.\d\.');
+ $test_response = $controller->membersCards($request, $response, $this->adh->id);
+
+ $this->assertSame(200, $test_response->getStatusCode());
+ $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
+ $this->assertSame('attachment;filename="cards.pdf"', $test_response->getHeader('Content-Disposition')[0]);
+
+ //test no selection
+ $test_response = $controller->membersCards($request, $response);
+ $this->assertSame(['Location' => ['/members']], $test_response->getHeaders());
+ $this->assertSame(301, $test_response->getStatusCode());
+ $this->assertSame(
+ [
+ 'error_detected' => [
+ 'No member was selected, please check at least one name.'
+ ]
+ ],
+ $this->flash_data['slimFlash']
+ );
+ $this->flash_data = [];
+ }
+
+ /**
+ * Test filtered membersCards
+ *
+ * @return void
+ */
+ public function testFilteredMembersCards()
+ {
+ $this->getMemberOne();
+
+ $ufactory = new \Slim\Psr7\Factory\UriFactory();
+ $sfactory = new \Slim\Psr7\Factory\StreamFactory();
+
+ $request = new Request(
+ 'POST',
+ $ufactory->createUri('/members/card/' . $this->adh->id),
+ new Headers(['Content-Type' => ['text/html']]),
+ [],
+ [],
+ $sfactory->createStream()
+ );
+
+ $response = new \Slim\Psr7\Response();
+ $controller = new \Galette\Controllers\PdfController($this->container);
+ $this->container->injectOn($controller);
+
+ //test logged-in as superadmin
+ $this->logSuperAdmin();
+
+ //test with filters
+ $filters = new \Galette\Filters\MembersList();
+ $filters->selected = [$this->adh->id];
+ $this->session->filter_members = $filters;
+
+ $this->expectOutputRegex('/^%PDF-\d.\d.');
+ $test_response = $controller->membersCards($request, $response);
+
+ unset($this->session->filter_members);
+ $this->assertSame(200, $test_response->getStatusCode());
+ $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
+ $this->assertSame('attachment;filename="cards.pdf"', $test_response->getHeader('Content-Disposition')[0]);
+ }
+
+ /**
+ * Test membersLabels
+ *
+ * @return void
+ */
+ public function testMembersLabels()
+ {
+ unset($this->session->filter_members);
+ $this->getMemberOne();
+
+ $ufactory = new \Slim\Psr7\Factory\UriFactory();
+ $sfactory = new \Slim\Psr7\Factory\StreamFactory();
+
+ $request = new Request(
+ 'POST',
+ $ufactory->createUri('/members/labels'),
+ new Headers(['Content-Type' => ['text/html']]),
+ [],
+ [],
+ $sfactory->createStream()
+ );
+
+ $response = new \Slim\Psr7\Response();
+ $controller = new \Galette\Controllers\PdfController($this->container);
+ $this->container->injectOn($controller);
+
+ //test with non-logged-in user
+ $test_response = $controller->membersLabels($request, $response, $this->adh->id);
+ $this->assertSame(['Location' => ['/members']], $test_response->getHeaders());
+ $this->assertSame(301, $test_response->getStatusCode());
+ $this->assertSame(
+ [
+ 'error_detected' => [
+ 'No member was selected, please check at least one name.'
+ ]
+ ],
+ $this->flash_data['slimFlash']
+ );
+ $this->flash_data = [];
+
+ //test again from filters
+ $test_response = null;
+ $filters = new \Galette\Filters\MembersList();
+ $filters->selected = [$this->adh->id];
+ $this->session->filter_members = $filters;
+
+ $this->expectOutputRegex('/^%PDF-\d\.\d');
+ $test_response = $controller->membersLabels($request, $response);
+
+ $this->assertSame(200, $test_response->getStatusCode());
+ $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
+ $this->assertSame('attachment;filename="labels_print_filename.pdf"', $test_response->getHeader('Content-Disposition')[0]);
+ unset($this->session->filter_members);
+
+ //test logged-in as superadmin
+ $this->logSuperAdmin();
+ //test no selection
+ $test_response = null;
+ $test_response = $controller->membersCards($request, $response);
+ $this->assertSame(['Location' => ['/members']], $test_response->getHeaders());
+ $this->assertSame(301, $test_response->getStatusCode());
+ $this->assertSame(
+ [
+ 'error_detected' => [
+ 'No member was selected, please check at least one name.'
+ ]
+ ],
+ $this->flash_data['slimFlash']
+ );
+ $this->flash_data = [];
+ }
+
+ /**
+ * Test filtered membersLabels
+ *
+ * @return void
+ */
+ public function testFilteredMembersLabels()
+ {
+ unset($this->session->filter_members);
+ $this->getMemberOne();
+
+ $ufactory = new \Slim\Psr7\Factory\UriFactory();
+ $sfactory = new \Slim\Psr7\Factory\StreamFactory();
+
+ $request = new Request(
+ 'POST',
+ $ufactory->createUri('/members/labels'),
+ new Headers(['Content-Type' => ['text/html']]),
+ [],
+ [],
+ $sfactory->createStream()
+ );
+
+ $response = new \Slim\Psr7\Response();
+ $controller = new \Galette\Controllers\PdfController($this->container);
+ $this->container->injectOn($controller);
+
+ //test logged-in as superadmin
+ $this->logSuperAdmin();
+
+ //test again from filters
+ $filters = new \Galette\Filters\MembersList();
+ $filters->selected = [$this->adh->id];
+ $this->session->filter_members = $filters;
+
+ $this->expectOutputRegex('/^%PDF-\d\.\d');
+ $test_response = $controller->membersCards($request, $response);
+
+ $this->assertSame(200, $test_response->getStatusCode());
+ $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
+ $this->assertSame('attachment;filename="cards.pdf"', $test_response->getHeader('Content-Disposition')[0]);
+ }
+
+ /**
+ * Test adhesionForm
+ *
+ * @return void
+ */
+ public function testadhesionForm()
+ {
+ unset($this->session->filter_members);
+ $this->getMemberOne();
+
+ $ufactory = new \Slim\Psr7\Factory\UriFactory();
+ $sfactory = new \Slim\Psr7\Factory\StreamFactory();
+
+ $request = new Request(
+ 'POST',
+ $ufactory->createUri('/members/labels'),
+ new Headers(['Content-Type' => ['text/html']]),
+ [],
+ [],
+ $sfactory->createStream()
+ );
+
+ $response = new \Slim\Psr7\Response();
+ $controller = new \Galette\Controllers\PdfController($this->container);
+ $this->container->injectOn($controller);
+
+ //test with non-logged-in user
+ $test_response = $controller->adhesionForm($request, $response, $this->adh->id);
+ $this->assertSame(['Location' => ['/member/me']], $test_response->getHeaders());
+ $this->assertSame(200, $test_response->getStatusCode());
+ $this->assertSame(
+ [
+ 'error_detected' => [
+ 'You do not have permission for requested URL.'
+ ]
+ ],
+ $this->flash_data['slimFlash']
+ );
+ $this->flash_data = [];
+
+ //test logged-in as superadmin
+ $this->logSuperAdmin();
+ $test_response = null;
+
+ $this->expectOutputRegex('/^%PDF-\d\.\d/');
+ $test_response = $controller->adhesionForm($request, $response, $this->adh->id);
+
+ $this->assertSame(200, $test_response->getStatusCode());
+ $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
+ $this->assertSame('attachment;filename="adherent_form.' . $this->adh->id . '.pdf"', $test_response->getHeader('Content-Disposition')[0]);
+ }
+
+ /**
+ * Test attendanceSheet
+ *
+ * @return void
+ */
+ public function testAttendanceSheet()
+ {
+ $this->getMemberOne();
+
+ $ufactory = new \Slim\Psr7\Factory\UriFactory();
+ $sfactory = new \Slim\Psr7\Factory\StreamFactory();
+
+ $request = new Request(
+ 'POST',
+ $ufactory->createUri('/attendance-sheet'),
+ new Headers(['Content-Type' => ['application/json']]),
+ [],
+ [],
+ $sfactory->createStream()
+ );
+
+ $response = new \Slim\Psr7\Response();
+ $controller = new \Galette\Controllers\PdfController($this->container);
+ $this->container->injectOn($controller);
+
+ //test no selection
+ $test_response = null;
+ $test_response = $controller->membersCards($request, $response);
+ $this->assertSame(['Location' => ['/members']], $test_response->getHeaders());
+ $this->assertSame(301, $test_response->getStatusCode());
+ $this->assertSame(
+ [
+ 'error_detected' => [
+ 'No member was selected, please check at least one name.'
+ ]
+ ],
+ $this->flash_data['slimFlash']
+ );
+ $this->flash_data = [];
+
+ //test with selection
+ $request = $request->withParsedBody(
+ [
+ 'selection' => [$this->adh->id]
+ ]
+ );
+
+ $test_response = null;
+
+ $this->expectOutputRegex('/^%PDF-\d\.\d/');
+ $test_response = $controller->attendanceSheet($request, $response);
+
+ $this->assertSame(200, $test_response->getStatusCode());
+ $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
+ $this->assertSame('attachment;filename="attendance_sheet.pdf"', $test_response->getHeader('Content-Disposition')[0]);
+ }
+
+ /**
+ * Test contribution
+ *
+ * @return void
+ */
+ public function testContribution()
+ {
+ $this->getMemberOne();
+ $this->createContribution();
+
+ $ufactory = new \Slim\Psr7\Factory\UriFactory();
+ $sfactory = new \Slim\Psr7\Factory\StreamFactory();
+
+ $request = new Request(
+ 'POST',
+ $ufactory->createUri('/contribution/print/' . $this->contrib->id),
+ new Headers(['Content-Type' => ['application/json']]),
+ [],
+ [],
+ $sfactory->createStream()
+ );
+
+ $response = new \Slim\Psr7\Response();
+ $controller = new \Galette\Controllers\PdfController($this->container);
+ $this->container->injectOn($controller);
+
+ //test not logged
+ $test_response = $controller->contribution($request, $response, $this->contrib->id);
+ $this->assertSame(['Location' => ['/contributions']], $test_response->getHeaders());
+ $this->assertSame(301, $test_response->getStatusCode());
+ $this->assertSame(
+ [
+ 'error_detected' => [
+ 'Unable to load contribution #' . $this->contrib->id . '!'
+ ]
+ ],
+ $this->flash_data['slimFlash']
+ );
+ $this->flash_data = [];
+
+ //test superadmin
+ $this->logSuperAdmin();
+ $test_response = null;
+
+ $this->expectOutputRegex('/^%PDF-\d\.\d\/');
+ $test_response = $controller->contribution($request, $response, $this->contrib->id);
+
+ $this->assertSame(200, $test_response->getStatusCode());
+ $this->assertSame('application/pdf', $test_response->getHeader('Content-type')[0]);
+ $this->assertSame('attachment;filename="contribution_' . $this->contrib->id . '_invoice.pdf"', $test_response->getHeader('Content-Disposition')[0]);
}
}