HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/brameda/brameda.nl/app/Komma/Shop/Tests/Browser/OrderTest.php
<?php

namespace App\Komma\Shop\Tests\Browser;

use App\Komma\Addresses\Models\Address;
use App\Komma\Shop\Cart\ShoppingCartItem;
use App\Komma\Shop\Cart\ShoppingCartService;
use App\Komma\Shop\Checkout\CheckoutService;
use App\Komma\Shop\Orders\Models\Order;
use App\Komma\Shop\Orders\OrderStatus;
use App\Komma\Shop\Products\Product\Product;
use App\Komma\Shop\Products\ProductableInterface;
use App\Komma\Shop\Products\ProductComposite\ProductComposite;
use App\Komma\Shop\Products\ProductGroup\ProductGroup;
use App\Komma\Shop\Tests\Browser\Pages\OrdersSectionTestPage;
use App\Komma\Shop\Tests\DuskTestCase;
use App\Komma\Users\Models\KmsUser;
use App\Komma\Users\Models\SiteUser;
use Laravel\Dusk\Browser;

class OrderTest extends DuskTestCase
{
    /**
     * Test creating shipment via order
     *
     * @group OrderTest
     * @test
     * @throws \Throwable
     */
    public function testOrderBatchStatusChange()
    {
        $self = $this;

        $orders = [
            $this->createOrderWithOneOrderedProduct(),
            $this->createOrderWithOneOrderedProduct(),
            $this->createOrderWithOneOrderedProduct()
        ];
        foreach($orders as $order) {
            /** @var Order $order */
            $order->save();
        }

        $this->browse(function (Browser $browser) use($orders, $self) {
            $browser->loginAs(KmsUser::find(1), 'kms')
                ->screenshot($this->getName(false))
                ->visit(new OrdersSectionTestPage());

            //Scroll to where the change status to select is, click it, and see the error that no orders are selected
            $self->scrollToElement($browser, '@change_status_to');
            $browser->click('@change_status')
                ->assertSee(__('shop/orders.batch.no_orders_selected'));

            //Check the orders.
            foreach($orders as $order)
            {
                /** @var Order $order */
                $self->scrollToElement($browser, '@order_checkbox_'.$order->id);
//                $browser->waitUntil('alert("@order_'.$order->id.'")');
                $browser->check('@order_checkbox_'.$order->id);
            }

            //Change their status to completed.
            $browser->select('@change_status_to', OrderStatus::COMPLETED)
                ->click('@change_status')
                ->assertSee(trans_choice('shop/orders.batch.status_changed', count($orders), ['count' => count($orders), 'status' => __('shop/orders.status.'.OrderStatus::COMPLETED)]));
        });
    }



    /**
     * Testing helper method. Scrolls to an element with the given dusk Selector
     *
     * @param Browser $browser
     * @param string $duskSelector
     */
    public function scrollToElement(Browser $browser, $duskSelector)
    {
        $duskSelector = str_replace('@', '', $duskSelector);
        $browser->waitUntil('document.querySelector(\'[dusk="'.$duskSelector.'"]\').scrollIntoView() === undefined;');
    }

    /**
     * Asserts that the amount of shipments in an order is the specified amount. Must be used on the order detail page
     *
     * @param Browser $browser
     * @param int $count
     */
    public function assertOrdersShipmentCountIs(Browser $browser, int $count)
    {
        $browser->waitUntil('document.querySelector(\'[dusk="order_shipments_table"]\').childElementCount === '.$count);
    }

    /**
     * Testing helper method.
     *
     * Create an order for a random new user.
     *
     * @return Order
     * @throws \Throwable
     */
    public function createOrderWithOneOrderedProduct(): Order
    {
        //CheckoutService
        $checkoutService = new CheckoutService();

        //ShoppingCart
        $shoppingCart = new ShoppingCartService();

        //Get a random customer user to test with
        /** @var SiteUser $customer */
        $customer = factory(SiteUser::class)->create();
        $this->assertInstanceOf(SiteUser::class, $customer);

        //Give it an address
        /** @var Address $address */
        $address = factory(Address::class)->create();
        $customer->addresses()->save($address);

        //Put some random products in the shopping cart
        $products = Product::inRandomOrder()->take(3)->get();
        $this->assertCount(3, $products);

        //Put some random product groups in the shopping cart
        $productGroups = ProductGroup::inRandomOrder()->take(2)->get();
        $this->assertCount(2, $productGroups);

        //Put some random product composites in the shopping cart
        $productComposites = ProductComposite::inRandomOrder()->take(1)->get();
        $this->assertCount(1, $productComposites);

        //Build an order
        $allProductables = collect();
        $allProductables = $allProductables->merge($products);
        $allProductables = $allProductables->merge($productGroups);
        $allProductables = $allProductables->merge($productComposites);

        $allProductables->each(function(ProductableInterface $productable) use ($shoppingCart) {
            /** @var ShoppingCartItem $shoppingCartItem */
            $shoppingCartItem = $shoppingCart->addProductable($productable, mt_rand(1, 3));
        });

        return $checkoutService->createOrderFromShoppingCartItems($shoppingCart->getItems(), $customer, $customer->addresses()->first(), $customer->addresses()->first());
    }
}