2009-07-11 Michael Barker <mike@middlesoft.co.uk>
[mono.git] / mcs / class / System.Data.Linq / src / DbLinq / Test / Providers / Transactions.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Linq;\r
4 using System.Text;\r
5 using NUnit.Framework;\r
6 using Test_NUnit;\r
7 \r
8 using System.Data;\r
9 using System.Data.Common;\r
10 \r
11 using nwind;\r
12 \r
13 // test ns \r
14 #if MYSQL\r
15     namespace Test_NUnit_MySql\r
16 #elif ORACLE && ODP\r
17     namespace Test_NUnit_OracleODP\r
18 #elif ORACLE\r
19     namespace Test_NUnit_Oracle\r
20 #elif POSTGRES\r
21     namespace Test_NUnit_PostgreSql\r
22 #elif SQLITE\r
23     namespace Test_NUnit_Sqlite\r
24 #elif INGRES\r
25     namespace Test_NUnit_Ingres\r
26 #elif MSSQL && L2SQL\r
27     namespace Test_NUnit_MsSql_Strict\r
28 #elif MSSQL\r
29     namespace Test_NUnit_MsSql\r
30 #elif FIREBIRD\r
31     namespace Test_NUnit_Firebird\r
32 #endif\r
33 {\r
34     [TestFixture]\r
35     public class Transactions : TestBase\r
36     {\r
37         [SetUp]\r
38         public void Setup_LinqToSqlInsert07()\r
39         {\r
40             Northwind db = CreateDB();\r
41             var orderDetails =\r
42                  from o in db.OrderDetails\r
43                  where o.Order.CustomerID == "WARTH"\r
44                  select o;\r
45 \r
46             var order =\r
47                 (from o in db.Orders\r
48                  where o.CustomerID == "WARTH"\r
49                  select o).FirstOrDefault();\r
50 \r
51             if (!orderDetails.Any() || order == null)\r
52             {\r
53                 var o = new Order { CustomerID = "WARTH", Employee = db.Employees.First() };\r
54                 o.OrderDetails.Add(new OrderDetail { Discount = 0.1f, Quantity = 1, Product = db.Products.First(p => p.ProductID % 2 == 0) });\r
55                 o.OrderDetails.Add(new OrderDetail { Discount = 0.2f, Quantity = 1, Product = db.Products.First(p => p.ProductID % 2 != 0) });\r
56                 db.Orders.InsertOnSubmit(o);\r
57                 db.SubmitChanges();\r
58             }\r
59         }\r
60 \r
61 #if !DEBUG && (SQLITE || (MSSQL && !L2SQL))\r
62         [Explicit]\r
63 #endif\r
64         [Test]\r
65         public void TransactionRollbackDelete()\r
66         {\r
67             Northwind db = CreateDB();\r
68             DbTransaction t = BeginTransaction(db);\r
69 \r
70             try\r
71             {\r
72                 var orderDetails =\r
73                     from o in db.OrderDetails\r
74                     where o.Order.CustomerID == "WARTH"\r
75                     select o;\r
76 \r
77                 var order =\r
78                     (from o in db.Orders\r
79                      where o.CustomerID == "WARTH"\r
80                      select o).FirstOrDefault();\r
81 \r
82                 if (!orderDetails.Any() || order == null)\r
83                     Assert.Ignore("Preconditions");\r
84 \r
85                 db.OrderDetails.DeleteAllOnSubmit(orderDetails); //formerly Remove(od);\r
86 \r
87                 db.Orders.DeleteOnSubmit(order); //formerly Remove(order);\r
88                 db.SubmitChanges();\r
89 \r
90                 Assert.IsFalse(\r
91                     db.OrderDetails.Any(od => od.Order.Customer.CustomerID == "WARTH" && od.Order.EmployeeID == 3));\r
92                 Assert.IsFalse(db.Orders.Any(ord => ord.OrderID == order.OrderID));\r
93             }\r
94             finally\r
95             {\r
96                 t.Rollback();\r
97             }\r
98         }\r
99 \r
100         private DbTransaction BeginTransaction(Northwind db)\r
101         {\r
102             db.Connection.Open();\r
103             DbTransaction t = db.Connection.BeginTransaction();\r
104             db.Transaction = t;\r
105 \r
106             return t;\r
107         }\r
108 \r
109 #if !DEBUG && (SQLITE || (MSSQL && !L2SQL))\r
110         [Explicit]\r
111 #endif\r
112         [Test]\r
113         public void TransactionCheckAndRollbackInsert()\r
114         {\r
115             Northwind db = CreateDB();\r
116             DbTransaction t = BeginTransaction(db);\r
117 \r
118             var cust = new Customer();\r
119             int beforeCustomersCount = db.Customers.Count();\r
120 \r
121             string id = new object().GetHashCode().ToString().Substring(0, 5);\r
122             cust.CustomerID = id;\r
123             cust.Country = "Spain";\r
124             cust.CompanyName = "Coco";\r
125 \r
126             db.Customers.InsertOnSubmit(cust);\r
127             db.SubmitChanges();\r
128 \r
129             int afterCustomercount = db.Customers.Count();\r
130             Assert.IsTrue(beforeCustomersCount + 1 == afterCustomercount);\r
131 \r
132             t.Rollback();\r
133 \r
134             afterCustomercount = db.Customers.Count();\r
135             Assert.IsTrue(beforeCustomersCount == afterCustomercount);\r
136 \r
137             // The Count is correct.  However, DataContext doesn't know that the \r
138             // transaction was aborted, and will satisfy the following from\r
139             // an internal cache\r
140             var customer = db.Customers.FirstOrDefault(c => c.CustomerID == id);\r
141             Assert.IsNotNull(customer);\r
142 \r
143             // Let's let DataContext know that it doesn't exist anymore.\r
144             db.Customers.DeleteOnSubmit(customer);\r
145             db.SubmitChanges(); // Note no exception from deleting a non-existent entity\r
146 \r
147             customer = db.Customers.FirstOrDefault(c => c.CustomerID == id);\r
148             Assert.IsNull(customer);\r
149         }\r
150     }\r
151 }\r