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/stafa.komma.pro/app/Komma/Shop/Tests/Unit/ShoppingCartTest.php
<?php

namespace App\Komma\Shop\Tests\Unit;

use App\Komma\Shop\Cart\ShoppingCartService;
use App\Komma\Shop\Products\Product\Product;
use App\Komma\Shop\Products\ProductComposite\ProductComposite;
use App\Komma\Shop\Products\ProductGroup\ProductGroup;
use App\Komma\Shop\Products\ProductGroupBehaviour\ProductGroupBehaviour;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class ShoppingCartTest
{
    use DatabaseTransactions; //Automatically rolls back database actions after tests

    /**
     * @var ShoppingCartService $shoppingCart
     */
    private $shoppingCart;

    /**
     * Runs before each test
     */
    public function setup()
    {
        $this->shoppingCart = new ShoppingCartService();
    }

    ///////////////////////////////////////////////
    // Tests without price modification
    ///////////////////////////////////////////////

    /**
     * @test
     */
    public function testAddSingleProductAndGetItems()
    {
        /** @var Product $product */
        $product = factory(Product::class)->create();
        $this->shoppingCart->addProductable($product);
        $this->assertCount(1, $this->shoppingCart->getItems());
    }

    /**
     * @test
     * @group ShoppingCart
     */
    public function testGetItemsCount()
    {
        /** @var Product $product */
        $product = factory(Product::class)->create();
        $this->shoppingCart->addProductable($product);
        $product = factory(Product::class)->create();
        $this->shoppingCart->addProductable($product);
        $product = factory(Product::class)->create();
        $this->shoppingCart->addProductable($product);

        $this->assertEquals(3, $this->shoppingCart->getItemsCount(false, false));
    }

    /**
     * @test
     * @group ShoppingCart
     */
    public function testGetUniqueItemsCount()
    {
        /** @var Product $product */
        $product = factory(Product::class)->create();
        $this->shoppingCart->addProductable($product);
        $product = factory(Product::class)->create();
        $this->shoppingCart->addProductable($product);

        $this->assertEquals(1, $this->shoppingCart->getItemsCount(true, false));
    }


    /**
     * @test
     * @group ShoppingCart
     */
    public function testDeleteProduct()
    {
        /** @var Product $product */
        $product = factory(Product::class)->create();
        $this->shoppingCart->addProductable($product);

        $product = factory(Product::class)->create();
        $this->shoppingCart->addProductable($product);

        /** @var Product $productToDelete */
        $productToDelete = factory(Product::class)->create();

        /** @var Product $productToDelete */
        $shoppingCartItemToDelete = $this->shoppingCart->addProductable($productToDelete);

        $product = factory(Product::class)->create();
        $this->shoppingCart->addProductable($product);

        $this->assertEquals(4, count($this->shoppingCart->getItems()));
        $this->shoppingCart->deleteItem($shoppingCartItemToDelete->getProductable());
        $this->assertEquals(3, count($this->shoppingCart->getItems()));
    }

    /**
     * @test
     * @group ShoppingCart
     */
    public function testClearCart()
    {
        $product = factory(Product::class)->create();
        $this->shoppingCart->addProductable($product);
        $product = factory(Product::class)->create();
        $this->shoppingCart->addProductable($product);
        $this->assertCount(2, $this->shoppingCart->getItems());

        $this->shoppingCart->clear();
        $this->assertEquals(0, count($this->shoppingCart->getItems()));
    }

    /**
     * @test
     * @group ShoppingCart
     */
    public function testGetPrice()
    {
        $expectedPrice = 0;
        /** @var Product $product */
        $product = factory(Product::class)->create();
        $expectedPrice += $product->price;
        $this->shoppingCart->addProductable($product);
        $product = factory(Product::class)->create();
        $expectedPrice += $product->price;
        $this->shoppingCart->addProductable($product);

        $this->assertEquals($expectedPrice, $this->shoppingCart->getTotal(false));
    }

    /**
     * @test
     * @group ShoppingCart
     */
    public function testAddProductGroup()
    {
        //Setup
        /** @var Product[] $products */
        $products = [];
        $products[] = factory(Product::class)->create();
        $products[] = factory(Product::class)->create();

        /** @var ProductGroupBehaviour $group */
        $behaviour = factory(ProductGroupBehaviour::class)->create();
        /** @var ProductGroup $group */

        $group = factory(ProductGroup::class)->make();
        $group->productGroupBehaviour()->associate($behaviour);
        $group->save();
        $group->products()->saveMany($products);

        //Exercise
        $this->shoppingCart->addProductable($group);

        //Test
        $this->assertEquals($group->getPrice(), $this->shoppingCart->getTotal());
    }

    /**
     * @test
     * @group ShoppingCart
     */
    public function testAddProductComposite()
    {
        //Setup
        /** @var Product[] $products */
        $products = [];
        $products[] = factory(Product::class)->create();
        $products[] = factory(Product::class)->create();

        /** @var Product[] $productsGroup2 */
        $productsGroup2 = [];
        $productsGroup2[] = factory(Product::class)->create();
        $productsGroup2[] = factory(Product::class)->create();

        /** @var ProductGroupBehaviour $group */
        $behaviour = factory(ProductGroupBehaviour::class)->create();
        $behaviourGroup2 = factory(ProductGroupBehaviour::class)->create();
        /** @var ProductGroup $group */
        $group = factory(ProductGroup::class)->make();
        $group->productGroupBehaviour()->associate($behaviour);
        $group->save();
        $group->products()->saveMany($products);

        /** @var ProductGroup $group2 */
        $group2 = factory(ProductGroup::class)->make();
        $group2->productGroupBehaviour()->associate($behaviourGroup2);
        $group2->save();
        $group2->products()->saveMany($productsGroup2);

        /** @var ProductComposite $composite */
        $composite = factory(ProductComposite::class)->create();
        $composite->groups()->saveMany([$group, $group2]);

        //Exercise
        $this->shoppingCart->addProductable($composite);

        //Test
        $this->assertEquals($composite->getPrice(), $this->shoppingCart->getTotal());
    }

    /**
     * @test
     * @group ShoppingCart
     */
    public function testAddingDuplicateProduct()
    {
        /** @var Product $product */
        $product = factory(Product::class)->create();

        $this->shoppingCart->addProductable($product, 3);

        $this->assertEquals(1, $this->shoppingCart->getItemsCount(true));

        $this->shoppingCart->addProductable($product, 2);

        $this->assertEquals(1, $this->shoppingCart->getItemsCount(true));
        $this->assertEquals(5, $this->shoppingCart->getItemsCount(false));
    }
}