command: rg -n "Suite 2|Suite 3|Suite 7|Admin Authentication|Storefront Browsing|Cart Flow|Checkout Flow|Customer Account|Test 2\.|Test 7\.|Test 8\.|Test 9\.|Test 10\." specs/08-PLAYWRIGHT-E2E-PLAN.md

type: search

cmd: rg -n "Suite 2|Suite 3|Suite 7|Admin Authentication|Storefront Browsing|Cart Flow|Checkout Flow|Customer Account|Test 2\\.|Test 7\\.|Test 8\\.|Test 9\\.|Test 10\\." specs/08-PLAYWRIGHT-E2E-PLAN.md

query: Suite 2|Suite 3|Suite 7|Admin Authentication|Storefront Browsing|Cart Flow|Checkout Flow|Customer Account|Test 2\.|Test 7\.|Test 8\.|Test 9\.|Test 10\.

aggregated_output:
12:| 2 - Admin Authentication | `tests/Browser/Admin/AuthenticationTest.php` | 10 | Admin login, logout, invalid credentials, session access control | Admin user |
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) |
114:    S1[Suite 1: Smoke Tests] --> S2[Suite 2: Admin Auth]
115:    S1 --> S7[Suite 7: Storefront Browsing]
116:    S2 --> S3[Suite 3: Admin Products]
124:    S7 --> S8[Suite 8: Cart Flow]
125:    S8 --> S9[Suite 9: Checkout Flow]
126:    S7 --> S10[Suite 10: Customer Account]
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
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
1440:    CartDrawer -->|click 'Checkout'| Checkout[Checkout 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
2084:### Customer Account Flow
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
3123:| 2 - Admin Authentication | `tests/Browser/Admin/AuthenticationTest.php` | 10 |
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 |


output:
Chunk ID: b4faa5
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1381
Output:
12:| 2 - Admin Authentication | `tests/Browser/Admin/AuthenticationTest.php` | 10 | Admin login, logout, invalid credentials, session access control | Admin user |
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) |
114:    S1[Suite 1: Smoke Tests] --> S2[Suite 2: Admin Auth]
115:    S1 --> S7[Suite 7: Storefront Browsing]
116:    S2 --> S3[Suite 3: Admin Products]
124:    S7 --> S8[Suite 8: Cart Flow]
125:    S8 --> S9[Suite 9: Checkout Flow]
126:    S7 --> S10[Suite 10: Customer Account]
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
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
1440:    CartDrawer -->|click 'Checkout'| Checkout[Checkout 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
2084:### Customer Account Flow
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
3123:| 2 - Admin Authentication | `tests/Browser/Admin/AuthenticationTest.php` | 10 |
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 |


command: rg -n "data-test|customer-login-button|add-to-cart|checkout|cart|admin-login|logout|Create|Save|Update|Archive|Apply|payment|shipping|discount" resources/views app/Livewire tests -g '!vendor'

type: search

cmd: rg -n 'data-test|customer-login-button|add-to-cart|checkout|cart|admin-login|logout|Create|Save|Update|Archive|Apply|payment|shipping|discount' resources/views app/Livewire tests -g '!vendor'

query: data-test|customer-login-button|add-to-cart|checkout|cart|admin-login|logout|Create|Save|Update|Archive|Apply|payment|shipping|discount

path: views

aggregated_output:
app/Livewire/Actions/Logout.php:15:        Auth::guard('web')->logout();
resources/views/layouts/storefront.blade.php:65:                    <flux:modal.trigger name="cart-drawer">
resources/views/layouts/storefront.blade.php:72:        <livewire:storefront.cart-drawer />
tests/Feature/Analytics/AnalyticsServiceTest.php:62:        $analytics->track($store, AnalyticsEventType::AddToCart->value, ['variant_id' => $index], 'agg-session-'.$index, null, "agg-cart-{$index}", $date->copy()->addHour()->addMinutes($index));
tests/Feature/Analytics/AnalyticsServiceTest.php:66:        $analytics->track($store, AnalyticsEventType::CheckoutStarted->value, ['cart_id' => $index], 'agg-session-'.$index, null, "agg-checkout-{$index}", $date->copy()->addHours(2)->addMinutes($index));
tests/Feature/Analytics/AnalyticsServiceTest.php:79:        ->and($daily->add_to_cart_count)->toBe(3)
tests/Feature/Analytics/AnalyticsServiceTest.php:80:        ->and($daily->checkout_started_count)->toBe(2)
tests/Feature/Analytics/AnalyticsServiceTest.php:81:        ->and($daily->checkout_completed_count)->toBe(2)
app/Livewire/Admin/Developers/Index.php:92:            $this->webhookEventType = WebhookEventType::OrderCreated->value;
tests/Feature/Webhooks/WebhookDeliveryTest.php:23:        'event_type' => WebhookEventType::OrderCreated,
tests/Feature/Webhooks/WebhookDeliveryTest.php:28:        'event_type' => WebhookEventType::ProductUpdated,
tests/Feature/Webhooks/WebhookDeliveryTest.php:32:    app(WebhookService::class)->dispatch($store, WebhookEventType::OrderCreated->value, [
tests/Feature/Webhooks/WebhookDeliveryTest.php:37:        return $job->eventType === WebhookEventType::OrderCreated->value
tests/Feature/Webhooks/WebhookDeliveryTest.php:62:        'event_type' => WebhookEventType::OrderCreated->value,
tests/Feature/Webhooks/WebhookDeliveryTest.php:67:    (new DeliverWebhook($delivery->getKey(), WebhookEventType::OrderCreated->value, $payload))
tests/Feature/Webhooks/WebhookDeliveryTest.php:75:            && $request->header('X-Platform-Event')[0] === WebhookEventType::OrderCreated->value
tests/Feature/Webhooks/WebhookDeliveryTest.php:109:    expect(fn () => (new DeliverWebhook($delivery->getKey(), WebhookEventType::OrderCreated->value, [
tests/Feature/Webhooks/WebhookDeliveryTest.php:120:    $job = new DeliverWebhook(1, WebhookEventType::OrderCreated->value, []);
app/Livewire/Admin/Analytics/Index.php:124:            ? round(($totals['checkout_completed_count'] / $totals['visits_count']) * 100, 2)
tests/Feature/Orders/OrderServiceTest.php:10:use App\Events\OrderCreated;
tests/Feature/Orders/OrderServiceTest.php:51:        'config_json' => ['default_rate_bps' => 0, 'shipping_taxable' => false],
tests/Feature/Orders/OrderServiceTest.php:113:function orderCompletionCheckout(Store $store, string $paymentMethod = 'credit_card', ?string $discountCode = null): array
tests/Feature/Orders/OrderServiceTest.php:117:    $cart = app(CartService::class)->create($store);
tests/Feature/Orders/OrderServiceTest.php:119:    app(CartService::class)->addLine($cart, $variant->getKey(), 2);
tests/Feature/Orders/OrderServiceTest.php:121:    $checkout = app(CheckoutService::class)->createFromCart($cart);
tests/Feature/Orders/OrderServiceTest.php:122:    $checkout = app(CheckoutService::class)->setAddress($checkout, [
tests/Feature/Orders/OrderServiceTest.php:124:        'shipping_address' => [
tests/Feature/Orders/OrderServiceTest.php:133:    $checkout = app(CheckoutService::class)->setShippingMethod($checkout, $rate->getKey());
tests/Feature/Orders/OrderServiceTest.php:135:    if ($discountCode !== null) {
tests/Feature/Orders/OrderServiceTest.php:136:        $checkout->forceFill(['discount_code' => $discountCode])->save();
tests/Feature/Orders/OrderServiceTest.php:137:        app(PricingEngine::class)->calculate($checkout);
tests/Feature/Orders/OrderServiceTest.php:140:    $checkout = app(CheckoutService::class)->selectPaymentMethod($checkout, $paymentMethod);
tests/Feature/Orders/OrderServiceTest.php:142:    return [$checkout, $variant, $cart];
tests/Feature/Orders/OrderServiceTest.php:145:test('checkout completion creates a paid order and commits inventory', function () {
tests/Feature/Orders/OrderServiceTest.php:147:    $discount = Discount::factory()
tests/Feature/Orders/OrderServiceTest.php:153:    [$checkout, $variant, $cart] = orderCompletionCheckout($store, discountCode: 'SAVE500');
tests/Feature/Orders/OrderServiceTest.php:157:    $order = app(CheckoutService::class)->completeCheckout($checkout, [
tests/Feature/Orders/OrderServiceTest.php:167:        ->and($order->lines->first()->discount_allocations_json)->toBe([[
tests/Feature/Orders/OrderServiceTest.php:168:            'discount_id' => $discount->getKey(),
tests/Feature/Orders/OrderServiceTest.php:172:        ->and($order->payments)->toHaveCount(1)
tests/Feature/Orders/OrderServiceTest.php:173:        ->and($order->payments->first()->status)->toBe(PaymentStatus::Captured)
tests/Feature/Orders/Ord…125074 chars truncated…         <x-storefront.price :amount="$line->line_total_amount" :currency="$cart->currency" class="justify-end" />
resources/views/livewire/storefront/cart/show.blade.php:67:                    @if ($cart)
resources/views/livewire/storefront/cart/show.blade.php:68:                        <x-storefront.price :amount="$subtotal" :currency="$cart->currency" />
resources/views/livewire/storefront/cart/show.blade.php:75:                    @if ($cart && ($discountAmount > 0 || $discountFreeShipping))
resources/views/livewire/storefront/cart/show.blade.php:77:                            {{ $discountFreeShipping && $discountAmount === 0 ? 'Free shipping' : '-'.\App\Support\Money::format($discountAmount, $cart->currency) }}
resources/views/livewire/storefront/cart/show.blade.php:85:                    @if (! $cart || $lineCount === 0)
resources/views/livewire/storefront/cart/show.blade.php:87:                    @elseif (! $requiresShipping || $discountFreeShipping)
resources/views/livewire/storefront/cart/show.blade.php:90:                        <x-storefront.price :amount="$estimatedShipping" :currency="$cart->currency" />
resources/views/livewire/storefront/cart/show.blade.php:97:                    @if ($cart)
resources/views/livewire/storefront/cart/show.blade.php:98:                        <x-storefront.price :amount="$estimatedTotal" :currency="$cart->currency" />
resources/views/livewire/storefront/cart/show.blade.php:105:            @if ($cart && $lineCount > 0)
resources/views/livewire/storefront/cart/show.blade.php:109:                            <flux:input wire:model="discountCode" label="Discount code" placeholder="SAVE10" />
resources/views/livewire/storefront/cart/show.blade.php:112:                            Apply
resources/views/livewire/storefront/cart/show.blade.php:115:                    <flux:error name="discountCode" />
resources/views/livewire/storefront/cart/show.blade.php:129:                        <flux:select wire:model.live="shippingCountry" label="Ship to">
resources/views/livewire/storefront/cart/show.blade.php:136:                            <flux:input wire:model.live.debounce.400ms="shippingPostalCode" label="Postal code" placeholder="10115" />
resources/views/livewire/storefront/cart/show.blade.php:137:                            <flux:input wire:model.live.debounce.400ms="shippingProvinceCode" label="Region code" placeholder="BE" />
resources/views/livewire/storefront/cart/show.blade.php:141:                    <flux:error name="shippingCountry" />
resources/views/livewire/storefront/cart/show.blade.php:144:                        Estimate shipping
resources/views/livewire/storefront/cart/show.blade.php:149:
getKey() }}">
resources/views/livewire/storefront/cart/show.blade.php:151:                                <x-storefront.price :amount="data_get($rateAmounts, $rate->getKey(), 0)" :currency="$cart->currency" class="justify-end text-sm" />
resources/views/livewire/storefront/cart/show.blade.php:155:                                {{ $requiresShipping ? 'No rates are available.' : 'No shipping needed.' }}
resources/views/livewire/storefront/cart/show.blade.php:162:            <flux:button wire:click="checkout" variant="primary" class="mt-6 w-full" :disabled="$lineCount === 0">
resources/views/livewire/storefront/account/auth/register.blade.php:2:    <x-auth-header :title="__('Create an account')" :description="__('Save your details for faster checkout')" />
resources/views/livewire/storefront/account/auth/register.blade.php:43:        <flux:button variant="primary" type="submit" class="w-full" data-test="customer-register-button">
resources/views/livewire/storefront/account/auth/register.blade.php:44:            {{ __('Create account') }}
resources/views/livewire/storefront/account/auth/login.blade.php:31:        <flux:button variant="primary" type="submit" class="w-full" data-test="customer-login-button">
resources/views/livewire/storefront/account/auth/login.blade.php:38:        <flux:link :href="route('account.register')" wire:navigate>{{ __('Create an account') }}</flux:link>
resources/views/livewire/storefront/account/auth/reset-password.blade.php:33:        <flux:button variant="primary" type="submit" class="w-full" data-test="customer-reset-password-button">
resources/views/livewire/storefront/account/orders/show.blade.php:61:                    -{{ \App\Support\Money::format($order->discount_amount, $order->currency) }}
resources/views/livewire/storefront/account/orders/show.blade.php:65:                    <x-storefront.price :amount="$order->shipping_amount" :currency="$order->currency" />
resources/views/livewire/storefront/account/auth/forgot-password.blade.php:21:        <flux:button variant="primary" type="submit" class="w-full" data-test="customer-forgot-password-button">

status: completed


output:
Chunk ID: a25063
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 33769
Output:
Total output lines: 1115

app/Livewire/Actions/Logout.php:15:        Auth::guard('web')->logout();
resources/views/layouts/storefront.blade.php:65:                    <flux:modal.trigger name="cart-drawer">
resources/views/layouts/storefront.blade.php:72:        <livewire:storefront.cart-drawer />
tests/Feature/Analytics/AnalyticsServiceTest.php:62:        $analytics->track($store, AnalyticsEventType::AddToCart->value, ['variant_id' => $index], 'agg-session-'.$index, null, "agg-cart-{$index}", $date->copy()->addHour()->addMinutes($index));
tests/Feature/Analytics/AnalyticsServiceTest.php:66:        $analytics->track($store, AnalyticsEventType::CheckoutStarted->value, ['cart_id' => $index], 'agg-session-'.$index, null, "agg-checkout-{$index}", $date->copy()->addHours(2)->addMinutes($index));
tests/Feature/Analytics/AnalyticsServiceTest.php:79:        ->and($daily->add_to_cart_count)->toBe(3)
tests/Feature/Analytics/AnalyticsServiceTest.php:80:        ->and($daily->checkout_started_count)->toBe(2)
tests/Feature/Analytics/AnalyticsServiceTest.php:81:        ->and($daily->checkout_completed_count)->toBe(2)
app/Livewire/Admin/Developers/Index.php:92:            $this->webhookEventType = WebhookEventType::OrderCreated->value;
tests/Feature/Webhooks/WebhookDeliveryTest.php:23:        'event_type' => WebhookEventType::OrderCreated,
tests/Feature/Webhooks/WebhookDeliveryTest.php:28:        'event_type' => WebhookEventType::ProductUpdated,
tests/Feature/Webhooks/WebhookDeliveryTest.php:32:    app(WebhookService::class)->dispatch($store, WebhookEventType::OrderCreated->value, [
tests/Feature/Webhooks/WebhookDeliveryTest.php:37:        return $job->eventType === WebhookEventType::OrderCreated->value
tests/Feature/Webhooks/WebhookDeliveryTest.php:62:        'event_type' => WebhookEventType::OrderCreated->value,
tests/Feature/Webhooks/WebhookDeliveryTest.php:67:    (new DeliverWebhook($delivery->getKey(), WebhookEventType::OrderCreated->value, $payload))
tests/Feature/Webhooks/WebhookDeliveryTest.php:75:            && $request->header('X-Platform-Event')[0] === WebhookEventType::OrderCreated->value
tests/Feature/Webhooks/WebhookDeliveryTest.php:109:    expect(fn () => (new DeliverWebhook($delivery->getKey(), WebhookEventType::OrderCreated->value, [
tests/Feature/Webhooks/WebhookDeliveryTest.php:120:    $job = new DeliverWebhook(1, WebhookEventType::OrderCreated->value, []);
app/Livewire/Admin/Analytics/Index.php:124:            ? round(($totals['checkout_completed_count'] / $totals['visits_count']) * 100, 2)
tests/Feature/Orders/OrderServiceTest.php:10:use App\Events\OrderCreated;
tests/Feature/Orders/OrderServiceTest.php:51:        'config_json' => ['default_rate_bps' => 0, 'shipping_taxable' => false],
tests/Feature/Orders/OrderServiceTest.php:113:function orderCompletionCheckout(Store $store, string $paymentMethod = 'credit_card', ?string $discountCode = null): array
tests/Feature/Orders/OrderServiceTest.php:117:    $cart = app(CartService::class)->create($store);
tests/Feature/Orders/OrderServiceTest.php:119:    app(CartService::class)->addLine($cart, $variant->getKey(), 2);
tests/Feature/Orders/OrderServiceTest.php:121:    $checkout = app(CheckoutService::class)->createFromCart($cart);
tests/Feature/Orders/OrderServiceTest.php:122:    $checkout = app(CheckoutService::class)->setAddress($checkout, [
tests/Feature/Orders/OrderServiceTest.php:124:        'shipping_address' => [
tests/Feature/Orders/OrderServiceTest.php:133:    $checkout = app(CheckoutService::class)->setShippingMethod($checkout, $rate->getKey());
tests/Feature/Orders/OrderServiceTest.php:135:    if ($discountCode !== null) {
tests/Feature/Orders/OrderServiceTest.php:136:        $checkout->forceFill(['discount_code' => $discountCode])->save();
tests/Feature/Orders/OrderServiceTest.php:137:        app(PricingEngine::class)->calculate($checkout);
tests/Feature/Orders/OrderServiceTest.php:140:    $checkout = app(CheckoutService::class)->selectPaymentMethod($checkout, $paymentMethod);
tests/Feature/Orders/OrderServiceTest.php:142:    return [$checkout, $variant, $cart];
tests/Feature/Orders/OrderServiceTest.php:145:test('checkout completion creates a paid order and commits inventory', function () {
tests/Feature/Orders/OrderServiceTest.php:147:    $discount = Discount::factory()
tests/Feature/Orders/OrderServiceTest.php:153:    [$checkout, $variant, $cart] = orderCompletionCheckout($store, discountCode: 'SAVE500');
tests/Feature/Orders/OrderServiceTest.php:157:    $order = app(CheckoutService::class)->completeCheckout($checkout, [
tests/Feature/Orders/OrderServiceTest.php:167:        ->and($order->lines->first()->discount_allocations_json)->toBe([[
tests/Feature/Orders/OrderServiceTest.php:168:            'discount_id' => $discount->getKey(),
tests/Feature/Orders/OrderServiceTest.php:172:        ->and($order->payments)->toHaveCount(1)
tests/Feature/Orders/OrderServiceTest.php:173:        ->and($order->payments->first()->status)->toBe(PaymentStatus::Captured)
tests/Feature/Orders/OrderServiceTest.php:174:        ->and($order->payments->first()->raw_json_encrypted['success'])->toBeTrue()
tests/Feature/Orders/OrderServiceTest.php:175:        ->and($cart->refresh()->status)->toBe(CartStatus::Converted)
tests/Feature/Orders/OrderServiceTest.php:176:        ->and($checkout->refresh()->status)->toBe(CheckoutStatus::Completed)
tests/Feature/Orders/OrderServiceTest.php:177:        ->and($discount->refresh()->usage_count)->toBe(1);
tests/Feature/Orders/OrderServiceTest.php:184:    Event::assertDispatched(OrderCreated::class, fn (OrderCreated $event): bool => $event->order->is($order));
tests/Feature/Orders/OrderServiceTest.php:188:test('checkout completion attributes automatic discounts on order lines', function () {
tests/Feature/Orders/OrderServiceTest.php:198:    [$checkout] = orderCompletionCheckout($store);
tests/Feature/Orders/OrderServiceTest.php:200:    $order = app(CheckoutService::class)->completeCheckout($checkout, [
tests/Feature/Orders/OrderServiceTest.php:204:    expect($order->discount_amount)->toBe(500)
tests/Feature/Orders/OrderServiceTest.php:205:        ->and($order->lines->first()->discount_allocations_json)->toBe([[
tests/Feature/Orders/OrderServiceTest.php:206:            'discount_id' => $automatic->getKey(),
tests/Feature/Orders/OrderServiceTest.php:212:test('checkout completion keeps explicit and automatic discount allocations separate', function () {
tests/Feature/Orders/OrderServiceTest.php:229:    [$checkout] = orderCompletionCheckout($store, discountCode: 'SAVE10');
tests/Feature/Orders/OrderServiceTest.php:231:    $order = app(CheckoutService::class)->completeCheckout($checkout, [
tests/Feature/Orders/OrderServiceTest.php:235:    expect($order->discount_amount)->toBe(950)
tests/Feature/Orders/OrderServiceTest.php:236:        ->and($order->lines->first()->discount_allocations_json)->toBe([
tests/Feature/Orders/OrderServiceTest.php:238:                'discount_id' => $codeDiscount->getKey(),
tests/Feature/Orders/OrderServiceTest.php:243:                'discount_id' => $automatic->getKey(),
tests/Feature/Orders/OrderServiceTest.php:250:test('checkout completion is idempotent for the same checkout', function () {
tests/Feature/Orders/OrderServiceTest.php:252:    [$checkout, $variant] = orderCompletionCheckout($store);
tests/Feature/Orders/OrderServiceTest.php:254:    $order = app(CheckoutService::class)->completeCheckout($checkout, [
tests/Feature/Orders/OrderServiceTest.php:257:    $sameOrder = app(CheckoutService::class)->completeCheckout($checkout->refresh(), [
tests/Feature/Orders/OrderServiceTest.php:270:    [$checkout, $variant] = orderCompletionCheckout($store, paymentMethod: 'bank_transfer');
tests/Feature/Orders/OrderServiceTest.php:274:    $order = app(CheckoutService::class)->completeCheckout($checkout);
tests/Feature/Orders/OrderServiceTest.php:278:        ->and($order->payments->first()->status)->toBe(PaymentStatus::Pending)
tests/Feature/Orders/OrderServiceTest.php:279:        ->and($checkout->refresh()->status)->toBe(CheckoutStatus::Completed);
tests/Feature/Orders/OrderServiceTest.php:286:    Event::assertDispatched(OrderCreated::class);
tests/Feature/Orders/OrderServiceTest.php:290:test('payment failures release reserved inventory and allow checkout retry', function () {
tests/Feature/Orders/OrderServiceTest.php:292:    [$checkout, $variant] = orderCompletionCheckout($store);
tests/Feature/Orders/OrderServiceTest.php:294:    expect(fn () => app(CheckoutService::class)->completeCheckout($checkout, [
tests/Feature/Orders/OrderServiceTest.php:303:        ->and($checkout->refresh()->status)->toBe(CheckoutStatus::ShippingSelected)
tests/Feature/Orders/OrderServiceTest.php:304:        ->and($checkout->payment_method)->toBeNull();
app/Livewire/Admin/Themes/Editor.php:96:        ThemeSettings::withoutGlobalScopes()->updateOrCreate(
tests/Feature/Orders/BankTransferOrderTest.php:42:        'requires_shipping' => ! $digital,
tests/Feature/Orders/BankTransferOrderTest.php:55:        'payment_method' => PaymentMethod::BankTransfer,
tests/Feature/Orders/BankTransferOrderTest.php:60:        'shipping_amount' => 0,
tests/Feature/Orders/BankTransferOrderTest.php:80:test('confirming bank transfer payment captures payment and commits reserved inventory', function () {
tests/Feature/Orders/BankTransferOrderTest.php:90:        ->and($paidOrder->payments->first()->status)->toBe(PaymentStatus::Captured)
tests/Feature/Orders/BankTransferOrderTest.php:97:test('confirming digital bank transfer payment auto-fulfills the order', function () {
tests/Feature/Orders/BankTransferOrderTest.php:121:        ->and($oldOrder->payments()->first()?->status)->toBe(PaymentStatus::Failed)
tests/Feature/Orders/RefundServiceTest.php:48:        'shipping_amount' => 0,
tests/Feature/Orders/RefundServiceTest.php:86:        ->and($order->payments()->first()?->status)->toBe(PaymentStatus::Captured)
tests/Feature/Orders/RefundServiceTest.php:92:test('refund service marks order and payment refunded when the full amount is refunded', function () {
tests/Feature/Orders/RefundServiceTest.php:100:        ->and($order->payments()->first()?->status)->toBe(PaymentStatus::Refunded);
tests/Feature/Orders/RefundServiceTest.php:103:test('refund service rejects over-refunds and orders without captured payments', function () {
tests/Feature/Orders/RefundServiceTest.php:109:    $order->payments()->update(['status' => PaymentStatus::Pending]);
tests/Feature/Orders/FulfillmentServiceTest.php:7:use App\Events\FulfillmentCreated;
tests/Feature/Orders/FulfillmentServiceTest.php:60:test('fulfillment service blocks fulfillment until payment is confirmed', function () {
tests/Feature/Orders/FulfillmentServiceTest.php:91:    Event::assertDispatched(FulfillmentCreated::class, 2);
app/Livewire/Admin/Pages/Form.php:66:        $this->authorizeSave();
app/Livewire/Admin/Pages/Form.php:128:            'title' => $this->page ? __('Edit page') : __('Create page'),
app/Livewire/Admin/Pages/Form.php:156:    private function authorizeSave(): void
app/Livewire/Admin/Pages/Index.php:63:            PageStatus::Archived => 'red',
tests/Feature/Api/StorefrontCheckoutApiTest.php:64:test('storefront checkout api progresses through address shipping discount removal and payment selection', function (): void {
tests/Feature/Api/StorefrontCheckoutApiTest.php:69:    $cartId = $api()
tests/Feature/Api/StorefrontCheckoutApiTest.php:70:        ->postJson('/api/storefront/v1/carts')
tests/Feature/Api/StorefrontCheckoutApiTest.php:71:        ->assertCreated()['data']['id'];
tests/Feature/Api/StorefrontCheckoutApiTest.php:74:        ->postJson("/api/storefront/v1/carts/{$cartId}/lines", [
tests/Feature/Api/StorefrontCheckoutApiTest.php:78:        ->assertCreated();
tests/Feature/Api/StorefrontCheckoutApiTest.php:80:    $checkoutResponse = $api()
tests/Feature/Api/StorefrontCheckoutApiTest.php:81:        ->postJson('/api/storefront/v1/checkouts', [
tests/Feature/Api/StorefrontCheckoutApiTest.php:82:            'cart_id' => $cartId,
tests/Feature/Api/StorefrontCheckoutApiTest.php:86:    $checkoutResponse
tests/Feature/Api/StorefrontCheckoutApiTest.php:87:        ->assertCreated()
tests/Feature/Api/StorefrontCheckoutApiTest.php:91:        ->assertJsonPath('data.cart.line_count', 2);
tests/Feature/Api/StorefrontCheckoutApiTest.php:93:    $checkoutId = $checkoutResponse['data']['id'];
tests/Feature/Api/StorefrontCheckoutApiTest.php:96:        ->putJson("/api/storefront/v1/checkouts/{$checkoutId}/address", [
tests/Feature/Api/StorefrontCheckoutApiTest.php:97:            'shipping_address' => storefrontApiCheckoutAddress(),
tests/Feature/Api/StorefrontCheckoutApiTest.php:103:        ->assertJsonPath('data.shipping_address.country', 'DE')
tests/Feature/Api/StorefrontCheckoutApiTest.php:104:        ->assertJsonCount(3, 'data.available_shipping_rates');
tests/Feature/Api/StorefrontCheckoutApiTest.php:106:    $shippingRateId = $addressResponse['data']['available_shipping_rates'][0]['id'];
tests/Feature/Api/StorefrontCheckoutApiTest.php:109:        ->putJson("/api/storefront/v1/checkouts/{$checkoutId}/shipping-method", [
tests/Feature/Api/StorefrontCheckoutApiTest.php:110:            'shipping_rate_id' => $shippingRateId,
tests/Feature/Api/StorefrontCheckoutApiTest.php:113:        ->assertJsonPath('data.status', 'shipping_selected')
tests/Feature/Api/StorefrontCheckoutApiTest.php:114:        ->assertJsonPath('data.shipping_method_id', $shippingRateId)
tests/Feature/Api/StorefrontCheckoutApiTest.php:115:        ->assertJsonPath('data.totals.shipping', 799);
tests/Feature/Api/StorefrontCheckoutApiTest.php:118:        ->postJson("/api/storefront/v1/checkouts/{$checkoutId}/apply-discount", ['code' => 'SAVE10'])
tests/Feature/Api/StorefrontCheckoutApiTest.php:120:        ->assertJsonPath('data.discount_code', 'SAVE10')
tests/Feature/Api/StorefrontCheckoutApiTest.php:121:        ->assertJsonPath('data.totals.discount', 500);
tests/Feature/Api/StorefrontCheckoutApiTest.php:124:        ->deleteJson("/api/storefront/v1/checkouts/{$checkoutId}/discount")
tests/Feature/Api/StorefrontCheckoutApiTest.php:126:        ->assertJsonPath('data.discount_code', null)
tests/Feature/Api/StorefrontCheckoutApiTest.php:127:        ->assertJsonPath('data.totals.discount', 0);
tests/Feature/Api/StorefrontCheckoutApiTest.php:130:        ->putJson("/api/storefront/v1/checkouts/{$checkoutId}/payment-method", [
tests/Feature/Api/StorefrontCheckoutApiTest.php:131:            'payment_method' => 'credit_card',
tests/Feature/Api/StorefrontCheckoutApiTest.php:134:        ->assertJsonPath('data.status', 'payment_selected')
tests/Feature/Api/StorefrontCheckoutApiTest.php:135:        ->assertJsonPath('data.payment_method', 'credit_card');
tests/Feature/Api/StorefrontCheckoutApiTest.php:137:    $checkout = Checkout::withoutGlobalScopes()->findOrFail($checkoutId);
tests/Feature/Api/StorefrontCheckoutApiTest.php:140:    expect($checkout->status)->toBe(CheckoutStatus::PaymentSelected)
tests/Feature/Api/StorefrontCheckoutApiTest.php:144:test('storefront checkout api rejects invalid addresses shipping methods and discounts', function (): void {
tests/Feature/Api/StorefrontCheckoutApiTest.php:149:    $cartId = $api()
tests/Feature/Api/StorefrontCheckoutApiTest.php:150:        ->postJson('/api/storefront/v1/carts')
tests/Feature/Api/StorefrontCheckoutApiTest.php:151:        ->assertCreated()['data']['id'];
tests/Feature/Api/StorefrontCheckoutApiTest.php:154:        ->postJson("/api/storefront/v1/carts/{$cartId}/lines", [
tests/Feature/Api/StorefrontCheckoutApiTest.php:158:        ->assertCreated();
tests/Feature/Api/StorefrontCheckoutApiTest.php:160:    $checkoutId = $api()
tests/Feature/Api/StorefrontCheckoutApiTest.php:161:        ->postJson('/api/storefront/v1/checkouts', [
tests/Feature/Api/StorefrontCheckoutApiTest.php:162:            'cart_id' => $cartId,
tests/Feature/Api/StorefrontCheckoutApiTest.php:165:        ->assertCreated()['data']['id'];
tests/Feature/Api/StorefrontCheckoutApiTest.php:168:        ->putJson("/api/storefront/v1/checkouts/{$checkoutId}/address", [
tests/Feature/Api/StorefrontCheckoutApiTest.php:169:            'shipping_address' => array_diff_key(storefrontApiCheckoutAddress(), ['first_name' => true]),
tests/Feature/Api/StorefrontCheckoutApiTest.php:172:        ->assertJsonValidationErrors('shipping_address.first_name');
tests/Feature/Api/StorefrontCheckoutApiTest.php:175:        ->putJson("/api/storefront/v1/checkouts/{$checkoutId}/address", [
tests/Feature/Api/StorefrontCheckoutApiTest.php:176:            'shipping_address' => storefrontApiCheckoutAddress(),
tests/Feature/Api/StorefrontCheckoutApiTest.php:185:        ->putJson("/api/storefront/v1/checkouts/{$checkoutId}/shipping-method", [
tests/Feature/Api/StorefrontCheckoutApiTest.php:186:            'shipping_rate_id' => $otherStoreRate->getKey(),
tests/Feature/Api/StorefrontCheckoutApiTest.php:191:        ->postJson("/api/storefront/v1/checkouts/{$checkoutId}/apply-discount", ['code' => 'NOTREAL'])
tests/Feature/Api/StorefrontCheckoutApiTest.php:193:        ->assertJsonPath('reason', 'discount_not_found');
resources/views/layouts/app/sidebar.blade.php:55:                    <flux:sidebar.item icon="tag" :href="route('admin.discounts.index')" :current="request()->routeIs('admin.discounts.*')" wire:navigate>
resources/views/layouts/app/sidebar.blade.php:139:                    <form method="POST" action="{{ route('logout') }}" class="w-full">
resources/views/layouts/app/sidebar.blade.php:146:                            data-test="logout-button"
tests/Feature/Api/AdminAnalyticsSummaryApiTest.php:58:            'add_to_cart_count' => 4,
tests/Feature/Api/AdminAnalyticsSummaryApiTest.php:59:            'checkout_started_count' => 3,
tests/Feature/Api/AdminAnalyticsSummaryApiTest.php:60:            'checkout_completed_count' => 2,
tests/Feature/Api/AdminAnalyticsSummaryApiTest.php:69:            'add_to_cart_count' => 6,
tests/Feature/Api/AdminAnalyticsSummaryApiTest.php:70:            'checkout_started_count' => 7,
tests/Feature/Api/AdminAnalyticsSummaryApiTest.php:71:            'checkout_completed_count' => 3,
tests/Feature/Api/AdminAnalyticsSummaryApiTest.php:101:        ->assertJsonPath('data.summary.add_to_cart_count', 10)
tests/Feature/Api/AdminAnalyticsSummaryApiTest.php:102:        ->assertJsonPath('data.summary.checkout_started_count', 10)
tests/Feature/Api/StorefrontAnalyticsApiTest.php:28:                'type' => 'add_to_cart',
tests/Feature/Api/AdminTaxSettingsApiTest.php:60:                        'shipping_taxed' => true,
app/Livewire/Admin/Orders/Show.php:187:                'payments',
tests/Feature/Cart/CartServiceTest.php:19:function cartServiceStore(): Store
tests/Feature/Cart/CartServiceTest.php:27:function cartServiceVariant(Store $store, int $price = 2500, int $stock = 20, InventoryPolicy $policy = InventoryPolicy::Deny): ProductVariant
tests/Feature/Cart/CartServiceTest.php:47:test('cart service creates carts and mutates lines with version increments and price snapshots', function () {
tests/Feature/Cart/CartServiceTest.php:48:    $store = cartServiceStore();
tests/Feature/Cart/CartServiceTest.php:49:    $variant = cartServiceVariant($store, price: 2500, stock: 20);
tests/Feature/Cart/CartServiceTest.php:51:    $cart = $service->create($store);
tests/Feature/Cart/CartServiceTest.php:53:    expect($cart->store_id)->toBe($store->getKey())
tests/Feature/Cart/CartServiceTest.php:54:        ->and($cart->currency)->toBe('EUR')
tests/Feature/Cart/CartServiceTest.php:55:        ->and($cart->cart_version)->toBe(1);
tests/Feature/Cart/CartServiceTest.php:57:    $line = $service->addLine($cart, $variant->getKey(), 2, expectedVersion: 1);
tests/Feature/Cart/CartServiceTest.php:62:        ->and($cart->refresh()->cart_version)->toBe(2);
tests/Feature/Cart/CartServiceTest.php:64:    $service->addLine($cart, $variant->getKey(), 1, expectedVersion: 2);
tests/Feature/Cart/CartServiceTest.php:66:    expect(Cart::withoutGlobalS…23769 tokens truncated…customers/show.blade.php:180:                <flux:button type="submit" variant="primary">Save</flux:button>
tests/Feature/Payments/MockPaymentProviderTest.php:22:        expect($result->referenceId)->toStartWith('mock_payment_');
tests/Feature/Payments/MockPaymentProviderTest.php:39:        ->and($paypal->referenceId)->toStartWith('mock_payment_')
tests/Feature/Storefront/CartCheckoutUiTest.php:50:test('product detail add to cart persists a session cart', function () {
tests/Feature/Storefront/CartCheckoutUiTest.php:57:        ->assertDispatched('cart-updated');
tests/Feature/Storefront/CartCheckoutUiTest.php:59:    $cart = Cart::withoutGlobalScopes()->findOrFail(session('cart_id'));
tests/Feature/Storefront/CartCheckoutUiTest.php:61:    expect($cart->store_id)->toBe($store->getKey())
tests/Feature/Storefront/CartCheckoutUiTest.php:62:        ->and($cart->lines()->withoutGlobalScopes()->where('variant_id', $variant->getKey())->first()?->quantity)->toBe(2);
tests/Feature/Storefront/CartCheckoutUiTest.php:65:test('cart page updates and removes line quantities', function () {
tests/Feature/Storefront/CartCheckoutUiTest.php:68:    $cart = app(CartService::class)->create($store);
tests/Feature/Storefront/CartCheckoutUiTest.php:69:    session(['cart_id' => $cart->getKey()]);
tests/Feature/Storefront/CartCheckoutUiTest.php:70:    $line = app(CartService::class)->addLine($cart, $variant->getKey(), 2);
tests/Feature/Storefront/CartCheckoutUiTest.php:75:        ->assertDispatched('cart-updated');
tests/Feature/Storefront/CartCheckoutUiTest.php:81:        ->assertDispatched('cart-updated');
tests/Feature/Storefront/CartCheckoutUiTest.php:83:    expect($cart->lines()->withoutGlobalScopes()->count())->toBe(0);
tests/Feature/Storefront/CartCheckoutUiTest.php:86:test('cart page applies discount estimates shipping and carries discount into checkout', function () {
tests/Feature/Storefront/CartCheckoutUiTest.php:89:    $cart = app(CartService::class)->create($store);
tests/Feature/Storefront/CartCheckoutUiTest.php:90:    session(['cart_id' => $cart->getKey()]);
tests/Feature/Storefront/CartCheckoutUiTest.php:91:    app(CartService::class)->addLine($cart, $variant->getKey(), 2);
tests/Feature/Storefront/CartCheckoutUiTest.php:94:        ->set('discountCode', 'SAVE10')
tests/Feature/Storefront/CartCheckoutUiTest.php:98:        ->set('shippingCountry', 'DE')
tests/Feature/Storefront/CartCheckoutUiTest.php:99:        ->set('shippingPostalCode', '10115')
tests/Feature/Storefront/CartCheckoutUiTest.php:104:    expect(session('cart_discount_code'))->toBe('SAVE10')
tests/Feature/Storefront/CartCheckoutUiTest.php:105:        ->and($component->instance()->discountAmount())->toBe(500)
tests/Feature/Storefront/CartCheckoutUiTest.php:110:        ->assertSet('discountCode', 'SAVE10');
tests/Feature/Storefront/CartCheckoutUiTest.php:112:    $checkout = Checkout::withoutGlobalScopes()->where('cart_id', $cart->getKey())->firstOrFail();
tests/Feature/Storefront/CartCheckoutUiTest.php:114:    expect($checkout->discount_code)->toBe('SAVE10')
tests/Feature/Storefront/CartCheckoutUiTest.php:115:        ->and($checkout->totals_json['discount'])->toBe(500);
tests/Feature/Storefront/CartCheckoutUiTest.php:118:test('customer login merges an existing guest cart without creating empty carts', function () {
tests/Feature/Storefront/CartCheckoutUiTest.php:127:    session(['cart_id' => $guestCart->getKey()]);
tests/Feature/Storefront/CartCheckoutUiTest.php:142:test('checkout page progresses through address shipping discount and payment selection', function () {
tests/Feature/Storefront/CartCheckoutUiTest.php:145:    $cart = app(CartService::class)->create($store);
tests/Feature/Storefront/CartCheckoutUiTest.php:146:    session(['cart_id' => $cart->getKey()]);
tests/Feature/Storefront/CartCheckoutUiTest.php:147:    app(CartService::class)->addLine($cart, $variant->getKey(), 2);
tests/Feature/Storefront/CartCheckoutUiTest.php:156:        ->set('shippingAddress.first_name', 'Test')
tests/Feature/Storefront/CartCheckoutUiTest.php:157:        ->set('shippingAddress.last_name', 'Buyer')
tests/Feature/Storefront/CartCheckoutUiTest.php:158:        ->set('shippingAddress.address1', 'Main Street 1')
tests/Feature/Storefront/CartCheckoutUiTest.php:159:        ->set('shippingAddress.city', 'Berlin')
tests/Feature/Storefront/CartCheckoutUiTest.php:160:        ->set('shippingAddress.country', 'DE')
tests/Feature/Storefront/CartCheckoutUiTest.php:161:        ->set('shippingAddress.postal_code', '10115')
tests/Feature/Storefront/CartCheckoutUiTest.php:163:        ->assertSet('step', 'shipping')
tests/Feature/Storefront/CartCheckoutUiTest.php:166:        ->assertSet('step', 'payment')
tests/Feature/Storefront/CartCheckoutUiTest.php:167:        ->set('discountCode', 'SAVE10')
tests/Feature/Storefront/CartCheckoutUiTest.php:170:        ->set('paymentMethod', 'credit_card')
tests/Feature/Storefront/CartCheckoutUiTest.php:174:    $checkout = Checkout::withoutGlobalScopes()->where('cart_id', $cart->getKey())->firstOrFail();
tests/Feature/Storefront/CartCheckoutUiTest.php:177:    expect($checkout->status)->toBe(CheckoutStatus::PaymentSelected)
tests/Feature/Storefront/CartCheckoutUiTest.php:178:        ->and($checkout->discount_code)->toBe('SAVE10')
tests/Feature/Storefront/CartCheckoutUiTest.php:179:        ->and($checkout->totals_json['discount'])->toBeGreaterThan(0)
tests/Feature/Catalog/VariantMatrixServiceTest.php:13:test('variant matrix rebuild creates missing cartesian combinations and inventory', function () {
tests/Feature/Storefront/ThemeDataTest.php:87:    expect($settings['announcement']['text'])->toBe('Free shipping on orders over 75.00 EUR')
resources/views/livewire/admin/customers/index.blade.php:20:                        <th class="px-4 py-3">Created</th>
resources/views/livewire/admin/customers/index.blade.php:46:                                    <flux:text>Customer accounts will appear here after registration or checkout.</flux:text>
tests/Feature/Auth/AuthenticationTest.php:62:test('users can logout', function () {
tests/Feature/Auth/AuthenticationTest.php:65:    $response = $this->actingAs($user)->post(route('logout'));
resources/views/livewire/storefront/cart-drawer.blade.php:1:<flux:modal name="cart-drawer" class="md:w-[32rem]">
resources/views/livewire/storefront/cart-drawer.blade.php:9:            <flux:button :href="route('cart.show')" wire:navigate variant="subtle" size="sm" icon="shopping-bag">
resources/views/livewire/storefront/cart-drawer.blade.php:10:                View cart
resources/views/livewire/storefront/cart-drawer.blade.php:17:                <p class="mt-3 text-sm text-zinc-600 dark:text-zinc-400">Your cart is empty.</p>
resources/views/livewire/storefront/cart-drawer.blade.php:25:                    <div class="flex gap-4 py-4" wire:key="cart-drawer-line-{{ $line->getKey() }}">
resources/views/livewire/storefront/cart-drawer.blade.php:41:                                <x-storefront.price :amount="$line->line_total_amount" :currency="$cart->currency" class="justify-end text-sm" />
resources/views/livewire/storefront/cart-drawer.blade.php:61:                    <x-storefront.price :amount="$subtotal" :currency="$cart->currency" />
resources/views/livewire/storefront/cart-drawer.blade.php:64:                <flux:button wire:click="checkout" variant="primary" class="w-full">
resources/views/livewire/storefront/checkout/show.blade.php:3:        ['label' => 'Cart', 'url' => route('cart.show')],
resources/views/livewire/storefront/checkout/show.blade.php:12:                    @foreach (['address' => 'Address', 'shipping' => 'Shipping', 'payment' => 'Payment'] as $key => $label)
resources/views/livewire/storefront/checkout/show.blade.php:13:                        @php($active = $step === $key || ($key === 'payment' && $step === 'reserved'))
resources/views/livewire/storefront/checkout/show.blade.php:25:            @if (! $cart || $lines->isEmpty())
resources/views/livewire/storefront/checkout/show.blade.php:28:                    <h2 class="mt-4 text-lg font-semibold text-zinc-950 dark:text-white">Your cart is empty</h2>
resources/views/livewire/storefront/checkout/show.blade.php:41:                        @if ($checkout?->status !== \App\Enums\CheckoutStatus::Started)
resources/views/livewire/storefront/checkout/show.blade.php:42:                            <flux:badge color="green">Saved</flux:badge>
resources/views/livewire/storefront/checkout/show.blade.php:52:                        <flux:input wire:model="shippingAddress.first_name" label="First name" />
resources/views/livewire/storefront/checkout/show.blade.php:53:                        <flux:input wire:model="shippingAddress.last_name" label="Last name" />
resources/views/livewire/storefront/checkout/show.blade.php:56:                            <flux:input wire:model="shippingAddress.address1" label="Address" />
resources/views/livewire/storefront/checkout/show.blade.php:57:                            <flux:error name="shippingAddress.address1" />
resources/views/livewire/storefront/checkout/show.blade.php:61:                            <flux:input wire:model="shippingAddress.address2" label="Apartment, suite, etc." />
resources/views/livewire/storefront/checkout/show.blade.php:64:                        <flux:input wire:model="shippingAddress.city" label="City" />
resources/views/livewire/storefront/checkout/show.blade.php:65:                        <flux:input wire:model="shippingAddress.postal_code" label="Postal code" />
resources/views/livewire/storefront/checkout/show.blade.php:67:                        <flux:input wire:model="shippingAddress.province_code" label="Region code" placeholder="DE-BE" />
resources/views/livewire/storefront/checkout/show.blade.php:68:                        <flux:select wire:model="shippingAddress.country" label="Country">
resources/views/livewire/storefront/checkout/show.blade.php:91:                        @if ($checkout?->status === \App\Enums\CheckoutStatus::ShippingSelected || $checkout?->status === \App\Enums\CheckoutStatus::PaymentSelected)
resources/views/livewire/storefront/checkout/show.blade.php:117:                                    <x-storefront.price :amount="data_get($rateAmounts, $rate->getKey(), 0)" :currency="$cart->currency" />
resources/views/livewire/storefront/checkout/show.blade.php:143:                        @if ($checkout?->status === \App\Enums\CheckoutStatus::PaymentSelected)
resources/views/livewire/storefront/checkout/show.blade.php:148:                    @if ($step === 'address' || $step === 'shipping')
resources/views/livewire/storefront/checkout/show.blade.php:149:                        <p class="mt-5 text-sm text-zinc-600 dark:text-zinc-400">Pending shipping</p>
resources/views/livewire/storefront/checkout/show.blade.php:153:                                <flux:input wire:model="discountCode" label="Discount code" placeholder="SAVE10" />
resources/views/livewire/storefront/checkout/show.blade.php:155:                                    Apply
resources/views/livewire/storefront/checkout/show.blade.php:158:                            <flux:error name="discountCode" />
resources/views/livewire/storefront/checkout/show.blade.php:160:                            <flux:select wire:model="paymentMethod" label="Payment method">
resources/views/livewire/storefront/checkout/show.blade.php:165:                            <flux:error name="paymentMethod" />
resources/views/livewire/storefront/checkout/show.blade.php:167:                            @if ($paymentMethod === 'credit_card')
resources/views/livewire/storefront/checkout/show.blade.php:199:                    <div class="flex gap-3 py-3 first:pt-0" wire:key="checkout-line-{{ $line->getKey() }}">
resources/views/livewire/storefront/checkout/show.blade.php:207:                        <x-storefront.price :amount="$line->line_total_amount" :currency="$cart?->currency ?? data_get($totals, 'currency')" class="justify-end text-sm" />
resources/views/livewire/storefront/checkout/show.blade.php:215:                    <x-storefront.price :amount="data_get($totals, 'subtotal', 0)" :currency="data_get($totals, 'currency', $cart?->currency ?? 'EUR')" />
resources/views/livewire/storefront/checkout/show.blade.php:219:                    <span class="font-semibold text-zinc-950 dark:text-white">-{{ \App\Support\Money::format((int) data_get($totals, 'discount', 0), data_get($totals, 'currency', $cart?->currency ?? 'EUR')) }}</span>
resources/views/livewire/storefront/checkout/show.blade.php:223:                    <x-storefront.price :amount="data_get($totals, 'shipping', 0)" :currency="data_get($totals, 'currency', $cart?->currency ?? 'EUR')" />
resources/views/livewire/storefront/checkout/show.blade.php:227:                    <x-storefront.price :amount="data_get($totals, 'tax', 0)" :currency="data_get($totals, 'currency', $cart?->currency ?? 'EUR')" />
resources/views/livewire/storefront/checkout/show.blade.php:231:                    <x-storefront.price :amount="data_get($totals, 'total', 0)" :currency="data_get($totals, 'currency', $cart?->currency ?? 'EUR')" />
resources/views/livewire/storefront/checkout/confirmation.blade.php:3:        ['label' => 'Cart', 'url' => route('cart.show')],
resources/views/livewire/storefront/checkout/confirmation.blade.php:4:        ['label' => 'Checkout', 'url' => route('checkout.show')],
resources/views/livewire/storefront/checkout/confirmation.blade.php:20:            @if ($order->payment_method === \App\Enums\PaymentMethod::BankTransfer)
resources/views/livewire/storefront/checkout/confirmation.blade.php:73:                    <span class="font-semibold text-zinc-950 dark:text-white">-{{ \App\Support\Money::format($order->discount_amount, $order->currency) }}</span>
resources/views/livewire/storefront/checkout/confirmation.blade.php:77:                    <x-storefront.price :amount="$order->shipping_amount" :currency="$order->currency" />
resources/views/livewire/storefront/products/show.blade.php:70:                    {{ $this->canAddToCart() ? 'Add to cart' : 'Sold out' }}
resources/views/livewire/storefront/products/show.blade.php:96:                        <dd class="mt-1 text-zinc-600 dark:text-zinc-400">{{ $selectedVariant->requires_shipping ? 'Required' : 'Digital delivery' }}</dd>
resources/views/livewire/storefront/cart/show.blade.php:20:                    <h2 class="mt-4 text-lg font-semibold text-zinc-950 dark:text-white">Your cart is empty</h2>
resources/views/livewire/storefront/cart/show.blade.php:28:                        <div class="grid gap-4 p-4 sm:grid-cols-[5rem_1fr_auto] sm:items-center" wire:key="cart-page-line-{{ $line->getKey() }}">
resources/views/livewire/storefront/cart/show.blade.php:40:                                <x-storefront.price :amount="$line->unit_price_amount" :currency="$cart->currency" class="text-sm" />
resources/views/livewire/storefront/cart/show.blade.php:51:                                    <x-storefront.price :amount="$line->line_total_amount" :currency="$cart->currency" class="justify-end" />
resources/views/livewire/storefront/cart/show.blade.php:67:                    @if ($cart)
resources/views/livewire/storefront/cart/show.blade.php:68:                        <x-storefront.price :amount="$subtotal" :currency="$cart->currency" />
resources/views/livewire/storefront/cart/show.blade.php:75:                    @if ($cart && ($discountAmount > 0 || $discountFreeShipping))
resources/views/livewire/storefront/cart/show.blade.php:77:                            {{ $discountFreeShipping && $discountAmount === 0 ? 'Free shipping' : '-'.\App\Support\Money::format($discountAmount, $cart->currency) }}
resources/views/livewire/storefront/cart/show.blade.php:85:                    @if (! $cart || $lineCount === 0)
resources/views/livewire/storefront/cart/show.blade.php:87:                    @elseif (! $requiresShipping || $discountFreeShipping)
resources/views/livewire/storefront/cart/show.blade.php:90:                        <x-storefront.price :amount="$estimatedShipping" :currency="$cart->currency" />
resources/views/livewire/storefront/cart/show.blade.php:97:                    @if ($cart)
resources/views/livewire/storefront/cart/show.blade.php:98:                        <x-storefront.price :amount="$estimatedTotal" :currency="$cart->currency" />
resources/views/livewire/storefront/cart/show.blade.php:105:            @if ($cart && $lineCount > 0)
resources/views/livewire/storefront/cart/show.blade.php:109:                            <flux:input wire:model="discountCode" label="Discount code" placeholder="SAVE10" />
resources/views/livewire/storefront/cart/show.blade.php:112:                            Apply
resources/views/livewire/storefront/cart/show.blade.php:115:                    <flux:error name="discountCode" />
resources/views/livewire/storefront/cart/show.blade.php:129:                        <flux:select wire:model.live="shippingCountry" label="Ship to">
resources/views/livewire/storefront/cart/show.blade.php:136:                            <flux:input wire:model.live.debounce.400ms="shippingPostalCode" label="Postal code" placeholder="10115" />
resources/views/livewire/storefront/cart/show.blade.php:137:                            <flux:input wire:model.live.debounce.400ms="shippingProvinceCode" label="Region code" placeholder="BE" />
resources/views/livewire/storefront/cart/show.blade.php:141:                    <flux:error name="shippingCountry" />
resources/views/livewire/storefront/cart/show.blade.php:144:                        Estimate shipping
resources/views/livewire/storefront/cart/show.blade.php:149:                            <div class="flex items-center justify-between gap-4 py-2 first:pt-0" wire:key="cart-rate-{{ $rate->getKey() }}">
resources/views/livewire/storefront/cart/show.blade.php:151:                                <x-storefront.price :amount="data_get($rateAmounts, $rate->getKey(), 0)" :currency="$cart->currency" class="justify-end text-sm" />
resources/views/livewire/storefront/cart/show.blade.php:155:                                {{ $requiresShipping ? 'No rates are available.' : 'No shipping needed.' }}
resources/views/livewire/storefront/cart/show.blade.php:162:            <flux:button wire:click="checkout" variant="primary" class="mt-6 w-full" :disabled="$lineCount === 0">
resources/views/livewire/storefront/account/auth/register.blade.php:2:    <x-auth-header :title="__('Create an account')" :description="__('Save your details for faster checkout')" />
resources/views/livewire/storefront/account/auth/register.blade.php:43:        <flux:button variant="primary" type="submit" class="w-full" data-test="customer-register-button">
resources/views/livewire/storefront/account/auth/register.blade.php:44:            {{ __('Create account') }}
resources/views/livewire/storefront/account/auth/login.blade.php:31:        <flux:button variant="primary" type="submit" class="w-full" data-test="customer-login-button">
resources/views/livewire/storefront/account/auth/login.blade.php:38:        <flux:link :href="route('account.register')" wire:navigate>{{ __('Create an account') }}</flux:link>
resources/views/livewire/storefront/account/auth/reset-password.blade.php:33:        <flux:button variant="primary" type="submit" class="w-full" data-test="customer-reset-password-button">
resources/views/livewire/storefront/account/orders/show.blade.php:61:                    <span class="font-semibold text-zinc-950 dark:text-white">-{{ \App\Support\Money::format($order->discount_amount, $order->currency) }}</span>
resources/views/livewire/storefront/account/orders/show.blade.php:65:                    <x-storefront.price :amount="$order->shipping_amount" :currency="$order->currency" />
resources/views/livewire/storefront/account/auth/forgot-password.blade.php:21:        <flux:button variant="primary" type="submit" class="w-full" data-test="customer-forgot-password-button">


command:
/bin/zsh
-lc
git status --short

type: unknown

cmd: git status --short


output:
Chunk ID: dea3f5
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 0
Output:


message: The current browser coverage is only `SmokeTest.php`. I’m going to add the first interaction suite from Spec 08, starting with admin authentication because it is self-contained and exercises real login/logout/session redirects without needing cart or order setup.

phase: commentary


type: message

role: assistant

text: The current browser coverage is only `SmokeTest.php`. I’m going to add the first interaction suite from Spec 08, starting with admin authentication because it is self-contained and exercises real login/logout/session redirects without needing cart or order setup.


packages: pestphp/pest laravel/framework

queries: browser testing Pest visit fill click assert see Laravel

queries: Pest browser testing acting as session Laravel

queries: Laravel feature test unauthenticated redirect assert