Mercurial > pub > bltoolkit
diff UnitTests/CS/DataAccess/SqlTest.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/CS/DataAccess/SqlTest.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,235 @@ +using System; + +using NUnit.Framework; + +using BLToolkit.Data; +using BLToolkit.Data.DataProvider; +using BLToolkit.DataAccess; +using BLToolkit.Mapping; +using System.Linq; + +namespace DataAccess +{ + [TestFixture] + public class SqlTest + { + public class Name + { + public string LastName; + public string FirstName; + public string MiddleName; + } + + public class Person + { + [MapField("PersonID"), PrimaryKey] + public int ID; + [MapField(Format="{0}")] + public Name Name = new Name(); + + [SqlIgnore] + public string Gender; + } + + [Test] + public void Test() + { + var da = new SqlQuery(); + var p = (Person)da.SelectByKey(typeof(Person), 1); + + Assert.AreEqual("Pupkin", p.Name.LastName); + } + + [Test] + public void GetFieldListTest() + { + var da = new SqlQuery(); + + using (var db = new DbManager()) + { + var info = da.GetSqlQueryInfo(db, typeof (Person), "SelectAll"); + + Console.WriteLine(info.QueryText); + Assert.That(info.QueryText.Contains("\t" + db.DataProvider.Convert("PersonID", ConvertType.NameToQueryField))); + Assert.That(info.QueryText.Contains("\t" + db.DataProvider.Convert("LastName", ConvertType.NameToQueryField))); + Assert.That(info.QueryText, Is.Not.Contains("\t" + db.DataProvider.Convert("Name", ConvertType.NameToQueryField))); + } + } + + [MapField("InnerId", "InnerObject.Id")] + public class TestObject + { + public int Id; + public TestObject InnerObject; + } + + [Test] + public void RecursiveTest() + { + var query = new SqlQuery<TestObject>(); + var info = query.GetSqlQueryInfo(new DbManager(), "SelectAll"); + + Console.WriteLine(info.QueryText); + Assert.That(info.QueryText.Contains("InnerId")); + Assert.That(info.QueryText, Is.Not.Contains("InnerObject")); + } + + [Test] + public void SqlIgnoreAttributeTest() + { + var da = new SqlQuery(); + var p = (Person)da.SelectByKey(typeof(Person), 1); + + Assert.IsNull(p.Gender); + } + + public class TestCategory + { + [PrimaryKey, NonUpdatable] + public int Id; + public string Name; + } + + [MapField("CategoryId", "Category.Id")] + public class TestObject2 + { + [PrimaryKey, NonUpdatable] + public int Id; + public TestCategory Category; + } + + [Test] + public void NonUpdatableTest() + { + var da = new SqlQuery(); + + using (var db = new DbManager()) + { + var update = da.GetSqlQueryInfo<TestCategory>(db, "Update"); + var insert = da.GetSqlQueryInfo<TestCategory>(db, "Insert"); + + Assert.That(update.QueryText, Is.Not.Contains( + "\t" + db.DataProvider.Convert("Id", ConvertType.NameToQueryField) + " = " + db.DataProvider.Convert("Id", db.GetConvertTypeToParameter()) + "\n"), + "Update"); + Assert.That(insert.QueryText, Is.Not.Contains("Id"), "Insert"); + } + } + + [Test] + public void ComplexMapperNonUpdatableTest() + { + var da = new SqlQuery(); + + using (var db = new DbManager()) + { + var update = da.GetSqlQueryInfo<TestObject2>(db, "Update"); + var insert = da.GetSqlQueryInfo<TestObject2>(db, "Insert"); + + Assert.That(update.QueryText.Contains("CategoryId"), "Update"); + Assert.That(insert.QueryText.Contains("CategoryId"), "Insert"); + } + } + + [TableName("DataTypeTest")] + class UpdateTest + { + [PrimaryKey] public Guid Guid_; + + public UpdateTest(Guid guid) + { + Guid_ = guid; + } + } + + [Test, ExpectedException(typeof(DataAccessException))] + public void UpdateGuid() + { + new SqlQuery<UpdateTest>().Update(new UpdateTest(Guid.NewGuid())); + } + + [TableName("Person")] + public class Person1 + { + [Identity, PrimaryKey] public int PersonID; + public string FirstName; + public string LastName; + [NonUpdatable(OnInsert=false)] public string MiddleName; + public char Gender; + } + + [Test] + public void NonUpdatableOnUpdate() + { + using (var db = new DbManager()) + { + db.BeginTransaction(); + + var person = new Person1 + { + FirstName = "TestOnInsert", + LastName = "", + MiddleName = "1", + Gender = 'M' + }; + + var sqlQuery = new SqlQuery<Person1>(); + + sqlQuery.Insert(db, person); + + var p = db.GetTable<Person1>().Single(_ => _.FirstName == "TestOnInsert"); + + Assert.AreEqual(person.MiddleName, p.MiddleName); + + person.PersonID = p.PersonID; + person.MiddleName = "should not be updated"; + + sqlQuery.Update(db, person); + + p = db.GetTable<Person1>().Single(_ => _.FirstName == "TestOnInsert"); + + Assert.AreNotEqual(person.MiddleName, p.MiddleName); + + db.RollbackTransaction(); + } + } + + [TableName("Person")] + [Identity(FieldName = "PersonID")] + [NonUpdatable(OnInsert = false, FieldName = "MiddleName")] + public class Person2 + { + [PrimaryKey] public int PersonID; + [NonUpdatable(OnUpdate = false)] public string FirstName; + public string MiddleName; + public string Gender; + } + + [Test] + public void NonUpdatableOnClass() + { + var da = new SqlQuery(); + + using (var db = new DbManager()) + { + var update = da.GetSqlQueryInfo<Person2>(db, "Update"); + var insert = da.GetSqlQueryInfo<Person2>(db, "Insert"); + + var personID = "\t" + db.DataProvider.Convert("PersonID", ConvertType.NameToQueryField).ToString(); + var middleName = "\t" + db.DataProvider.Convert("MiddleName", ConvertType.NameToQueryField).ToString(); + var firstName = "\t" + db.DataProvider.Convert("FirstName", ConvertType.NameToQueryField).ToString(); + + var personID_P = " = " + db.DataProvider.Convert("PersonID_P", ConvertType.NameToQueryParameter).ToString(); + var middleName_P = " = " + db.DataProvider.Convert("MiddleName_P", ConvertType.NameToQueryParameter).ToString(); + var firstName_P = " = " + db.DataProvider.Convert("FirstName_P", ConvertType.NameToQueryParameter).ToString(); + + Assert.That(update.QueryText, Is.Not.Contains(personID + personID_P), "personId\n" + update.QueryText); + Assert.That(update.QueryText, Is.Not.Contains(middleName + middleName_P), "middleName\n" + update.QueryText); + Assert.That(update.QueryText.Contains(firstName + firstName_P), "firstName\n" + update.QueryText); + + Assert.That(insert.QueryText, Is.Not.Contains(personID), "personId\n" + insert.QueryText); + Assert.That(insert.QueryText, Is.Not.Contains(firstName), "firstName\n" + insert.QueryText); + Assert.That(insert.QueryText.Contains(middleName), "middleName\n" + insert.QueryText); + } + } + } +}