File: D:/HostingSpaces/SBogers10/werken-bij-stafa.komma.pro/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());
}
}