public function testDelete() { Config::inst()->update('FlatTaxModifier', 'rate', 0.25); Config::inst()->update('Order', 'modifiers', array('FlatTaxModifier')); $order = Order::create(); $shirt = $this->objFromFixture("Product", "tshirt"); $mp3player = $this->objFromFixture("Product", "mp3player"); $order->Items()->add($shirt->createItem(3)); $order->Items()->add($mp3player->createItem(1)); $order->write(); $order->calculate(); $statusLogId = OrderStatusLog::create(array('Title' => 'Test status log', 'OrderID' => $order->ID))->write(); $paymentId = Payment::create(array('OrderID' => $order->ID))->init('Manual', 343.75, 'NZD')->write(); $this->assertEquals(4, $order->Items()->Quantity()); $this->assertEquals(1, $order->Modifiers()->count()); $this->assertEquals(1, $order->OrderStatusLogs()->count()); $this->assertEquals(1, $order->Payments()->count()); $itemIds = Product_OrderItem::get()->filter('OrderID', $order->ID)->column('ID'); $modifierIds = OrderModifier::get()->filter('OrderID', $order->ID)->column('ID'); $order->delete(); // Items should no longer be linked to order $this->assertEquals(0, $order->Items()->count()); $this->assertEquals(0, $order->Modifiers()->count()); $this->assertEquals(0, $order->OrderStatusLogs()->count()); $this->assertEquals(0, $order->Payments()->count()); // Ensure the order items have been deleted! $this->assertEquals(0, Product_OrderItem::get()->filter('ID', $itemIds)->count()); $this->assertEquals(0, OrderModifier::get()->filter('ID', $modifierIds)->count()); $this->assertEquals(0, OrderStatusLog::get()->filter('ID', $statusLogId)->count()); // Keep the payment… it might be relevant for book keeping $this->assertEquals(1, Payment::get()->filter('ID', $paymentId)->count()); }
public function testPlaceFailure() { if (!ShopTools::DBConn()->supportsTransactions()) { $this->markTestSkipped('The Database doesn\'t support transactions.'); } // Add the erroneous extension Order::add_extension('OrderProcessorTest_PlaceFailExtension'); Config::inst()->update('Product', 'order_item', 'OrderProcessorTest_CustomOrderItem'); //log out the admin user Member::currentUser()->logOut(); $joemember = $this->objFromFixture('Member', 'joebloggs'); $joemember->logIn(); $this->shoppingcart->add($this->mp3player); $cart = ShoppingCart::curr(); $cart->calculate(); $this->assertDOSContains(array(array('ClassName' => 'OrderProcessorTest_CustomOrderItem')), $cart->Items()); $versions = Product_OrderItem::get()->filter('OrderID', $cart->ID)->column('ProductVersion'); // The Product_OrderItem should not reference a product version while the order is not placed $this->assertEquals(array(0), $versions); $this->assertTrue($cart->has_extension('OrderProcessorTest_PlaceFailExtension')); // Placing the order will fail. $this->assertFalse($this->placeOrder('Joseph', 'Blog', '*****@*****.**', '100 Melrose Place', null, 'Martinsonville', 'New Mexico', null, 'EG', 'newpassword', 'newpassword', $joemember), "Member order placed successfully"); $order = Order::get()->byID($cart->ID); //update order variable to db-stored version $this->assertNotNull($this->shoppingcart->current(), "Shopping is still present"); $this->assertNotNull($order); $this->assertNull($order->Placed); $this->assertEquals($order->Status, 'Cart', 'Status should still be "Cart"'); // When order failed, everything that was written during the placement should be rolled back $versions = Product_OrderItem::get()->filter('OrderID', $cart->ID)->column('ProductVersion'); // The Product_OrderItem should still not reference a product if the rollback worked $this->assertEquals(array(0), $versions); $this->assertEquals(0, OrderProcessorTest_CustomOrderItem::get()->filter('OrderID', $cart->ID)->first()->IsPlaced); Order::remove_extension('OrderProcessorTest_PlaceFailExtension'); $this->shoppingcart->clear(false); }