File: D:/HostingSpaces/SBogers10/vanderkampen.komma.pro/app/KommaApp/Shop/Tests/Unit/ShoppingCartTest.php
<?php
namespace App\KommaApp\Shop\Tests\Unit;
use App\KommaApp\Shop\Cart\ShoppingCartItem;
use App\KommaApp\Shop\Cart\ShoppingCartService;
use App\KommaApp\Shop\Products\Product\Product;
use App\KommaApp\Shop\Products\ProductComposite\ProductComposite;
use App\KommaApp\Shop\Products\ProductGroup\ProductGroup;
use App\KommaApp\Shop\Products\ProductGroupBehaviour\ProductGroupBehaviour;
use App\KommaApp\Shop\Tests\TestCase;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ShoppingCartTest extends TestCase
{
use DatabaseTransactions; //Automatically rolls back database actions after tests
/**
* @var ShoppingCartService $shoppingCart
*/
private $shoppingCart;
/**
* Runs before each test
*/
public function setup()
{
parent::setup();
$this->shoppingCart = new ShoppingCartService();
}
///////////////////////////////////////////////
// Tests without price modification
///////////////////////////////////////////////
/**
* Runs after each test
* @group ShoppingCart
*/
public function teardown()
{
parent::tearDown();
}
/**
* @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));
}
}