diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2590a0b3..82c9fd6d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -70,13 +70,24 @@ test: - apk add ${PHPIZE_DEPS} && pecl install xdebug && docker-php-ext-enable xdebug - curl -sS https://getcomposer.org/installer | php -- --no-ansi --install-dir /usr/local/bin/ --filename composer - cp -R tests/ phpunit.xml "${DOCROOT}" - - HOMEDIR=$(pwd) + - HOMEDIR=$PWD - cd "${DOCROOT}" - composer --no-ansi install - ./bin/migrate script: - - vendor/bin/phpunit -v --colors=never --coverage-text --coverage-html "${HOMEDIR}/coverage/" --log-junit "${HOMEDIR}/unittests.xml" - - bin/migrate down + - ./vendor/bin/phpunit -v --colors=never --coverage-text --coverage-html "${HOMEDIR}/coverage/" --log-junit "${HOMEDIR}/unittests.xml" + - ./bin/migrate down + +check-style: + image: ${TEST_IMAGE} + stage: test + before_script: + - curl -sS https://getcomposer.org/installer | php -- --no-ansi --install-dir /usr/local/bin/ --filename composer + - cp -R tests/ "${DOCROOT}" + - cd "${DOCROOT}" + - composer --no-ansi install + script: + - ./vendor/bin/phpcs --no-colors --basepath="$PWD" -p --standard=PSR12 config/ db/ public/index.php src/ tests/ release-image: <<: *docker_definition diff --git a/README.md b/README.md index 037a9e75..7fc3e5ed 100644 --- a/README.md +++ b/README.md @@ -196,5 +196,9 @@ For more information on how to use it call `./bin/migrate help` ### Translation We use gettext. You may use POEdit to extract new texts from the sourcecode. Please config POEdit to extract also the twig template files using the following settings: https://gist.github.com/jlambe/a868d9b63d70902a12254ce47069d0e6 -### Codestyle -Please ensure that your pull requests follow [PSR-2](http://www.php-fig.org/psr/psr-2/) and [PSR-4](http://www.php-fig.org/psr/psr-4/). +### Code style +Please ensure that your pull requests follows the [PSR-12](http://www.php-fig.org/psr/psr-12/) coding style guide. +You can check that by running +```php +vendor/bin/phpcs --standard=PSR12 config/ db/ public/index.php src/ tests/ +``` diff --git a/composer.json b/composer.json index a1f2101b..2f20655f 100644 --- a/composer.json +++ b/composer.json @@ -44,6 +44,7 @@ "dms/phpunit-arraysubset-asserts": "^0.1.0", "filp/whoops": "^2.3", "phpunit/phpunit": "^8.1", + "squizlabs/php_codesniffer": "^3.5", "symfony/var-dumper": "^4.3" }, "autoload": { diff --git a/db/migrations/2018_01_01_000001_import_install_sql.php b/db/migrations/2018_01_01_000001_import_install_sql.php index eae8c810..7f1619e3 100644 --- a/db/migrations/2018_01_01_000001_import_install_sql.php +++ b/db/migrations/2018_01_01_000001_import_install_sql.php @@ -47,8 +47,7 @@ class ImportInstallSql extends Migration /** * Reverse the migration */ - public - function down() + public function down() { $this->schema->getConnection()->statement('SET FOREIGN_KEY_CHECKS=0;'); diff --git a/db/migrations/2018_01_01_000003_fix_old_tables.php b/db/migrations/2018_01_01_000003_fix_old_tables.php index 0ae9a1a5..822846db 100644 --- a/db/migrations/2018_01_01_000003_fix_old_tables.php +++ b/db/migrations/2018_01_01_000003_fix_old_tables.php @@ -18,7 +18,8 @@ class FixOldTables extends Migration [ 'User' => 'CreateDate', 'NewsComments' => 'Datum', - ] as $table => $column) { + ] as $table => $column + ) { if (!$this->schema->hasTable($table)) { continue; } diff --git a/db/migrations/2018_10_01_000000_create_users_tables.php b/db/migrations/2018_10_01_000000_create_users_tables.php index 52b3658f..40721286 100644 --- a/db/migrations/2018_10_01_000000_create_users_tables.php +++ b/db/migrations/2018_10_01_000000_create_users_tables.php @@ -83,8 +83,10 @@ class CreateUsersTables extends Migration }); if ($this->schema->hasTable('User')) { + $emptyDates = ['0000-00-00 00:00:00', '0001-01-01 00:00:00', '1000-01-01 00:00:00']; /** @var stdClass[] $users */ $users = $this->schema->getConnection()->table('User')->get(); + foreach ($users as $data) { $user = new User([ 'name' => $data->Nick, @@ -94,10 +96,7 @@ class CreateUsersTables extends Migration 'last_login_at' => Carbon::createFromTimestamp($data->lastLogIn), ]); $user->setAttribute('id', $data->UID); - if (!in_array( - $data->CreateDate, - ['0000-00-00 00:00:00', '0001-01-01 00:00:00', '1000-01-01 00:00:00'] - )) { + if (!in_array($data->CreateDate, $emptyDates)) { $user->setAttribute('created_at', new Carbon($data->CreateDate)); } $user->save(); @@ -114,8 +113,12 @@ class CreateUsersTables extends Migration 'first_name' => $data->Vorname ?: null, 'last_name' => $data->Name ?: null, 'shirt_size' => $data->Size ?: null, - 'planned_arrival_date' => $data->planned_arrival_date ? Carbon::createFromTimestamp($data->planned_arrival_date) : null, - 'planned_departure_date' => $data->planned_departure_date ? Carbon::createFromTimestamp($data->planned_departure_date) : null, + 'planned_arrival_date' => $data->planned_arrival_date + ? Carbon::createFromTimestamp($data->planned_arrival_date) + : null, + 'planned_departure_date' => $data->planned_departure_date + ? Carbon::createFromTimestamp($data->planned_departure_date) + : null, ]); $personalData->user() ->associate($user) @@ -181,7 +184,7 @@ class CreateUsersTables extends Migration $table->string('DECT', 5)->nullable(); $table->string('Handy', 40)->nullable(); $table->string('email', 123)->nullable(); - $table->boolean('email_shiftinfo')->default(false)->comment('User wants to be informed by mail about changes in his shifts'); + $table->boolean('email_shiftinfo')->default(false); $table->string('jabber', 200)->nullable(); $table->string('Size', 4)->nullable(); $table->string('Passwort', 128)->nullable(); @@ -244,8 +247,12 @@ class CreateUsersTables extends Migration 'api_key' => $user->api_key, 'got_voucher' => $state->got_voucher, 'arrival_date' => $state->arrival_date ? $state->arrival_date->getTimestamp() : null, - 'planned_arrival_date' => $personal->planned_arrival_date ? $personal->planned_arrival_date->getTimestamp() : null, - 'planned_departure_date' => $personal->planned_departure_date ? $personal->planned_departure_date->getTimestamp() : null, + 'planned_arrival_date' => $personal->planned_arrival_date + ? $personal->planned_arrival_date->getTimestamp() + : null, + 'planned_departure_date' => $personal->planned_departure_date + ? $personal->planned_departure_date->getTimestamp() + : null, 'email_by_human_allowed' => $settings->email_human, ]); } diff --git a/db/migrations/ChangesReferences.php b/db/migrations/ChangesReferences.php index 6bdd187d..1e7a5f10 100644 --- a/db/migrations/ChangesReferences.php +++ b/db/migrations/ChangesReferences.php @@ -24,14 +24,16 @@ trait ChangesReferences $table->dropForeign($reference->constraint); }); - $this->schema->table($reference->table, + $this->schema->table( + $reference->table, function (Blueprint $table) use ($reference, $targetTable, $targetColumn, $type) { $table->{$type}($reference->column)->change(); $table->foreign($reference->column) ->references($targetColumn)->on($targetTable) ->onDelete('cascade'); - }); + } + ); } } diff --git a/resources/lang/de_DE/default.po b/resources/lang/de_DE/default.po index 1370fca2..cb39e5b2 100644 --- a/resources/lang/de_DE/default.po +++ b/resources/lang/de_DE/default.po @@ -2754,9 +2754,7 @@ msgid "Development Platform" msgstr "Entwicklerplattform" #: src/Middleware/LegacyMiddleware.php -msgid "" -"This page could not be found or you don't have permission to view it. You " -"probably have to sign in or register in order to gain access!" +msgid "page.404.text" msgstr "" "Diese Seite existiert nicht oder Du hast keinen Zugriff. Melde Dich an um " "Zugriff zu erhalten!" diff --git a/resources/lang/en_US/default.po b/resources/lang/en_US/default.po index 0119865b..cfb587f1 100644 --- a/resources/lang/en_US/default.po +++ b/resources/lang/en_US/default.po @@ -25,6 +25,11 @@ msgstr "" msgid "form.submit" msgstr "Submit" +msgid "page.404.text" +msgstr "" +"This page could not be found or you don't have permission to view it. " +"You probably have to sign in or register in order to gain access!" + msgid "credits.credit" msgstr "" "The original engelsystem was written by " diff --git a/src/Controllers/Metrics/MetricsEngine.php b/src/Controllers/Metrics/MetricsEngine.php index 21ae8fd0..8301e388 100644 --- a/src/Controllers/Metrics/MetricsEngine.php +++ b/src/Controllers/Metrics/MetricsEngine.php @@ -137,10 +137,12 @@ class MetricsEngine implements EngineInterface } /** - * Does nothing as shared data will onyly result in unexpected behaviour + * Does nothing as shared data will only result in unexpected behaviour * * @param string|mixed[] $key * @param mixed $value */ - public function share($key, $value = null) { } + public function share($key, $value = null) + { + } } diff --git a/src/Controllers/PasswordResetController.php b/src/Controllers/PasswordResetController.php index a1460104..6ceadec1 100644 --- a/src/Controllers/PasswordResetController.php +++ b/src/Controllers/PasswordResetController.php @@ -74,7 +74,7 @@ class PasswordResetController extends BaseController /** @var User $user */ $user = User::whereEmail($data['email'])->first(); if ($user) { - $reset = (new PasswordReset)->findOrNew($user->id); + $reset = (new PasswordReset())->findOrNew($user->id); $reset->user_id = $user->id; $reset->token = md5(random_bytes(64)); $reset->save(); @@ -120,8 +120,10 @@ class PasswordResetController extends BaseController ]); if ($data['password'] !== $data['password_confirmation']) { - $this->session->set('errors', - array_merge($this->session->get('errors', []), ['validation.password.confirmed'])); + $this->session->set( + 'errors', + array_merge($this->session->get('errors', []), ['validation.password.confirmed']) + ); return $this->showView('pages/password/reset-form'); } diff --git a/src/Database/Migration/Migrate.php b/src/Database/Migration/Migrate.php index 214903e4..a0d5d4b0 100644 --- a/src/Database/Migration/Migrate.php +++ b/src/Database/Migration/Migrate.php @@ -11,8 +11,11 @@ use Illuminate\Support\Str; class Migrate { - const UP = 'up'; - const DOWN = 'down'; + /** @var string */ + public const UP = 'up'; + + /** @var string */ + public const DOWN = 'down'; /** @var Application */ protected $app; diff --git a/src/Exceptions/Handler.php b/src/Exceptions/Handler.php index b3d840c0..f8905531 100644 --- a/src/Exceptions/Handler.php +++ b/src/Exceptions/Handler.php @@ -18,8 +18,11 @@ class Handler /** @var Request */ protected $request; - const ENV_PRODUCTION = 'prod'; - const ENV_DEVELOPMENT = 'dev'; + /** @var string */ + public const ENV_PRODUCTION = 'prod'; + + /** @var string */ + public const ENV_DEVELOPMENT = 'dev'; /** * Handler constructor. diff --git a/src/Exceptions/Handlers/Legacy.php b/src/Exceptions/Handlers/Legacy.php index 461dabe1..45285a8d 100644 --- a/src/Exceptions/Handlers/Legacy.php +++ b/src/Exceptions/Handlers/Legacy.php @@ -13,7 +13,7 @@ class Legacy implements HandlerInterface */ public function render($request, Throwable $e) { - echo 'An unexpected error occurred, a team of untrained monkeys has been dispatched to deal with it.'; + echo 'An unexpected error occurred. A team of untrained monkeys has been dispatched to fix it.'; } /** diff --git a/src/Exceptions/Handlers/LegacyDevelopment.php b/src/Exceptions/Handlers/LegacyDevelopment.php index cfa4efa4..d6a11949 100644 --- a/src/Exceptions/Handlers/LegacyDevelopment.php +++ b/src/Exceptions/Handlers/LegacyDevelopment.php @@ -15,7 +15,11 @@ class LegacyDevelopment extends Legacy { $file = $this->stripBasePath($e->getFile()); - echo '
';
+        echo sprintf(
+            '
',
+            'background-color:#333;color:#ccc;z-index:1000;position:fixed;'
+            . 'bottom:1em;padding:1em;width:97%;max-height:90%;overflow-y:auto;'
+        );
         echo sprintf('%s: (%s)' . PHP_EOL, get_class($e), $e->getCode());
         $data = [
             'string'     => $e->getMessage(),
diff --git a/src/Http/Validation/ValidatesRequest.php b/src/Http/Validation/ValidatesRequest.php
index 33ff76af..142bd129 100644
--- a/src/Http/Validation/ValidatesRequest.php
+++ b/src/Http/Validation/ValidatesRequest.php
@@ -17,10 +17,12 @@ trait ValidatesRequest
      */
     protected function validate(Request $request, array $rules)
     {
-        if (!$this->validator->validate(
+        $isValid = $this->validator->validate(
             (array)$request->getParsedBody(),
             $rules
-        )) {
+        );
+
+        if (!$isValid) {
             throw new ValidationException($this->validator);
         }
 
diff --git a/src/Middleware/LegacyMiddleware.php b/src/Middleware/LegacyMiddleware.php
index 478ffab1..f652e766 100644
--- a/src/Middleware/LegacyMiddleware.php
+++ b/src/Middleware/LegacyMiddleware.php
@@ -82,7 +82,7 @@ class LegacyMiddleware implements MiddlewareInterface
 
             $page = 404;
             $title = $translator->translate('Page not found');
-            $content = $translator->translate('This page could not be found or you don\'t have permission to view it. You probably have to sign in or register in order to gain access!');
+            $content = $translator->translate('page.404.text');
         }
 
         return $this->renderPage($page, $title, $content);
@@ -103,14 +103,17 @@ class LegacyMiddleware implements MiddlewareInterface
             case 'ical':
                 require_once realpath(__DIR__ . '/../../includes/pages/user_ical.php');
                 user_ical();
+                break;
             /** @noinspection PhpMissingBreakStatementInspection */
             case 'atom':
                 require_once realpath(__DIR__ . '/../../includes/pages/user_atom.php');
                 user_atom();
+                break;
             /** @noinspection PhpMissingBreakStatementInspection */
             case 'shifts_json_export':
                 require_once realpath(__DIR__ . '/../../includes/controller/shifts_controller.php');
                 shifts_json_export_controller();
+                break;
             case 'public_dashboard':
                 return public_dashboard_controller();
             case 'angeltypes':
diff --git a/src/Models/LogEntry.php b/src/Models/LogEntry.php
index 53f72b65..8a73d305 100644
--- a/src/Models/LogEntry.php
+++ b/src/Models/LogEntry.php
@@ -24,7 +24,7 @@ class LogEntry extends BaseModel
     public $timestamps = true;
 
     /** @var null Disable updated_at */
-    const UPDATED_AT = null;
+    public const UPDATED_AT = null;
 
     /**
      * The attributes that are mass assignable.
diff --git a/src/Models/User/PasswordReset.php b/src/Models/User/PasswordReset.php
index 82f44add..7f694268 100644
--- a/src/Models/User/PasswordReset.php
+++ b/src/Models/User/PasswordReset.php
@@ -18,7 +18,7 @@ class PasswordReset extends HasUserModel
     public $timestamps = true;
 
     /** @var null Disable updated_at */
-    const UPDATED_AT = null;
+    public const UPDATED_AT = null;
 
     /** The attributes that are mass assignable */
     protected $fillable = [
diff --git a/src/helpers.php b/src/helpers.php
index 796b8764..de140c4e 100644
--- a/src/helpers.php
+++ b/src/helpers.php
@@ -1,5 +1,4 @@
  LogLevel::INFO,
-                     'Some test content'      => LogLevel::ERROR,
-                     'Foo bar bartz!'         => LogLevel::INFO,
-                     'Someone did something?' => LogLevel::NOTICE,
-                     'This is a Test!'        => LogLevel::INFO,
-                     'I\'m verbose notice!'   => LogLevel::DEBUG,
-                     'The newest stuff!!'     => LogLevel::ERROR,
-                 ] as $message => $level) {
+        foreach (
+            [
+                'Lorem Ipsum'            => LogLevel::INFO,
+                'Some test content'      => LogLevel::ERROR,
+                'Foo bar bartz!'         => LogLevel::INFO,
+                'Someone did something?' => LogLevel::NOTICE,
+                'This is a Test!'        => LogLevel::INFO,
+                'I\'m verbose notice!'   => LogLevel::DEBUG,
+                'The newest stuff!!'     => LogLevel::ERROR,
+            ] as $message => $level
+        ) {
             $entry = new LogEntry(['level' => $level, 'message' => $message]);
             $entry->save();
         }
diff --git a/tests/Unit/Controllers/PasswordResetControllerTest.php b/tests/Unit/Controllers/PasswordResetControllerTest.php
index 09538416..c83b06b9 100644
--- a/tests/Unit/Controllers/PasswordResetControllerTest.php
+++ b/tests/Unit/Controllers/PasswordResetControllerTest.php
@@ -152,7 +152,7 @@ class PasswordResetControllerTest extends TestCase
         $response = $controller->postResetPassword($request);
         $this->assertEquals(200, $response->getStatusCode());
 
-        $this->assertEmpty((new PasswordReset)->find($user->id));
+        $this->assertEmpty((new PasswordReset())->find($user->id));
         $this->assertNotNull(auth()->authenticate($user->name, $password));
     }
 
diff --git a/tests/Unit/Helpers/AuthenticatorTest.php b/tests/Unit/Helpers/AuthenticatorTest.php
index 1dc39a28..03033858 100644
--- a/tests/Unit/Helpers/AuthenticatorTest.php
+++ b/tests/Unit/Helpers/AuthenticatorTest.php
@@ -259,7 +259,9 @@ class AuthenticatorTest extends ServiceProviderTest
         return new class extends Authenticator
         {
             /** @noinspection PhpMissingParentConstructorInspection */
-            public function __construct() { }
+            public function __construct()
+            {
+            }
         };
     }
 }
