rg -n "^## Suite|^### Test|\*\*Total:\*\*|\| [0-9]+ -" specs/08-PLAYWRIGHT-E2E-PLAN.md

Question: ^## Suite|^### Test|\*\*Total:\*\*|\| [0-9]+ -

11:| 1 - Smoke Tests | `tests/Browser/SmokeTest.php` | 10 | Hit every major page, assert HTTP 200 and no JS errors | Store 1, Products, Collections, Pages |
12:| 2 - Admin Authentication | `tests/Browser/Admin/AuthenticationTest.php` | 10 | Admin login, logout, invalid credentials, session access control | Admin user |
13:| 3 - Admin Product Management | `tests/Browser/Admin/ProductManagementTest.php` | 7 | Product CRUD: listing, creating, editing, archiving, filtering | Admin user, Products (incl. #15 draft) |
14:| 4 - Admin Order Management | `tests/Browser/Admin/OrderManagementTest.php` | 11 | Order listing, filtering, detail view, fulfillment, refund, confirm payment, fulfillment guard, mark shipped/delivered | Admin user, Orders (#1001, #1005), Customer |
15:| 5 - Admin Discount Management | `tests/Browser/Admin/DiscountManagementTest.php` | 6 | Discount code listing, creation, editing | Admin user, Discounts |
16:| 6 - Admin Settings | `tests/Browser/Admin/SettingsTest.php` | 7 | Store settings, shipping zones, tax config, domains | Admin user, Shipping zones, Store 1 |
17:| 7 - Storefront Browsing | `tests/Browser/Storefront/BrowsingTest.php` | 15 | Home page, collections, product detail, variants, search, pages | Products, Collections, Pages, Products #15/#17/#18 |
18:| 8 - Cart Flow | `tests/Browser/Storefront/CartTest.php` | 12 | Cart lifecycle: add, update qty, remove, discounts, totals | Products, Discounts (all codes) |
19:| 9 - Checkout Flow | `tests/Browser/Storefront/CheckoutTest.php` | 13 | Full checkout: contact, address, shipping, payment method selection, payment, confirmation, magic card decline, bank transfer flow | Products, Shipping zones, Discounts |
20:| 10 - Customer Account | `tests/Browser/Storefront/CustomerAccountTest.php` | 12 | Registration, login, order history, addresses, logout | Customer user, Orders (#1001/#1002/#1004) |
21:| 11 - Inventory Enforcement | `tests/Browser/Storefront/InventoryTest.php` | 4 | Inventory policy enforcement: deny vs. continue | Products #17 (deny), #18 (continue), #1 |
22:| 12 - Tenant Isolation | `tests/Browser/Storefront/TenantIsolationTest.php` | 5 | Multi-store data isolation verification | Store 1, Admin user, Customer user |
23:| 13 - Responsive / Mobile | `tests/Browser/Storefront/ResponsiveTest.php` | 8 | Mobile and tablet viewport rendering and interaction | Products, Admin user |
24:| 14 - Accessibility | `tests/Browser/Storefront/AccessibilityTest.php` | 11 | Heading hierarchy, ARIA labels, form labels, keyboard nav | Products, Store 1 |
25:| 15 - Admin Collections | `tests/Browser/Admin/CollectionManagementTest.php` | 3 | Collection CRUD in admin | Admin user, Collections |
26:| 16 - Admin Customers | `tests/Browser/Admin/CustomerManagementTest.php` | 3 | Customer listing and detail views | Admin user, Customer user, Orders |
27:| 17 - Admin Pages | `tests/Browser/Admin/PageManagementTest.php` | 3 | CMS page management | Admin user, Pages |
28:| 18 - Admin Analytics | `tests/Browser/Admin/AnalyticsTest.php` | 3 | Analytics dashboard rendering | Admin user, Orders |
172:## Suite 1: Smoke Tests
180:### Test 1.1: Loads the storefront home page
193:### Test 1.2: Loads a collection page
206:### Test 1.3: Loads a product page
220:### Test 1.4: Loads the cart page
233:### Test 1.5: Loads the customer login page
246:### Test 1.6: Loads the admin login page
259:### Test 1.7: Loads the about page
272:### Test 1.8: Loads the search page
285:### Test 1.9: Loads all collections listing
298:### Test 1.10: Has no errors on critical pages (batch)
312:## Suite 2: Admin Authentication
338:### Test 2.1: Can log in as admin
354:### Test 2.2: Shows error for invalid credentials
370:### Test 2.3: Shows error for empty email
385:### Test 2.4: Shows error for empty password
400:### Test 2.5: Redirects unauthenticated users to login from dashboard
413:### Test 2.6: Redirects unauthenticated users to login from products
426:### Test 2.7: Can log out
444:### Test 2.8: Can navigate through admin sidebar sections
470:### Test 2.9: Can navigate to analytics from sidebar
487:### Test 2.10: Can navigate to themes from sidebar
508:## Suite 3: Admin Product Management
528:### Test 3.1: Shows the product list with seeded products
546:### Test 3.2: Can create a new product
571:### Test 3.3: Can edit an existing product title
591:### Test 3.4: Can archive a product
619:### Test 3.5: Shows draft products only in admin, not storefront
640:### Test 3.6: Can search products in admin
656:### Test 3.7: Can filter products by status in admin
676:## Suite 4: Admin Order Management
700:### Test 4.1: Shows the order list with seeded orders
715:### Test 4.2: Can filter orders by status
735:### Test 4.3: Shows order detail with line items and totals
755:### Test 4.4: Shows order timeline events
772:### Test 4.5: Can create a fulfillment
793:### Test 4.6: Can process a refund
814:### Test 4.7: Shows customer information in order detail
830:### Test 4.8: Can confirm bank transfer pa…3181 chars truncated… for declined credit card (magic number)
2031:### Test 9.12: Shows error for insufficient funds (magic number)
2056:### Test 9.13: Switches between payment method forms
2078:## Suite 10: Customer Account
2103:### Test 10.1: Can register a new customer
2121:### Test 10.2: Shows validation errors for duplicate email registration
2139:### Test 10.3: Shows validation errors for mismatched passwords
2157:### Test 10.4: Can log in as existing customer
2174:### Test 10.5: Shows error for invalid customer credentials
2190:### Test 10.6: Redirects unauthenticated customers to login
2203:### Test 10.7: Shows order history for logged-in customer
2222:### Test 10.8: Shows order detail for customer order
2240:### Test 10.9: Can view addresses
2255:### Test 10.10: Can add a new address
2280:### Test 10.11: Can edit an existing address
2299:### Test 10.12: Can log out
2319:## Suite 11: Inventory Enforcement
2336:### Test 11.1: Blocks add-to-cart for out-of-stock deny-policy product
2350:### Test 11.2: Allows add-to-cart for out-of-stock continue-policy product
2368:### Test 11.3: Shows correct stock status for in-stock product
2383:### Test 11.4: Prevents adding more than available stock for deny-policy product
2403:## Suite 12: Tenant Isolation
2432:### Test 12.1: Store 1 only shows Store 1 products
2447:### Test 12.2: Store 1 collections only contain Store 1 products
2461:### Test 12.3: Admin cannot access other store data
2481:### Test 12.4: Search only returns current store products
2495:### Test 12.5: Customer accounts are scoped to their store
2514:## Suite 13: Responsive / Mobile
2529:### Test 13.1: Storefront home works on mobile viewport
2546:### Test 13.2: Product page stacks layout on mobile
2561:### Test 13.3: Can add to cart on mobile
2578:### Test 13.4: Cart page works on mobile
2597:### Test 13.5: Checkout flow works on mobile
2626:### Test 13.6: Admin login works on tablet viewport
2643:### Test 13.7: Admin sidebar navigation works on tablet
2662:### Test 13.8: Collection page works on mobile with filters
2680:## Suite 14: Accessibility
2700:### Test 14.1: Home page has no JavaScript errors or console warnings
2713:### Test 14.2: Home page has proper heading hierarchy
2728:### Test 14.3: Product page has proper ARIA labels for variant selector
2742:### Test 14.4: Product page images have alt text
2755:### Test 14.5: Customer login form has accessible labels
2769:### Test 14.6: Admin login form has accessible labels
2783:### Test 14.7: Checkout form has accessible labels
2802:### Test 14.8: Checkout validation errors are accessible
2822:### Test 14.9: Can navigate storefront with keyboard only
2838:### Test 14.10: Cart page has no console errors or warnings
2851:### Test 14.11: Search page has proper form labels
2866:## Suite 15: Admin Collections Management
2874:### Test 15.1: Shows the collection list with seeded collections
2890:### Test 15.2: Can create a new collection
2910:### Test 15.3: Can edit a collection
2930:## Suite 16: Admin Customer Management
2938:### Test 16.1: Shows the customer list
2954:### Test 16.2: Shows customer detail with order history
2972:### Test 16.3: Shows customer addresses
2990:## Suite 17: Admin Pages Management
2998:### Test 17.1: Shows the pages list
3013:### Test 17.2: Can create a new page
3032:### Test 17.3: Can edit an existing page
3052:## Suite 18: Admin Analytics Dashboard
3070:### Test 18.1: Shows the analytics dashboard
3085:### Test 18.2: Shows sales data
3101:### Test 18.3: Shows conversion funnel data
3122:| 1 - Smoke Tests | `tests/Browser/SmokeTest.php` | 10 |
3123:| 2 - Admin Authentication | `tests/Browser/Admin/AuthenticationTest.php` | 10 |
3124:| 3 - Admin Product Management | `tests/Browser/Admin/ProductManagementTest.php` | 7 |
3125:| 4 - Admin Order Management | `tests/Browser/Admin/OrderManagementTest.php` | 7 |
3126:| 5 - Admin Discount Management | `tests/Browser/Admin/DiscountManagementTest.php` | 6 |
3127:| 6 - Admin Settings | `tests/Browser/Admin/SettingsTest.php` | 7 |
3128:| 7 - Storefront Browsing | `tests/Browser/Storefront/BrowsingTest.php` | 15 |
3129:| 8 - Cart Flow | `tests/Browser/Storefront/CartTest.php` | 12 |
3130:| 9 - Checkout Flow | `tests/Browser/Storefront/CheckoutTest.php` | 8 |
3131:| 10 - Customer Account | `tests/Browser/Storefront/CustomerAccountTest.php` | 12 |
3132:| 11 - Inventory Enforcement | `tests/Browser/Storefront/InventoryTest.php` | 4 |
3133:| 12 - Tenant Isolation | `tests/Browser/Storefront/TenantIsolationTest.php` | 5 |
3134:| 13 - Responsive / Mobile | `tests/Browser/Storefront/ResponsiveTest.php` | 8 |
3135:| 14 - Accessibility | `tests/Browser/Storefront/AccessibilityTest.php` | 11 |
3136:| 15 - Admin Collections | `tests/Browser/Admin/CollectionManagementTest.php` | 3 |
3137:| 16 - Admin Customers | `tests/Browser/Admin/CustomerManagementTest.php` | 3 |
3138:| 17 - Admin Pages | `tests/Browser/Admin/PageManagementTest.php` | 3 |
3139:| 18 - Admin Analytics | `tests/Browser/Admin/AnalyticsTest.php` | 3 |


find tests/Browser -type f -name '*.php' -print | sort

Question: *.php


/bin/zsh
-lc
rg -n "^test\(" tests/Browser

Question: ^test\(

tests/Browser/Admin/CustomerManagementTest.php:129:test('shows the customer list', function (): void {
tests/Browser/Admin/CustomerManagementTest.php:136:test('shows customer detail with order history', function (): void {
tests/Browser/Admin/CustomerManagementTest.php:154:test('shows customer addresses', function (): void {
tests/Browser/Admin/CollectionManagementTest.php:63:test('shows the collection list with seeded collections', function (): void {
tests/Browser/Admin/CollectionManagementTest.php:70:test('can create a new collection', function (): void {
tests/Browser/Admin/CollectionManagementTest.php:99:test('can edit a collection', function (): void {
tests/Browser/Admin/OrderManagementTest.php:232:test('shows the order list with seeded orders', function (): void {
tests/Browser/Admin/OrderManagementTest.php:238:test('can filter orders by status', function (): void {
tests/Browser/Admin/OrderManagementTest.php:257:test('shows order detail with line items and totals', function (): void {
tests/Browser/Admin/OrderManagementTest.php:269:test('shows order timeline events', function (): void {
tests/Browser/Admin/OrderManagementTest.php:276:test('can create a fulfillment', function (): void {
tests/Browser/Admin/OrderManagementTest.php:280:test('can process a refund', function (): void {
tests/Browser/Admin/OrderManagementTest.php:293:test('shows customer information in order detail', function (): void {
tests/Browser/Admin/OrderManagementTest.php:299:test('can confirm bank transfer payment', function (): void {
tests/Browser/Admin/OrderManagementTest.php:311:test('shows fulfillment guard for unpaid order', function (): void {
tests/Browser/Admin/OrderManagementTest.php:319:test('can mark fulfillment as shipped', function (): void {
tests/Browser/Admin/OrderManagementTest.php:328:test('can mark fulfillment as delivered', function (): void {
tests/Browser/Admin/PageManagementTest.php:58:test('shows the pages list', function (): void {
tests/Browser/Admin/PageManagementTest.php:64:test('can create a new page', function (): void {
tests/Browser/Admin/PageManagementTest.php:88:test('can edit an existing page', function (): void {
tests/Browser/Admin/AuthenticationTest.php:46:test('can log in as admin', function (): void {
tests/Browser/Admin/AuthenticationTest.php:50:test('shows error for invalid credentials', function (): void {
tests/Browser/Admin/AuthenticationTest.php:61:test('shows error for empty email', function (): void {
tests/Browser/Admin/AuthenticationTest.php:68:test('shows error for empty password', function (): void {
tests/Browser/Admin/AuthenticationTest.php:75:test('redirects unauthenticated users to login from dashboard', function (): void {
tests/Browser/Admin/AuthenticationTest.php:83:test('redirects unauthenticated users to login from products', function (): void {
tests/Browser/Admin/AuthenticationTest.php:91:test('can log out', function (): void {
tests/Browser/Admin/AuthenticationTest.php:101:test('can navigate through admin sidebar sections', function (): void {
tests/Browser/Admin/AuthenticationTest.php:119:test('can navigate to analytics from sidebar', function (): void {
tests/Browser/Admin/AuthenticationTest.php:128:test('can navigate to themes from sidebar', function (): void {
tests/Browser/Admin/AnalyticsTest.php:52:test('shows the analytics dashboard', function (): void {
tests/Browser/Admin/AnalyticsTest.php:58:test('shows sales data', function (): void {
tests/Browser/Admin/AnalyticsTest.php:65:test('shows conversion funnel data', function (): void {
tests/Browser/Admin/SettingsTest.php:76:test('can view store settings', function (): void {
tests/Browser/Admin/SettingsTest.php:82:test('can update store name', function (): void {
tests/Browser/Admin/SettingsTest.php:101:test('can view shipping zones', function (): void {
tests/Browser/Admin/SettingsTest.php:109:test('can add a new shipping rate to an existing zone', function (): void {
tests/Browser/Admin/SettingsTest.php:138:test('can view tax settings', function (): void {
tests/Browser/Admin/SettingsTest.php:144:test('can update tax inclusion setting', function (): void {
tests/Browser/Admin/SettingsTest.php:160:test('can view domain settings', function (): void {
tests/Browser/Admin/ProductManagementTest.php:98:test('shows the product list with seeded products', function (): void {
tests/Browser/Admin/ProductManagementTest.php:105:test('can create a new product', function (): void {
tests/Browser/Admin/ProductManagementTest.php:131:test('can edit an existing product title', function (): void {
tests/Browser/Admin/ProductManagementTest.php:149:test('can archive a product', function (): void {
tests/Browser/Admin/ProductManagementTest.php:181:test('shows draft products only in admin and not storefront', function (): void {
tests/Browser/Admin/ProductManagementTest.php:202:test('can search products in admin', function (): void {
tests/Browser/Admin/ProductManagementTest.php:211:test('can filter products by status in admin',…5558 chars truncated…siveTest.php:86:test('mobile home shows hamburger navigation without horizontal overflow', function (): void {
tests/Browser/Storefront/ResponsiveTest.php:100:test('mobile product detail is stacked and keeps purchase controls usable', function (): void {
tests/Browser/Storefront/ResponsiveTest.php:125:test('mobile shoppers can add a product to the cart', function (): void {
tests/Browser/Storefront/ResponsiveTest.php:134:test('mobile cart keeps checkout available', function (): void {
tests/Browser/Storefront/ResponsiveTest.php:143:test('mobile checkout reaches shipping methods after address entry', function (): void {
tests/Browser/Storefront/ResponsiveTest.php:159:test('tablet admin login works at responsive width', function (): void {
tests/Browser/Storefront/ResponsiveTest.php:164:test('tablet admin sidebar navigation reaches products and orders', function (): void {
tests/Browser/Storefront/ResponsiveTest.php:182:test('mobile collection keeps filters accessible', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:45:test('home page has no javascript errors or console warnings', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:52:test('home page has proper heading hierarchy', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:77:test('product page has proper aria labels for variant selectors', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:95:test('product page images or placeholders have accessible text', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:114:test('customer login form has accessible labels', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:130:test('admin login form has accessible labels', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:146:test('checkout form has accessible labels', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:161:test('checkout validation errors are accessible', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:180:test('can navigate storefront with keyboard only', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:198:test('cart page has no console errors or warnings', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:205:test('search page has proper form labels', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:96:test('can register a new customer', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:109:test('shows validation errors for duplicate email registration', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:122:test('shows validation errors for mismatched passwords', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:135:test('can log in as existing customer', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:139:test('shows error for invalid customer credentials', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:150:test('redirects unauthenticated customers to login', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:158:test('shows order history for logged in customer', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:171:test('shows order detail for customer order', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:187:test('can view addresses', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:197:test('can add a new address', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:217:test('can edit an existing address', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:231:test('can log out', function (): void {
tests/Browser/Storefront/CartTest.php:52:test('can add product to cart', function (): void {
tests/Browser/Storefront/CartTest.php:61:test('can view cart with added item', function (): void {
tests/Browser/Storefront/CartTest.php:67:test('can update quantity in cart', function (): void {
tests/Browser/Storefront/CartTest.php:76:test('can remove item from cart', function (): void {
tests/Browser/Storefront/CartTest.php:84:test('can add multiple different products', function (): void {
tests/Browser/Storefront/CartTest.php:97:test('can apply valid discount code welcome ten', function (): void {
tests/Browser/Storefront/CartTest.php:105:test('shows error for invalid discount code', function (): void {
tests/Browser/Storefront/CartTest.php:111:test('shows error for expired discount code', function (): void {
tests/Browser/Storefront/CartTest.php:117:test('shows error for maxed out discount code', function (): void {
tests/Browser/Storefront/CartTest.php:123:test('can apply free shipping discount', function (): void {
tests/Browser/Storefront/CartTest.php:130:test('can apply flat five discount for fixed amount off', function (): void {
tests/Browser/Storefront/CartTest.php:137:test('shows subtotal and total in cart', function (): void {


php artisan test --list-tests 2>/dev/null | rg '^  Tests\\Browser|^  P\\Browser|Browser' | head -n 220

 - P\Tests\Browser\Admin\AnalyticsTest::__pest_evaluable_shows_the_analytics_dashboard
 - P\Tests\Browser\Admin\AnalyticsTest::__pest_evaluable_shows_sales_data
 - P\Tests\Browser\Admin\AnalyticsTest::__pest_evaluable_shows_conversion_funnel_data
 - P\Tests\Browser\Admin\AuthenticationTest::__pest_evaluable_can_log_in_as_admin
 - P\Tests\Browser\Admin\AuthenticationTest::__pest_evaluable_shows_error_for_invalid_credentials
 - P\Tests\Browser\Admin\AuthenticationTest::__pest_evaluable_shows_error_for_empty_email
 - P\Tests\Browser\Admin\AuthenticationTest::__pest_evaluable_shows_error_for_empty_password
 - P\Tests\Browser\Admin\AuthenticationTest::__pest_evaluable_redirects_unauthenticated_users_to_login_from_dashboard
 - P\Tests\Browser\Admin\AuthenticationTest::__pest_evaluable_redirects_unauthenticated_users_to_login_from_products
 - P\Tests\Browser\Admin\AuthenticationTest::__pest_evaluable_can_log_out
 - P\Tests\Browser\Admin\AuthenticationTest::__pest_evaluable_can_navigate_through_admin_sidebar_sections
 - P\Tests\Browser\Admin\AuthenticationTest::__pest_evaluable_can_navigate_to_analytics_from_sidebar
 - P\Tests\Browser\Admin\AuthenticationTest::__pest_evaluable_can_navigate_to_themes_from_sidebar
 - P\Tests\Browser\Admin\CollectionManagementTest::__pest_evaluable_shows_the_collection_list_with_seeded_collections
 - P\Tests\Browser\Admin\CollectionManagementTest::__pest_evaluable_can_create_a_new_collection
 - P\Tests\Browser\Admin\CollectionManagementTest::__pest_evaluable_can_edit_a_collection
 - P\Tests\Browser\Admin\CustomerManagementTest::__pest_evaluable_shows_the_customer_list
 - P\Tests\Browser\Admin\CustomerManagementTest::__pest_evaluable_shows_customer_detail_with_order_history
 - P\Tests\Browser\Admin\CustomerManagementTest::__pest_evaluable_shows_customer_addresses
 - P\Tests\Browser\Admin\DiscountManagementTest::__pest_evaluable_shows_seeded_discount_codes
 - P\Tests\Browser\Admin\DiscountManagementTest::__pest_evaluable_can_create_a_new_percentage_discount_code
 - P\Tests\Browser\Admin\DiscountManagementTest::__pest_evaluable_can_create_a_fixed_amount_discount_code
 - P\Tests\Browser\Admin\DiscountManagementTest::__pest_evaluable_can_create_a_free_shipping_discount_code
 - P\Tests\Browser\Admin\DiscountManagementTest::__pest_evaluable_can_edit_a_discount
 - P\Tests\Browser\Admin\DiscountManagementTest::__pest_evaluable_shows_discount_status_indicators
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_shows_the_order_list_with_seeded_orders
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_can_filter_orders_by_status
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_shows_order_detail_with_line_items_and_totals
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_shows_order_timeline_events
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_can_create_a_fulfillment
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_can_process_a_refund
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_shows_customer_information_in_order_detail
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_can_confirm_bank_transfer_payment
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_shows_fulfillment_guard_for_unpaid_order
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_can_mark_fulfillment_as_shipped
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_can_mark_fulfillment_as_delivered
 - P\Tests\Browser\Admin\PageManagementTest::__pest_evaluable_shows_the_pages_list
 - P\Tests\Browser\Admin\PageManagementTest::__pest_evaluable_can_create_a_new_page
 - P\Tests\Browser\Admin\PageManagementTest::__pest_evaluable_can_edit_an_existing_page
 - P\Tests\Browser\Admin\ProductManagementTest::__pest_evaluable_shows_the_product_list_with_seeded_products
 - P\Tests\Browser\Admin\ProductManagementTest::__pest_evaluable_can_create_a_new_product
 - P\Tests\Browser\Admin\ProductManagementTest::__pest_evaluable_can_edit_an_existing_product_title
 - P\Tests\Browser\Admin\ProductManagementTest::__pest_evaluable_can_archive_a_product
 - P\Tests\Browser\Admin\ProductManagementTest::__pest_evaluable_shows_draft_products_only_in_admin_and_not_storefront
 - P\Tests\Browser\Admin\ProductManagementTest::__pest_evaluable_can_search_products_in_admin
 - P\Tests\Browser\Admin\ProductManagementTest::__pest_evaluable_can_filter_products_by_status_in_admin
 - P\Tests\Browser\Admin\SettingsTest::__pest_evaluable_can_view_store_settings
 - P\Tests\Browser\Admin\SettingsTest::__pest_evaluable_can_update_store_name
 - P\Tests\Browser\Admin\SettingsTest::__pest_evaluable_can_view_shipping_zones
 - P\Tests\Browser\Admin\SettingsTest::__pest_evaluable_can_add_a_new_shipping_rate_to_an_existing_zone
 - P\Tests\Browser\Admin\SettingsTest::__pest_evaluable_can_view_tax_settings
 - P\Tests\Browser\Admin\SettingsTest::__pest_evaluable_can_update_tax_inclusion_setting
 - P\Tests\Browser\Admin\SettingsTest::__pest_evalua…3826 chars truncated…P\Tests\Browser\Storefront\CartTest::__pest_evaluable_shows_error_for_expired_discount_code
 - P\Tests\Browser\Storefront\CartTest::__pest_evaluable_shows_error_for_maxed_out_discount_code
 - P\Tests\Browser\Storefront\CartTest::__pest_evaluable_can_apply_free_shipping_discount
 - P\Tests\Browser\Storefront\CartTest::__pest_evaluable_can_apply_flat_five_discount_for_fixed_amount_off
 - P\Tests\Browser\Storefront\CartTest::__pest_evaluable_shows_subtotal_and_total_in_cart
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_completes_full_checkout_with_credit_card
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_shows_shipping_methods_based_on_german_address
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_shows_international_shipping_methods_for_non_german_address
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_applies_discount_during_checkout
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_validates_required_contact_email
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_validates_required_shipping_address_fields
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_validates_invalid_postal_code_format
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_prevents_checkout_with_empty_cart
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_completes_checkout_with_paypal
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_completes_checkout_with_bank_transfer
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_shows_error_for_declined_credit_card
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_shows_error_for_insufficient_funds
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_switches_between_payment_method_forms
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_can_register_a_new_customer
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_shows_validation_errors_for_duplicate_email_registration
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_shows_validation_errors_for_mismatched_passwords
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_can_log_in_as_existing_customer
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_shows_error_for_invalid_customer_credentials
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_redirects_unauthenticated_customers_to_login
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_shows_order_history_for_logged_in_customer
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_shows_order_detail_for_customer_order
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_can_view_addresses
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_can_add_a_new_address
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_can_edit_an_existing_address
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_can_log_out
 - P\Tests\Browser\Storefront\InventoryTest::__pest_evaluable_blocks_add_to_cart_for_out_of_stock_deny_policy_product
 - P\Tests\Browser\Storefront\InventoryTest::__pest_evaluable_allows_add_to_cart_for_out_of_stock_continue_policy_product
 - P\Tests\Browser\Storefront\InventoryTest::__pest_evaluable_shows_correct_stock_status_for_in_stock_product
 - P\Tests\Browser\Storefront\InventoryTest::__pest_evaluable_prevents_adding_more_than_available_stock_for_deny_policy_product
 - P\Tests\Browser\Storefront\ResponsiveTest::__pest_evaluable_mobile_home_shows_hamburger_navigation_without_horizontal_overflow
 - P\Tests\Browser\Storefront\ResponsiveTest::__pest_evaluable_mobile_product_detail_is_stacked_and_keeps_purchase_controls_usable
 - P\Tests\Browser\Storefront\ResponsiveTest::__pest_evaluable_mobile_shoppers_can_add_a_product_to_the_cart
 - P\Tests\Browser\Storefront\ResponsiveTest::__pest_evaluable_mobile_cart_keeps_checkout_available
 - P\Tests\Browser\Storefront\ResponsiveTest::__pest_evaluable_mobile_checkout_reaches_shipping_methods_after_address_entry
 - P\Tests\Browser\Storefront\ResponsiveTest::__pest_evaluable_tablet_admin_login_works_at_responsive_width
 - P\Tests\Browser\Storefront\ResponsiveTest::__pest_evaluable_tablet_admin_sidebar_navigation_reaches_products_and_orders
 - P\Tests\Browser\Storefront\ResponsiveTest::__pest_evaluable_mobile_collection_keeps_filters_accessible
 - P\Tests\Browser\Storefront\TenantIsolationTest::__pest_evaluable_storefront_only_shows_current_store_products
 - P\Tests\Browser\Storefront\TenantIsolationTest::__pest_evaluable_storefront_collections_only_contain_current_store_products
 - P\Tests\Browser\Storefront\TenantIsolationTest::__pest_evaluable_admin_cannot_see_other_store_products_or_orders
 - P\Tests\Browser\Storefront\TenantIsolationTest::__pest_evaluable_search_only_returns_current_store_products
 - P\Tests\Browser\Storefront\TenantIsolationTest::__pest_evaluable_customer_accounts_are_scoped_to_their_store.


Output:
Chunk ID: df6013
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 3296
Output:
11:| 1 - Smoke Tests | `tests/Browser/SmokeTest.php` | 10 | Hit every major page, assert HTTP 200 and no JS errors | Store 1, Products, Collections, Pages |
12:| 2 - Admin Authentication | `tests/Browser/Admin/AuthenticationTest.php` | 10 | Admin login, logout, invalid credentials, session access control | Admin user |
13:| 3 - Admin Product Management | `tests/Browser/Admin/ProductManagementTest.php` | 7 | Product CRUD: listing, creating, editing, archiving, filtering | Admin user, Products (incl. #15 draft) |
14:| 4 - Admin Order Management | `tests/Browser/Admin/OrderManagementTest.php` | 11 | Order listing, filtering, detail view, fulfillment, refund, confirm payment, fulfillment guard, mark shipped/delivered | Admin user, Orders (#1001, #1005), Customer |
15:| 5 - Admin Discount Management | `tests/Browser/Admin/DiscountManagementTest.php` | 6 | Discount code listing, creation, editing | Admin user, Discounts |
16:| 6 - Admin Settings | `tests/Browser/Admin/SettingsTest.php` | 7 | Store settings, shipping zones, tax config, domains | Admin user, Shipping zones, Store 1 |
17:| 7 - Storefront Browsing | `tests/Browser/Storefront/BrowsingTest.php` | 15 | Home page, collections, product detail, variants, search, pages | Products, Collections, Pages, Products #15/#17/#18 |
18:| 8 - Cart Flow | `tests/Browser/Storefront/CartTest.php` | 12 | Cart lifecycle: add, update qty, remove, discounts, totals | Products, Discounts (all codes) |
19:| 9 - Checkout Flow | `tests/Browser/Storefront/CheckoutTest.php` | 13 | Full checkout: contact, address, shipping, payment method selection, payment, confirmation, magic card decline, bank transfer flow | Products, Shipping zones, Discounts |
20:| 10 - Customer Account | `tests/Browser/Storefront/CustomerAccountTest.php` | 12 | Registration, login, order history, addresses, logout | Customer user, Orders (#1001/#1002/#1004) |
21:| 11 - Inventory Enforcement | `tests/Browser/Storefront/InventoryTest.php` | 4 | Inventory policy enforcement: deny vs. continue | Products #17 (deny), #18 (continue), #1 |
22:| 12 - Tenant Isolation | `tests/Browser/Storefront/TenantIsolationTest.php` | 5 | Multi-store data isolation verification | Store 1, Admin user, Customer user |
23:| 13 - Responsive / Mobile | `tests/Browser/Storefront/ResponsiveTest.php` | 8 | Mobile and tablet viewport rendering and interaction | Products, Admin user |
24:| 14 - Accessibility | `tests/Browser/Storefront/AccessibilityTest.php` | 11 | Heading hierarchy, ARIA labels, form labels, keyboard nav | Products, Store 1 |
25:| 15 - Admin Collections | `tests/Browser/Admin/CollectionManagementTest.php` | 3 | Collection CRUD in admin | Admin user, Collections |
26:| 16 - Admin Customers | `tests/Browser/Admin/CustomerManagementTest.php` | 3 | Customer listing and detail views | Admin user, Customer user, Orders |
27:| 17 - Admin Pages | `tests/Browser/Admin/PageManagementTest.php` | 3 | CMS page management | Admin user, Pages |
28:| 18 - Admin Analytics | `tests/Browser/Admin/AnalyticsTest.php` | 3 | Analytics dashboard rendering | Admin user, Orders |
172:## Suite 1: Smoke Tests
180:### Test 1.1: Loads the storefront home page
193:### Test 1.2: Loads a collection page
206:### Test 1.3: Loads a product page
220:### Test 1.4: Loads the cart page
233:### Test 1.5: Loads the customer login page
246:### Test 1.6: Loads the admin login page
259:### Test 1.7: Loads the about page
272:### Test 1.8: Loads the search page
285:### Test 1.9: Loads all collections listing
298:### Test 1.10: Has no errors on critical pages (batch)
312:## Suite 2: Admin Authentication
338:### Test 2.1: Can log in as admin
354:### Test 2.2: Shows error for invalid credentials
370:### Test 2.3: Shows error for empty email
385:### Test 2.4: Shows error for empty password
400:### Test 2.5: Redirects unauthenticated users to login from dashboard
413:### Test 2.6: Redirects unauthenticated users to login from products
426:### Test 2.7: Can log out
444:### Test 2.8: Can navigate through admin sidebar sections
470:### Test 2.9: Can navigate to analytics from sidebar
487:### Test 2.10: Can navigate to themes from sidebar
508:## Suite 3: Admin Product Management
528:### Test 3.1: Shows the product list with seeded products
546:### Test 3.2: Can create a new product
571:### Test 3.3: Can edit an existing product title
591:### Test 3.4: Can archive a product
619:### Test 3.5: Shows draft products only in admin, not storefront
640:### Test 3.6: Can search products in admin
656:### Test 3.7: Can filter products by status in admin
676:## Suite 4: Admin Order Management
700:### Test 4.1: Shows the order list with seeded orders
715:### Test 4.2: Can filter orders by status
735:### Test 4.3: Shows order detail with line items and totals
755:### Test 4.4: Shows order timeline events
772:### Test 4.5: Can create a fulfillment
793:### Test 4.6: Can process a refund
814:### Test 4.7: Shows customer information in order detail
830:### Test 4.8: Can confirm bank transfer payment
851:### Test 4.9: Shows fulfillment guard for unpaid order
868:### Test 4.10: Can mark fulfillment as shipped
886:### Test 4.11: Can mark fulfillment as delivered
906:## Suite 5: Admin Discount Management
922:### Test 5.1: Shows seeded discount codes
939:### Test 5.2: Can create a new percentage discount code
962:### Test 5.3: Can create a fixed amount discount code
982:### Test 5.4: Can create a free shipping discount code
1001:### Test 5.5: Can edit a discount
1019:### Test 5.6: Shows discount status indicators
1037:## Suite 6: Admin Settings
1060:### Test 6.1: Can view store settings
1076:### Test 6.2: Can update store name
1094:### Test 6.3: Can view shipping zones
1112:### Test 6.4: Can add a new shipping rate to existing zone
1133:### Test 6.5: Can view tax settings
1149:### Test 6.6: Can update tax inclusion setting
1167:### Test 6.7: Can view domain settings
1185:## Suite 7: Storefront Browsing
1207:### Test 7.1: Shows featured products on home page
1222:### Test 7.2: Shows collection with product grid
1236:### Test 7.3: Can navigate from collection to product
1252:### Test 7.4: Shows product detail with variant options
1268:### Test 7.5: Shows size and color option values
1282:### Test 7.6: Updates price when variant changes on product with compare-at pricing
1298:### Test 7.7: Shows search results for valid query
1311:### Test 7.8: Shows no results message for invalid query
1324:### Test 7.9: Does not show draft products on storefront collections
1337:### Test 7.10: Does not show draft products in search results
1350:### Test 7.11: Shows out of stock messaging for deny-policy product
1364:### Test 7.12: Shows backorder messaging for continue-policy product
1378:### Test 7.13: Shows new arrivals collection
1391:### Test 7.14: Shows static about page
1404:### Test 7.15: Navigates between pages using the main navigation
1421:## Suite 8: Cart Flow
1456:### Test 8.1: Can add product to cart
1473:### Test 8.2: Can view cart with added item
1492:### Test 8.3: Can update quantity in cart
1513:### Test 8.4: Can remove item from cart
1532:### Test 8.5: Can add multiple different products
1552:### Test 8.6: Can apply valid discount code WELCOME10
1574:### Test 8.7: Shows error for invalid discount code
1593:### Test 8.8: Shows error for expired discount code
1612:### Test 8.9: Shows error for maxed out discount code
1631:### Test 8.10: Can apply free shipping discount
1651:### Test 8.11: Can apply FLAT5 discount for fixed amount off
1671:### Test 8.12: Shows subtotal and total in cart
1691:## Suite 9: Checkout Flow
1752:### Test 9.1: Completes full checkout with credit card
1790:### Test 9.2: Shows shipping methods based on German address
1818:### Test 9.3: Shows international shipping methods for non-DE address
1845:### Test 9.4: Applies discount during checkout
1879:### Test 9.5: Validates required contact email
1898:### Test 9.6: Validates required shipping address fields
1919:### Test 9.7: Validates invalid postal code format
1946:### Test 9.8: Prevents checkout with empty cart
1960:### Test 9.9: Completes checkout with PayPal
1982:### Test 9.10: Completes checkout with bank transfer
2005:### Test 9.11: Shows error for declined credit card (magic number)
2031:### Test 9.12: Shows error for insufficient funds (magic number)
2056:### Test 9.13: Switches between payment method forms
2078:## Suite 10: Customer Account
2103:### Test 10.1: Can register a new customer
2121:### Test 10.2: Shows validation errors for duplicate email registration
2139:### Test 10.3: Shows validation errors for mismatched passwords
2157:### Test 10.4: Can log in as existing customer
2174:### Test 10.5: Shows error for invalid customer credentials
2190:### Test 10.6: Redirects unauthenticated customers to login
2203:### Test 10.7: Shows order history for logged-in customer
2222:### Test 10.8: Shows order detail for customer order
2240:### Test 10.9: Can view addresses
2255:### Test 10.10: Can add a new address
2280:### Test 10.11: Can edit an existing address
2299:### Test 10.12: Can log out
2319:## Suite 11: Inventory Enforcement
2336:### Test 11.1: Blocks add-to-cart for out-of-stock deny-policy product
2350:### Test 11.2: Allows add-to-cart for out-of-stock continue-policy product
2368:### Test 11.3: Shows correct stock status for in-stock product
2383:### Test 11.4: Prevents adding more than available stock for deny-policy product
2403:## Suite 12: Tenant Isolation
2432:### Test 12.1: Store 1 only shows Store 1 products
2447:### Test 12.2: Store 1 collections only contain Store 1 products
2461:### Test 12.3: Admin cannot access other store data
2481:### Test 12.4: Search only returns current store products
2495:### Test 12.5: Customer accounts are scoped to their store
2514:## Suite 13: Responsive / Mobile
2529:### Test 13.1: Storefront home works on mobile viewport
2546:### Test 13.2: Product page stacks layout on mobile
2561:### Test 13.3: Can add to cart on mobile
2578:### Test 13.4: Cart page works on mobile
2597:### Test 13.5: Checkout flow works on mobile
2626:### Test 13.6: Admin login works on tablet viewport
2643:### Test 13.7: Admin sidebar navigation works on tablet
2662:### Test 13.8: Collection page works on mobile with filters
2680:## Suite 14: Accessibility
2700:### Test 14.1: Home page has no JavaScript errors or console warnings
2713:### Test 14.2: Home page has proper heading hierarchy
2728:### Test 14.3: Product page has proper ARIA labels for variant selector
2742:### Test 14.4: Product page images have alt text
2755:### Test 14.5: Customer login form has accessible labels
2769:### Test 14.6: Admin login form has accessible labels
2783:### Test 14.7: Checkout form has accessible labels
2802:### Test 14.8: Checkout validation errors are accessible
2822:### Test 14.9: Can navigate storefront with keyboard only
2838:### Test 14.10: Cart page has no console errors or warnings
2851:### Test 14.11: Search page has proper form labels
2866:## Suite 15: Admin Collections Management
2874:### Test 15.1: Shows the collection list with seeded collections
2890:### Test 15.2: Can create a new collection
2910:### Test 15.3: Can edit a collection
2930:## Suite 16: Admin Customer Management
2938:### Test 16.1: Shows the customer list
2954:### Test 16.2: Shows customer detail with order history
2972:### Test 16.3: Shows customer addresses
2990:## Suite 17: Admin Pages Management
2998:### Test 17.1: Shows the pages list
3013:### Test 17.2: Can create a new page
3032:### Test 17.3: Can edit an existing page
3052:## Suite 18: Admin Analytics Dashboard
3070:### Test 18.1: Shows the analytics dashboard
3085:### Test 18.2: Shows sales data
3101:### Test 18.3: Shows conversion funnel data
3122:| 1 - Smoke Tests | `tests/Browser/SmokeTest.php` | 10 |
3123:| 2 - Admin Authentication | `tests/Browser/Admin/AuthenticationTest.php` | 10 |
3124:| 3 - Admin Product Management | `tests/Browser/Admin/ProductManagementTest.php` | 7 |
3125:| 4 - Admin Order Management | `tests/Browser/Admin/OrderManagementTest.php` | 7 |
3126:| 5 - Admin Discount Management | `tests/Browser/Admin/DiscountManagementTest.php` | 6 |
3127:| 6 - Admin Settings | `tests/Browser/Admin/SettingsTest.php` | 7 |
3128:| 7 - Storefront Browsing | `tests/Browser/Storefront/BrowsingTest.php` | 15 |
3129:| 8 - Cart Flow | `tests/Browser/Storefront/CartTest.php` | 12 |
3130:| 9 - Checkout Flow | `tests/Browser/Storefront/CheckoutTest.php` | 8 |
3131:| 10 - Customer Account | `tests/Browser/Storefront/CustomerAccountTest.php` | 12 |
3132:| 11 - Inventory Enforcement | `tests/Browser/Storefront/InventoryTest.php` | 4 |
3133:| 12 - Tenant Isolation | `tests/Browser/Storefront/TenantIsolationTest.php` | 5 |
3134:| 13 - Responsive / Mobile | `tests/Browser/Storefront/ResponsiveTest.php` | 8 |
3135:| 14 - Accessibility | `tests/Browser/Storefront/AccessibilityTest.php` | 11 |
3136:| 15 - Admin Collections | `tests/Browser/Admin/CollectionManagementTest.php` | 3 |
3137:| 16 - Admin Customers | `tests/Browser/Admin/CustomerManagementTest.php` | 3 |
3138:| 17 - Admin Pages | `tests/Browser/Admin/PageManagementTest.php` | 3 |
3139:| 18 - Admin Analytics | `tests/Browser/Admin/AnalyticsTest.php` | 3 |


Output:
Chunk ID: bef03c
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 194
Output:
tests/Browser/Admin/AnalyticsTest.php
tests/Browser/Admin/AuthenticationTest.php
tests/Browser/Admin/CollectionManagementTest.php
tests/Browser/Admin/CustomerManagementTest.php
tests/Browser/Admin/DiscountManagementTest.php
tests/Browser/Admin/OrderManagementTest.php
tests/Browser/Admin/PageManagementTest.php
tests/Browser/Admin/ProductManagementTest.php
tests/Browser/Admin/SettingsTest.php
tests/Browser/SmokeTest.php
tests/Browser/Storefront/AccessibilityTest.php
tests/Browser/Storefront/BrowsingTest.php
tests/Browser/Storefront/CartTest.php
tests/Browser/Storefront/CheckoutTest.php
tests/Browser/Storefront/CustomerAccountTest.php
tests/Browser/Storefront/InventoryTest.php
tests/Browser/Storefront/ResponsiveTest.php
tests/Browser/Storefront/TenantIsolationTest.php


Output:
Chunk ID: 486f92
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 3890
Output:
tests/Browser/Admin/CustomerManagementTest.php:129:test('shows the customer list', function (): void {
tests/Browser/Admin/CustomerManagementTest.php:136:test('shows customer detail with order history', function (): void {
tests/Browser/Admin/CustomerManagementTest.php:154:test('shows customer addresses', function (): void {
tests/Browser/Admin/CollectionManagementTest.php:63:test('shows the collection list with seeded collections', function (): void {
tests/Browser/Admin/CollectionManagementTest.php:70:test('can create a new collection', function (): void {
tests/Browser/Admin/CollectionManagementTest.php:99:test('can edit a collection', function (): void {
tests/Browser/Admin/OrderManagementTest.php:232:test('shows the order list with seeded orders', function (): void {
tests/Browser/Admin/OrderManagementTest.php:238:test('can filter orders by status', function (): void {
tests/Browser/Admin/OrderManagementTest.php:257:test('shows order detail with line items and totals', function (): void {
tests/Browser/Admin/OrderManagementTest.php:269:test('shows order timeline events', function (): void {
tests/Browser/Admin/OrderManagementTest.php:276:test('can create a fulfillment', function (): void {
tests/Browser/Admin/OrderManagementTest.php:280:test('can process a refund', function (): void {
tests/Browser/Admin/OrderManagementTest.php:293:test('shows customer information in order detail', function (): void {
tests/Browser/Admin/OrderManagementTest.php:299:test('can confirm bank transfer payment', function (): void {
tests/Browser/Admin/OrderManagementTest.php:311:test('shows fulfillment guard for unpaid order', function (): void {
tests/Browser/Admin/OrderManagementTest.php:319:test('can mark fulfillment as shipped', function (): void {
tests/Browser/Admin/OrderManagementTest.php:328:test('can mark fulfillment as delivered', function (): void {
tests/Browser/Admin/PageManagementTest.php:58:test('shows the pages list', function (): void {
tests/Browser/Admin/PageManagementTest.php:64:test('can create a new page', function (): void {
tests/Browser/Admin/PageManagementTest.php:88:test('can edit an existing page', function (): void {
tests/Browser/Admin/AuthenticationTest.php:46:test('can log in as admin', function (): void {
tests/Browser/Admin/AuthenticationTest.php:50:test('shows error for invalid credentials', function (): void {
tests/Browser/Admin/AuthenticationTest.php:61:test('shows error for empty email', function (): void {
tests/Browser/Admin/AuthenticationTest.php:68:test('shows error for empty password', function (): void {
tests/Browser/Admin/AuthenticationTest.php:75:test('redirects unauthenticated users to login from dashboard', function (): void {
tests/Browser/Admin/AuthenticationTest.php:83:test('redirects unauthenticated users to login from products', function (): void {
tests/Browser/Admin/AuthenticationTest.php:91:test('can log out', function (): void {
tests/Browser/Admin/AuthenticationTest.php:101:test('can navigate through admin sidebar sections', function (): void {
tests/Browser/Admin/AuthenticationTest.php:119:test('can navigate to analytics from sidebar', function (): void {
tests/Browser/Admin/AuthenticationTest.php:128:test('can navigate to themes from sidebar', function (): void {
tests/Browser/Admin/AnalyticsTest.php:52:test('shows the analytics dashboard', function (): void {
tests/Browser/Admin/AnalyticsTest.php:58:test('shows sales data', function (): void {
tests/Browser/Admin/AnalyticsTest.php:65:test('shows conversion funnel data', function (): void {
tests/Browser/Admin/SettingsTest.php:76:test('can view store settings', function (): void {
tests/Browser/Admin/SettingsTest.php:82:test('can update store name', function (): void {
tests/Browser/Admin/SettingsTest.php:101:test('can view shipping zones', function (): void {
tests/Browser/Admin/SettingsTest.php:109:test('can add a new shipping rate to an existing zone', function (): void {
tests/Browser/Admin/SettingsTest.php:138:test('can view tax settings', function (): void {
tests/Browser/Admin/SettingsTest.php:144:test('can update tax inclusion setting', function (): void {
tests/Browser/Admin/SettingsTest.php:160:test('can view domain settings', function (): void {
tests/Browser/Admin/ProductManagementTest.php:98:test('shows the product list with seeded products', function (): void {
tests/Browser/Admin/ProductManagementTest.php:105:test('can create a new product', function (): void {
tests/Browser/Admin/ProductManagementTest.php:131:test('can edit an existing product title', function (): void {
tests/Browser/Admin/ProductManagementTest.php:149:test('can archive a product', function (): void {
tests/Browser/Admin/ProductManagementTest.php:181:test('shows draft products only in admin and not storefront', function (): void {
tests/Browser/Admin/ProductManagementTest.php:202:test('can search products in admin', function (): void {
tests/Browser/Admin/ProductManagementTest.php:211:test('can filter products by status in admin', function (): void {
tests/Browser/Storefront/BrowsingTest.php:24:test('shows featured products on home page', function (): void {
tests/Browser/Storefront/BrowsingTest.php:32:test('shows collection with product grid', function (): void {
tests/Browser/Storefront/BrowsingTest.php:39:test('can navigate from collection to product', function (): void {
tests/Browser/Storefront/BrowsingTest.php:50:test('shows product detail with variant options', function (): void {
tests/Browser/Storefront/BrowsingTest.php:59:test('shows size and color option values', function (): void {
tests/Browser/Storefront/BrowsingTest.php:71:test('shows sale and compare at pricing for sale product', function (): void {
tests/Browser/Storefront/BrowsingTest.php:80:test('shows search results for valid query', function (): void {
tests/Browser/Storefront/BrowsingTest.php:86:test('shows no results message for invalid query', function (): void {
tests/Browser/Storefront/BrowsingTest.php:92:test('does not show draft products on storefront collections', function (): void {
tests/Browser/Storefront/BrowsingTest.php:98:test('does not show draft products in search results', function (): void {
tests/Browser/Storefront/BrowsingTest.php:104:test('shows out of stock messaging for deny policy product', function (): void {
tests/Browser/Storefront/BrowsingTest.php:114:test('shows backorder messaging for continue policy product', function (): void {
tests/Browser/Storefront/BrowsingTest.php:123:test('shows new arrivals collection', function (): void {
tests/Browser/Storefront/BrowsingTest.php:129:test('shows static about page', function (): void {
tests/Browser/Storefront/BrowsingTest.php:135:test('navigates between pages using the main navigation', function (): void {
tests/Browser/Storefront/CheckoutTest.php:118:test('completes full checkout with credit card', function (): void {
tests/Browser/Storefront/CheckoutTest.php:129:test('shows shipping methods based on german address', function (): void {
tests/Browser/Storefront/CheckoutTest.php:144:test('shows international shipping methods for non german address', function (): void {
tests/Browser/Storefront/CheckoutTest.php:159:test('applies discount during checkout', function (): void {
tests/Browser/Storefront/CheckoutTest.php:177:test('validates required contact email', function (): void {
tests/Browser/Storefront/CheckoutTest.php:185:test('validates required shipping address fields', function (): void {
tests/Browser/Storefront/CheckoutTest.php:198:test('validates invalid postal code format', function (): void {
tests/Browser/Storefront/CheckoutTest.php:206:test('prevents checkout with empty cart', function (): void {
tests/Browser/Storefront/CheckoutTest.php:213:test('completes checkout with paypal', function (): void {
tests/Browser/Storefront/CheckoutTest.php:226:test('completes checkout with bank transfer', function (): void {
tests/Browser/Storefront/CheckoutTest.php:242:test('shows error for declined credit card', function (): void {
tests/Browser/Storefront/CheckoutTest.php:255:test('shows error for insufficient funds', function (): void {
tests/Browser/Storefront/CheckoutTest.php:268:test('switches between payment method forms', function (): void {
tests/Browser/Admin/DiscountManagementTest.php:99:test('shows seeded discount codes', function (): void {
tests/Browser/Admin/DiscountManagementTest.php:107:test('can create a new percentage discount code', function (): void {
tests/Browser/Admin/DiscountManagementTest.php:135:test('can create a fixed amount discount code', function (): void {
tests/Browser/Admin/DiscountManagementTest.php:157:test('can create a free shipping discount code', function (): void {
tests/Browser/Admin/DiscountManagementTest.php:178:test('can edit a discount', function (): void {
tests/Browser/Admin/DiscountManagementTest.php:201:test('shows discount status indicators', function (): void {
tests/Browser/Storefront/TenantIsolationTest.php:102:test('storefront only shows current store products', function (): void {
tests/Browser/Storefront/TenantIsolationTest.php:111:test('storefront collections only contain current store products', function (): void {
tests/Browser/Storefront/TenantIsolationTest.php:120:test('admin cannot see other store products or orders', function (): void {
tests/Browser/Storefront/TenantIsolationTest.php:138:test('search only returns current store products', function (): void {
tests/Browser/Storefront/TenantIsolationTest.php:150:test('customer accounts are scoped to their store', function (): void {
tests/Browser/SmokeTest.php:27:test('storefront core pages render without javascript errors', function (): void {
tests/Browser/SmokeTest.php:65:test('admin core pages render for an authenticated store user', function (): void {
tests/Browser/SmokeTest.php:103:test('storefront account auth pages render without javascript errors', function (): void {
tests/Browser/SmokeTest.php:125:test('storefront home renders on a mobile viewport', function (): void {
tests/Browser/Storefront/InventoryTest.php:59:test('blocks add to cart for out of stock deny policy product', function (): void {
tests/Browser/Storefront/InventoryTest.php:69:test('allows add to cart for out of stock continue policy product', function (): void {
tests/Browser/Storefront/InventoryTest.php:81:test('shows correct stock status for in stock product', function (): void {
tests/Browser/Storefront/InventoryTest.php:91:test('prevents adding more than available stock for deny policy product', function (): void {
tests/Browser/Storefront/ResponsiveTest.php:86:test('mobile home shows hamburger navigation without horizontal overflow', function (): void {
tests/Browser/Storefront/ResponsiveTest.php:100:test('mobile product detail is stacked and keeps purchase controls usable', function (): void {
tests/Browser/Storefront/ResponsiveTest.php:125:test('mobile shoppers can add a product to the cart', function (): void {
tests/Browser/Storefront/ResponsiveTest.php:134:test('mobile cart keeps checkout available', function (): void {
tests/Browser/Storefront/ResponsiveTest.php:143:test('mobile checkout reaches shipping methods after address entry', function (): void {
tests/Browser/Storefront/ResponsiveTest.php:159:test('tablet admin login works at responsive width', function (): void {
tests/Browser/Storefront/ResponsiveTest.php:164:test('tablet admin sidebar navigation reaches products and orders', function (): void {
tests/Browser/Storefront/ResponsiveTest.php:182:test('mobile collection keeps filters accessible', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:45:test('home page has no javascript errors or console warnings', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:52:test('home page has proper heading hierarchy', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:77:test('product page has proper aria labels for variant selectors', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:95:test('product page images or placeholders have accessible text', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:114:test('customer login form has accessible labels', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:130:test('admin login form has accessible labels', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:146:test('checkout form has accessible labels', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:161:test('checkout validation errors are accessible', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:180:test('can navigate storefront with keyboard only', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:198:test('cart page has no console errors or warnings', function (): void {
tests/Browser/Storefront/AccessibilityTest.php:205:test('search page has proper form labels', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:96:test('can register a new customer', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:109:test('shows validation errors for duplicate email registration', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:122:test('shows validation errors for mismatched passwords', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:135:test('can log in as existing customer', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:139:test('shows error for invalid customer credentials', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:150:test('redirects unauthenticated customers to login', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:158:test('shows order history for logged in customer', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:171:test('shows order detail for customer order', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:187:test('can view addresses', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:197:test('can add a new address', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:217:test('can edit an existing address', function (): void {
tests/Browser/Storefront/CustomerAccountTest.php:231:test('can log out', function (): void {
tests/Browser/Storefront/CartTest.php:52:test('can add product to cart', function (): void {
tests/Browser/Storefront/CartTest.php:61:test('can view cart with added item', function (): void {
tests/Browser/Storefront/CartTest.php:67:test('can update quantity in cart', function (): void {
tests/Browser/Storefront/CartTest.php:76:test('can remove item from cart', function (): void {
tests/Browser/Storefront/CartTest.php:84:test('can add multiple different products', function (): void {
tests/Browser/Storefront/CartTest.php:97:test('can apply valid discount code welcome ten', function (): void {
tests/Browser/Storefront/CartTest.php:105:test('shows error for invalid discount code', function (): void {
tests/Browser/Storefront/CartTest.php:111:test('shows error for expired discount code', function (): void {
tests/Browser/Storefront/CartTest.php:117:test('shows error for maxed out discount code', function (): void {
tests/Browser/Storefront/CartTest.php:123:test('can apply free shipping discount', function (): void {
tests/Browser/Storefront/CartTest.php:130:test('can apply flat five discount for fixed amount off', function (): void {
tests/Browser/Storefront/CartTest.php:137:test('shows subtotal and total in cart', function (): void {


Output:
Chunk ID: 90b032
Wall time: 0.7354 seconds
Process exited with code 0
Original token count: 3457
Output:
 - P\Tests\Browser\Admin\AnalyticsTest::__pest_evaluable_shows_the_analytics_dashboard
 - P\Tests\Browser\Admin\AnalyticsTest::__pest_evaluable_shows_sales_data
 - P\Tests\Browser\Admin\AnalyticsTest::__pest_evaluable_shows_conversion_funnel_data
 - P\Tests\Browser\Admin\AuthenticationTest::__pest_evaluable_can_log_in_as_admin
 - P\Tests\Browser\Admin\AuthenticationTest::__pest_evaluable_shows_error_for_invalid_credentials
 - P\Tests\Browser\Admin\AuthenticationTest::__pest_evaluable_shows_error_for_empty_email
 - P\Tests\Browser\Admin\AuthenticationTest::__pest_evaluable_shows_error_for_empty_password
 - P\Tests\Browser\Admin\AuthenticationTest::__pest_evaluable_redirects_unauthenticated_users_to_login_from_dashboard
 - P\Tests\Browser\Admin\AuthenticationTest::__pest_evaluable_redirects_unauthenticated_users_to_login_from_products
 - P\Tests\Browser\Admin\AuthenticationTest::__pest_evaluable_can_log_out
 - P\Tests\Browser\Admin\AuthenticationTest::__pest_evaluable_can_navigate_through_admin_sidebar_sections
 - P\Tests\Browser\Admin\AuthenticationTest::__pest_evaluable_can_navigate_to_analytics_from_sidebar
 - P\Tests\Browser\Admin\AuthenticationTest::__pest_evaluable_can_navigate_to_themes_from_sidebar
 - P\Tests\Browser\Admin\CollectionManagementTest::__pest_evaluable_shows_the_collection_list_with_seeded_collections
 - P\Tests\Browser\Admin\CollectionManagementTest::__pest_evaluable_can_create_a_new_collection
 - P\Tests\Browser\Admin\CollectionManagementTest::__pest_evaluable_can_edit_a_collection
 - P\Tests\Browser\Admin\CustomerManagementTest::__pest_evaluable_shows_the_customer_list
 - P\Tests\Browser\Admin\CustomerManagementTest::__pest_evaluable_shows_customer_detail_with_order_history
 - P\Tests\Browser\Admin\CustomerManagementTest::__pest_evaluable_shows_customer_addresses
 - P\Tests\Browser\Admin\DiscountManagementTest::__pest_evaluable_shows_seeded_discount_codes
 - P\Tests\Browser\Admin\DiscountManagementTest::__pest_evaluable_can_create_a_new_percentage_discount_code
 - P\Tests\Browser\Admin\DiscountManagementTest::__pest_evaluable_can_create_a_fixed_amount_discount_code
 - P\Tests\Browser\Admin\DiscountManagementTest::__pest_evaluable_can_create_a_free_shipping_discount_code
 - P\Tests\Browser\Admin\DiscountManagementTest::__pest_evaluable_can_edit_a_discount
 - P\Tests\Browser\Admin\DiscountManagementTest::__pest_evaluable_shows_discount_status_indicators
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_shows_the_order_list_with_seeded_orders
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_can_filter_orders_by_status
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_shows_order_detail_with_line_items_and_totals
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_shows_order_timeline_events
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_can_create_a_fulfillment
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_can_process_a_refund
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_shows_customer_information_in_order_detail
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_can_confirm_bank_transfer_payment
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_shows_fulfillment_guard_for_unpaid_order
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_can_mark_fulfillment_as_shipped
 - P\Tests\Browser\Admin\OrderManagementTest::__pest_evaluable_can_mark_fulfillment_as_delivered
 - P\Tests\Browser\Admin\PageManagementTest::__pest_evaluable_shows_the_pages_list
 - P\Tests\Browser\Admin\PageManagementTest::__pest_evaluable_can_create_a_new_page
 - P\Tests\Browser\Admin\PageManagementTest::__pest_evaluable_can_edit_an_existing_page
 - P\Tests\Browser\Admin\ProductManagementTest::__pest_evaluable_shows_the_product_list_with_seeded_products
 - P\Tests\Browser\Admin\ProductManagementTest::__pest_evaluable_can_create_a_new_product
 - P\Tests\Browser\Admin\ProductManagementTest::__pest_evaluable_can_edit_an_existing_product_title
 - P\Tests\Browser\Admin\ProductManagementTest::__pest_evaluable_can_archive_a_product
 - P\Tests\Browser\Admin\ProductManagementTest::__pest_evaluable_shows_draft_products_only_in_admin_and_not_storefront
 - P\Tests\Browser\Admin\ProductManagementTest::__pest_evaluable_can_search_products_in_admin
 - P\Tests\Browser\Admin\ProductManagementTest::__pest_evaluable_can_filter_products_by_status_in_admin
 - P\Tests\Browser\Admin\SettingsTest::__pest_evaluable_can_view_store_settings
 - P\Tests\Browser\Admin\SettingsTest::__pest_evaluable_can_update_store_name
 - P\Tests\Browser\Admin\SettingsTest::__pest_evaluable_can_view_shipping_zones
 - P\Tests\Browser\Admin\SettingsTest::__pest_evaluable_can_add_a_new_shipping_rate_to_an_existing_zone
 - P\Tests\Browser\Admin\SettingsTest::__pest_evaluable_can_view_tax_settings
 - P\Tests\Browser\Admin\SettingsTest::__pest_evaluable_can_update_tax_inclusion_setting
 - P\Tests\Browser\Admin\SettingsTest::__pest_evaluable_can_view_domain_settings
 - P\Tests\Browser\SmokeTest::__pest_evaluable_storefront_core_pages_render_without_javascript_errors
 - P\Tests\Browser\SmokeTest::__pest_evaluable_admin_core_pages_render_for_an_authenticated_store_user
 - P\Tests\Browser\SmokeTest::__pest_evaluable_storefront_account_auth_pages_render_without_javascript_errors
 - P\Tests\Browser\SmokeTest::__pest_evaluable_storefront_home_renders_on_a_mobile_viewport
 - P\Tests\Browser\Storefront\AccessibilityTest::__pest_evaluable_home_page_has_no_javascript_errors_or_console_warnings
 - P\Tests\Browser\Storefront\AccessibilityTest::__pest_evaluable_home_page_has_proper_heading_hierarchy
 - P\Tests\Browser\Storefront\AccessibilityTest::__pest_evaluable_product_page_has_proper_aria_labels_for_variant_selectors
 - P\Tests\Browser\Storefront\AccessibilityTest::__pest_evaluable_product_page_images_or_placeholders_have_accessible_text
 - P\Tests\Browser\Storefront\AccessibilityTest::__pest_evaluable_customer_login_form_has_accessible_labels
 - P\Tests\Browser\Storefront\AccessibilityTest::__pest_evaluable_admin_login_form_has_accessible_labels
 - P\Tests\Browser\Storefront\AccessibilityTest::__pest_evaluable_checkout_form_has_accessible_labels
 - P\Tests\Browser\Storefront\AccessibilityTest::__pest_evaluable_checkout_validation_errors_are_accessible
 - P\Tests\Browser\Storefront\AccessibilityTest::__pest_evaluable_can_navigate_storefront_with_keyboard_only
 - P\Tests\Browser\Storefront\AccessibilityTest::__pest_evaluable_cart_page_has_no_console_errors_or_warnings
 - P\Tests\Browser\Storefront\AccessibilityTest::__pest_evaluable_search_page_has_proper_form_labels
 - P\Tests\Browser\Storefront\BrowsingTest::__pest_evaluable_shows_featured_products_on_home_page
 - P\Tests\Browser\Storefront\BrowsingTest::__pest_evaluable_shows_collection_with_product_grid
 - P\Tests\Browser\Storefront\BrowsingTest::__pest_evaluable_can_navigate_from_collection_to_product
 - P\Tests\Browser\Storefront\BrowsingTest::__pest_evaluable_shows_product_detail_with_variant_options
 - P\Tests\Browser\Storefront\BrowsingTest::__pest_evaluable_shows_size_and_color_option_values
 - P\Tests\Browser\Storefront\BrowsingTest::__pest_evaluable_shows_sale_and_compare_at_pricing_for_sale_product
 - P\Tests\Browser\Storefront\BrowsingTest::__pest_evaluable_shows_search_results_for_valid_query
 - P\Tests\Browser\Storefront\BrowsingTest::__pest_evaluable_shows_no_results_message_for_invalid_query
 - P\Tests\Browser\Storefront\BrowsingTest::__pest_evaluable_does_not_show_draft_products_on_storefront_collections
 - P\Tests\Browser\Storefront\BrowsingTest::__pest_evaluable_does_not_show_draft_products_in_search_results
 - P\Tests\Browser\Storefront\BrowsingTest::__pest_evaluable_shows_out_of_stock_messaging_for_deny_policy_product
 - P\Tests\Browser\Storefront\BrowsingTest::__pest_evaluable_shows_backorder_messaging_for_continue_policy_product
 - P\Tests\Browser\Storefront\BrowsingTest::__pest_evaluable_shows_new_arrivals_collection
 - P\Tests\Browser\Storefront\BrowsingTest::__pest_evaluable_shows_static_about_page
 - P\Tests\Browser\Storefront\BrowsingTest::__pest_evaluable_navigates_between_pages_using_the_main_navigation
 - P\Tests\Browser\Storefront\CartTest::__pest_evaluable_can_add_product_to_cart
 - P\Tests\Browser\Storefront\CartTest::__pest_evaluable_can_view_cart_with_added_item
 - P\Tests\Browser\Storefront\CartTest::__pest_evaluable_can_update_quantity_in_cart
 - P\Tests\Browser\Storefront\CartTest::__pest_evaluable_can_remove_item_from_cart
 - P\Tests\Browser\Storefront\CartTest::__pest_evaluable_can_add_multiple_different_products
 - P\Tests\Browser\Storefront\CartTest::__pest_evaluable_can_apply_valid_discount_code_welcome_ten
 - P\Tests\Browser\Storefront\CartTest::__pest_evaluable_shows_error_for_invalid_discount_code
 - P\Tests\Browser\Storefront\CartTest::__pest_evaluable_shows_error_for_expired_discount_code
 - P\Tests\Browser\Storefront\CartTest::__pest_evaluable_shows_error_for_maxed_out_discount_code
 - P\Tests\Browser\Storefront\CartTest::__pest_evaluable_can_apply_free_shipping_discount
 - P\Tests\Browser\Storefront\CartTest::__pest_evaluable_can_apply_flat_five_discount_for_fixed_amount_off
 - P\Tests\Browser\Storefront\CartTest::__pest_evaluable_shows_subtotal_and_total_in_cart
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_completes_full_checkout_with_credit_card
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_shows_shipping_methods_based_on_german_address
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_shows_international_shipping_methods_for_non_german_address
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_applies_discount_during_checkout
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_validates_required_contact_email
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_validates_required_shipping_address_fields
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_validates_invalid_postal_code_format
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_prevents_checkout_with_empty_cart
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_completes_checkout_with_paypal
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_completes_checkout_with_bank_transfer
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_shows_error_for_declined_credit_card
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_shows_error_for_insufficient_funds
 - P\Tests\Browser\Storefront\CheckoutTest::__pest_evaluable_switches_between_payment_method_forms
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_can_register_a_new_customer
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_shows_validation_errors_for_duplicate_email_registration
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_shows_validation_errors_for_mismatched_passwords
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_can_log_in_as_existing_customer
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_shows_error_for_invalid_customer_credentials
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_redirects_unauthenticated_customers_to_login
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_shows_order_history_for_logged_in_customer
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_shows_order_detail_for_customer_order
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_can_view_addresses
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_can_add_a_new_address
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_can_edit_an_existing_address
 - P\Tests\Browser\Storefront\CustomerAccountTest::__pest_evaluable_can_log_out
 - P\Tests\Browser\Storefront\InventoryTest::__pest_evaluable_blocks_add_to_cart_for_out_of_stock_deny_policy_product
 - P\Tests\Browser\Storefront\InventoryTest::__pest_evaluable_allows_add_to_cart_for_out_of_stock_continue_policy_product
 - P\Tests\Browser\Storefront\InventoryTest::__pest_evaluable_shows_correct_stock_status_for_in_stock_product
 - P\Tests\Browser\Storefront\InventoryTest::__pest_evaluable_prevents_adding_more_than_available_stock_for_deny_policy_product
 - P\Tests\Browser\Storefront\ResponsiveTest::__pest_evaluable_mobile_home_shows_hamburger_navigation_without_horizontal_overflow
 - P\Tests\Browser\Storefront\ResponsiveTest::__pest_evaluable_mobile_product_detail_is_stacked_and_keeps_purchase_controls_usable
 - P\Tests\Browser\Storefront\ResponsiveTest::__pest_evaluable_mobile_shoppers_can_add_a_product_to_the_cart
 - P\Tests\Browser\Storefront\ResponsiveTest::__pest_evaluable_mobile_cart_keeps_checkout_available
 - P\Tests\Browser\Storefront\ResponsiveTest::__pest_evaluable_mobile_checkout_reaches_shipping_methods_after_address_entry
 - P\Tests\Browser\Storefront\ResponsiveTest::__pest_evaluable_tablet_admin_login_works_at_responsive_width
 - P\Tests\Browser\Storefront\ResponsiveTest::__pest_evaluable_tablet_admin_sidebar_navigation_reaches_products_and_orders
 - P\Tests\Browser\Storefront\ResponsiveTest::__pest_evaluable_mobile_collection_keeps_filters_accessible
 - P\Tests\Browser\Storefront\TenantIsolationTest::__pest_evaluable_storefront_only_shows_current_store_products
 - P\Tests\Browser\Storefront\TenantIsolationTest::__pest_evaluable_storefront_collections_only_contain_current_store_products
 - P\Tests\Browser\Storefront\TenantIsolationTest::__pest_evaluable_admin_cannot_see_other_store_products_or_orders
 - P\Tests\Browser\Storefront\TenantIsolationTest::__pest_evaluable_search_only_returns_current_store_products
 - P\Tests\Browser\Storefront\TenantIsolationTest::__pest_evaluable_customer_accounts_are_scoped_to_their_store.


The audit found the only count mismatch left: `tests/Browser/SmokeTest.php` batches Suite 1 into 4 tests while Spec 08 defines 10 smoke tests. I’m going to split Suite 1 to the spec’s 10-test shape while preserving the broader critical-page batch in test 1.10.


browser testing visit multiple pages assert no javascript errors

pest browser testing host visit navigation

laravel browser testing authenticated session


# Search Results

## Browser Testing
Browser Testing | pestphp/pest@4.x | Source: https://github.com/pestphp/docs/blob/4.x/browser-testing.md

---
title: Browser Testing
description:
---

# Browser Testing

Browser testing is an essential part of modern web development, allowing you to ensure that your application works correctly across different browsers and devices. Pest provides a simple and elegant way to write browser tests. Here is an example of how to write a browser test using Pest:

```php
it('may welcome the user', function () {
    $page = visit('/');

    $page->assertSee('Welcome');
});
```

This is a basic example of a browser test that checks if the homepage contains the text "Welcome". However, Pest's browser testing capabilities go beyond this simple example. You can use various methods to interact with the page, such as clicking buttons, filling out forms, and navigating between pages.

Here is an example of a more complex browser test, on Laravel, that checks if a user can sign in:

```php
it('may sign in the user', function () {
    Event::fake();

    User::factory()->create([ // assumes RefreshDatabase trait is used on Pest.php...
        'email' => 'nuno@laravel.com',
        'password' => 'password',
    ]);

    $page = visit('/')->on()->mobile()->firefox();

    $page->click('Sign In')
         ->assertUrlIs('/login')
         ->assertSee('Sign In to Your Account')
         ->fill('email', 'nuno@laravel.com')
         ->fill('password', 'password')
         ->click('Submit')
         ->assertSee('Dashboard');

    $this->assertAuthenticated();

    Event::assertDispatched(UserLoggedIn::class);
});
```

Note that, you are leveraging the full power of Laravel's testing capabilities, such as refresh database, event faking, and authentication assertions, while also actually doing browser testing.

## Getting Started

To get started with browser testing in Pest, you need to install the Pest Browser plugin. You can do this by running the following command:

```bash
composer require pestphp/pest-plugin-browser --dev

npm install playwright@latest
npx playwright install
```

Finally, add `tests/Browser/Screenshots` to your `.gitignore` file to avoid committing screenshots taken during browser tests.

### Running Browser Tests

Running browser tests is similar to running regular Pest tests:

```bash
./vendor/bin/pest
```

We recommend running tests in parallel using the `--parallel` option to speed up the execution:

```bash
./vendor/bin/pest --parallel
```

For debugging purposes, you can run the tests in a headed mode and pause the execution at the end of the failed test run:

```bash
./vendor/bin/pest --debug
```

### Navigation

The `visit()` method is used to navigate to a specific URL in your browser test. It provides various methods to interact with the page:

```php
test('example', function () {
    $page = visit('/');

    $page->assertSee('Welcome');
});
```

### Using Other Browsers

By default, the `visit()` method uses Chrome as the browser. However, if you want to use a different browser, you can specify it using the `--browser` option when running the tests:

```bash
./vendor/bin/pest --browser firefox
./vendor/bin/pest --browser safari
```

If you wish to use a different browser by default without specifying it in the command line, you can set it in your `Pest.php` configuration file:

```php
pest()->browser()->inFirefox();
pest()->browser()->inSafari();
```

### Using Other Devices

The `visit()` method uses a desktop viewport. However, you can specify a mobile viewport using the `onMobile()` method. For example:

```php
$page = visit('/')->on()->mobile();
```

If you wish to use a specific device, you can use the `on()` method and chain it with the `macbook14`, `iPhone14Pro`, etc:

```php
$page = visit('/')->on()->iPhone14Pro();
```

### Using Dark Mode

Pest enforces a light color scheme by default. However, you can specify a dark color scheme using the `inDarkMode()` method:

```php
$page = visit('/')->inDarkMode();
```

### Visiting Multiple Pages

You can visit multiple pages simultaneously by passing an array of URLs to the `visit()` method. This is useful for testing scenarios where you need to interact with multiple pages at once:

```php
$pages = visit(['/', '/about']);

$pages->assertNoSmoke()
    ->assertNoAccessibilityIssues()
    ->assertNoConsoleLogs()
    ->assertNoJavaScriptErrors();

[$homePage, $aboutPage] = $pages;

$homePage->assertSee('Welcome to our website');
$aboutPage->assertSee('About Us');
```

### Navigation

After visiting a page, you can navigate to other pages using the `navigate()` method. This method allows you to navigate to a different URL while keeping the current browser context:

```php
$page = visit('/');

$page->navigate('/about')
     ->assertSee('About Us');
```

### Locating Elements

You can locate elements in the DOM using text or CSS selectors. Pest provides a simple syntax for locating elements:

```php
// Clicks the first link with the text "Login"
$page->click('Login');

// Clicks the first element with the class "btn-primary"
$page->click('.btn-primary');

// Clicks the element with the data-test attribute "login"
$page->click('@login');

// Clicks the element with the ID "submit-button"
$page->click('#submit-button');

// etc...
```

### Configuring Timeouts

Sometimes, elements may take time to appear on the page. By default, Pest waits for `5` seconds before timing out. You can configure the default timeout for browser tests in your `Pest.php` configuration file:

```php
pest()->browser()->timeout(10000);
```

### Configuring User Agent

By default, the User Agent will default to the Browser you're running for tests such as: `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/133.0.6943.16 Safari/537.36`

You may wish to override the User Agent of the browser for all of your tests, you can configure this in the `Pest.php` configuration file:

```php
pest()->browser()->userAgent('CustomUserAgent');
```

### Configuring Host

By default, the server will bind to `127.0.0.1` for all browser tests.

You may wish to override the host for subdomain applications. You can configure this in the `Pest.php` configuration file:

```php
pest()->browser()->withHost('some-subdomain.localhost');
```

### Geolocation

Sometimes, you need to define where the browser believes it is physically on the earth.  This method takes a latitude and longitude and will set the `geolocation` permission in the browser and then make the coordinates available via Javascript's getCurrentPosition API:

```php
$page = visit('/')
     ->geolocation(39.399872, -8.224454);
```

### Configuring Locale

You can set the locale for your test requests using the `withLocale` method. This is particularly useful for testing multilingual applications.

```php
$page = visit('/')->withLocale('fr-FR');

$page->assertSee('Bienvenue');
```
### Configuring Timezone

You can set the timezone for your test requests using the `withTimezone` method. This is useful for testing date and time displays in different time zones.

```php
$page = visit('/')->withTimezone('America/New_York');

$page->assertSee('EST');
```

### Configuring UserAgent

You can set the User-Agent header for your test requests using the `withUserAgent` method. This is useful for testing how your application responds to different types of clients, such as mobile browsers or bots.

```php
$page = visit('/')->withUserAgent('Googlebot');

$page->assertSee('Welcome, bot!');
```

### Configuring Host

You can set the host for your test server using the `withHost` method. This is useful for testing subdomains or where different hosts serve different content.

```php
$page = visit('/dashboard')->withHost('some-subdomain.localhost');

$page->assertSee('Welcome to Some Subdomain');
```

## Table of Contents

### Available Assertions

[assertTitle](#assert-title)
[assertTitleContains](#assert-title-contains)
[assertSee](#assert-see)
[assertDontSee](#assert-dont-see)
[assertSeeIn](#assert-see-in)
[assertDontSeeIn](#assert-dont-see-in)
[assertSeeAnythingIn](#assert-see-anything-in)
[assertSeeNothingIn](#assert-see-nothing-in)
[assertCount](#assert-count)
[assertScript](#assert-script)
[assertSourceHas](#assert-source-has)
[assertSourceMissing](#assert-source-missing)
[assertSeeLink](#assert-see-link)
[assertDontSeeLink](#assert-dont-see-link)
[assertChecked](#assert-checked)
[assertNotChecked](#assert-not-checked)
[assertIndeterminate](#assert-indeterminate)
[assertRadioSelected](#assert-radio-selected)
[assertRadioNotSelected](#assert-radio-not-selected)
[assertSelected](#assert-selected)
[assertNotSelected](#assert-not-selected)
[assertValue](#assert-value)
[assertValueIsNot](#assert-value-is-not)
[assertAttribute](#assert-attribute)
[assertAttributeMissing](#assert-attribute-missing)
[assertAttributeContains](#assert-attribute-contains)
[assertAttributeDoesntContain](#assert-attribute-doesnt-contain)
[assertAriaAttribute](#assert-aria-attribute)
[assertDataAttribute](#assert-data-attribute)
[assertVisible](#assert-visible)
[assertPresent](#assert-present)
[assertNotPresent](#assert-not-present)
[assertMissing](#assert-missing)
[assertEnabled](#assert-enabled)
[assertDisabled](#assert-disabled)
[assertButtonEnabled](#assert-button-enabled)
[assertButtonDisabled](#assert-button-disabled)
[assertUrlIs](#assert-url-is)
[assertSchemeIs](#assert-scheme-is)
[assertSchemeIsNot](#assert-scheme-is-not)
[assertHostIs](#assert-host-is)
[assertHostIsNot](#assert-host-is-not)
[assertPortIs](#assert-port-is)
[assertPortIsNot](#assert-port-is-not)
[assertPathBeginsWith](#assert-path-begins-with)
[assertPathEndsWith](#assert-path-ends-with)
[assertPathContains](#assert-path-contains)
[assertPathIs](#assert-path-is)
[assertPathIsNot](#assert-path-is-not)
[assertQueryStringHas](#assert-query-string-has)
[assertQueryStringMissing](#assert-query-string-missing)
[assertFragmentIs](#assert-fragment-is)
[assertFragmentBeginsWith](#assert-fragment-begins-with)
[assertFragmentIsNot](#assert-fragment-is-not)
[assertNoSmoke](#assert-no-smoke)
[assertNoConsoleLogs](#assert-no-console-logs)
[assertNoJavaScriptErrors](#assert-no-javascript-errors)
[assertNoAccessibilityIssues](#assert-no-accessibility-issues)
[assertScreenshotMatches](#assert-screenshot-matches)

### Element Interactions

[click](#click)
[text](#text)
[attribute](#attribute)
[keys](#keys)
[withKeyDown](#withKeyDown)
[type](#type)
[typeSlowly](#type-slowly)
[select](#select)
[append](#append)
[clear](#clear)
[radio](#radio)
[check](#check)
[uncheck](#uncheck)
[attach](#attach)
[press](#press)
[pressAndWaitFor](#press-and-wait-for)
[drag](#drag)
[hover](#hover)
[submit](#submit)
[value](#value)
[withinIframe](#within-iframe)
[resize](#resize)
[script](#script)
[content](#content)
[url](#url)
[wait](#wait)
[waitForKey](#wait-for-key)

### Debugging tests

[debug](#debug)
[screenshot](#screenshot)
[screenshotElement](#screenshot-element)
[tinker](#tinker)
[headed](#headed)

## Element Assertions

---

## Dusk Browser Basics Authentication
Dusk | laravel/framework@12.x | Source: https://github.com/laravel/docs/blob/12.x/dusk.md

### Authentication

Often, you will be testing pages that require authentication. You can use Dusk's `loginAs` method in order to avoid interacting with your application's login screen during every test. The `loginAs` method accepts a primary key associated with your authenticatable model or an authenticatable model instance:

```php
use App\Models\User;
use Laravel\Dusk\Browser;

$this->browse(function (Browser $browser) {
    $browser->loginAs(User::find(1))
        ->visit('/home');
});
```

> [!WARNING]
> After using the `loginAs` method, the user session will be maintained for all tests within the file.

---

## Pest V4 Is Here Now With Browser Testing
Pest V4 Is Here Now With Browser Testing | pestphp/pest@4.x | Source: https://github.com/pestphp/docs/blob/4.x/pest-v4-is-here-now-with-browser-testing.md

---
title: Pest v4 Is Here — Now with Browser Testing
description: Today, we're thrilled to announce Pest v4 — our biggest release yet, featuring powerful new browser testing with parallel support and full Laravel integration.
---

> To get started with Pest v4's new features including browser testing, please refer to the upgrade guide: [Upgrade Guide →](/docs/upgrade-guide).

- [Browser Testing](#content-pest-v4-is-here-now-with-browser-testing)
- [Smoke Testing](#content-smoke-testing)
- [Visual Regression Testing](#content-visual-regression-testing)
- [Test Sharding](#content-test-sharding)
- [Type Coverage Is Much Faster](#content-type-coverage-is-much-faster)
- [Profanity Checking](#content-profanity-checking)
- [On Top of PHPUnit 12](#content-on-top-of-phpunit-12)

# Pest v4 Is Here — Now with Browser Testing

Today, we're thrilled to announce the release of **Pest v4**, bringing the biggest testing upgrade yet: powerful **[Browser Testing](/docs/browser-testing)**. Pest's new browser testing features let you run elegant, maintainable browser tests — with first-class support for Laravel's testing API and the ability to run tests in parallel. For the first time, this is browser testing that feels as good as writing unit tests.

Here is the creator of Pest, [Nuno Maduro](https://twitter.com/enunomaduro), demoing the new browser testing features in Pest v4 at Laracon US:

[![Pest v4](/assets/pest4_play.png)](https://youtu.be/f5gAgwwwwOI?si=LtPpySZe3tf8qMjz&t=52)

Here is an example of Browser Testing using [Laravel](https://laravel.com):

```php
it('may reset the password', function () {
    // access any laravel testing helpers...
    Notification::fake();

    // access to the database — using the RefreshDatabase trait (even sqlite in memory...)
    $this->actingAs(User::factory()->create());

    $page = visit('/sign-in') // visit on a real browser...
        ->on()->mobile() // or ->desktop(), ->tablet(), etc...
        ->inDarkMode(); // or ->inLightMode()

    $page->assertSee('Sign In')
         ->click('Forgot Password?')
         ->type('email', 'nuno@laravel.com')
         ->press('Send Reset Link')
         ->assertSee('We have emailed your password reset link!')
         ->assertNoJavascriptErrors(); // or ->assertNoConsoleLogs()

    Notification::assertSent(ResetPassword::class);
});
```

With Pest v4's browser testing, you can:
- Seamlessly use **Laravel features** like `Event::fake()`, `assertAuthenticated()`, and model factories
- Use `RefreshDatabase`, even with SQLite in-memory databases, to ensure a clean state for each test
- Test on **multiple browsers** (Chrome, Firefox, Safari)
- Test on **different devices** and viewports (like iPhone 14 Pro, tablets, or custom breakpoints)
- Switch **color schemes** (light/dark mode)
- Interact with the page (click, type, scroll, select, submit, drag-and-drop, touch gestures, etc.)
- Run **parallel browser tests** for dramatically faster suites
- Take **screenshots** or pause tests for debugging
- …all with the elegance of Pest syntax
- **Playwright-based** — modern, fast, and reliable

To get started with browser testing in Pest, you need to install the Pest Browser Plugin:

```bash
composer require pestphp/pest-plugin-browser --dev

npm install playwright@latest
npx playwright install
```

After, you may use the `visit()` function anywhere. Finally, running this test is as simple as executing `./vendor/bin/pest` in your terminal. Pest will handle the rest, launching a browser, navigating to the page, and performing the actions you specified.

## Smoke Testing

Smoke testing your application in real browsers has never been easier. With Pest v4, you can literally visit all your application pages, and ensure they don't throw any JavaScript errors, and they don't log any console errors.

```php
$routes = ['/', '/about', '/contact'];

visit($routes)->assertNoSmoke();

// assertNoSmoke() is a shorthand for:
// - assertNoJavascriptErrors()
// - assertNoConsoleLogs()
```

## Visual Regression Testing

Want to ensure your pages look exactly as expected over time? Pest v4 introduces visual regression testing with the `assertScreenshotMatches()` assertion. This allows you to take screenshots of your pages and compare them against baseline images, ensuring that your UI remains consistent across changes.

```php
$pages = visit(['/', '/about', '/contact']);

$pages->assertScreenshotMatches();
```

This is just a glimpse of what Browser Testing in Pest v4 can do. Find out more about the new features below, and check out the [Browser Testing documentation](/docs/browser-testing) for a complete guide on how to get started.

## Test Sharding

Pest v4 introduces **Test Sharding**, allowing you to split your test suite into smaller, manageable chunks. This is particularly useful for large applications (or when running browser tests) where running all tests at once can be time-consuming.

This feature is particularly useful on CI platforms, where on things like GitHub actions you can no longer scale vertical, but rather horizontally. This means you can run your tests in parallel across multiple machines, significantly speeding up your test suite execution.

To get started with Test Sharding, you can use the `--shard` option when running Pest:

```bash
# GitHub Workflow One
./vendor/bin/pest --shard=1/4

# GitHub Workflow Two
./vendor/bin/pest --shard=2/4

# GitHub Workflow Three
./vendor/bin/pest --shard=3/4

# GitHub Workflow Four
./vendor/bin/pest --shard=4/4
```

You may combine this with the `--parallel` option to run your tests in parallel, and this way trully maximize your test suite execution speed:

```bash
./vendor/bin/pest --shard=1/4 --parallel
```

Finally, to easily set up sharding your CI configuration, you just have to ensure each job in your CI configuration runs a different shard of your test suite. For example, in GitHub Actions, you can use the `matrix` strategy to define multiple jobs that run different shards:

```yaml
strategy:
  matrix:
    shard: [1, 2, 3, 4]

name: Tests (Shard ${{ matrix.shard }}/4)

steps:
  - name: Run tests
    run: pest --parallel --shard ${{ matrix.shard }}/4
```

## Type Coverage Is Much Faster

Remember the days when you had to wait for your type coverage to run? Not anymore! Pest v4 introduces a new type coverage engine that is significantly faster than previous versions.

Type coverage is 2x faster on the first run and instant on subsequent runs. This means you can quickly check your type coverage without waiting for long periods, making your development workflow much more efficient.

In addition, Type Coverage now supports **Sharding**. This means you can run type coverage with the `--shard` option, just like you do with your tests.

## Profanity Checking

Pest v4 introduces a new feature that allows you to check for profanity in your test code. This is particularly useful for maintaining a clean and professional codebase, especially in collaborative environments.

You can enable profanity checking by adding the `--profanity` option when running Pest:

```bash
./vendor/bin/pest --profanity
```

To start using Pest's Profanity plugin, you need to require the plugin via Composer.

```bash
composer require pestphp/pest-plugin-profanity --dev
```

After requiring the plugin, you may utilize the `--profanity` option to generate a report of your profanity.

```bash
./vendor/bin/pest --profanity
```

If any of your files contain profanity, they will be highlighted in red and displayed using their respective line
numbers and the profane word(s) that have been found.

As an example, `pr31(f*ck)` means that the word "fuck" was found on line 31.

To learn more about the Profanity plugin and how to configure it, check out the [Profanity documentation](/docs/profanity).

### Skip Locally or On CI

Pest v4 introduces the ability to conditionally skip tests based on the environment. You can use `skipLocally()` to skip tests when running locally, or `skipOnCi` to skip tests when running on a CI server.

```php
it('does not run locally', function () {
    // This test will be skipped when running locally
})->skipLocally();

it('does not run on CI', function () {
    // This test will be skipped when running on a CI server
})->skipOnCi();
```

### Miscellaneous Improvements

- You may now use `skipLocally()` or `skipOnCi` to conditionally skip tests based on the environment.
- The `not->toHaveSuspiciousCharacters()` arch expectation has been added to help you identify potential suspicious characters in your code. This arch expectation is now enabled by default on the `php` arch preset. This expectation requires the `intl` PHP extension.
- The expectation `toBeSlug` has been added to help you validate that a string is a valid slug.

### On Top of PHPUnit 12

Pest v4 is built on top of PHPUnit 12, which means you get all the latest features and improvements from PHPUnit. As such, be sure to check out the [PHPUnit 12 release announcement](https://phpunit.de/announcements/phpunit-12.html).

### Thanks To You, Pest v4 Is Here!

There's never been a better time to dive into testing and start using Pest. If you're ready to get started with Pest v4 right away, check out our [installation guide](/docs/installation) for step-by-step instructions. And if you're currently using an earlier version of Pest, we've got you covered with detailed upgrade instructions in our [upgrade guide](/docs/upgrade-guide).

Thank you for your continued support and feedback. We can't wait to see what you build with Pest v4!

---

Thank you for reading about Pest v4's new features! Want to get started with Pest? You can find the installation guide in the next section of the documentation: [Installation →](/docs/installation)

_[Truncated]_