Source of file CartTest.php
Size: 33,141 Bytes - Last Modified: 2021-12-23T10:47:54+00:00
/var/www/docs.ssmods.com/process/src/tests/CartTest.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014 | <?php /** * Testing {@link Product}s added and removed from {@link Order}s. * * Summary of tests: * ----------------- * add product to cart * change quantity of product in cart * update product and add it to cart again checking version number * add negative quantity to cart * add 0 quantity to cart * try saving duplicate variations * try saving variation without full set of options * change product price after it is in the cart * cannot add non-published product to the cart * customer members can add stuff to carts * website visitors can add stuff to carts * add product to cart and change price * add product variation * change quantity of variation * add different variations for same product * add product and variation to cart and check version * add variation to cart with price change * check cart totals * * TODO * ---- * remove options from product and variaiton when the attribute is deleted * Test saving a product with a new attribute, existing variations without this attribute should be disabled * * @author Frank Mullenger <frankmullenger@gmail.com> * @copyright Copyright (c) 2011, Frank Mullenger * @package swipestripe * @subpackage tests */ class SWS_CartTest extends SWS_Test { public function setUp() { parent::setUp(); Director::set_environment_type('dev'); //Check that payment module is installed $this->assertTrue(class_exists('Payment'), 'Payment module is installed.'); } /** * Create product and check basic attributes */ public function testProduct() { $productA = $this->objFromFixture('Product', 'productA'); $this->assertEquals($productA->Price, 500.00, 'The price of Product A should be 500.'); $this->assertEquals($productA->Currency, 'NZD', 'The currency of Product A should be NZD.'); } /** * Add an item to the cart for a basic product and check correct product added */ public function testAddProductToCart() { //Add published product to cart $productA = $this->objFromFixture('Product', 'productA'); $this->loginAs('admin'); $productA->doPublish(); $this->logOut(); $productALink = $productA->Link(); $this->get(Director::makeRelative($productALink)); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 1 )); $order = Cart::get_current_order(); $items = $order->Items(); $firstItem = $items->First(); $this->assertEquals(1, $items->Count()); $this->assertInstanceOf('Item', $firstItem); $this->assertEquals(1, $firstItem->Quantity); //Check that the correct product has been added $firstProduct = $firstItem->Product(); $this->assertInstanceOf('Product', $firstProduct); $this->assertEquals($productA->Title, $firstProduct->Title); $this->assertEquals($productA->Price, $firstProduct->Price); } /** * Add product to the cart twice and check quantity */ public function testAddProductQuantityToCart() { $productA = $this->objFromFixture('Product', 'productA'); $this->logInAs('admin'); $productA->doPublish(); $this->logOut(); $productALink = $productA->Link(); $this->get(Director::makeRelative($productALink)); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 1 )); $order = Cart::get_current_order(); $items = $order->Items(); $this->assertEquals(1, $items->Count()); $this->assertEquals(1, $items->First()->Quantity); $this->get(Director::makeRelative($productALink)); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 2 )); $order = Cart::get_current_order(); $items = $order->Items(); $this->assertEquals(1, $items->Count()); $this->assertEquals(3, $items->First()->Quantity); } /** * Add negative quantity to cart, should have no effect on cart */ public function testAddProductNegativeQuantityToCart() { $productA = $this->objFromFixture('Product', 'productA'); $this->logInAs('admin'); $productA->doPublish(); $this->logOut(); $productALink = $productA->Link(); $this->get(Director::makeRelative($productALink)); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 1 )); $order = Cart::get_current_order(); $items = $order->Items(); $this->assertEquals(1, $items->Count()); $this->assertEquals(1, $items->First()->Quantity); $message = null; $this->get(Director::makeRelative($productALink)); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => -1 )); $order = Cart::get_current_order(); $items = $order->Items(); $this->assertEquals(1, $items->Count()); $this->assertEquals(1, $items->First()->Quantity); } /** * Adding product with zero quantity should have no effect on cart */ public function testAddProductZeroQuantityToCart() { $productA = $this->objFromFixture('Product', 'productA'); $this->logInAs('admin'); $productA->doPublish(); $this->logOut(); $productALink = $productA->Link(); $this->get(Director::makeRelative($productALink)); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 1 )); $order = Cart::get_current_order(); $items = $order->Items(); $this->assertEquals(1, $items->Count()); $this->assertEquals(1, $items->First()->Quantity); $this->get(Director::makeRelative($productALink)); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 0 )); $order = Cart::get_current_order(); $items = $order->Items(); $this->assertEquals(1, $items->Count()); $this->assertEquals(1, $items->First()->Quantity); } /** * Published products should get different versions, new versions are new items in the cart */ public function testAddProductVersionToCart() { $productA = $this->objFromFixture('Product', 'productA'); $this->logInAs('admin'); $productA->doPublish(); $this->logOut(); $firstVersion = $productA->Version; $this->assertTrue($firstVersion > 0); $productALink = $productA->Link(); $this->get(Director::makeRelative($productALink)); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 1 )); $order = Cart::get_current_order(); $items = $order->Items(); $this->assertEquals(1, $items->Count()); $firstProduct = $order->Items()->First()->Product(); $this->assertEquals($firstVersion, $firstProduct->Version); //Publish again and check version in the cart $this->logInAs('admin'); //$productA->forceChange(); $productA->Title = 'Product A Changed'; $productA->doPublish(); $this->logOut(); $secondVersion = $productA->Version; $this->assertTrue($secondVersion > $firstVersion); $this->get(Director::makeRelative($productALink)); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 1 )); $order = Cart::get_current_order(); $items = $order->Items(); $this->assertEquals(2, $items->Count()); $this->assertEquals($firstVersion, $order->Items()->First()->Product()->Version); $this->assertEquals($secondVersion, $order->Items()->Last()->Product()->Version); } /** * Add a product to the cart as a visitor to the website */ public function testAddProductToCartLoggedOut() { $productA = $this->objFromFixture('Product', 'productA'); $this->logInAs('admin'); $productA->doPublish(); $this->logOut(); $loggedInAs = $this->session()->get('loggedInAs'); $this->assertTrue(!$loggedInAs); $productALink = $productA->Link(); $this->get(Director::makeRelative($productALink)); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 1 )); $order = Cart::get_current_order(); $this->assertEquals(1, $order->Items()->Count()); } /** * Add a product logged in as a customer */ public function testAddProductToCartLoggedInCustomer() { $productA = $this->objFromFixture('Product', 'productA'); $this->logInAs('admin'); $productA->doPublish(); $this->logOut(); $this->logInAs($this->objFromFixture('Customer', 'buyer')); $buyer = $this->objFromFixture('Customer', 'buyer'); $loggedInAs = $this->session()->get('loggedInAs'); $this->assertEquals($buyer->ID, $loggedInAs); $member = Customer::currentUser(); $this->assertEquals(true, $member->inGroup('customers')); $productALink = $productA->Link(); $this->get(Director::makeRelative($productALink)); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 1 )); $order = Cart::get_current_order(); $this->assertEquals(1, $order->Items()->Count()); } /** * Change product price after it is in the cart, check that price has not changed in cart */ public function testAddProductToCartChangePrice() { $productA = $this->objFromFixture('Product', 'productA'); $this->logInAs('admin'); $productA->doPublish(); $this->logOut(); $this->get(Director::makeRelative($productA->Link())); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 1 )); $order = Cart::get_current_order(); $items = $order->Items(); $firstItem = $items->First(); $this->assertEquals(1, $order->Items()->Count()); $this->assertEquals($productA->Price, $firstItem->Price); $newAmount = Price::create(); $newAmount->setAmount(72.34); $newAmount->setCurrency('NZD'); DataObject::flush_and_destroy_cache(); $this->logInAs('admin'); $productA->Price = $newAmount->getAmount(); $productA->doPublish(); $this->logOut(); $this->get(Director::makeRelative($productA->Link())); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 1 )); $order = Cart::get_current_order(); $items = $order->Items(); $firstItem = $items->First(); $secondItem = $items->Last(); $this->assertEquals(2, $order->Items()->Count()); $this->assertTrue(in_array(500, $order->Items()->column('Price'))); $this->assertTrue(in_array(72.34, $order->Items()->column('Price'))); } /** * Add a product variation to the cart */ public function testAddProductVariationToCart() { $teeshirtA = $this->objFromFixture('Product', 'teeshirtA'); $this->logInAs('admin'); $teeshirtA->doPublish(); $this->logOut(); $this->get(Director::makeRelative($teeshirtA->Link())); $teeshirtAVariation = $this->objFromFixture('Variation', 'teeshirtSmallRedCotton'); $this->assertEquals('Enabled', $teeshirtAVariation->Status); //Add variation to the cart $sizeAttr = $this->objFromFixture('Attribute', 'attrSize'); $colorAttr = $this->objFromFixture('Attribute', 'attrColor'); $materialAttr = $this->objFromFixture('Attribute', 'attrMaterial'); $teeshirtASmallOpt = $this->objFromFixture('Option', 'optSmallTeeshirt'); $teeshirtARedOpt = $this->objFromFixture('Option', 'optRedTeeshirt'); $teeshirtACottonOpt = $this->objFromFixture('Option', 'optCottonTeeshirt'); $this->assertEquals($teeshirtASmallOpt->ID, $teeshirtAVariation->getOptionForAttribute($sizeAttr->ID)->ID); $this->assertEquals($teeshirtARedOpt->ID, $teeshirtAVariation->getOptionForAttribute($colorAttr->ID)->ID); $this->assertEquals($teeshirtACottonOpt->ID, $teeshirtAVariation->getOptionForAttribute($materialAttr->ID)->ID); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 1, "Options[{$sizeAttr->ID}]" => $teeshirtASmallOpt->ID, //Small "Options[{$colorAttr->ID}]" => $teeshirtARedOpt->ID, //Red "Options[{$materialAttr->ID}]" => $teeshirtACottonOpt->ID, //Cotton )); $order = Cart::get_current_order(); $items = $order->Items(); $firstItem = $items->First(); $variation = $firstItem->Variation(); // $itemOptions = $firstItem->ItemOptions(); // $variation = $itemOptions->First()->Object(); // $this->assertEquals(1, $itemOptions->Count()); $this->assertEquals($teeshirtAVariation->ID, $variation->ID); $this->assertEquals($teeshirtAVariation->Version, $variation->Version); $this->assertEquals($teeshirtAVariation->Status, $variation->Status); $this->assertEquals($teeshirtAVariation->ProductID, $variation->ProductID); } /** * Add disabled product variation to cart should not work */ public function testAddDisabledProductVariationToCart() { $teeshirtA = $this->objFromFixture('Product', 'teeshirtA'); $teeshirtAVariation = $this->objFromFixture('Variation', 'teeshirtSmallRedCotton'); $this->logInAs('admin'); $teeshirtA->doPublish(); $teeshirtAVariation->Status = 'Disabled'; $teeshirtAVariation->write(); $this->logOut(); $this->get(Director::makeRelative($teeshirtA->Link())); $this->assertEquals('Disabled', $teeshirtAVariation->Status); $this->assertFalse($teeshirtAVariation->isEnabled()); //Add variation to the cart $sizeAttr = $this->objFromFixture('Attribute', 'attrSize'); $colorAttr = $this->objFromFixture('Attribute', 'attrColor'); $materialAttr = $this->objFromFixture('Attribute', 'attrMaterial'); $teeshirtASmallOpt = $this->objFromFixture('Option', 'optSmallTeeshirt'); $teeshirtARedOpt = $this->objFromFixture('Option', 'optRedTeeshirt'); $teeshirtACottonOpt = $this->objFromFixture('Option', 'optCottonTeeshirt'); $this->assertEquals($teeshirtASmallOpt->ID, $teeshirtAVariation->getOptionForAttribute($sizeAttr->ID)->ID); $this->assertEquals($teeshirtARedOpt->ID, $teeshirtAVariation->getOptionForAttribute($colorAttr->ID)->ID); $this->assertEquals($teeshirtACottonOpt->ID, $teeshirtAVariation->getOptionForAttribute($materialAttr->ID)->ID); $data = $this->getFormData('ProductForm_ProductForm'); $data['Quantity'] = 1; $data["Options[{$sizeAttr->ID}]"] = $teeshirtASmallOpt->ID; //Small $data["Options[{$colorAttr->ID}]"] = $teeshirtARedOpt->ID; //Red $data["Options[{$materialAttr->ID}]"] = $teeshirtACottonOpt->ID; //Cotton $this->post( Director::absoluteURL($teeshirtA->Link() . '/AddToCartForm/'), $data ); $order = Cart::get_current_order(); $items = $order->Items(); $this->assertEquals(0, $items->Count()); } /** * Add invalid product variation to cart should not work */ public function testAddInvalidProductVariationToCart() { $teeshirtA = $this->objFromFixture('Product', 'teeshirtA'); $teeshirtAVariation = $this->objFromFixture('Variation', 'teeshirtSmallRedCotton'); $this->logInAs('admin'); $teeshirtA->doPublish(); $this->logOut(); $this->get(Director::makeRelative($teeshirtA->Link())); //Add variation to the cart $sizeAttr = $this->objFromFixture('Attribute', 'attrSize'); $colorAttr = $this->objFromFixture('Attribute', 'attrColor'); $materialAttr = $this->objFromFixture('Attribute', 'attrMaterial'); $teeshirtASmallOpt = $this->objFromFixture('Option', 'optSmallTeeshirt'); $teeshirtAMediumOpt = $this->objFromFixture('Option', 'optMediumTeeshirt'); $teeshirtARedOpt = $this->objFromFixture('Option', 'optRedTeeshirt'); $teeshirtACottonOpt = $this->objFromFixture('Option', 'optCottonTeeshirt'); $this->assertEquals($teeshirtASmallOpt->ID, $teeshirtAVariation->getOptionForAttribute($sizeAttr->ID)->ID); $this->assertFalse($teeshirtAMediumOpt->ID == $teeshirtAVariation->getOptionForAttribute($sizeAttr->ID)->ID); $this->assertEquals($teeshirtARedOpt->ID, $teeshirtAVariation->getOptionForAttribute($colorAttr->ID)->ID); $this->assertEquals($teeshirtACottonOpt->ID, $teeshirtAVariation->getOptionForAttribute($materialAttr->ID)->ID); //Submit with incorrect variation values, for Medium, Red, Cotton $data = $this->getFormData('ProductForm_ProductForm'); $data['Quantity'] = 1; $data["Options[{$sizeAttr->ID}]"] = $teeshirtAMediumOpt->ID; //Medium $data["Options[{$colorAttr->ID}]"] = $teeshirtARedOpt->ID; //Red $data["Options[{$materialAttr->ID}]"] = $teeshirtACottonOpt->ID; //Cotton $this->post( Director::absoluteURL($teeshirtA->Link() . '/AddToCartForm/'), $data ); $order = Cart::get_current_order(); $items = $order->Items(); $this->assertEquals(0, $items->Count()); } public function testAddProductNoVariation() { $teeshirtA = $this->objFromFixture('Product', 'teeshirtA'); $teeshirtAVariation = $this->objFromFixture('Variation', 'teeshirtSmallRedCotton'); $this->logInAs('admin'); $teeshirtA->doPublish(); $this->logOut(); $this->get(Director::makeRelative($teeshirtA->Link())); //Submit with incorrect variation values, for Medium, Red, Cotton $data = $this->getFormData('ProductForm_ProductForm'); $data['Quantity'] = 1; $this->post( Director::absoluteURL($teeshirtA->Link() . '/AddToCartForm/'), $data ); $order = Cart::get_current_order(); $items = $order->Items(); $this->assertEquals(0, $items->Count()); } /** * Add product variations and check quantities */ public function testAddProductVariationQuantity() { $teeshirtA = $this->objFromFixture('Product', 'teeshirtA'); $teeshirtAVariation = $this->objFromFixture('Variation', 'teeshirtSmallRedCotton'); $this->logInAs('admin'); $teeshirtA->doPublish(); $this->logOut(); $this->get(Director::makeRelative($teeshirtA->Link())); //Add variation to the cart $sizeAttr = $this->objFromFixture('Attribute', 'attrSize'); $colorAttr = $this->objFromFixture('Attribute', 'attrColor'); $materialAttr = $this->objFromFixture('Attribute', 'attrMaterial'); $teeshirtASmallOpt = $this->objFromFixture('Option', 'optSmallTeeshirt'); $teeshirtARedOpt = $this->objFromFixture('Option', 'optRedTeeshirt'); $teeshirtACottonOpt = $this->objFromFixture('Option', 'optCottonTeeshirt'); $this->assertEquals($teeshirtASmallOpt->ID, $teeshirtAVariation->getOptionForAttribute($sizeAttr->ID)->ID); $this->assertEquals($teeshirtARedOpt->ID, $teeshirtAVariation->getOptionForAttribute($colorAttr->ID)->ID); $this->assertEquals($teeshirtACottonOpt->ID, $teeshirtAVariation->getOptionForAttribute($materialAttr->ID)->ID); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 1, "Options[{$sizeAttr->ID}]" => $teeshirtASmallOpt->ID, //Small "Options[{$colorAttr->ID}]" => $teeshirtARedOpt->ID, //Red "Options[{$materialAttr->ID}]" => $teeshirtACottonOpt->ID, //Cotton )); $order = Cart::get_current_order(); $items = $order->Items(); $firstItem = $items->First(); $this->assertEquals(1, $items->Count()); $this->assertEquals(1, $firstItem->Quantity); $this->get(Director::makeRelative($teeshirtA->Link())); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 2, "Options[{$sizeAttr->ID}]" => $teeshirtASmallOpt->ID, //Small "Options[{$colorAttr->ID}]" => $teeshirtARedOpt->ID, //Red "Options[{$materialAttr->ID}]" => $teeshirtACottonOpt->ID, //Cotton )); $order = Cart::get_current_order(); $items = $order->Items(); $firstItem = $items->First(); $this->assertEquals(1, $items->Count()); $this->assertEquals(3, $firstItem->Quantity); } /** * Add different product variations for the same product */ public function testAddProductVariations() { $teeshirtA = $this->objFromFixture('Product', 'teeshirtA'); $teeshirtAVariation = $this->objFromFixture('Variation', 'teeshirtSmallRedCotton'); $this->logInAs('admin'); $teeshirtA->doPublish(); $this->logOut(); $this->get(Director::makeRelative($teeshirtA->Link())); //Add variation to the cart $sizeAttr = $this->objFromFixture('Attribute', 'attrSize'); $colorAttr = $this->objFromFixture('Attribute', 'attrColor'); $materialAttr = $this->objFromFixture('Attribute', 'attrMaterial'); $teeshirtASmallOpt = $this->objFromFixture('Option', 'optSmallTeeshirt'); $teeshirtARedOpt = $this->objFromFixture('Option', 'optRedTeeshirt'); $teeshirtACottonOpt = $this->objFromFixture('Option', 'optCottonTeeshirt'); $teeshirtAPolyesterOpt = $this->objFromFixture('Option', 'optPolyesterTeeshirt'); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 1, "Options[{$sizeAttr->ID}]" => $teeshirtASmallOpt->ID, //Small "Options[{$colorAttr->ID}]" => $teeshirtARedOpt->ID, //Red "Options[{$materialAttr->ID}]" => $teeshirtACottonOpt->ID, //Cotton )); $order = Cart::get_current_order(); $items = $order->Items(); $firstItem = $items->First(); $this->assertEquals(1, $items->Count()); $this->assertEquals(1, $firstItem->Quantity); $teeshirtA = $this->objFromFixture('Product', 'teeshirtA'); $teeshirtAVariation = $this->objFromFixture('Variation', 'teeshirtSmallRedCotton'); $this->logInAs('admin'); $teeshirtA->doPublish(); $this->logOut(); $this->get(Director::makeRelative($teeshirtA->Link())); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 1, "Options[{$sizeAttr->ID}]" => $teeshirtASmallOpt->ID, //Small "Options[{$colorAttr->ID}]" => $teeshirtARedOpt->ID, //Red "Options[{$materialAttr->ID}]" => $teeshirtAPolyesterOpt->ID, //Polyester )); $order = Cart::get_current_order(); $items = $order->Items(); $this->assertEquals(2, $items->Count()); $this->assertEquals(1, $items->First()->Quantity); $this->assertEquals(1, $items->Last()->Quantity); } /** * Add product variations and check version correct */ public function testAddVariationWithVersion() { $teeshirtA = $this->objFromFixture('Product', 'teeshirtA'); $teeshirtAVariation = $this->objFromFixture('Variation', 'teeshirtSmallRedCotton'); $this->logInAs('admin'); $teeshirtA->doPublish(); $teeshirtAVariation->Price = 1.00; $teeshirtAVariation->write(); $this->logOut(); $firstVersion = $teeshirtAVariation->Version; $this->get(Director::makeRelative($teeshirtA->Link())); //Add variation to the cart $sizeAttr = $this->objFromFixture('Attribute', 'attrSize'); $colorAttr = $this->objFromFixture('Attribute', 'attrColor'); $materialAttr = $this->objFromFixture('Attribute', 'attrMaterial'); $teeshirtASmallOpt = $this->objFromFixture('Option', 'optSmallTeeshirt'); $teeshirtARedOpt = $this->objFromFixture('Option', 'optRedTeeshirt'); $teeshirtACottonOpt = $this->objFromFixture('Option', 'optCottonTeeshirt'); $this->assertEquals($teeshirtASmallOpt->ID, $teeshirtAVariation->getOptionForAttribute($sizeAttr->ID)->ID); $this->assertEquals($teeshirtARedOpt->ID, $teeshirtAVariation->getOptionForAttribute($colorAttr->ID)->ID); $this->assertEquals($teeshirtACottonOpt->ID, $teeshirtAVariation->getOptionForAttribute($materialAttr->ID)->ID); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 1, "Options[{$sizeAttr->ID}]" => $teeshirtASmallOpt->ID, //Small "Options[{$colorAttr->ID}]" => $teeshirtARedOpt->ID, //Red "Options[{$materialAttr->ID}]" => $teeshirtACottonOpt->ID, //Cotton )); $order = Cart::get_current_order(); $items = $order->Items(); $firstItem = $items->First(); $variation = $firstItem->Variation(); // $itemOptions = $firstItem->ItemOptions(); // $firstItemOption = $itemOptions->First(); // $variation = $firstItemOption->Object(); $this->assertEquals(1, $items->Count()); $this->assertEquals(1, $firstItem->Quantity); $this->assertEquals($firstVersion, $firstItem->VariationVersion); $this->logInAs('admin'); $teeshirtA->doPublish(); $teeshirtAVariation->Price = 0.00; $teeshirtAVariation->write(); $this->logOut(); $secondVersion = $teeshirtAVariation->Version; $this->assertTrue($secondVersion > $firstVersion); $this->get(Director::makeRelative($teeshirtA->Link())); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 1, "Options[{$sizeAttr->ID}]" => $teeshirtASmallOpt->ID, //Small "Options[{$colorAttr->ID}]" => $teeshirtARedOpt->ID, //Red "Options[{$materialAttr->ID}]" => $teeshirtACottonOpt->ID, //Cotton )); $order = Cart::get_current_order(); $items = $order->Items(); // $lastItemOption = $items->Last()->ItemOptions()->Last(); $this->assertEquals(2, $items->Count()); $this->assertEquals(1, $items->Last()->Quantity); $this->assertEquals($secondVersion, $items->Last()->VariationVersion); } /** * Add product variation with different price and check order total */ public function testAddVariationWithPriceChanged() { $teeshirtA = $this->objFromFixture('Product', 'teeshirtA'); $teeshirtAVariation = $this->objFromFixture('Variation', 'teeshirtSmallRedPolyester'); $this->logInAs('admin'); $teeshirtA->doPublish(); $this->logOut(); $expectedAmount = $teeshirtA->Price + $teeshirtAVariation->Price; $this->get(Director::makeRelative($teeshirtA->Link())); //Add variation to the cart $sizeAttr = $this->objFromFixture('Attribute', 'attrSize'); $colorAttr = $this->objFromFixture('Attribute', 'attrColor'); $materialAttr = $this->objFromFixture('Attribute', 'attrMaterial'); $teeshirtASmallOpt = $this->objFromFixture('Option', 'optSmallTeeshirt'); $teeshirtARedOpt = $this->objFromFixture('Option', 'optRedTeeshirt'); $teeshirtACottonOpt = $this->objFromFixture('Option', 'optCottonTeeshirt'); $teeshirtAPolyesterOpt = $this->objFromFixture('Option', 'optPolyesterTeeshirt'); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 1, "Options[{$sizeAttr->ID}]" => $teeshirtASmallOpt->ID, //Small "Options[{$colorAttr->ID}]" => $teeshirtARedOpt->ID, //Red "Options[{$materialAttr->ID}]" => $teeshirtAPolyesterOpt->ID, //Polyester )); $order = Cart::get_current_order(); $this->assertEquals($expectedAmount, $order->Total()->getAmount()); } /** * Get variation options and test that they are correct */ public function testProductVariationOptions() { $smallRedCotton = $this->objFromFixture('Variation', 'teeshirtSmallRedCotton'); $this->assertEquals('Enabled', $smallRedCotton->Status, 'Variation should be status Enabled by default.'); //Ensure correct options $options = $smallRedCotton->Options(); $this->assertEquals(3, $options->Count()); //Add variation to the cart $sizeAttr = $this->objFromFixture('Attribute', 'attrSize'); $colorAttr = $this->objFromFixture('Attribute', 'attrColor'); $materialAttr = $this->objFromFixture('Attribute', 'attrMaterial'); $teeshirtASmallOpt = $this->objFromFixture('Option', 'optSmallTeeshirt'); $teeshirtARedOpt = $this->objFromFixture('Option', 'optRedTeeshirt'); $teeshirtACottonOpt = $this->objFromFixture('Option', 'optCottonTeeshirt'); $this->assertEquals(array( $teeshirtACottonOpt->ID => 'Cotton', $teeshirtARedOpt->ID => 'Red', $teeshirtASmallOpt->ID => 'Small' ), $options->map('ID', 'Title')->toArray()); } /** * Test saving duplicate product variations */ public function testSaveDuplicateProductVariation() { $brokenSmallRed = $this->objFromFixture('Variation', 'brokenSmallRed'); $brokenSmallRedDuplicate = $this->objFromFixture('Variation', 'brokenSmallRedDuplicate'); $firstOptions = $brokenSmallRed->Options()->map()->toArray(); $secondOptions = $brokenSmallRedDuplicate->Options()->map()->toArray(); $this->assertEquals($firstOptions, $secondOptions); //Hacky way to add attribute options to the record for Variation::isDuplicate() foreach ($brokenSmallRedDuplicate->Options() as $option) { $brokenSmallRedDuplicate->setField('Options['.$option->AttributeID.']', $option->ID); } $e = null; try { $result = $brokenSmallRedDuplicate->write(); } catch (ValidationException $e) { $message = $e->getMessage(); } $this->assertInstanceOf('ValidationException', $e); } /** * Add product and variation with quantity to cart and check total and subtotal */ public function testCartTotals() { $teeshirtA = $this->objFromFixture('Product', 'teeshirtA'); $teeshirtAVariation = $this->objFromFixture('Variation', 'teeshirtSmallRedPolyester'); $this->logInAs('admin'); $teeshirtA->doPublish(); $this->logOut(); $quantity = 2; $expectedAmount = ($teeshirtA->Price + $teeshirtAVariation->Price) * $quantity; $this->get(Director::makeRelative($teeshirtA->Link())); //Add variation to the cart $sizeAttr = $this->objFromFixture('Attribute', 'attrSize'); $colorAttr = $this->objFromFixture('Attribute', 'attrColor'); $materialAttr = $this->objFromFixture('Attribute', 'attrMaterial'); $teeshirtASmallOpt = $this->objFromFixture('Option', 'optSmallTeeshirt'); $teeshirtARedOpt = $this->objFromFixture('Option', 'optRedTeeshirt'); $teeshirtACottonOpt = $this->objFromFixture('Option', 'optCottonTeeshirt'); $teeshirtAPolyesterOpt = $this->objFromFixture('Option', 'optPolyesterTeeshirt'); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => $quantity, "Options[{$sizeAttr->ID}]" => $teeshirtASmallOpt->ID, //Small "Options[{$colorAttr->ID}]" => $teeshirtARedOpt->ID, //Red "Options[{$materialAttr->ID}]" => $teeshirtAPolyesterOpt->ID, //Polyester )); $order = Cart::get_current_order(); $this->assertEquals($expectedAmount, $order->Total()->getAmount()); $this->assertEquals($expectedAmount, $order->SubTotal()->getAmount()); } /** * Persist an order to the DB only when explicitly asked to */ public function testPersistOrder() { $this->assertEquals(1, Order::get()->count()); $order = Cart::get_current_order(); $this->assertEquals(1, Order::get()->count()); $order = Cart::get_current_order(true); $origID = $order->ID; $this->assertEquals(2, Order::get()->count()); //Should get the same Order as above and not persist another to the DB $order = Cart::get_current_order(true); $this->assertEquals($origID, $order->ID); $this->assertEquals(2, Order::get()->count()); } /** * Order is persisted to DB when trying to add a product to the cart */ public function testPersistOrderOnAddToCart() { $productA = $this->objFromFixture('Product', 'productA'); $this->loginAs('admin'); $productA->doPublish(); $this->logOut(); $order = Cart::get_current_order(); $origID = $order->ID; $this->assertEquals(1, Order::get()->count()); $productALink = $productA->Link(); $this->get(Director::makeRelative($productALink)); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 1 )); $order = Cart::get_current_order(); $this->assertFalse($origID == $order->ID); $this->assertEquals(2, Order::get()->count()); } /** * Carts abandoned longer than set lifetime are deleted */ public function testDeleteAbandonedCarts() { $productA = $this->objFromFixture('Product', 'productA'); $shopConfig = $this->objFromFixture('ShopConfig', 'config'); $this->assertEquals(1, $shopConfig->CartTimeout); $this->assertEquals('hour', $shopConfig->CartTimeoutUnit); $this->loginAs('admin'); $productA->doPublish(); $this->logOut(); $productALink = $productA->Link(); $this->get(Director::makeRelative($productALink)); $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 1 )); $order = Cart::get_current_order(); $this->assertTrue($order->exists()); Order::delete_abandoned(); DataObject::flush_and_destroy_cache(); $order = Cart::get_current_order(); $this->assertTrue($order->exists()); //Log in as admin, change the shop config and the cart last active and try to delete it $this->loginAs('admin'); $shopConfig->CartTimeout = 15; $shopConfig->CartTimeoutUnit = 'minute'; $shopConfig->write(); $date = new DateTime(); $date->sub(new DateInterval('PT20M')); $order->LastActive = $date->format('Y-m-d H:i:s'); $order->write(); $this->logOut(); Order::delete_abandoned(); DataObject::flush_and_destroy_cache(); $order = Cart::get_current_order(); $this->assertTrue(!$order->exists()); } /** * Test saving variation without all options set * Disabled validation for product variations because preventing disabling a variation * * @deprecated */ public function testSaveInvalidProductVariation() { return; //This variation only has 1 option instead of 2 $brokenProductVariation = $this->objFromFixture('Variation', 'brokenMedium'); $options = $brokenProductVariation->Options(); $this->assertEquals(1, $options->Count()); $e = null; try { $brokenProductVariation->write(); } catch (ValidationException $e) { $message = $e->getMessage(); } $this->assertInstanceOf('ValidationException', $e); } /** * Have to use draft site for following test testAddNonPublishedProductToCart */ public function testSetDraftTrue() { self::$use_draft_site = true; } /** * Adding non published product to a cart should fail */ public function testAddNonPublishedProductToCart() { $productA = $this->objFromFixture('Product', 'productA'); $this->assertEquals(false, $productA->isPublished()); $productALink = $productA->Link(); $this->get(Director::makeRelative($productALink)); $message = null; try { $this->submitForm('ProductForm_ProductForm', null, array( 'Quantity' => 1 )); } catch (Exception $e) { $message = $e->getMessage(); } $this->assertStringEndsWith('Object not written.', $message); $order = Cart::get_current_order(); $items = $order->Items(); $this->assertEquals(0, $items->Count()); } } |