diff --git a/tests/Unit/Helpers/Translation/TranslatorTest.php b/tests/Unit/Helpers/Translation/TranslatorTest.php
index afb1aabc..5e341cfd 100644
--- a/tests/Unit/Helpers/Translation/TranslatorTest.php
+++ b/tests/Unit/Helpers/Translation/TranslatorTest.php
@@ -32,7 +32,7 @@ class TranslatorTest extends ServiceProviderTest
             ->method('__invoke')
             ->withConsecutive(['te_ST'], ['fo_OO']);
 
-        $translator = new Translator($locale, 'fo_OO', function () { }, $locales, $localeChange);
+        $translator = new Translator($locale, 'fo_OO', [$this, 'doNothing'], $locales, $localeChange);
 
         $this->assertEquals($locales, $translator->getLocales());
         $this->assertEquals($locale, $translator->getLocale());
@@ -55,7 +55,7 @@ class TranslatorTest extends ServiceProviderTest
     {
         /** @var Translator|MockObject $translator */
         $translator = $this->getMockBuilder(Translator::class)
-            ->setConstructorArgs(['de_DE', 'en_US', function () { }, ['de_DE' => 'Deutsch']])
+            ->setConstructorArgs(['de_DE', 'en_US', [$this, 'doNothing'], ['de_DE' => 'Deutsch']])
             ->onlyMethods(['translateText'])
             ->getMock();
         $translator->expects($this->exactly(2))
@@ -77,7 +77,7 @@ class TranslatorTest extends ServiceProviderTest
     {
         /** @var Translator|MockObject $translator */
         $translator = $this->getMockBuilder(Translator::class)
-            ->setConstructorArgs(['de_DE', 'en_US', function () { }, ['de_DE' => 'Deutsch']])
+            ->setConstructorArgs(['de_DE', 'en_US', [$this, 'doNothing'], ['de_DE' => 'Deutsch']])
             ->onlyMethods(['translateText'])
             ->getMock();
         $translator->expects($this->once())
@@ -131,4 +131,11 @@ class TranslatorTest extends ServiceProviderTest
         // Successful translation
         $this->assertEquals('Lorem test3!', $translator->translatePlural('foo.barf', 'foo.bar2', 3, ['test3']));
     }
+
+    /**
+     * Does nothing
+     */
+    public function doNothing()
+    {
+    }
 }
