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, '
') !== false || - strpos($content, '
') !== false; - } - - /** - * Render an exception to the console. - * - * @param OutputInterface $output - */ - public function renderForConsole($output, Exception $e): void - { - $this->laravelExceptionHandler->renderForConsole($output, $e); - } - - /** - * @param string|callable $method - */ - public function __call($method, array $args) - { - return call_user_func_array([$this->laravelExceptionHandler, $method], $args); - } -} diff --git a/src/Codeception/Module/Laravel.php b/src/Codeception/Module/Laravel.php index fcadb79..129c5b7 100644 --- a/src/Codeception/Module/Laravel.php +++ b/src/Codeception/Module/Laravel.php @@ -24,6 +24,7 @@ use Codeception\Subscriber\ErrorHandler; use Codeception\TestInterface; use Codeception\Util\ReflectionHelper; +use Illuminate\Console\Application as Artisan; use Illuminate\Contracts\Config\Repository as Config; use Illuminate\Contracts\Foundation\Application as ApplicationContract; use Illuminate\Database\Connection; @@ -62,6 +63,7 @@ * * disable_events: `boolean`, default `false` - disable events (does not disable model events). * * disable_model_events: `boolean`, default `false` - disable model events. * * url: `string`, default `` - the application URL. + * * headers: `array` - default headers are set before each test. * * ### Example #1 (`functional.suite.yml`) * @@ -147,12 +149,12 @@ class Laravel extends Framework implements ActiveRecord, PartedModule /** * @var LaravelConnector */ - public ?AbstractBrowser $client; + public ?AbstractBrowser $client = null; /** * @var array */ - public $config = []; + public array $config = []; public function __construct(ModuleContainer $moduleContainer, ?array $config = null) { @@ -172,6 +174,7 @@ public function __construct(ModuleContainer $moduleContainer, ?array $config = n 'disable_middleware' => false, 'disable_events' => false, 'disable_model_events' => false, + 'headers' => [], ], (array)$config ); @@ -210,6 +213,8 @@ public function _initialize() */ public function _before(TestInterface $test) { + $this->headers = $this->config['headers']; + $this->client = new LaravelConnector($this); // Database migrations should run before database cleanup transaction starts @@ -257,6 +262,8 @@ public function _after(TestInterface $test) unset($this->app[\Faker\Generator::class]); unset($this->app[\Illuminate\Database\Eloquent\Factory::class]); } + + Artisan::forgetBootstrappers(); } /** pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

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:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy