using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Vitorm.MsTest.CommonTest { public abstract partial class UserTest where User : UserBase, new() { public virtual void WaitForUpdate() { } public abstract User NewUser(int id, bool forAdd = false); public virtual List NewUsers(int startId, int count = 1, bool forAdd = false) { return Enumerable.Range(startId, count).Select(id => NewUser(id, forAdd)).ToList(); } public void Test_DbContext() { #region #0 get DbContext and entityDescriptor { using var dbContext = Data.DataProvider()?.CreateDbContext(); var entityDescriptor = dbContext.GetEntityDescriptor(typeof(User)); Assert.IsNotNull(entityDescriptor); } #endregion } public void Test_Transaction() { #region #0 Transaction { using var dbContext = Data.DataProvider()?.CreateSqlDbContext(); Assert.AreEqual("u400", dbContext.Get(4).name); using (var tran1 = dbContext.BeginTransaction()) { dbContext.Update(new User { id = 4, name = "u4001" }); Assert.AreEqual("u4001", dbContext.Get(4).name); using (var tran2 = dbContext.BeginTransaction()) { dbContext.Update(new User { id = 4, name = "u4002" }); Assert.AreEqual("u4002", dbContext.Get(4).name); var userSet = dbContext.DbSet(); Assert.AreEqual("u4002", userSet.Get(4).name); } Assert.AreEqual("u4001", dbContext.Get(4).name); using (var tran2 = dbContext.BeginTransaction()) { dbContext.Update(new User { id = 4, name = "u4002" }); Assert.AreEqual("u4002", dbContext.Get(4).name); tran2.Rollback(); } Assert.AreEqual("u4001", dbContext.Get(4).name); using (var tran2 = dbContext.BeginTransaction()) { dbContext.Update(new User { id = 4, name = "u4003" }); Assert.AreEqual("u4003", dbContext.Get(4).name); tran2.Commit(); } Assert.AreEqual("u4003", dbContext.Get(4).name); //Assert.AreEqual("u400", Data.Get(4).name); } Assert.AreEqual("u400", dbContext.Get(4).name); } #endregion } public void Test_Get() { #region Get { var user = Data.Get(1); Assert.AreEqual(1, user?.id); } #endregion } public void Test_Query() { #region Query { var userList = Data.Query().Where(u => u.id == 1).ToList(); Assert.AreEqual(1, userList.Count); Assert.AreEqual(1, userList.First().id); } #endregion } public void Test_QueryJoin() { #region Query { var query = from user in Data.Query() from father in Data.Query().Where(father => user.fatherId == father.id) where user.id > 2 select new { user, father }; var userList = query.ToList(); Assert.AreEqual(1, userList.Count); Assert.AreEqual(3, userList.First().user.id); Assert.AreEqual(5, userList.First().father.id); } #endregion } public void Test_ToExecuteString() { #region ToExecuteString { var query = Data.Query().Where(u => u.id == 1); var sql = query.ToExecuteString(); Assert.IsNotNull(sql); } #endregion } public void Test_ExecuteUpdate() { #region ExecuteUpdate { var query = Data.Query(); var count = query.ExecuteUpdate(row => new User { name = "u_" + row.id + "_" + (row.fatherId.ToString() ?? "") + "_" + (row.motherId.ToString() ?? ""), birth = DateTime.Parse("2021-01-11 00:00:00") }); Assert.AreEqual(6, count); WaitForUpdate(); var userList = query.ToList(); Assert.AreEqual("u_1_4_6", userList.First().name); Assert.AreEqual(DateTime.Parse("2021-01-11 00:00:00"), userList.First().birth); Assert.AreEqual("u_6__", userList.Last().name); } #endregion } public void Test_ExecuteDelete() { #region ExecuteDelete { var query = Data.Query(); var count = query.Where(u => u.id == 6).ExecuteDelete(); //Assert.AreEqual(1, count); WaitForUpdate(); var userList = query.ToList(); Assert.AreEqual(5, userList.Count()); } #endregion } public void Test_Create() { #region Create : Add AddRange { var newUserList = NewUsers(7, 4, forAdd: true); // #1 Add Data.Add(newUserList[0]); // #2 AddRange Data.AddRange(newUserList.Skip(1)); WaitForUpdate(); // assert { var userList = Data.Query().Where(user => user.id >= 7).ToList(); Assert.AreEqual(newUserList.Count, userList.Count()); Assert.AreEqual(0, userList.Select(m => m.id).Except(newUserList.Select(m => m.id)).Count()); Assert.AreEqual(0, userList.Select(m => m.name).Except(newUserList.Select(m => m.name)).Count()); } } #endregion } public void Test_Update() { #region Update: Update UpdateRange { var ids = Data.Query().OrderBy(u => u.id).Select(u => u.id).ToArray()[^2..]; var newUserList = ids.Select(id => NewUser(id)).Append(NewUser(ids.Last() + 1)).ToList(); // Update { var rowCount = Data.Update(newUserList[0]); Assert.AreEqual(1, rowCount); } // UpdateRange { var rowCount = Data.UpdateRange(newUserList.Skip(1)); Assert.AreEqual(1, rowCount); } WaitForUpdate(); // assert { var userList = Data.Query().Where(m => ids.Contains(m.id)).ToList(); Assert.AreEqual(2, userList.Count()); Assert.AreEqual(0, userList.Select(m => m.id).Except(newUserList.Select(m => m.id)).Count()); Assert.AreEqual(0, userList.Select(m => m.name).Except(newUserList.Select(m => m.name)).Count()); } } #endregion } public void Test_Delete() { #region Delete : Delete DeleteRange DeleteByKey DeleteByKeys { // #1 Delete { var rowCount = Data.Delete(NewUser(1)); //Assert.AreEqual(1, rowCount); } // #2 DeleteRange { var rowCount = Data.DeleteRange(NewUsers(2, 2)); //Assert.AreEqual(2, rowCount); } // #3 DeleteByKey { using var dbContext = Data.DataProvider()?.CreateDbContext(); var entityDescriptor = dbContext.GetEntityDescriptor(typeof(User)); var key = entityDescriptor.key; var user = NewUser(4); var keyValue = key.GetValue(user); var rowCount = Data.DeleteByKey(keyValue); //Assert.AreEqual(1, rowCount); } // assert { WaitForUpdate(); var userList = Data.Query().Where(u => u.id <= 4).ToList(); Assert.AreEqual(0, userList.Count()); } // #4 DeleteByKeys { using var dbContext = Data.DataProvider()?.CreateDbContext(); var entityDescriptor = dbContext.GetEntityDescriptor(typeof(User)); var key = entityDescriptor.key; var users = Data.Query().ToList(); var keyValues = users.Select(user => key.GetValue(user)); var rowCount = Data.DeleteByKeys(keyValues); //Assert.AreEqual(users.Count, rowCount); } // assert { WaitForUpdate(); var userList = Data.Query().ToList(); Assert.AreEqual(0, userList.Count()); } } #endregion } public void Test_Truncate() { Data.Truncate(); } } }