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);
 }