From 84674e4f1ebb2a43e2ef12821d8cfbb8ad3a420d Mon Sep 17 00:00:00 2001 From: Punyapal Shah Date: Mon, 19 May 2025 22:42:41 +0530 Subject: [PATCH 1/5] feat: add assertChecked method and corresponding tests --- src/Operations/AssertChecked.php | 29 +++++++++++++++++++ src/PendingTest.php | 3 +- .../Browser/Operations/AssertCheckedTest.php | 17 +++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 src/Operations/AssertChecked.php create mode 100644 tests/Browser/Operations/AssertCheckedTest.php diff --git a/src/Operations/AssertChecked.php b/src/Operations/AssertChecked.php new file mode 100644 index 00000000..9b3d2b56 --- /dev/null +++ b/src/Operations/AssertChecked.php @@ -0,0 +1,29 @@ +page->querySelector($selector); + + expect($element)->toBeInstanceOf(Element::class) + ->and($element->isChecked())->toBeTrue(); + + return $this; + } +} diff --git a/src/PendingTest.php b/src/PendingTest.php index 31cb430c..2fe36d7c 100644 --- a/src/PendingTest.php +++ b/src/PendingTest.php @@ -5,6 +5,7 @@ namespace Pest\Browser; use Pest\Browser\Contracts\Operation; +use Pest\Browser\Operations\AssertChecked; use Pest\Browser\Operations\AssertUrlIs; use Pest\Browser\Operations\Visit; use Pest\Browser\Playwright\Client; @@ -15,7 +16,7 @@ */ final class PendingTest { - use AssertUrlIs, Visit; + use AssertUrlIs, Visit, AssertChecked; /** * The pending operations. diff --git a/tests/Browser/Operations/AssertCheckedTest.php b/tests/Browser/Operations/AssertCheckedTest.php new file mode 100644 index 00000000..e6d9cf70 --- /dev/null +++ b/tests/Browser/Operations/AssertCheckedTest.php @@ -0,0 +1,17 @@ +visit(playgroundUrl('/test/form-inputs')) + ->assertChecked('input[name="checked-checkbox"]'); + }); + + it('fails when checkbox is not checked', function () { + $this->visit(playgroundUrl('/test/form-inputs')) + ->assertChecked('input[name="default-checkbox"]'); + })->throws(ExpectationFailedException::class); +}); From 4086df802d63d1d240df5ea995abfc41608d3051 Mon Sep 17 00:00:00 2001 From: Punyapal Shah Date: Tue, 20 May 2025 00:06:26 +0530 Subject: [PATCH 2/5] feat: implement page function for browser navigation and remove assertChecked operation --- src/Autoload.php | 19 ++++++++++++ src/Operations/AssertChecked.php | 29 ------------------- .../Browser/Operations/AssertCheckedTest.php | 11 ++++--- tests/Pest.php | 11 +++++++ 4 files changed, 37 insertions(+), 33 deletions(-) delete mode 100644 src/Operations/AssertChecked.php diff --git a/src/Autoload.php b/src/Autoload.php index eddb8204..9e6c9fee 100644 --- a/src/Autoload.php +++ b/src/Autoload.php @@ -5,6 +5,8 @@ namespace Pest\Browser; use Pest\Browser\Playwright\Client; +use Pest\Browser\Playwright\Page; +use Pest\Browser\Playwright\Playwright; use Pest\Browser\Playwright\Server; use Pest\Plugin; use Pest\Plugins\Parallel; @@ -24,6 +26,23 @@ function visit(string $url): PendingTest } } +if (! function_exists('\Pest\Browser\page')) { + /** + * Visits the given URL, and starts a new browser test. + */ + function page(string $url = '/'): Page + { + Server::instance()->start(); + Client::instance()->connectTo(Server::instance()->url('?browser=chromium')); + + $browser = Playwright::chromium()->launch(); + $page = $browser->newPage(); + $page->goto($url); + + return $page; + } +} + register_shutdown_function(function (): void { if (Parallel::isEnabled() || ! Parallel::isWorker()) { Server::instance()->stop(); diff --git a/src/Operations/AssertChecked.php b/src/Operations/AssertChecked.php deleted file mode 100644 index 9b3d2b56..00000000 --- a/src/Operations/AssertChecked.php +++ /dev/null @@ -1,29 +0,0 @@ -page->querySelector($selector); - - expect($element)->toBeInstanceOf(Element::class) - ->and($element->isChecked())->toBeTrue(); - - return $this; - } -} diff --git a/tests/Browser/Operations/AssertCheckedTest.php b/tests/Browser/Operations/AssertCheckedTest.php index e6d9cf70..a2a30879 100644 --- a/tests/Browser/Operations/AssertCheckedTest.php +++ b/tests/Browser/Operations/AssertCheckedTest.php @@ -3,15 +3,18 @@ declare(strict_types=1); use PHPUnit\Framework\ExpectationFailedException; +use function Pest\Browser\page; describe('assertChecked', function () { it('passes when checkbox is checked', function () { - $this->visit(playgroundUrl('/test/form-inputs')) - ->assertChecked('input[name="checked-checkbox"]'); + $page = page(playgroundUrl('/test/form-inputs')); + + expect($page->querySelector('input[name="checked-checkbox"]'))->toBeChecked(); }); it('fails when checkbox is not checked', function () { - $this->visit(playgroundUrl('/test/form-inputs')) - ->assertChecked('input[name="default-checkbox"]'); + $page = page(playgroundUrl('/test/form-inputs')); + + expect($page->querySelector('input[name="unchecked-checkbox"]'))->toBeChecked(); })->throws(ExpectationFailedException::class); }); diff --git a/tests/Pest.php b/tests/Pest.php index 73a8273f..1bc3cd37 100644 --- a/tests/Pest.php +++ b/tests/Pest.php @@ -27,3 +27,14 @@ function playgroundUrl(string $path = '/'): string { return 'http://localhost:9357/'.mb_ltrim($path, '/'); } + +use Pest\Browser\Playwright\Element; +use Pest\Expectation; + +expect()->extend('toBeChecked', function (): Expectation { + + expect($this->value)->toBeInstanceOf(Element::class) + ->and($this->value->isChecked())->toBeTrue(); + + return $this; +}); From 4ce0697572e995a2c36b60eb68f60d996eebbeae Mon Sep 17 00:00:00 2001 From: Punyapal Shah Date: Tue, 20 May 2025 00:17:03 +0530 Subject: [PATCH 3/5] feat: implement page method in Browser trait and update tests to use it --- src/Browser.php | 10 ++++++++++ tests/Browser/Operations/AssertCheckedTest.php | 5 ++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/Browser.php b/src/Browser.php index 79a915cf..2d63e752 100644 --- a/src/Browser.php +++ b/src/Browser.php @@ -4,6 +4,8 @@ namespace Pest\Browser; +use Pest\Browser\Playwright\Page; + /** * @internal */ @@ -16,4 +18,12 @@ public function visit(string $url): PendingTest { return visit($url); } + + /** + * gets the page instance for given URL. + */ + public function page(string $url): Page + { + return page($url); + } } diff --git a/tests/Browser/Operations/AssertCheckedTest.php b/tests/Browser/Operations/AssertCheckedTest.php index a2a30879..7c8560aa 100644 --- a/tests/Browser/Operations/AssertCheckedTest.php +++ b/tests/Browser/Operations/AssertCheckedTest.php @@ -3,17 +3,16 @@ declare(strict_types=1); use PHPUnit\Framework\ExpectationFailedException; -use function Pest\Browser\page; describe('assertChecked', function () { it('passes when checkbox is checked', function () { - $page = page(playgroundUrl('/test/form-inputs')); + $page = $this->page(playgroundUrl('/test/form-inputs')); expect($page->querySelector('input[name="checked-checkbox"]'))->toBeChecked(); }); it('fails when checkbox is not checked', function () { - $page = page(playgroundUrl('/test/form-inputs')); + $page = $this->page(playgroundUrl('/test/form-inputs')); expect($page->querySelector('input[name="unchecked-checkbox"]'))->toBeChecked(); })->throws(ExpectationFailedException::class); From 1eaeb533683803b7b0756653fed246d30d376038 Mon Sep 17 00:00:00 2001 From: Punyapal Shah Date: Tue, 20 May 2025 00:18:06 +0530 Subject: [PATCH 4/5] feat: remove AssertChecked operation from PendingTest class --- src/PendingTest.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/PendingTest.php b/src/PendingTest.php index 2fe36d7c..31cb430c 100644 --- a/src/PendingTest.php +++ b/src/PendingTest.php @@ -5,7 +5,6 @@ namespace Pest\Browser; use Pest\Browser\Contracts\Operation; -use Pest\Browser\Operations\AssertChecked; use Pest\Browser\Operations\AssertUrlIs; use Pest\Browser\Operations\Visit; use Pest\Browser\Playwright\Client; @@ -16,7 +15,7 @@ */ final class PendingTest { - use AssertUrlIs, Visit, AssertChecked; + use AssertUrlIs, Visit; /** * The pending operations. From 2a85598dc27e8fc050c141c161703207b1cdfd85 Mon Sep 17 00:00:00 2001 From: Punyapal Shah Date: Tue, 20 May 2025 11:47:31 +0530 Subject: [PATCH 5/5] feat: reorganize imports in Pest.php and clean up unused code --- tests/Pest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Pest.php b/tests/Pest.php index 1bc3cd37..91c5ee10 100644 --- a/tests/Pest.php +++ b/tests/Pest.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Pest\Browser\Playwright\Element; +use Pest\Expectation; use Pest\TestSuite; pest() @@ -28,9 +30,7 @@ function playgroundUrl(string $path = '/'): string return 'http://localhost:9357/'.mb_ltrim($path, '/'); } -use Pest\Browser\Playwright\Element; -use Pest\Expectation; - +// todo: move this to Pest core expect()->extend('toBeChecked', function (): Expectation { expect($this->value)->toBeInstanceOf(Element::class)