diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 77bdcac..fd75a49 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -8,12 +8,12 @@ jobs: strategy: matrix: - php: [7.4, 8.0] - laravel: [6, 8] + php: [8.2, 8.3, 8.4] + laravel: [10, 11] steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 @@ -23,49 +23,50 @@ jobs: extensions: ctype, iconv, intl, json, mbstring, pdo, pdo_sqlite coverage: none - - name: Checkout Laravel 6 Sample - if: matrix.laravel == 6 - uses: actions/checkout@v2 - with: - repository: codeception/laravel-module-tests - path: framework-tests - ref: 6.x + - name: Set Laravel version reference + run: echo "LV_REF=${MATRIX_LARAVEL%.*}" >> $GITHUB_ENV + env: + MATRIX_LARAVEL: ${{ matrix.laravel }} - - name: Checkout Laravel 8 Sample - if: matrix.laravel == 8 - uses: actions/checkout@v2 + - name: Checkout Laravel ${{ env.LV_REF }} Sample + uses: actions/checkout@v4 with: repository: codeception/laravel-module-tests path: framework-tests - ref: main + ref: ${{ env.LV_REF }}.x - name: Get composer cache directory id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - name: Cache composer dependencies - uses: actions/cache@v2.1.3 + uses: actions/cache@v3 with: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-${{ matrix.php }}-composer-${{ hashFiles('composer.json') }} restore-keys: ${{ runner.os }}-${{ matrix.php }}-composer- + - name: Install PHPUnit 11 + run: composer require --dev --no-update "phpunit/phpunit=^11.0" + - name: Install dependencies run: | - composer require laravel/framework=${{ matrix.laravel }} --ignore-platform-req=php --no-update - composer install --prefer-dist --no-progress --ignore-platform-req=php + composer require symfony/console:^6.0 || ^7.0 --no-update + composer require codeception/module-asserts="3.*" --no-update + composer update --prefer-dist --no-progress --no-dev - name: Validate composer.json and composer.lock - run: composer validate + run: composer validate --strict working-directory: framework-tests - name: Install Laravel Sample run: | composer remove codeception/module-laravel --dev --no-update - composer install --no-progress + composer require phpunit/phpunit:^11.0 --dev --no-update + composer update --no-progress working-directory: framework-tests - - name: Prepare the test environment and run test suite + - name: Prepare the test environment run: | cp .env.testing .env php artisan config:cache @@ -74,4 +75,4 @@ jobs: working-directory: framework-tests - name: Run test suite - run: php vendor/bin/codecept run Functional -c framework-tests \ No newline at end of file + run: php vendor/bin/codecept run Functional -c framework-tests diff --git a/composer.json b/composer.json index eb1869f..ead9d2c 100644 --- a/composer.json +++ b/composer.json @@ -19,16 +19,16 @@ ], "minimum-stability": "RC", "require": { - "php": "^7.4 | ^8.0", + "php": "^8.2", "ext-json": "*", - "codeception/lib-innerbrowser": "^2.0", - "codeception/codeception": "^4.1" + "codeception/lib-innerbrowser": "^3.1 | ^4.0", + "codeception/codeception": "^5.0.8", + "vlucas/phpdotenv": "^5.3" }, "require-dev": { - "codeception/module-asserts": "^2.0", - "codeception/module-rest": "^2.0", - "laravel/framework": "^6.0 | ^7.0 | ^8.0", - "vlucas/phpdotenv": "^3.6 | ^4.1 | ^5.2" + "codeception/module-asserts": "^3.0", + "codeception/module-rest": "^3.3", + "laravel/framework": "^10.0 | ^11.0" }, "autoload": { "classmap": ["src/"] diff --git a/readme.md b/readme.md index b844e36..87f0ec6 100644 --- a/readme.md +++ b/readme.md @@ -9,8 +9,8 @@ A Codeception module for Laravel framework. ## Requirements -* `Laravel 6` or higher. -* `PHP 7.4` or higher. +* `Laravel 10` or higher, as per the [Laravel supported versions](https://laravel.com/docs/master/releases#support-policy). +* `PHP 8.2` or higher. ## Installation diff --git a/src/Codeception/Lib/Connector/Laravel.php b/src/Codeception/Lib/Connector/Laravel.php index 049c718..2bdad83 100644 --- a/src/Codeception/Lib/Connector/Laravel.php +++ b/src/Codeception/Lib/Connector/Laravel.php @@ -6,9 +6,9 @@ use Closure; use Codeception\Lib\Connector\Laravel\ExceptionHandlerDecorator as LaravelExceptionHandlerDecorator; -use Codeception\Lib\Connector\Laravel6\ExceptionHandlerDecorator as Laravel6ExceptionHandlerDecorator; use Codeception\Module\Laravel as LaravelModule; use Codeception\Stub; +use Dotenv\Dotenv; use Exception; use Illuminate\Contracts\Config\Repository as Config; use Illuminate\Contracts\Debug\ExceptionHandler; @@ -111,7 +111,7 @@ protected function doRequest($request): Response $request = Request::createFromBase($request); $response = $this->kernel->handle($request); - $this->getHttpKernel()->terminate($request, $response); + $this->getHttpKernel()->terminate($this->app['request'], $response); return $response; } @@ -153,14 +153,7 @@ private function initialize(SymfonyRequest $request = null): void $this->getEvents()->listen('*', $listener); - // Replace the Laravel exception handler with our decorated exception handler, - // so exceptions can be intercepted for the disable_exception_handling functionality. - if (version_compare(Application::VERSION, '7.0.0', '<')) { - $decorator = new Laravel6ExceptionHandlerDecorator($this->getExceptionHandler()); - } else { - $decorator = new LaravelExceptionHandlerDecorator($this->getExceptionHandler()); - } - + $decorator = new LaravelExceptionHandlerDecorator($this->getExceptionHandler()); $decorator->exceptionHandlingDisabled($this->exceptionHandlingDisabled); $this->app->instance(ExceptionHandler::class, $decorator); @@ -186,7 +179,12 @@ private function loadApplication(): AppContract { /** @var AppContract $app */ $app = require $this->module->config['bootstrap_file']; - $app->loadEnvironmentFrom($this->module->config['environment_file']); + if ($this->module->config['environment_file'] !== '.env') { + Dotenv::createMutable( + $app->basePath(), + $this->module->config['environment_file'] + )->load(); + } $app->instance('request', new Request()); return $app; diff --git a/src/Codeception/Lib/Connector/Laravel6/ExceptionHandlerDecorator.php b/src/Codeception/Lib/Connector/Laravel6/ExceptionHandlerDecorator.php deleted file mode 100644 index 2bca70c..0000000 --- a/src/Codeception/Lib/Connector/Laravel6/ExceptionHandlerDecorator.php +++ /dev/null @@ -1,94 +0,0 @@ -laravelExceptionHandler = $exceptionHandler; - } - - public function exceptionHandlingDisabled(bool $exceptionHandlingDisabled): void - { - $this->exceptionHandlingDisabled = $exceptionHandlingDisabled; - } - - /** - * Report or log an exception. - * - * @throws Exception - */ - public function report(Exception $e): void - { - $this->laravelExceptionHandler->report($e); - } - - /** - * Determine if the exception should be reported. - */ - public function shouldReport(Exception $e): bool - { - return $this->exceptionHandlingDisabled; - } - - /** - * Render an exception into an HTTP response. - * - * @param Request $request - * @throws Exception - */ - public function render($request, Exception $e): Response - { - $response = $this->laravelExceptionHandler->render($request, $e); - - if ($this->exceptionHandlingDisabled && $this->isSymfonyExceptionHandlerOutput($response->getContent())) { - // If content was generated by the \Symfony\Component\Debug\ExceptionHandler class - // the Laravel application could not handle the exception, - // so re-throw this exception if the Codeception user disabled Laravel exception handling. - throw $e; - } - - return $response; - } - - /** - * Check if the response content is HTML output of the Symfony exception handler class. - */ - private function isSymfonyExceptionHandlerOutput(string $content): bool - { - return strpos($content, '
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: