From 032dd8166fde579d74a1640fb342fc9ad3b681f5 Mon Sep 17 00:00:00 2001 From: Rhys Lees <43909932+RhysLees@users.noreply.github.com> Date: Fri, 28 Feb 2025 17:58:27 +0000 Subject: [PATCH 01/12] WIP --- composer.json | 28 ++++--- phpunit.xml | 18 +++++ .../{ => Feature}/PrerenderMiddlewareTest.php | 3 +- tests/Pest.php | 6 ++ tests/TestCase.php | 81 +++---------------- 5 files changed, 57 insertions(+), 79 deletions(-) create mode 100644 phpunit.xml rename tests/{ => Feature}/PrerenderMiddlewareTest.php (97%) create mode 100644 tests/Pest.php diff --git a/composer.json b/composer.json index 0ccd10f..da0acb2 100644 --- a/composer.json +++ b/composer.json @@ -10,10 +10,14 @@ "license": "MIT", "authors": [ { - "name": "Sebastian Fix", - "email": "sebastian.fix@codebar.ch", + "name": "Sebastian BΓΌrgin-Fix", + "email": "sebastian.buergin@buergin.ch", "homepage": "https://www.codebar.ch", - "role": "Developer" + "role": "Sofware-Engineer" + }, + { + "name": "Rhys Lees", + "role": "Software-Engineer" }, { "name": "Casper Lai", @@ -28,15 +32,20 @@ } ], "require": { - "php": "^8.2|^8.3", + "php": "8.2.*|8.3.*|8.4.*", "guzzlehttp/guzzle": "^7.8", - "illuminate/support": "^11.0|^12.0", + "illuminate/contracts": "^12.0", "symfony/psr-http-message-bridge": "^7.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.50", - "orchestra/testbench": "^9.0|^10.0", - "phpunit/phpunit": "^10.5|^11.5.3" + "laravel/pint": "^1.21", + "larastan/larastan": "^v3.1", + "orchestra/testbench": "^10.0", + "pestphp/pest": "^3.7", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "spatie/laravel-ray": "^1.39" }, "autoload": { "psr-4": { @@ -56,7 +65,8 @@ "config": { "sort-packages": true, "allow-plugins": { - "pestphp/pest-plugin": true + "pestphp/pest-plugin": true, + "phpstan/extension-installer": true } }, "extra": { diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..7d0904f --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,18 @@ + + + + + ./tests + + + + + ./app + ./src + + + diff --git a/tests/PrerenderMiddlewareTest.php b/tests/Feature/PrerenderMiddlewareTest.php similarity index 97% rename from tests/PrerenderMiddlewareTest.php rename to tests/Feature/PrerenderMiddlewareTest.php index 9ae6196..50bfc4e 100644 --- a/tests/PrerenderMiddlewareTest.php +++ b/tests/Feature/PrerenderMiddlewareTest.php @@ -1,7 +1,8 @@ in(__DIR__); diff --git a/tests/TestCase.php b/tests/TestCase.php index ff281b0..933954a 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -3,30 +3,20 @@ namespace CodebarAg\LaravelPrerender\Tests; use CodebarAg\LaravelPrerender\LaravelPrerenderServiceProvider; -use CodebarAg\LaravelPrerender\PrerenderMiddleware; -use GuzzleHttp\Client; -use GuzzleHttp\Exception\ConnectException; -use GuzzleHttp\Handler\MockHandler; -use GuzzleHttp\HandlerStack; -use GuzzleHttp\Psr7\Request; -use GuzzleHttp\Psr7\Response; -use Illuminate\Foundation\Application; -use Illuminate\Foundation\Http\Kernel; -use Illuminate\Support\Facades\Route; -use Psr\Http\Message\RequestInterface; +use Illuminate\Database\Eloquent\Factories\Factory; +use Orchestra\Testbench\TestCase as Orchestra; -class TestCase extends \Orchestra\Testbench\TestCase +class TestCase extends Orchestra { protected function setUp(): void { parent::setUp(); - $this->setupRoutes(); + Factory::guessFactoryNamesUsing( + fn (string $modelName) => 'CodebarAg\\LaravelPrerender\\Database\\Factories\\'.class_basename($modelName).'Factory', + ); } - /** - * @param Application $app - */ protected function getPackageProviders($app): array { return [ @@ -34,60 +24,13 @@ protected function getPackageProviders($app): array ]; } - /** - * @param Application $app - */ - protected function getEnvironmentSetUp($app): void + public function getEnvironmentSetUp($app): void { - $app->make(Kernel::class)->prependMiddleware(PrerenderMiddleware::class); - - // mock guzzle client - $app->bind(Client::class, function () { - $mock = new MockHandler([ - new Response(200, ['prerender.io-mock' => true]), - ]); - $stack = HandlerStack::create($mock); - - return new Client(['handler' => $stack]); - }); - } - - protected function createMockTimeoutClient(): Client - { - $mock = new MockHandler([ - new ConnectException('Could not connect', new Request('GET', 'test')), + $app['config']->set('database.default', 'sqlite'); + $app['config']->set('database.connections.sqlite', [ + 'driver' => 'sqlite', + 'database' => ':memory:', + 'prefix' => '', ]); - - $stack = HandlerStack::create($mock); - - return new Client(['handler' => $stack]); - } - - protected function createMockUrlTrackingClient(): Client - { - $mock = new MockHandler([ - function (RequestInterface $request) { - return new Response( - 200, - ['prerender.io-mock' => true], - (string) $request->getUri() - ); - }, - ]); - - $stack = HandlerStack::create($mock); - - return new Client(['handler' => $stack]); - } - - protected function setupRoutes(): void - { - Route::get('test-middleware', function () { - return 'GET - Success'; - }); - - Route::post('test-middleware', function () { - return 'Success'; - }); } } From 7229eca1a1d789e3391fcca77a59a37be97a7c62 Mon Sep 17 00:00:00 2001 From: Rhys Lees <43909932+RhysLees@users.noreply.github.com> Date: Fri, 28 Feb 2025 18:02:16 +0000 Subject: [PATCH 02/12] WIP --- tests/TestCase.php | 47 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/tests/TestCase.php b/tests/TestCase.php index 933954a..ccae5da 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -3,8 +3,16 @@ namespace CodebarAg\LaravelPrerender\Tests; use CodebarAg\LaravelPrerender\LaravelPrerenderServiceProvider; +use GuzzleHttp\Client; +use GuzzleHttp\Exception\ConnectException; +use GuzzleHttp\Handler\MockHandler; +use GuzzleHttp\HandlerStack; +use GuzzleHttp\Psr7\Request; +use GuzzleHttp\Psr7\Response; use Illuminate\Database\Eloquent\Factories\Factory; +use Illuminate\Support\Facades\Route; use Orchestra\Testbench\TestCase as Orchestra; +use Psr\Http\Message\RequestInterface; class TestCase extends Orchestra { @@ -33,4 +41,43 @@ public function getEnvironmentSetUp($app): void 'prefix' => '', ]); } + + protected function createMockTimeoutClient(): Client + { + $mock = new MockHandler([ + new ConnectException('Could not connect', new Request('GET', 'test')), + ]); + + $stack = HandlerStack::create($mock); + + return new Client(['handler' => $stack]); + } + + protected function createMockUrlTrackingClient(): Client + { + $mock = new MockHandler([ + function (RequestInterface $request) { + return new Response( + 200, + ['prerender.io-mock' => true], + (string) $request->getUri() + ); + }, + ]); + + $stack = HandlerStack::create($mock); + + return new Client(['handler' => $stack]); + } + + protected function setupRoutes(): void + { + Route::get('test-middleware', function () { + return 'GET - Success'; + }); + + Route::post('test-middleware', function () { + return 'Success'; + }); + } } From f2adcbe9ff666a19b9a034cd24fa82f1d6a6d3ee Mon Sep 17 00:00:00 2001 From: Rhys Lees <43909932+RhysLees@users.noreply.github.com> Date: Fri, 28 Feb 2025 18:30:22 +0000 Subject: [PATCH 03/12] WIP --- tests/TestCase.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/TestCase.php b/tests/TestCase.php index ccae5da..7fb2f9c 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -3,6 +3,7 @@ namespace CodebarAg\LaravelPrerender\Tests; use CodebarAg\LaravelPrerender\LaravelPrerenderServiceProvider; +use CodebarAg\LaravelPrerender\PrerenderMiddleware; use GuzzleHttp\Client; use GuzzleHttp\Exception\ConnectException; use GuzzleHttp\Handler\MockHandler; @@ -10,6 +11,7 @@ use GuzzleHttp\Psr7\Request; use GuzzleHttp\Psr7\Response; use Illuminate\Database\Eloquent\Factories\Factory; +use Illuminate\Foundation\Http\Kernel; use Illuminate\Support\Facades\Route; use Orchestra\Testbench\TestCase as Orchestra; use Psr\Http\Message\RequestInterface; @@ -40,6 +42,18 @@ public function getEnvironmentSetUp($app): void 'database' => ':memory:', 'prefix' => '', ]); + + $app->make(Kernel::class)->prependMiddleware(PrerenderMiddleware::class); + + // mock guzzle client + $app->bind(Client::class, function () { + $mock = new MockHandler([ + new Response(200, ['prerender.io-mock' => true]), + ]); + $stack = HandlerStack::create($mock); + + return new Client(['handler' => $stack]); + }); } protected function createMockTimeoutClient(): Client From 838ea492b00be13fa9b18b727226eefbfd4cb08f Mon Sep 17 00:00:00 2001 From: Rhys Lees <43909932+RhysLees@users.noreply.github.com> Date: Fri, 28 Feb 2025 18:36:45 +0000 Subject: [PATCH 04/12] WIP --- .github/ISSUE_TEMPLATE/bug.yml | 52 ------------------- .github/ISSUE_TEMPLATE/bug_report.yml | 17 +++--- .github/dependabot.yml | 12 +++++ .github/workflows/dependabot-auto-merge.yml | 32 ++++++++++++ .github/workflows/dependency-review.yml | 20 +++++++ .../workflows/fix-php-code-style-issues.yml | 2 +- .github/workflows/phpstan.yml | 21 ++++++++ .github/workflows/release.yml | 23 ++++++++ .github/workflows/run-tests.yml | 43 ++++++--------- 9 files changed, 136 insertions(+), 86 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug.yml create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/dependabot-auto-merge.yml create mode 100644 .github/workflows/dependency-review.yml create mode 100644 .github/workflows/phpstan.yml create mode 100644 .github/workflows/release.yml diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml deleted file mode 100644 index 52f37d5..0000000 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: Bug Report -description: Report an Issue or Bug with the Package -title: "[Bug]: " -labels: ["bug"] -body: - - type: markdown - attributes: - value: | - We're sorry to hear you have a problem. Can you help us solve it by providing the following details. - - type: textarea - id: what-happened - attributes: - label: What happened? - description: What did you expect to happen? - placeholder: I cannot currently do X thing because when I do, it breaks X thing. - validations: - required: true - - - type: input - id: package-version - attributes: - label: Package Version - description: What version of our Package are you running? Please be as specific as possible - placeholder: 2.0.0 - validations: - required: true - - type: input - id: php-version - attributes: - label: PHP Version - description: What version of PHP are you running? Please be as specific as possible - placeholder: 8.2.0 - validations: - required: true - - type: input - id: laravel-version - attributes: - label: Laravel Version - description: What version of Laravel are you running? Please be as specific as possible - placeholder: 9.0.0 - validations: - required: true - - type: dropdown - id: operating-systems - attributes: - label: Which operating systems does with happen with? - description: You may select more than one. - multiple: true - options: - - macOS - - Windows - - Linux diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 7546b77..bc5e177 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,18 +1,18 @@ name: Bug Report description: Report an Issue or Bug with the Package title: "[Bug]: " -labels: ["bug"] +labels: [ "bug" ] body: - type: markdown attributes: - value: | - We're sorry to hear you have a problem. Can you help us solve it by providing the following details. + value: "| +We're sorry to hear you have a problem. Can you help us solve it by providing the following details." - type: textarea id: what-happened attributes: label: What happened? description: What did you expect to happen? - placeholder: I cannot currently do X thing because when I do, it breaks X thing. + placeholder: "I cannot currently do X thing because when I do, it breaks X thing." validations: required: true - type: input @@ -20,7 +20,8 @@ body: attributes: label: Package Version description: What version of our Package are you running? Please be as specific as possible - placeholder: 1.0.0 + placeholder: "12.0" + value: "12.0" validations: required: true - type: input @@ -28,7 +29,8 @@ body: attributes: label: PHP Version description: What version of PHP are you running? Please be as specific as possible - placeholder: 8.3.0 + placeholder: "8.4.0" + value: "8.4.0" validations: required: true - type: input @@ -36,7 +38,8 @@ body: attributes: label: Laravel Version description: What version of Laravel are you running? Please be as specific as possible - placeholder: 11.0.0 + placeholder: "12.0.0" + value: "12.0.0" validations: required: true - type: dropdown diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..0bc378d --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ +# Please see the documentation for all configuration options: +# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + labels: + - "dependencies" diff --git a/.github/workflows/dependabot-auto-merge.yml b/.github/workflows/dependabot-auto-merge.yml new file mode 100644 index 0000000..2df1631 --- /dev/null +++ b/.github/workflows/dependabot-auto-merge.yml @@ -0,0 +1,32 @@ +name: dependabot-auto-merge +on: pull_request_target + +permissions: + pull-requests: write + contents: write + +jobs: + dependabot: + runs-on: ubuntu-latest + if: ${{ github.actor == 'dependabot[bot]' }} + steps: + + - name: Dependabot metadata + id: metadata + uses: dependabot/fetch-metadata@v2.3.0 + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" + + - name: Auto-merge Dependabot PRs for semver-minor updates + if: ${{steps.metadata.outputs.update-type == 'version-update:semver-minor'}} + run: gh pr merge --auto --merge "$PR_URL" + env: + PR_URL: ${{github.event.pull_request.html_url}} + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} + + - name: Auto-merge Dependabot PRs for semver-patch updates + if: ${{steps.metadata.outputs.update-type == 'version-update:semver-patch'}} + run: gh pr merge --auto --merge "$PR_URL" + env: + PR_URL: ${{github.event.pull_request.html_url}} + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml new file mode 100644 index 0000000..0d4a013 --- /dev/null +++ b/.github/workflows/dependency-review.yml @@ -0,0 +1,20 @@ +# Dependency Review Action +# +# This Action will scan dependency manifest files that change as part of a Pull Request, surfacing known-vulnerable versions of the packages declared or updated in the PR. Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable packages will be blocked from merging. +# +# Source repository: https://github.com/actions/dependency-review-action +# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement +name: 'Dependency Review' +on: [pull_request] + +permissions: + contents: read + +jobs: + dependency-review: + runs-on: ubuntu-latest + steps: + - name: 'Checkout Repository' + uses: actions/checkout@v4 + - name: 'Dependency Review' + uses: actions/dependency-review-action@v4 diff --git a/.github/workflows/fix-php-code-style-issues.yml b/.github/workflows/fix-php-code-style-issues.yml index 7f61fce..ef2fadf 100644 --- a/.github/workflows/fix-php-code-style-issues.yml +++ b/.github/workflows/fix-php-code-style-issues.yml @@ -13,7 +13,7 @@ jobs: ref: ${{ github.head_ref }} - name: Fix PHP code style issues - uses: aglipanci/laravel-pint-action@2.3.1 + uses: aglipanci/laravel-pint-action@2.5 - name: Commit changes uses: stefanzweifel/git-auto-commit-action@v5 diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml new file mode 100644 index 0000000..ef2fadf --- /dev/null +++ b/.github/workflows/phpstan.yml @@ -0,0 +1,21 @@ +name: Fix PHP code style issues + +on: [push] + +jobs: + php-code-styling: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + ref: ${{ github.head_ref }} + + - name: Fix PHP code style issues + uses: aglipanci/laravel-pint-action@2.5 + + - name: Commit changes + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: Fix styling diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..afa28ff --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,23 @@ +name: release + +on: + pull_request: + types: + - closed + branches: + - main +jobs: + release: + name: Release + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: '0' + - name: Bump version and push tag + uses: anothrNick/github-tag-action@master + env: + GITHUB_TOKEN: ${{ secrets.MY_GITHUB_TOKEN }} + WITH_V: true + RELEASE_BRANCHES: main + DEFAULT_BUMP: minor diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index be5239a..c4d9e45 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -2,42 +2,34 @@ name: run-tests on: push: - branches: - - main + branches: [ main ] pull_request: - branches: - - main + branches: [ main ] jobs: test: runs-on: ${{ matrix.os }} - strategy: fail-fast: true max-parallel: 1 matrix: - os: [ubuntu-latest, windows-latest] - php: [8.2, 8.3] - laravel: ['11.*', '12.*'] - stability: [prefer-lowest, prefer-stable] - include: - - laravel: 11.* - testbench: 9.* - - laravel: 12.* - testbench: 10.* + os: [ ubuntu-latest ] + php: [ 8.2, 8.3, 8.4 ] + laravel: [ 12.* ] + stability: [ prefer-lowest, prefer-stable ] name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.stability }} - ${{ matrix.os }} steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo - coverage: xdebug + coverage: none - name: Setup problem matchers run: | @@ -46,19 +38,18 @@ jobs: - name: Install dependencies run: | - composer require "laravel/framework:${{ matrix.laravel }}" "orchestra/testbench:${{ matrix.testbench }}" --dev --no-interaction --no-update - composer update --${{ matrix.stability }} --prefer-dist --no-interaction --no-suggest + composer require "laravel/framework:${{ matrix.laravel }}" --no-interaction --no-update + composer update --${{ matrix.stability }} --prefer-dist --no-interaction - - name: Set phpunit.xml + - name: Execute tests run: cp phpunit.xml.dist phpunit.xml - name: Execute tests - run: vendor/bin/phpunit + run: vendor/bin/pest - - name: Store test reports - uses: actions/upload-artifact@v2 + - name: Store Log Artifacts + if: failure() + uses: actions/upload-artifact@v4 with: - name: Store report - retention-days: 1 - path: | - ./reports + name: Store report artifacts + path: ./vendor/orchestra/testbench-core/laravel/storage/logs From c4db95a518f083ef492ee5f81d262c5f42a0cb52 Mon Sep 17 00:00:00 2001 From: Rhys Lees <43909932+RhysLees@users.noreply.github.com> Date: Fri, 28 Feb 2025 18:40:42 +0000 Subject: [PATCH 05/12] WIP --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8949e2c..7cca505 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,16 @@ [![Latest Version on Packagist](https://img.shields.io/packagist/v/codebar-ag/laravel-prerender.svg?style=flat-square)](https://packagist.org/packages/codebar-ag/laravel-prerender) +[![GitHub-Tests](https://github.com/codebar-ag/laravel-prerender/actions/workflows/run-tests.yml/badge.svg?branch=main)](https://github.com/codebar-ag/laravel-prerender/actions/workflows/run-tests.yml) +[![GitHub Code Style](https://github.com/codebar-ag/laravel-prerender/actions/workflows/fix-php-code-style-issues.yml/badge.svg?branch=main)](https://github.com/codebar-ag/laravel-prerender/actions/workflows/fix-php-code-style-issues.yml) [![Total Downloads](https://img.shields.io/packagist/dt/codebar-ag/laravel-prerender.svg?style=flat-square)](https://packagist.org/packages/codebar-ag/laravel-prerender) -[![run-tests](https://github.com/codebar-ag/laravel-prerender/actions/workflows/run-tests.yml/badge.svg)](https://github.com/codebar-ag/laravel-prerender/actions/workflows/run-tests.yml) -[![Check & fix styling](https://github.com/codebar-ag/laravel-prerender/actions/workflows/php-cs-fixer.yml/badge.svg)](https://github.com/codebar-ag/laravel-prerender/actions/workflows/php-cs-fixer.yml) This package was developed to give you a quick start to integrate with the Prerender.io service in your Laravel application. ## πŸ™‡ Credits -This package is a clone from [jeroennoten/Laravel-Prerender](https://github.com/jeroennoten/Laravel-Prerender) +This package is a clone from [jeroennoten/laravel-prerender](https://github.com/jeroennoten/Laravel-Prerender) with [jeroennoten](https://github.com/jeroennoten) as the original author. [CasperLaiTW](https://github.com/CasperLaiTW) provided Laravel 6,7 & 8 compatibility by an unmerged (14th September 2020) Pull-Request. @@ -32,7 +32,8 @@ using Prerender.io since the response always goes through your server. | Package | PHP | Laravel | Prerender.io access | |:-------:|:-----------:|:-------:|:-------------------:| -| main | ^8.2 - ^8.3 | 11.x | βœ… | +| v12.0.0 | ^8.2 - ^8.4 | 12.x | βœ… | +| v11.0.0 | ^8.2 - ^8.3 | 11.x | βœ… | | v3.3.0 | ^8.1 - ^8.3 | 10.x | βœ… | | v3.2.0 | ^8.0 - ^8.2 | 9.x | βœ… | | v3.1.1 | ^7.3 - ^8.1 | 8.x | βœ… | From 523e1ee8f9a4ae3fa7b0682fe069cc7a5b612a9f Mon Sep 17 00:00:00 2001 From: Sebastian Fix Date: Mon, 3 Mar 2025 17:06:33 +0700 Subject: [PATCH 06/12] Fixed Pest Tests --- tests/Feature/PrerenderMiddlewareTest.php | 227 +++++++++------------- tests/Pest.php | 57 +++++- tests/TestCase.php | 118 ++++------- 3 files changed, 180 insertions(+), 222 deletions(-) diff --git a/tests/Feature/PrerenderMiddlewareTest.php b/tests/Feature/PrerenderMiddlewareTest.php index 50bfc4e..4e5c886 100644 --- a/tests/Feature/PrerenderMiddlewareTest.php +++ b/tests/Feature/PrerenderMiddlewareTest.php @@ -1,139 +1,92 @@ allowSymfonyUserAgent(); - - $this->get('/test-middleware') - ->assertHeader('prerender.io-mock', true) - ->assertSuccessful(); - } - - /** @test */ - public function it_should_not_prerender_page_when_user_agent_does_not_in_list() - { - $this->get('/test-middleware') - ->assertSuccessful() - ->assertHeaderMissing('prerender.io-mock') - ->assertSee('GET - Success'); - } - - /** @test */ - public function it_should_prerender_page_with_escaped_fragment_in_query_string() - { - $this->get('/test-middleware?_escaped_fragment_') - ->assertHeader('prerender.io-mock', true) - ->assertSuccessful(); - } - - /** @test */ - public function it_should_prerender_when_user_agent_is_part_of_crawler_user_agents() - { - $this->get('/test-middleware', ['User-Agent' => 'Googlebot/2.1 (+http://www.google.com/bot.html)']) - ->assertHeader('prerender.io-mock', true) - ->assertSuccessful(); - } - - /** @test */ - public function it_should_prerender_page_with_url_in_whitelist() - { - config()->set('prerender.whitelist', ['/test-middleware*']); - - $this->get('/test-middleware?_escaped_fragment_') - ->assertHeader('prerender.io-mock', true) - ->assertSuccessful(); - } - - /** @test */ - public function is_should_not_prerender_page_in_blacklist() - { - config()->set('prerender.blacklist', ['/test-middleware*']); - - $this->get('/test-middleware?_escaped_fragment_') - ->assertSuccessful() - ->assertHeaderMissing('prerender.io-mock') - ->assertSee('GET - Success'); - } - - /** @test */ - public function it_should_not_prerender_page_on_non_get_request() - { - $this->allowSymfonyUserAgent(); - - $this->post('/test-middleware') - ->assertSuccessful() - ->assertSee('Success'); - } - - /** @test */ - public function it_should_not_prerender_page_when_missing_user_agent() - { - $this->get('/test-middleware', ['User-Agent' => null]) - ->assertHeaderMissing('prerender.io-mock') - ->assertSee('GET - Success'); - } - - /** @test */ - public function it_should_not_prerender_page_if_request_times_out() - { - $this->app->bind(Client::class, function () { - return $this->createMockTimeoutClient(); - }); - - $this->allowSymfonyUserAgent(); - - $this->get('/test-middleware') - ->assertHeaderMissing('prerender.io-mock') - ->assertSee('GET - Success'); - } - - /** @test */ - public function it_does_not_send_query_strings_to_prerender_by_default() - { - $this->app->bind(Client::class, function () { - return $this->createMockUrlTrackingClient(); - }); - - $this->allowSymfonyUserAgent(); - - $this->get('/test-middleware?withQueryParam=true') - ->assertHeader('prerender.io-mock', true) - ->assertSuccessful() - ->assertSee(urlencode('/test-middleware')) - ->assertDontSee('withQueryParam'); - } - - /** @test */ - public function it_sends_full_query_string_to_prerender() - { - $this->app->bind(Client::class, function () { - return $this->createMockUrlTrackingClient(); - }); - - $this->allowSymfonyUserAgent(); - $this->allowQueryParams(); - - $this->get('/test-middleware?withQueryParam=true') - ->assertHeader('prerender.io-mock', true) - ->assertSuccessful() - ->assertSee(urlencode('/test-middleware?withQueryParam=true')); - } - - private function allowSymfonyUserAgent() - { - config()->set('prerender.crawler_user_agents', ['symfony']); - } - - private function allowQueryParams() - { - config()->set('prerender.full_url', true); - } -} +test('it should prerender page on get request', function () { + allowSymfonyUserAgent(); + + $this->get('/test-middleware') + ->assertHeader('prerender.io-mock', true) + ->assertSuccessful(); +}); + +test('it should not prerender page when user agent does not in list', function () { + $this->get('/test-middleware') + ->assertHeaderMissing('prerender.io-mock') + ->assertSee('GET - Success'); +}); + +test('it should prerender page with escaped fragment in query string', function () { + $this->get('/test-middleware?_escaped_fragment_') + ->assertHeader('prerender.io-mock', true) + ->assertSuccessful(); +}); + +test('it should prerender when user agent is part of crawler user agents', function () { + $this->get('/test-middleware', ['User-Agent' => 'Googlebot/2.1 (+http://www.google.com/bot.html)']) + ->assertHeader('prerender.io-mock', true) + ->assertSuccessful(); +}); + +test('it should prerender page with url in whitelist', function () { + config()->set('prerender.whitelist', ['/test-middleware*']); + + $this->get('/test-middleware?_escaped_fragment_') + ->assertHeader('prerender.io-mock', true) + ->assertSuccessful(); +}); + +test('it should not prerender page in blacklist', function () { + config()->set('prerender.blacklist', ['/test-middleware*']); + + $this->get('/test-middleware?_escaped_fragment_') + ->assertSuccessful() + ->assertHeaderMissing('prerender.io-mock') + ->assertSee('GET - Success'); +}); + +test('it should not prerender page on non-get request', function () { + allowSymfonyUserAgent(); + + $this->post('/test-middleware') + ->assertSuccessful() + ->assertSee('Success'); +}); + +test('it should not prerender page when missing user agent', function () { + $this->get('/test-middleware', ['User-Agent' => null]) + ->assertHeaderMissing('prerender.io-mock') + ->assertSee('GET - Success'); +}); + +test('it should not prerender page if request times out', function () { + $this->app->bind(\GuzzleHttp\Client::class, fn () => createMockTimeoutClient()); + + allowSymfonyUserAgent(); + + $this->get('/test-middleware') + ->assertHeaderMissing('prerender.io-mock') + ->assertSee('GET - Success'); +}); + +test('it does not send query strings to prerender by default', function () { + $this->app->bind(\GuzzleHttp\Client::class, fn () => createMockUrlTrackingClient()); + + allowSymfonyUserAgent(); + + $this->get('/test-middleware?withQueryParam=true') + ->assertHeader('prerender.io-mock', true) + ->assertSuccessful() + ->assertSee(urlencode('/test-middleware')) + ->assertDontSee('withQueryParam'); +}); + +test('it sends full query string to prerender', function () { + $this->app->bind(\GuzzleHttp\Client::class, fn () => createMockUrlTrackingClient()); + + allowSymfonyUserAgent(); + allowQueryParams(); + + $this->get('/test-middleware?withQueryParam=true') + ->assertHeader('prerender.io-mock', true) + ->assertSuccessful() + ->assertSee(urlencode('/test-middleware?withQueryParam=true')); +}); diff --git a/tests/Pest.php b/tests/Pest.php index bb70d64..2c2ec01 100644 --- a/tests/Pest.php +++ b/tests/Pest.php @@ -1,6 +1,59 @@ in(__DIR__); +uses(TestCase::class)->in(__DIR__); + +function createMockPrerenderClient(): Client +{ + $mock = new MockHandler([ + new Response(200, ['prerender.io-mock' => 'true'], 'Mocked Prerender Response'), + ]); + + $stack = HandlerStack::create($mock); + + return new Client(['handler' => $stack]); +} + +function createMockTimeoutClient(): Client +{ + $mock = new MockHandler([ + new ConnectException('Could not connect', new Request('GET', 'test')), + ]); + + $stack = HandlerStack::create($mock); + + return new Client(['handler' => $stack]); +} + +function createMockUrlTrackingClient(): Client +{ + $mock = new MockHandler([ + fn (RequestInterface $request) => new Response( + 200, + ['prerender.io-mock' => 'true'], + (string) $request->getUri() + ), + ]); + + $stack = HandlerStack::create($mock); + + return new Client(['handler' => $stack]); +} + +function allowSymfonyUserAgent() +{ + config()->set('prerender.crawler_user_agents', ['symfony']); +} + +function allowQueryParams() +{ + config()->set('prerender.full_url', true); +} diff --git a/tests/TestCase.php b/tests/TestCase.php index 7fb2f9c..d3a1d72 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -5,93 +5,45 @@ use CodebarAg\LaravelPrerender\LaravelPrerenderServiceProvider; use CodebarAg\LaravelPrerender\PrerenderMiddleware; use GuzzleHttp\Client; -use GuzzleHttp\Exception\ConnectException; -use GuzzleHttp\Handler\MockHandler; -use GuzzleHttp\HandlerStack; -use GuzzleHttp\Psr7\Request; -use GuzzleHttp\Psr7\Response; -use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Foundation\Http\Kernel; use Illuminate\Support\Facades\Route; use Orchestra\Testbench\TestCase as Orchestra; -use Psr\Http\Message\RequestInterface; class TestCase extends Orchestra { - protected function setUp(): void - { - parent::setUp(); - - Factory::guessFactoryNamesUsing( - fn (string $modelName) => 'CodebarAg\\LaravelPrerender\\Database\\Factories\\'.class_basename($modelName).'Factory', - ); - } - - protected function getPackageProviders($app): array - { - return [ - LaravelPrerenderServiceProvider::class, - ]; - } - - public function getEnvironmentSetUp($app): void - { - $app['config']->set('database.default', 'sqlite'); - $app['config']->set('database.connections.sqlite', [ - 'driver' => 'sqlite', - 'database' => ':memory:', - 'prefix' => '', - ]); - - $app->make(Kernel::class)->prependMiddleware(PrerenderMiddleware::class); - - // mock guzzle client - $app->bind(Client::class, function () { - $mock = new MockHandler([ - new Response(200, ['prerender.io-mock' => true]), - ]); - $stack = HandlerStack::create($mock); - - return new Client(['handler' => $stack]); - }); - } - - protected function createMockTimeoutClient(): Client - { - $mock = new MockHandler([ - new ConnectException('Could not connect', new Request('GET', 'test')), - ]); - - $stack = HandlerStack::create($mock); - - return new Client(['handler' => $stack]); - } - - protected function createMockUrlTrackingClient(): Client - { - $mock = new MockHandler([ - function (RequestInterface $request) { - return new Response( - 200, - ['prerender.io-mock' => true], - (string) $request->getUri() - ); - }, - ]); - - $stack = HandlerStack::create($mock); - - return new Client(['handler' => $stack]); - } - - protected function setupRoutes(): void - { - Route::get('test-middleware', function () { - return 'GET - Success'; - }); - - Route::post('test-middleware', function () { - return 'Success'; - }); - } + protected function getPackageProviders($app): array + { + return [ + LaravelPrerenderServiceProvider::class, + ]; + } + + public function getEnvironmentSetUp($app): void + { + $app['config']->set('database.default', 'sqlite'); + $app['config']->set('database.connections.sqlite', [ + 'driver' => 'sqlite', + 'database' => ':memory:', + 'prefix' => '', + ]); + + $app->make(Kernel::class)->prependMiddleware(PrerenderMiddleware::class); + + $this->setupRoutes(); + + $app->bind(Client::class, function () { + return createMockPrerenderClient(); + }); + } + + protected function setupRoutes(): void + { + Route::get('test-middleware', function () { + return response('GET - Success')->header('Content-Type', 'text/plain'); + }); + + Route::post('test-middleware', function () { + return response('Success')->header('Content-Type', 'text/plain'); + }); + } } From aeabf442ed9aab70e0ab9c0b6e7927ab150b884f Mon Sep 17 00:00:00 2001 From: StanBarrows <10268813+StanBarrows@users.noreply.github.com> Date: Mon, 3 Mar 2025 10:07:05 +0000 Subject: [PATCH 07/12] Fix styling --- tests/TestCase.php | 70 +++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/tests/TestCase.php b/tests/TestCase.php index d3a1d72..1cf6277 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -11,39 +11,39 @@ class TestCase extends Orchestra { - protected function getPackageProviders($app): array - { - return [ - LaravelPrerenderServiceProvider::class, - ]; - } - - public function getEnvironmentSetUp($app): void - { - $app['config']->set('database.default', 'sqlite'); - $app['config']->set('database.connections.sqlite', [ - 'driver' => 'sqlite', - 'database' => ':memory:', - 'prefix' => '', - ]); - - $app->make(Kernel::class)->prependMiddleware(PrerenderMiddleware::class); - - $this->setupRoutes(); - - $app->bind(Client::class, function () { - return createMockPrerenderClient(); - }); - } - - protected function setupRoutes(): void - { - Route::get('test-middleware', function () { - return response('GET - Success')->header('Content-Type', 'text/plain'); - }); - - Route::post('test-middleware', function () { - return response('Success')->header('Content-Type', 'text/plain'); - }); - } + protected function getPackageProviders($app): array + { + return [ + LaravelPrerenderServiceProvider::class, + ]; + } + + public function getEnvironmentSetUp($app): void + { + $app['config']->set('database.default', 'sqlite'); + $app['config']->set('database.connections.sqlite', [ + 'driver' => 'sqlite', + 'database' => ':memory:', + 'prefix' => '', + ]); + + $app->make(Kernel::class)->prependMiddleware(PrerenderMiddleware::class); + + $this->setupRoutes(); + + $app->bind(Client::class, function () { + return createMockPrerenderClient(); + }); + } + + protected function setupRoutes(): void + { + Route::get('test-middleware', function () { + return response('GET - Success')->header('Content-Type', 'text/plain'); + }); + + Route::post('test-middleware', function () { + return response('Success')->header('Content-Type', 'text/plain'); + }); + } } From 7babcdfc4ec1b2123ec2138edd9813e0075254bd Mon Sep 17 00:00:00 2001 From: Rhys Lees <43909932+RhysLees@users.noreply.github.com> Date: Mon, 3 Mar 2025 22:53:54 +0000 Subject: [PATCH 08/12] WIP --- .gitattributes | 12 +++++++++-- .gitignore | 12 +++++------ .php-cs-fixer.cache | 1 + phpstan-baseline.neon | 0 phpstan.neon.dist | 13 ++++++++++++ phpunit.xml | 26 ++++++++++++++++------- phpunit.xml.dist | 49 ++++++++++++++++++++++++------------------- 7 files changed, 77 insertions(+), 36 deletions(-) create mode 100644 .php-cs-fixer.cache create mode 100644 phpstan-baseline.neon create mode 100644 phpstan.neon.dist diff --git a/.gitattributes b/.gitattributes index 61e9c5f..9e9519b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,10 +2,18 @@ # https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html # Ignore all test and documentation with "export-ignore". +/.github export-ignore /.gitattributes export-ignore /.gitignore export-ignore /phpunit.xml.dist export-ignore +/art export-ignore +/docs export-ignore /tests export-ignore /.editorconfig export-ignore -/.php_cs.dist export-ignore -/.github export-ignore +/.php_cs.dist.php export-ignore +/psalm.xml export-ignore +/psalm.xml.dist export-ignore +/testbench.yaml export-ignore +/UPGRADING.md export-ignore +/phpstan.neon.dist export-ignore +/phpstan-baseline.neon export-ignore diff --git a/.gitignore b/.gitignore index 7514ae6..91b23b2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,12 @@ -.DS_Store .idea .phpunit.result.cache .phpunit.cache -build composer.lock coverage -docs +phpunit.xml +phpstan.neon +testbench.yaml vendor -.php_cs.cache -.php-cs-fixer.cache -coverage.xml +node_modules +.phpactor.json +build diff --git a/.php-cs-fixer.cache b/.php-cs-fixer.cache new file mode 100644 index 0000000..65d2b2b --- /dev/null +++ b/.php-cs-fixer.cache @@ -0,0 +1 @@ +{"php":"8.3.12","version":"3.70.0:v3.70.0#2ecd5aae0edc937f0d5aa4a22d1d705c6b2e084e","indent":" ","lineEnding":"\n","rules":{"blank_line_after_namespace":true,"braces_position":true,"class_definition":true,"constant_case":true,"control_structure_braces":true,"control_structure_continuation_position":true,"elseif":true,"function_declaration":true,"indentation_type":true,"line_ending":true,"lowercase_keywords":true,"method_argument_space":{"on_multiline":"ensure_fully_multiline","keep_multiple_spaces_after_comma":true},"no_break_comment":true,"no_closing_tag":true,"no_multiple_statements_per_line":true,"no_space_around_double_colon":true,"no_spaces_after_function_name":true,"no_trailing_whitespace":true,"no_trailing_whitespace_in_comment":true,"single_blank_line_at_eof":true,"single_class_element_per_statement":{"elements":["property"]},"single_import_per_statement":true,"single_line_after_imports":true,"single_space_around_construct":{"constructs_followed_by_a_single_space":["abstract","as","case","catch","class","do","else","elseif","final","for","foreach","function","if","interface","namespace","private","protected","public","static","switch","trait","try","use_lambda","while"],"constructs_preceded_by_a_single_space":["as","else","elseif","use_lambda"]},"spaces_inside_parentheses":true,"statement_indentation":true,"switch_case_semicolon_to_colon":true,"switch_case_space":true,"visibility_required":{"elements":["method","property"]},"encoding":true,"full_opening_tag":true,"array_syntax":{"syntax":"short"},"ordered_imports":{"sort_algorithm":"alpha"},"no_unused_imports":true,"trailing_comma_in_multiline":true,"phpdoc_scalar":true,"unary_operator_spaces":true,"binary_operator_spaces":true,"blank_line_before_statement":{"statements":["break","continue","declare","return","throw","try"]},"phpdoc_single_line_var_spacing":true,"phpdoc_var_without_name":true,"single_trait_insert_per_statement":true,"single_quote":true},"hashes":{"\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder2962\/tests\/PrerenderMiddlewareTest.php":"8a57a9fd0dfbbd8568f512e46a19da02","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder4256\/tests\/TestCase.php":"130fb887a0f4e617c71bfbf1d4134e07","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder2007\/tests\/TestCase.php":"130fb887a0f4e617c71bfbf1d4134e07","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder1941\/tests\/Feature\/PrerenderMiddlewareTest.php":"1612783abbae5207c7c3a3ad7e9f6c6e","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder950\/tests\/Feature\/PrerenderMiddlewareTest.php":"1612783abbae5207c7c3a3ad7e9f6c6e","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder293\/tests\/TestCase.php":"79538e1112e25458e40348dc07f2548d","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder4960\/tests\/TestCase.php":"8e3feb5532fb250daa80057c08790904","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder347\/tests\/PrerenderMiddlewareTest.php":"8a57a9fd0dfbbd8568f512e46a19da02","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder3233\/tests\/TestCase.php":"130fb887a0f4e617c71bfbf1d4134e07","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder2210\/tests\/Feature\/PrerenderMiddlewareTest.php":"1612783abbae5207c7c3a3ad7e9f6c6e","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder1934\/tests\/Feature\/PrerenderMiddlewareTest.php":"1612783abbae5207c7c3a3ad7e9f6c6e","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder2796\/tests\/TestCase.php":"8e3feb5532fb250daa80057c08790904","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder4866\/tests\/TestCase.php":"044189bdf2aab76cf9b5cbf6dd03dee7"}} \ No newline at end of file diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon new file mode 100644 index 0000000..e69de29 diff --git a/phpstan.neon.dist b/phpstan.neon.dist new file mode 100644 index 0000000..facf7fa --- /dev/null +++ b/phpstan.neon.dist @@ -0,0 +1,13 @@ + +includes: + - phpstan-baseline.neon + +parameters: + level: 5 + paths: + - src + - config + tmpDir: build/phpstan + checkOctaneCompatibility: true + checkModelProperties: true + noEnvCallsOutsideOfConfig: false diff --git a/phpunit.xml b/phpunit.xml index 7d0904f..d41aea3 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,17 +1,29 @@ + xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.3/phpunit.xsd" backupGlobals="false" + bootstrap="vendor/autoload.php" colors="true" processIsolation="false" stopOnFailure="false" + executionOrder="random" failOnWarning="true" failOnRisky="true" failOnEmptyTestSuite="true" + beStrictAboutOutputDuringTests="true" cacheDirectory=".phpunit.cache" backupStaticProperties="false"> - - ./tests + + tests + + + + + + + + + + + + + - ./app ./src diff --git a/phpunit.xml.dist b/phpunit.xml.dist index eedb770..d41aea3 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,23 +1,30 @@ - - - - tests - - - - - - - - - - - - - - - ./src - - + + + + tests + + + + + + + + + + + + + + + + + + ./src + + From f64e787f186297c8fb73323193ea0a7c0d4b3e38 Mon Sep 17 00:00:00 2001 From: Rhys Lees <43909932+RhysLees@users.noreply.github.com> Date: Mon, 3 Mar 2025 22:54:45 +0000 Subject: [PATCH 09/12] WIP --- .php-cs-fixer.cache | 1 - .php-cs-fixer.dist.php | 36 ------------------------------------ 2 files changed, 37 deletions(-) delete mode 100644 .php-cs-fixer.cache delete mode 100644 .php-cs-fixer.dist.php diff --git a/.php-cs-fixer.cache b/.php-cs-fixer.cache deleted file mode 100644 index 65d2b2b..0000000 --- a/.php-cs-fixer.cache +++ /dev/null @@ -1 +0,0 @@ -{"php":"8.3.12","version":"3.70.0:v3.70.0#2ecd5aae0edc937f0d5aa4a22d1d705c6b2e084e","indent":" ","lineEnding":"\n","rules":{"blank_line_after_namespace":true,"braces_position":true,"class_definition":true,"constant_case":true,"control_structure_braces":true,"control_structure_continuation_position":true,"elseif":true,"function_declaration":true,"indentation_type":true,"line_ending":true,"lowercase_keywords":true,"method_argument_space":{"on_multiline":"ensure_fully_multiline","keep_multiple_spaces_after_comma":true},"no_break_comment":true,"no_closing_tag":true,"no_multiple_statements_per_line":true,"no_space_around_double_colon":true,"no_spaces_after_function_name":true,"no_trailing_whitespace":true,"no_trailing_whitespace_in_comment":true,"single_blank_line_at_eof":true,"single_class_element_per_statement":{"elements":["property"]},"single_import_per_statement":true,"single_line_after_imports":true,"single_space_around_construct":{"constructs_followed_by_a_single_space":["abstract","as","case","catch","class","do","else","elseif","final","for","foreach","function","if","interface","namespace","private","protected","public","static","switch","trait","try","use_lambda","while"],"constructs_preceded_by_a_single_space":["as","else","elseif","use_lambda"]},"spaces_inside_parentheses":true,"statement_indentation":true,"switch_case_semicolon_to_colon":true,"switch_case_space":true,"visibility_required":{"elements":["method","property"]},"encoding":true,"full_opening_tag":true,"array_syntax":{"syntax":"short"},"ordered_imports":{"sort_algorithm":"alpha"},"no_unused_imports":true,"trailing_comma_in_multiline":true,"phpdoc_scalar":true,"unary_operator_spaces":true,"binary_operator_spaces":true,"blank_line_before_statement":{"statements":["break","continue","declare","return","throw","try"]},"phpdoc_single_line_var_spacing":true,"phpdoc_var_without_name":true,"single_trait_insert_per_statement":true,"single_quote":true},"hashes":{"\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder2962\/tests\/PrerenderMiddlewareTest.php":"8a57a9fd0dfbbd8568f512e46a19da02","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder4256\/tests\/TestCase.php":"130fb887a0f4e617c71bfbf1d4134e07","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder2007\/tests\/TestCase.php":"130fb887a0f4e617c71bfbf1d4134e07","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder1941\/tests\/Feature\/PrerenderMiddlewareTest.php":"1612783abbae5207c7c3a3ad7e9f6c6e","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder950\/tests\/Feature\/PrerenderMiddlewareTest.php":"1612783abbae5207c7c3a3ad7e9f6c6e","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder293\/tests\/TestCase.php":"79538e1112e25458e40348dc07f2548d","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder4960\/tests\/TestCase.php":"8e3feb5532fb250daa80057c08790904","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder347\/tests\/PrerenderMiddlewareTest.php":"8a57a9fd0dfbbd8568f512e46a19da02","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder3233\/tests\/TestCase.php":"130fb887a0f4e617c71bfbf1d4134e07","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder2210\/tests\/Feature\/PrerenderMiddlewareTest.php":"1612783abbae5207c7c3a3ad7e9f6c6e","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder1934\/tests\/Feature\/PrerenderMiddlewareTest.php":"1612783abbae5207c7c3a3ad7e9f6c6e","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder2796\/tests\/TestCase.php":"8e3feb5532fb250daa80057c08790904","\/private\/var\/folders\/5p\/yjskyj_10tx0k7221hbl8cfh0000gn\/T\/PHP CS Fixertemp_folder4866\/tests\/TestCase.php":"044189bdf2aab76cf9b5cbf6dd03dee7"}} \ No newline at end of file diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php deleted file mode 100644 index c55db8a..0000000 --- a/.php-cs-fixer.dist.php +++ /dev/null @@ -1,36 +0,0 @@ -in([ - __DIR__ . '/src', - __DIR__ . '/tests', - ]) - ->name('*.php') - ->notName('*.blade.php') - ->ignoreDotFiles(true) - ->ignoreVCS(true); - -return (new PhpCsFixer\Config()) - ->setRules([ - '@PSR2' => true, - 'array_syntax' => ['syntax' => 'short'], - 'ordered_imports' => ['sort_algorithm' => 'alpha'], - 'no_unused_imports' => true, - 'not_operator_with_successor_space' => false, - 'trailing_comma_in_multiline' => true, - 'phpdoc_scalar' => true, - 'unary_operator_spaces' => true, - 'binary_operator_spaces' => true, - 'blank_line_before_statement' => [ - 'statements' => ['break', 'continue', 'declare', 'return', 'throw', 'try'], - ], - 'phpdoc_single_line_var_spacing' => true, - 'phpdoc_var_without_name' => true, - 'method_argument_space' => [ - 'on_multiline' => 'ensure_fully_multiline', - 'keep_multiple_spaces_after_comma' => true, - ], - 'single_trait_insert_per_statement' => true, - 'single_quote' => true, - ]) - ->setFinder($finder); From 6879b1b0f23074397371801ad18a74df0de26d4e Mon Sep 17 00:00:00 2001 From: Rhys Lees <43909932+RhysLees@users.noreply.github.com> Date: Mon, 3 Mar 2025 23:02:44 +0000 Subject: [PATCH 10/12] WIP --- .github/workflows/phpstan.yml | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml index ef2fadf..b0cde6a 100644 --- a/.github/workflows/phpstan.yml +++ b/.github/workflows/phpstan.yml @@ -1,21 +1,26 @@ -name: Fix PHP code style issues +name: PHPStan -on: [push] +on: + push: + paths: + - '**.php' + - 'phpstan.neon.dist' jobs: - php-code-styling: + phpstan: + name: phpstan runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 + - uses: actions/checkout@v4 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 with: - ref: ${{ github.head_ref }} + php-version: '8.4' + coverage: none - - name: Fix PHP code style issues - uses: aglipanci/laravel-pint-action@2.5 + - name: Install composer dependencies + uses: ramsey/composer-install@v3 - - name: Commit changes - uses: stefanzweifel/git-auto-commit-action@v5 - with: - commit_message: Fix styling + - name: Run PHPStan + run: ./vendor/bin/phpstan --error-format=github From 8a087f73dcd21a275f80b07d9e233efa2026ae97 Mon Sep 17 00:00:00 2001 From: Rhys Lees <43909932+RhysLees@users.noreply.github.com> Date: Mon, 3 Mar 2025 23:16:16 +0000 Subject: [PATCH 11/12] WIP --- src/PrerenderMiddleware.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/PrerenderMiddleware.php b/src/PrerenderMiddleware.php index 69dcf66..df40c6d 100644 --- a/src/PrerenderMiddleware.php +++ b/src/PrerenderMiddleware.php @@ -79,6 +79,7 @@ public function __construct(Guzzle $client) { $this->returnSoftHttpCodes = config('prerender.prerender_soft_http_codes'); + // @phpstan-ignore-next-line $guzzleConfig = $client->getConfig(); $guzzleConfig['timeout'] = config('prerender.timeout'); From 233faa004c28405f39ce15fe6af68f8b2a3b0c61 Mon Sep 17 00:00:00 2001 From: Rhys Lees <43909932+RhysLees@users.noreply.github.com> Date: Tue, 4 Mar 2025 17:55:50 +0000 Subject: [PATCH 12/12] WIP --- .github/workflows/phpstan.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml index b0cde6a..f381a0b 100644 --- a/.github/workflows/phpstan.yml +++ b/.github/workflows/phpstan.yml @@ -1,10 +1,6 @@ name: PHPStan -on: - push: - paths: - - '**.php' - - 'phpstan.neon.dist' +on: [push] jobs: phpstan: