diff UnitTests/Linq/UpdateTest.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/UpdateTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,545 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+using Data.Linq;
+using Data.Linq.Model;
+
+#region ReSharper disable
+// ReSharper disable ConvertToConstant.Local
+#endregion
+
+namespace Update
+{
+	[TestFixture]
+	public class UpdateTest : TestBase
+	{
+		[Test]
+		public void Update1()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					var parent = new Parent1 { ParentID = 1001, Value1 = 1001 };
+
+					db.Parent.Delete(p => p.ParentID > 1000);
+					db.Insert(parent);
+
+					Assert.AreEqual(1, db.Parent.Count (p => p.ParentID == parent.ParentID));
+					Assert.AreEqual(1, db.Parent.Update(p => p.ParentID == parent.ParentID, p => new Parent { ParentID = p.ParentID + 1 }));
+					Assert.AreEqual(1, db.Parent.Count (p => p.ParentID == parent.ParentID + 1));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Update2()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					var parent = new Parent1 { ParentID = 1001, Value1 = 1001 };
+
+					db.Parent.Delete(p => p.ParentID > 1000);
+					db.Insert(parent);
+
+					Assert.AreEqual(1, db.Parent.Count(p => p.ParentID == parent.ParentID));
+					Assert.AreEqual(1, db.Parent.Where(p => p.ParentID == parent.ParentID).Update(p => new Parent { ParentID = p.ParentID + 1 }));
+					Assert.AreEqual(1, db.Parent.Count(p => p.ParentID == parent.ParentID + 1));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Update3()
+		{
+			ForEachProvider(new[] { ProviderName.Informix }, db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child.Delete(c => c.ChildID > 1000);
+					db.Child.Insert(() => new Child { ParentID = 1, ChildID = id});
+
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id));
+					Assert.AreEqual(1, db.Child.Where(c => c.ChildID == id && c.Parent.Value1 == 1).Update(c => new Child { ChildID = c.ChildID + 1 }));
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id + 1));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Update4()
+		{
+			ForEachProvider(new[] { ProviderName.Informix }, db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child.Delete(c => c.ChildID > 1000);
+					db.Child.Insert(() => new Child { ParentID = 1, ChildID = id});
+
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id));
+					Assert.AreEqual(1,
+						db.Child
+							.Where(c => c.ChildID == id && c.Parent.Value1 == 1)
+								.Set(c => c.ChildID, c => c.ChildID + 1)
+							.Update());
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id + 1));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Update5()
+		{
+			ForEachProvider(new[] { ProviderName.Informix }, db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child.Delete(c => c.ChildID > 1000);
+					db.Child.Insert(() => new Child { ParentID = 1, ChildID = id});
+
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id));
+					Assert.AreEqual(1,
+						db.Child
+							.Where(c => c.ChildID == id && c.Parent.Value1 == 1)
+								.Set(c => c.ChildID, () => id + 1)
+							.Update());
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id + 1));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Update6()
+		{
+			ForEachProvider(new[] { ProviderName.Informix }, db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Parent4.Delete(p => p.ParentID > 1000);
+					db.Insert(new Parent4 { ParentID = id, Value1 = TypeValue.Value1 });
+
+					Assert.AreEqual(1, db.Parent4.Count(p => p.ParentID == id && p.Value1 == TypeValue.Value1));
+					Assert.AreEqual(1,
+						db.Parent4
+							.Where(p => p.ParentID == id)
+								.Set(p => p.Value1, () => TypeValue.Value2)
+							.Update());
+					Assert.AreEqual(1, db.Parent4.Count(p => p.ParentID == id && p.Value1 == TypeValue.Value2));
+				}
+				finally
+				{
+					db.Parent4.Delete(p => p.ParentID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Update7()
+		{
+			ForEachProvider(new[] { ProviderName.Informix }, db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Parent4.Delete(p => p.ParentID > 1000);
+					db.Insert(new Parent4 { ParentID = id, Value1 = TypeValue.Value1 });
+
+					Assert.AreEqual(1, db.Parent4.Count(p => p.ParentID == id && p.Value1 == TypeValue.Value1));
+					Assert.AreEqual(1,
+						db.Parent4
+							.Where(p => p.ParentID == id)
+								.Set(p => p.Value1, TypeValue.Value2)
+							.Update());
+					Assert.AreEqual(1, db.Parent4.Count(p => p.ParentID == id && p.Value1 == TypeValue.Value2));
+
+					Assert.AreEqual(1,
+						db.Parent4
+							.Where(p => p.ParentID == id)
+								.Set(p => p.Value1, TypeValue.Value3)
+							.Update());
+					Assert.AreEqual(1, db.Parent4.Count(p => p.ParentID == id && p.Value1 == TypeValue.Value3));
+				}
+				finally
+				{
+					db.Parent4.Delete(p => p.ParentID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Update8()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					var parent = new Parent1 { ParentID = 1001, Value1 = 1001 };
+
+					db.Parent.Delete(p => p.ParentID > 1000);
+					db.Insert(parent);
+
+					parent.Value1++;
+
+					db.Update(parent);
+
+					Assert.AreEqual(1002, db.Parent.Single(p => p.ParentID == parent.ParentID).Value1);
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Update9()
+		{
+			ForEachProvider(new[] { ProviderName.Informix, ProviderName.SqlCe, ProviderName.DB2, ProviderName.Firebird, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access }, db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child.Delete(c => c.ChildID > 1000);
+					db.Child.Insert(() => new Child { ParentID = 1, ChildID = id});
+
+					var q =
+						from c in db.Child
+						join p in db.Parent on c.ParentID equals p.ParentID
+						where c.ChildID == id && c.Parent.Value1 == 1
+						select new { c, p };
+
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id));
+					Assert.AreEqual(1, q.Update(db.Child, _ => new Child { ChildID = _.c.ChildID + 1, ParentID = _.p.ParentID }));
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id + 1));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Update10()
+		{
+			ForEachProvider(new[] { ProviderName.Informix, ProviderName.SqlCe, ProviderName.DB2, ProviderName.Firebird, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access }, db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child.Delete(c => c.ChildID > 1000);
+					db.Child.Insert(() => new Child { ParentID = 1, ChildID = id});
+
+					var q =
+						from p in db.Parent
+						join c in db.Child on p.ParentID equals c.ParentID
+						where c.ChildID == id && c.Parent.Value1 == 1
+						select new { c, p };
+
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id));
+					Assert.AreEqual(1, q.Update(db.Child, _ => new Child { ChildID = _.c.ChildID + 1, ParentID = _.p.ParentID }));
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id + 1));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		//[Test]
+		public void Update11()
+		{
+			ForEachProvider(db =>
+			{
+				var q = db.GetTable<LinqDataTypes2>().Union(db.GetTable<LinqDataTypes2>());
+
+				//db.GetTable<LinqDataTypes2>().Update(_ => q.Contains(_), _ => new LinqDataTypes2 { GuidValue = _.GuidValue });
+
+				q.Update(_ => new LinqDataTypes2 { GuidValue = _.GuidValue });
+			});
+		}
+
+		[Test]
+		public void UpdateAssociation1([DataContexts(ProviderName.Sybase, ProviderName.Informix)] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				const int childId  = 10000;
+				const int parentId = 20000;
+
+				try
+				{
+					db.Child. Delete(x => x.ChildID  == childId);
+					db.Parent.Delete(x => x.ParentID == parentId);
+
+					db.Parent.Insert(() => new Parent { ParentID = parentId, Value1 = parentId });
+					db.Child. Insert(() => new Child  { ChildID = childId, ParentID = parentId });
+
+					var parents =
+						from child in db.Child
+						where child.ChildID == childId
+						select child.Parent;
+
+					Assert.AreEqual(1, parents.Update(db.Parent, x => new Parent { Value1 = 5 }));
+				}
+				finally
+				{
+					db.Child. Delete(x => x.ChildID  == childId);
+					db.Parent.Delete(x => x.ParentID == parentId);
+				}
+			}
+		}
+
+		[Test]
+		public void UpdateAssociation2([DataContexts(ProviderName.Sybase, ProviderName.Informix)] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				const int childId  = 10000;
+				const int parentId = 20000;
+
+				try
+				{
+					db.Child. Delete(x => x.ChildID  == childId);
+					db.Parent.Delete(x => x.ParentID == parentId);
+
+					db.Parent.Insert(() => new Parent { ParentID = parentId, Value1 = parentId });
+					db.Child. Insert(() => new Child  { ChildID = childId, ParentID = parentId });
+
+					var parents =
+						from child in db.Child
+						where child.ChildID == childId
+						select child.Parent;
+
+					Assert.AreEqual(1, parents.Update(x => new Parent { Value1 = 5 }));
+				}
+				finally
+				{
+					db.Child. Delete(x => x.ChildID  == childId);
+					db.Parent.Delete(x => x.ParentID == parentId);
+				}
+			}
+		}
+
+		[Test]
+		public void UpdateAssociation3([DataContexts(ProviderName.Sybase, ProviderName.Informix)] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				const int childId  = 10000;
+				const int parentId = 20000;
+
+				try
+				{
+					db.Child. Delete(x => x.ChildID  == childId);
+					db.Parent.Delete(x => x.ParentID == parentId);
+
+					db.Parent.Insert(() => new Parent { ParentID = parentId, Value1 = parentId });
+					db.Child. Insert(() => new Child  { ChildID = childId, ParentID = parentId });
+
+					var parents =
+						from child in db.Child
+						where child.ChildID == childId
+						select child.Parent;
+
+					Assert.AreEqual(1, parents.Update(x => x.ParentID > 0, x => new Parent { Value1 = 5 }));
+				}
+				finally
+				{
+					db.Child. Delete(x => x.ChildID  == childId);
+					db.Parent.Delete(x => x.ParentID == parentId);
+				}
+			}
+		}
+
+		[Test]
+		public void UpdateAssociation4([DataContexts(ProviderName.Sybase, ProviderName.Informix)] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				const int childId  = 10000;
+				const int parentId = 20000;
+
+				try
+				{
+					db.Child. Delete(x => x.ChildID  == childId);
+					db.Parent.Delete(x => x.ParentID == parentId);
+
+					db.Parent.Insert(() => new Parent { ParentID = parentId, Value1 = parentId });
+					db.Child. Insert(() => new Child  { ChildID = childId, ParentID = parentId });
+
+					var parents =
+						from child in db.Child
+						where child.ChildID == childId
+						select child.Parent;
+
+					Assert.AreEqual(1, parents.Set(x => x.Value1, 5).Update());
+				}
+				finally
+				{
+					db.Child. Delete(x => x.ChildID  == childId);
+					db.Parent.Delete(x => x.ParentID == parentId);
+				}
+			}
+		}
+
+		static readonly Func<TestDbManager,int,string,int> _updateQuery =
+			CompiledQuery.Compile   <TestDbManager,int,string,int>((ctx,key,value) =>
+				ctx.Person
+					.Where(_ => _.ID == key)
+					.Set(_ => _.FirstName, value)
+					.Update());
+
+		[Test]
+		public void CompiledUpdate()
+		{
+			using (var ctx = new TestDbManager())
+			{
+				_updateQuery(ctx, 12345, "54321");
+			}
+		}
+
+		[TableName("LinqDataTypes")]
+		class Table1
+		{
+			public int  ID;
+			public bool BoolValue;
+
+			[Association(ThisKey = "ID", OtherKey = "ParentID", CanBeNull = false)]
+			public List<Table2> Tables2;
+		}
+
+		[TableName("Parent")]
+		class Table2
+		{
+			public int  ParentID;
+			public bool Value1;
+
+			[Association(ThisKey = "ParentID", OtherKey = "ID", CanBeNull = false)]
+			public Table1 Table1;
+		}
+
+		[Test]
+		public void UpdateAssociation5([DataContexts(
+			ProviderName.Access, ProviderName.DB2, ProviderName.Firebird, ProviderName.Informix, "Oracle", ProviderName.PostgreSQL, ProviderName.SqlCe, ProviderName.SQLite,
+			ExcludeLinqService=true)] string context)
+		{
+			using (var db = new DbManager(context))
+			{
+				var ids = new[] { 10000, 20000 };
+
+				db.GetTable<Table2>()
+					.Where (x => ids.Contains(x.ParentID))
+					.Select(x => x.Table1)
+					.Distinct()
+					.Set(y => y.BoolValue, y => y.Tables2.All(x => x.Value1))
+					.Update();
+
+				var idx = db.LastQuery.IndexOf("INNER JOIN");
+
+				Assert.That(idx, Is.Not.EqualTo(-1));
+
+				idx = db.LastQuery.IndexOf("INNER JOIN", idx + 1);
+
+				Assert.That(idx, Is.EqualTo(-1));
+			}
+		}
+
+		[Test]
+		public void AsUpdatableTest([DataContexts(ProviderName.Informix)] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child.Delete(c => c.ChildID > 1000);
+					db.Child.Insert(() => new Child { ParentID = 1, ChildID = id});
+
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id));
+
+					var q  = db.Child.Where(c => c.ChildID == id && c.Parent.Value1 == 1);
+					var uq = q.AsUpdatable();
+
+					uq = uq.Set(c => c.ChildID, c => c.ChildID + 1);
+
+					Assert.AreEqual(1, uq.Update());
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id + 1));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			}
+		}
+
+		[TableName("GrandChild")]
+		class Table3
+		{
+			[PrimaryKey(1)] public int? ParentID;
+			[PrimaryKey(2)] public int? ChildID;
+			                public int? GrandChildID;
+		}
+
+		[Test]
+		public void UpdateNullablePrimaryKey([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				db.Update(new Table3 { ParentID = 10000, ChildID = null, GrandChildID = 1000 });
+
+				if (db is DbManager)
+					Assert.IsTrue(((DbManager)db).LastQuery.Contains("IS NULL"));
+
+				db.Update(new Table3 { ParentID = 10000, ChildID = 111, GrandChildID = 1000 });
+
+				if (db is DbManager)
+					Assert.IsFalse(((DbManager)db).LastQuery.Contains("IS NULL"));
+			}
+		}
+	}
+}