diff --git a/tests/Unit/Http/Psr7ServiceProviderTest.php b/tests/Unit/Http/Psr7ServiceProviderTest.php
index 25c2f6e3..d0df726b 100644
--- a/tests/Unit/Http/Psr7ServiceProviderTest.php
+++ b/tests/Unit/Http/Psr7ServiceProviderTest.php
@@ -20,7 +20,7 @@ class Psr7ServiceProviderTest extends ServiceProviderTest
      */
     public function testRegister()
     {
-        $app = new Application;
+        $app = new Application();
 
         $serviceProvider = new Psr7ServiceProvider($app);
         $serviceProvider->register();
diff --git a/tests/Unit/Logger/EngelsystemLoggerTest.php b/tests/Unit/Logger/EngelsystemLoggerTest.php
index 3b67aa29..6343717c 100644
--- a/tests/Unit/Logger/EngelsystemLoggerTest.php
+++ b/tests/Unit/Logger/EngelsystemLoggerTest.php
@@ -69,7 +69,10 @@ class EngelsystemLoggerTest extends ServiceProviderTest
             'user' =>
                 new class
                 {
-                    public function __toString() { return 'Bar'; }
+                    public function __toString()
+                    {
+                        return 'Bar';
+                    }
                 }
         ]);
     }
