raiolanetworks / plugin-seo-test
This Composer package provides a seamless integration for testing SEO aspects of your Laravel applications. Compatible with both Pest and PHPUnit, it offers a collection of tools and assertions specifically designed to evaluate on-page SEO elements like meta tags, title tags, canonical URLs, and str
Requires
- php: ^8.0.2
- illuminate/macroable: ^7.0|^8.0|^9.0|^10.0|^11.0
- phpunit/phpunit: ^8.3|^9.0|^10.0
- spatie/url: ^1.3.4|^2.0
- symfony/dom-crawler: ^5.4|^6.1
Requires (Dev)
- laravel/pint: ^1.0
- phpstan/phpstan: ^1.8
Replaces
README
This Composer package provides a seamless integration for testing SEO aspects of your Laravel applications. Compatible with both Pest and PHPUnit, it offers a collection of tools and assertions specifically designed to evaluate on-page SEO elements like meta tags, title tags, canonical URLs, and structured data. By automating SEO testing, this plugin ensures that your application consistently adheres to best SEO practices, helping you catch potential SEO issues early in the development cycle.
Get to know us
Installation
Installation
You can install the package via composer:
composer require raiolanetworks/plugin-seo-test --dev
Usage
// Create TestSEO instance using the response: $seo = new TestSEO($htmlResponse); // Perform assertions: $seo->assertTitleEndsWith(' - My Website'); // Assert the data yourself: $this->assertEquals( 'My title - My Website', $seo->data->title() );
Look at the following examples using PHPUnit, Laravel, and Pest.
PHPUnit
public function testLandingPageSEO() { // Arrange // ... // Act $response = $client->get('/')->send(); // Assert $this->assertEquals(200, $response->getStatusCode()); $html = json_decode($response->getBody(true), true); $seo = new TestSEO($html); // Assert $seo ->assertTitleEndsWith(' - My Website') ->assertCanonicalIs('https://www.mywebsite.com/'); }
Laravel
public function test_landing_page_SEO() { // Arrange // ... // Act $response = $this->get('/'); // Assert $response->assertStatus(200); $seo = new TestSEO($response->getContent()); $seo ->assertTitleEndsWith(' - My Website') ->assertCanonicalIs('https://www.mywebsite.com/'); }
Pest
test('landing page SEO tags', function () { // Arrange // ... // Act $response = get('/')->assertStatus(200); $seo = new TestSEO($response->getContent()); // Assert expect($seo->data) ->title()->toEndWith(' - My Website') ->description()->toBe('This is my description') ->canonical()->not()->toBeNull() ->robots()->index()->toBeTrue() ->robots()->nofollow()->toBeTrue(); });
SEO Data
You can access the SEO Data yourself by accessing the public property TestSEO->data
.
Here are the available methods:
The SEOData class is Macroable, so feel free to extend it yourself.
Assertions
Snapshots
When it comes to SEO, a snapshot test is a great way to ensure nothing has been changed by accident.
Here is an example:
$seo = new TestSEO($response->getContent(), snapshotSerializer: null); $json = json_encode($seo);
By default, the SEO tags are serialized using the SimpleSerializer
.
Make your own serializer by implementing the SnapshotSerializer
interface:
$seo = new TestSEO($response->getContent(), new MyCustomSerializer()); $json = json_encode($seo);
Pest Example
use function Spatie\Snapshots\{assertMatchesSnapshot, assertMatchesJsonSnapshot}; use Raiolanetworks\PluginSEOTest\TestSEO; test('landing page SEO', function () { $response = $this->get('/'); $response->assertStatus(200); $seo = new TestSEO($response->getContent()); assertMatchesJsonSnapshot(json_encode($seo)); });
Note: this example requires spatie/pest-plugin-snapshots
.
Contributing
Please see CONTRIBUTING for details.
Credits
Credits to the original project
License
The MIT License (MIT). Please see License File for more information.