File: D:/HostingSpaces/SBogers10/carrot.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)]));
}
}
});
}
}