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/SBogers10/hem-mechatronics.komma.pro/app/Komma/Shop/Tests/Browser/CheckoutTest.php
<?php

namespace App\Komma\Shop\Tests\Browser;

use App\Komma\Addresses\Models\Address;
use App\Komma\Globalization\RegionInfo;
use App\Komma\Kms\QualityAssurance\ExtraDuskTools;
use App\Komma\Shop\Cart\ShoppingCartService;
use App\Komma\Shop\Orders\OrderStatus;
use App\Komma\Shop\Payment\TransactionStatus;
use App\Komma\Shop\Products\Product\Product;
use App\Komma\Shop\Tests\Browser\Pages\ShoppingCartTestPage;
use App\Komma\Shop\Tests\DuskTestCase;
use App\Komma\Users\Models\SiteUser;
use Laravel\Dusk\Browser;

class CheckoutTest extends DuskTestCase
{
//    use DatabaseTransactions; //Automatically rolls back database actions after tests. Note: when you enable this, assertProductVisible creates a user but cannot be logged in somehow. Laravel dusk problem i think.
    /**
     * @group Checkout
     * @test
     * @throws \Throwable
     */
    public function assertCartEmpty()
    {
        $shoppingCartService = new ShoppingCartService();
        $shoppingCartService->clear(); //Clear the cart if it not already was
        $regionInfo = new RegionInfo('NL');

        $counter = 0;
        $this->browse(function (Browser $browser) use($regionInfo) {
            $browser->loginAs(SiteUser::find(1), 'site')
                ->visit(new ShoppingCartTestPage())
                ->assertSee(__('shop/cart.cart'))
                ->assertSeeIn('@subtotal', $regionInfo->getCurrencySymbol().' 0');
        });
    }

    /**
     * Test coupon codes in checkout
     *
     * @group Checkout
     * @test
     * @throws \Throwable
     */
    public function testCouponAndVat()
    {
        /** @var SiteUser $user */
        $user = factory(SiteUser::class)->create();
        /** @var Address $address */
        $address = factory(Address::class)->create();
        $user->addresses()->save($address);

        $this->assertDatabaseHas('site_users', [
            'id' => $user->id
        ]);

        $product = Product::find(1);

        $regionInfo = new RegionInfo('NL');


        $this->browse(function (Browser $browser) use($user, $product, $address, $regionInfo) {
            $browser->logout('site'); //Make sure we dont have a session
            $browser->loginAs($user->id, 'site')
                ->visit(new ShoppingCartTestPage())
                ->click('@addProductWithId1')
                ->waitUntil('document.querySelector(\'[dusk="shoppingCartItemList"]\').childElementCount == 1')
                ->click('@checkout')
                ->assertSee(__('shop/checkout.invoice_address'))
                ->assertSee(__('shop/checkout.shipping_address'))
                ->assertSee(__('shop/checkout.checkout'))
                ->assertSee(__('shop/checkout.terms_and_conditions'))
                ->type('@coupon_input', 'Absolute5')
                ->click('@add_coupon')
                ->assertSeeIn('@active_coupon', 'Absolute5')
                ->assertSee($regionInfo->getNumberFormat()->centsToCurrency(($product->getTotal() * 10) - 500)) //The product is added 1o times thanks to cart.js addProductToShoppingcart method. 500 is 500 cents from Absolute5 coupon.
                ->assertSee($regionInfo->getNumberFormat()->centsToCurrency(round(((($product->getTotal() * 10) - 500) * 0.21)))); //VAT 21% rounded. See
        });
    }

    /**
     * @group Checkout
     * @test
     * @see ExtraDuskTools
     * @throws \Throwable
     */
    public function assertCartNotEmptyWhenRandomProductAdded()
    {
        $shoppingCartService = new ShoppingCartService();
        $shoppingCartService->clear(); //Clear the cart if it not already was
        $regionInfo = new RegionInfo('NL');

        $this->browse(function (Browser $browser) use($regionInfo, $shoppingCartService) {
            $browser->loginAs(SiteUser::find(1), 'site');
                $browser->visit(new ShoppingCartTestPage())
                ->assertSee(__('shop/cart.cart'))
                ->assertSeeIn('@subtotal', $regionInfo->getCurrencySymbol().' 0')
                ->waitFor('@addRandomProduct')
                ->waitUntil('document.readyState === "complete"')->pause(500) //Also wait till javascript is loaded completely.
                ->click('@addRandomProduct')
                ->waitUntil('document.querySelectorAll(\'[dusk="shoppingCartItemList"] > li\').length === 1') //Wait until one item is visible in the list of shopping cart items
                ->assertDontSeeIn('@subtotal', $regionInfo->getCurrencySymbol().' 0');
        });
    }

