]> git.agnieray.net Git - galette.git/blobdiff - tests/Galette/Controllers/tests/units/PdfController.php
Properly use injection
[galette.git] / tests / Galette / Controllers / tests / units / PdfController.php
index dc6171993ca2807e1bd035e89e80c42d444b231a..b8bafd838deabe9763234769f2ff4d6a83f6b88c 100644 (file)
@@ -7,7 +7,7 @@
  *
  * 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
@@ -46,65 +48,27 @@ use atoum;
  * @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(
@@ -112,56 +76,37 @@ class PdfController extends atoum
             $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();
     }
 
     /**
@@ -172,42 +117,425 @@ class PdfController extends atoum
     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]);
     }
 }