diff --git a/tests/Unit/Models/LogEntryTest.php b/tests/Unit/Models/LogEntryTest.php
index 4b772cd0..d4cef2e0 100644
--- a/tests/Unit/Models/LogEntryTest.php
+++ b/tests/Unit/Models/LogEntryTest.php
@@ -16,15 +16,17 @@ class LogEntryTest extends TestCase
      */
     public function testFilter()
     {
-        foreach ([
-                     'I\'m an info'            => LogLevel::INFO,
-                     '*Insert explosion here*' => LogLevel::EMERGENCY,
-                     'Tracing along'           => LogLevel::DEBUG,
-                     'Oops'                    => LogLevel::ERROR,
-                     'It\'s happening'         => LogLevel::INFO,
-                     'Something is wrong'      => LogLevel::ERROR,
-                     'Ohi'                     => LogLevel::INFO,
-                 ] as $message => $level) {
+        foreach (
+            [
+                'I\'m an info'            => LogLevel::INFO,
+                '*Insert explosion here*' => LogLevel::EMERGENCY,
+                'Tracing along'           => LogLevel::DEBUG,
+                'Oops'                    => LogLevel::ERROR,
+                'It\'s happening'         => LogLevel::INFO,
+                'Something is wrong'      => LogLevel::ERROR,
+                'Ohi'                     => LogLevel::INFO,
+            ] as $message => $level
+        ) {
             (new LogEntry(['level' => $level, 'message' => $message]))->save();
         }
 
diff --git a/tests/Unit/Models/User/UserTest.php b/tests/Unit/Models/User/UserTest.php
index da121a4f..5cb8745d 100644
--- a/tests/Unit/Models/User/UserTest.php
+++ b/tests/Unit/Models/User/UserTest.php
@@ -113,7 +113,7 @@ class UserTest extends TestCase
 
         foreach ($modelData as $data) {
             /** @var BaseModel $model */
-            $model = (new $class);
+            $model = $this->app->make($class);
             $stored = $model->create($data + ['user_id' => $user->id]);
             $relatedModelIds[] = $stored->id;
         }