    /**
     * Test a successful checkout with payment
     *
     * @group Checkout
     * @test
     * @throws \Throwable
     */
    public function testCheckoutForm()
    {
        /** @var SiteUser $user */
        $user = factory(SiteUser::class)->create();
        /** @var Address $address */
        $address = factory(Address::class)->create();
        $user->addresses()->save($address);

        $this->assertDatabaseHas('site_users', [
           'id' => $user->id
        ]);

        $regionInfo = new RegionInfo('NL');
        $product = Product::find(1);

        $this->browse(function (Browser $browser) use($user, $product, $regionInfo, $address) {
            $browser->loginAs($user->id, 'site')
                ->visit(new ShoppingCartTestPage())
                ->click('@addProductWithId1')
                ->waitForReload()
                ->click('@checkout')
                ->assertSee(__('shop/checkout.invoice_address'))
                ->assertSee(__('shop/checkout.shipping_address'))
                ->assertSee(__('shop/checkout.checkout'))
                ->assertSee(__('shop/checkout.terms_and_conditions'))
                ->assertRadioSelected('@new_invoice_address', '-1') //-1 Means that the backend could see that this is a new address instead of an existing one (bigger as 0 value);
                ->assertRadioSelected('@new_shipping_address', '-1')
                ->type('@invoice_street', $address->street)
                ->type('@invoice_house_number', $address->house_number)
                ->type('@invoice_postal_code', $address->postal_code)
                ->type('@invoice_city', $address->city)
                ->type('@invoice_phone', $address->telephone)
                ->type('@invoice_country', $address->country)
                ->type('@shipping_street', $address->street)
                ->type('@shipping_house_number', $address->house_number)
                ->type('@shipping_postal_code', $address->postal_code)
                ->type('@shipping_city', $address->city)
                ->type('@shipping_phone', $address->telephone)
                ->type('@shipping_country', $address->country)
                ->type('@remarks', 'None')
                ->assertInputValue('@invoice_street', $address->street)
                ->assertInputValue('@invoice_house_number', $address->house_number)
                ->assertInputValue('@invoice_postal_code', $address->postal_code)
                ->assertInputValue('@invoice_city', $address->city)
                ->assertInputValue('@invoice_phone', $address->telephone)
                ->assertInputValue('@invoice_country', $address->country)
                ->assertInputValue('@shipping_street', $address->street)
                ->assertInputValue('@shipping_house_number', $address->house_number)
                ->assertInputValue('@shipping_postal_code', $address->postal_code)
                ->assertInputValue('@shipping_city', $address->city)
                ->assertInputValue('@shipping_phone', $address->telephone)
                ->assertInputValue('@shipping_country', $address->country)
                ->assertInputValue('@remarks', 'None')
                ->assertSee($product->getDisplayName());

                $browser->driver->executeScript('window.scrollTo(0,document.body.scrollHeight);'); //Scroll to bottom

                $browser->pause(1000)
                ->check('@terms_and_conditions')
                ->click('@checkout')
                ->assertSee('Welkom bij KommaPSP')
                ->select('@payment_status', TransactionStatus::PAYMENT_PAID)
                ->click('@redir') //Pay
                ->assertSee('We have received your payment')
                ->assertSee(TransactionStatus::PAYMENT_PAID)
                ->assertSee(OrderStatus::AWAITING_FULFILLMENT);
        });
    }

    /**
     * Test a successful checkout with payment
     *
     * @group Checkout
     * @test
     * @throws \Throwable
     */
    public function testCheckoutFormInvalid()
    {
        /** @var SiteUser $user */
        $user = factory(SiteUser::class)->create();
        /** @var Address $address */
        $address = factory(Address::class)->create();
        $user->addresses()->save($address);

        $this->assertDatabaseHas('site_users', [
            'id' => $user->id
        ]);

        $regionInfo = new RegionInfo('NL');
        $product = Product::find(1);

        $this->browse(function (Browser $browser) use($user, $product, $regionInfo, $address) {
            $browser->loginAs($user->id, 'site')
                ->visit(new ShoppingCartTestPage())
                ->click('@addProductWithId1')
                ->waitForReload()
                ->click('@checkout')
                ->assertSee(__('shop/checkout.invoice_address'))
                ->assertSee(__('shop/checkout.shipping_address'))
                ->assertSee(__('shop/checkout.checkout'))
                ->assertSee(__('shop/checkout.terms_and_conditions'))
                ->assertRadioSelected('@new_invoice_address', '-1') //-1 Means that the backend could see that this is a new address instead of an existing one (bigger as 0 value);
                ->assertRadioSelected('@new_shipping_address', '-1')
                ->pause(10)
                ->assertSee($product->getDisplayName());

            $browser->driver->executeScript('window.scrollTo(0,document.body.scrollHeight);'); //Scroll to bottom

            $browser->pause(10)
                ->click('@checkout');

            foreach(['shipping', 'invoice'] as $type) {
                foreach([
                    $type.'_street',
                    $type.'_house_number',
                    $type.'_postal_code',
                    $type.'_city',
                    $type.'_phone',
                    $type.'_country',
                ] as $attribute) {
                    $browser->assertSee(__('shop/checkout.validation.required_if', ['attribute' => __('validation.attributes.'.$attribute)]));
                }
            }

        });
    }
}