Add Quest UnitTest

This commit is contained in:
dailyccc 2023-02-21 09:38:45 +08:00
parent 32795da9f4
commit 3eb03ef00a
11 changed files with 680 additions and 0 deletions

View File

@ -0,0 +1,213 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FreeSql.Tests.QuestDb.QuestDbTestModel;
using FreeSql.Tests.QuestDb.Utils;
using Xunit;
using static FreeSql.Tests.QuestDb.QuestDbTest;
namespace FreeSql.Tests.QuestDb.Crud
{
[TestCaseOrderer("FreeSql.Tests.QuestDb.Utils.TestOrders", "FreeSql.Tests")]
public class QuestDbTestInsertAndUpdate
{
[Fact,Order(1)]
public async Task TestInsertAsync()
{
var result = await fsql.Insert(new QuestDb_Model_Test01()
{
Primarys = Guid.NewGuid().ToString(),
CreateTime = DateTime.Now,
Activos = 100.21,
Id = "IdAsync",
IsCompra = true,
NameInsert = "NameInsert",
NameUpdate = "NameUpdate"
}).ExecuteAffrowsAsync();
Assert.True(result > 0);
}
[Fact, Order(2)]
public async Task TestInsertBatchAsync()
{
var list = new List<QuestDb_Model_Test01>()
{
new QuestDb_Model_Test01()
{
Primarys = Guid.NewGuid().ToString(),
CreateTime = DateTime.Now,
Activos = 100.21,
Id = "1",
IsCompra = true,
NameInsert = "NameInsertAsync",
NameUpdate = "NameUpdate"
},
new QuestDb_Model_Test01()
{
Primarys = Guid.NewGuid().ToString(),
CreateTime = DateTime.Now,
Activos = 100.21,
Id = "2",
IsCompra = true,
NameInsert = "NameInsertAsync",
NameUpdate = "NameUpdate"
},
new QuestDb_Model_Test01()
{
Primarys = Guid.NewGuid().ToString(),
CreateTime = DateTime.Now,
Activos = 100.21,
Id = "3",
IsCompra = true,
NameInsert = "NameInsertAsync",
NameUpdate = "NameUpdate"
},
};
var result = await fsql.Insert(list).ExecuteAffrowsAsync();
Assert.True(result > 0);
}
[Fact, Order(3)]
public async Task TestInsertInsertColumnsAsync()
{
var list = new List<QuestDb_Model_Test01>()
{
new QuestDb_Model_Test01()
{
Primarys = Guid.NewGuid().ToString(),
CreateTime = DateTime.Now,
Activos = 100.21,
Id = "1",
IsCompra = true,
NameInsert = "NameInsert",
NameUpdate = "NameUpdate"
},
new QuestDb_Model_Test01()
{
Primarys = Guid.NewGuid().ToString(),
CreateTime = DateTime.Now,
Activos = 100.21,
Id = "2",
IsCompra = true,
NameInsert = "NameInsert",
NameUpdate = "NameUpdate"
},
new QuestDb_Model_Test01()
{
Primarys = Guid.NewGuid().ToString(),
CreateTime = DateTime.Now,
Activos = 100.21,
Id = "3",
IsCompra = true,
NameInsert = "NameInsert",
NameUpdate = "NameUpdate"
},
};
var result = await fsql.Insert(list).IgnoreColumns(q => q.NameInsert).ExecuteAffrowsAsync();
Assert.True(result > 0);
}
[Fact, Order(4)]
public void TestNormalUpdate()
{
var updateTime = DateTime.Now;
var updateObj = fsql.Update<QuestDb_Model_Test01>()
.Set(q => q.NameUpdate, "UpdateNow")
// .Set(q => q.CreateTime, DateTime.Now) 分表的时间不可以随便改
.Where(q => q.Id == "1");
var updateSql = updateObj.ToSql();
Debug.WriteLine(updateSql);
var sql =
$@"UPDATE ""QuestDb_Model_Test01"" SET ""NameUpdate"" = 'UpdateNow'
WHERE (""Id"" = '1')";
Debug.WriteLine(sql);
Assert.Equal(updateSql, sql);
var result = updateObj.ExecuteAffrows();
Assert.True(result > 0);
}
[Fact, Order(5)]
public void TestUpdateByModel()
{
var primary = Guid.NewGuid().ToString();
//先插入
fsql.Insert(new QuestDb_Model_Test01()
{
Primarys = primary,
CreateTime = DateTime.Now,
Activos = 100.21,
Id = primary,
IsCompra = true,
NameInsert = "NameInsert",
NameUpdate = "NameUpdate"
}).ExecuteAffrows();
var updateModel = new QuestDb_Model_Test01
{
Primarys = primary,
Id = primary,
Activos = 12.65,
};
var updateObj = fsql.Update<QuestDb_Model_Test01>().SetSourceIgnore(updateModel, o => o == null);
var sql = updateObj.ToSql();
Debug.WriteLine(sql);
var result = updateObj.ExecuteAffrows();
var resultAsync = fsql.Update<QuestDb_Model_Test01>().SetSourceIgnore(updateModel, o => o == null)
.ExecuteAffrows();
Assert.True(result > 0);
Assert.True(resultAsync > 0);
Assert.Equal(
@$"UPDATE ""QuestDb_Model_Test01"" SET ""Primarys"" = '{primary}', ""NameInsert"" = 'NameDefault', ""Activos"" = 12.65
WHERE (""Id"" = '{primary}')", sql);
}
[Fact, Order(6)]
public async Task TestUpdateIgnoreColumnsAsync()
{
var primary = Guid.NewGuid().ToString();
var updateTime = DateTime.Now;
//先插入
fsql.Insert(new QuestDb_Model_Test01()
{
Primarys = primary,
CreateTime = DateTime.Now,
Activos = 100.21,
Id = primary,
IsCompra = true,
NameInsert = "NameInsert",
NameUpdate = "NameUpdate"
}).ExecuteAffrows();
var updateModel = new QuestDb_Model_Test01
{
Id = primary,
Activos = 12.65,
IsCompra = true,
CreateTime = DateTime.Now
};
var updateObj = fsql.Update<QuestDb_Model_Test01>().SetSource(updateModel)
.IgnoreColumns(q => new { q.Id, q.CreateTime });
var sql = updateObj.ToSql();
Debug.WriteLine(sql);
var result = updateObj.ExecuteAffrows();
var resultAsync = await fsql.Update<QuestDb_Model_Test01>().SetSource(updateModel)
.IgnoreColumns(q => new { q.Id, q.CreateTime }).ExecuteAffrowsAsync();
Assert.True(result > 0);
Assert.True(resultAsync > 0);
Assert.Equal(
$@"UPDATE ""QuestDb_Model_Test01"" SET ""Primarys"" = NULL, ""NameUpdate"" = NULL, ""NameInsert"" = 'NameDefault', ""Activos"" = 12.65, ""UpdateTime"" = NULL, ""IsCompra"" = True
WHERE (""Id"" = '{primary}')", sql);
}
[Fact, Order(7)]
public async Task TestUpdateToUpdateAsync()
{
//官网demo有问题暂时放弃此功能
var result = await fsql.Select<QuestDb_Model_Test01>().Where(q => q.Id == "IdAsync" && q.NameInsert == null)
.ToUpdate()
.Set(q => q.UpdateTime, DateTime.Now)
.ExecuteAffrowsAsync();
}
}
}

View File

@ -0,0 +1,184 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FreeSql.DataAnnotations;
using FreeSql.Tests.QuestDb.QuestDbTestModel;
using NetTopologySuite.Operation.Valid;
using Xunit;
using static FreeSql.Tests.QuestDb.QuestDbTest;
namespace FreeSql.Tests.QuestDb.Crud
{
public class QuestDbTestSelect
{
[Fact]
public void TestNormal()
{
var sql = fsql.Select<QuestDb_Model_Test01>().ToSql();
Debug.WriteLine(sql);
Assert.Equal(
@"SELECT a.""Primarys"", a.""Id"", a.""NameUpdate"", a.""NameInsert"", a.""Activos"", a.""CreateTime"", a.""UpdateTime"", a.""IsCompra""
FROM ""QuestDb_Model_Test01"" a", sql);
var sqlWhere = fsql.Select<QuestDb_Model_Test01>().Where(q =>
q.UpdateTime.Value.BetweenEnd(DateTime.Parse("2023-02-17 09:35:00"),
DateTime.Parse("2023-02-17 10:20:00"))).ToSql();
Debug.WriteLine(sqlWhere);
Assert.Equal(
@"SELECT a.""Primarys"", a.""Id"", a.""NameUpdate"", a.""NameInsert"", a.""Activos"", a.""CreateTime"", a.""UpdateTime"", a.""IsCompra""
FROM ""QuestDb_Model_Test01"" a
WHERE (a.""UpdateTime"" >= '2023-02-17 09:35:00.000000' and a.""UpdateTime"" < '2023-02-17 10:20:00.000000')",
sqlWhere);
}
[Theory]
[InlineData(1)]
[InlineData(2)]
[InlineData(3)]
public void TestPageAndCount(int page)
{
var pageSize = 5;
var select = fsql.Select<QuestDb_Model_Test01>().Count(out var total).Page(page, pageSize);
var sql = select.ToSql();
Debug.WriteLine(sql);
switch (page)
{
case 1:
Assert.Equal(
@"SELECT a.""Primarys"", a.""Id"", a.""NameUpdate"", a.""NameInsert"", a.""Activos"", a.""CreateTime"", a.""UpdateTime"", a.""IsCompra""
FROM ""QuestDb_Model_Test01"" a
limit 5", sql);
break;
case 2:
Assert.Equal(
@"SELECT a.""Primarys"", a.""Id"", a.""NameUpdate"", a.""NameInsert"", a.""Activos"", a.""CreateTime"", a.""UpdateTime"", a.""IsCompra""
FROM ""QuestDb_Model_Test01"" a
limit 5,10", sql);
break;
case 3:
Assert.Equal(
@"SELECT a.""Primarys"", a.""Id"", a.""NameUpdate"", a.""NameInsert"", a.""Activos"", a.""CreateTime"", a.""UpdateTime"", a.""IsCompra""
FROM ""QuestDb_Model_Test01"" a
limit 10,15", sql);
break;
}
}
[Fact]
public void TestNavigation()
{
var select = fsql.Select<Topic>()
.LeftJoin(a => a.Category.Id == a.CategoryId)
.LeftJoin(a => a.Category.Parent.Id == a.Category.ParentId)
.Where(a => a.Category.Parent.Id > 0);
var sql = select.ToSql();
select.ToList();
Debug.WriteLine(sql);
Assert.Equal(
@"SELECT a.""Id"", a.""Title"", a.""Clicks"", a.""CreateTime"", a.""CategoryId"", a__Category.""Id"" as6, a__Category.""Name"", a__Category.""ParentId""
FROM ""Topic"" a
LEFT JOIN ""Category"" a__Category ON a__Category.""Id"" = a.""CategoryId""
LEFT JOIN ""CategoryType"" a__Category__Parent ON a__Category__Parent.""Id"" = a__Category.""ParentId""
WHERE (a__Category__Parent.""Id"" > 0)", sql);
}
[Fact]
public void TestComplexJoin()
{
var select = fsql.Select<Topic, Category, CategoryType>()
.LeftJoin(w => w.t1.CategoryId == w.t2.Id)
.LeftJoin(w => w.t2.ParentId == w.t3.Id)
.Where(w => w.t3.Id > 0);
var sql = select.ToSql(w => new { w.t1, w.t2, w.t3 });
Debug.WriteLine(sql);
select.ToList(w => new { w.t1, w.t2, w.t3 });
Assert.Equal(
@"SELECT a.""Id"" as1, a.""Title"" as2, a.""Clicks"" as3, a.""CreateTime"" as4, a.""CategoryId"" as5, b.""Id"" as6, b.""Name"" as7, b.""ParentId"" as8, c.""Id"" as9, c.""Name"" as10
FROM ""Topic"" a
LEFT JOIN ""Category"" b ON a.""CategoryId"" = b.""Id""
LEFT JOIN ""CategoryType"" c ON b.""ParentId"" = c.""Id""
WHERE (c.""Id"" > 0)", sql);
}
[Fact]
public void TestUnionAll()
{
var select = fsql.Select<QuestDb_Model_Test01>().Where(a => a.IsCompra == true)
.UnionAll(
fsql.Select<QuestDb_Model_Test01>().Where(a => a.IsCompra == true),
fsql.Select<QuestDb_Model_Test01>().Where(a => a.IsCompra == true)
)
.Where(a => a.IsCompra == true);
var sql = select.ToSql();
Debug.WriteLine(sql);
select.ToList();
Assert.Equal(
@"SELECT a.""Primarys"", a.""Id"", a.""NameUpdate"", a.""NameInsert"", a.""Activos"", a.""CreateTime"", a.""UpdateTime"", a.""IsCompra""
FROM ( SELECT a.""Primarys"", a.""Id"", a.""NameUpdate"", a.""NameInsert"", a.""Activos"", a.""CreateTime"", a.""UpdateTime"", a.""IsCompra""
FROM ""QuestDb_Model_Test01"" a
WHERE (a.""IsCompra"" = True)
UNION ALL
SELECT a.""Primarys"", a.""Id"", a.""NameUpdate"", a.""NameInsert"", a.""Activos"", a.""CreateTime"", a.""UpdateTime"", a.""IsCompra""
FROM ""QuestDb_Model_Test01"" a
WHERE (a.""IsCompra"" = True)
UNION ALL
SELECT a.""Primarys"", a.""Id"", a.""NameUpdate"", a.""NameInsert"", a.""Activos"", a.""CreateTime"", a.""UpdateTime"", a.""IsCompra""
FROM ""QuestDb_Model_Test01"" a
WHERE (a.""IsCompra"" = True) ) a
WHERE (a.""IsCompra"" = True)", sql);
}
[Fact]
public void TestSampleBy()
{
var selectSql = fsql.Select<QuestDb_Model_Test01>()
.SampleBy(1, SampleUnits.d)
.WithTempQuery(q => new { q.Id, q.Activos, count = SqlExt.Count(q.Id).ToValue() })
.Where(q => q.Id != "1")
.ToSql();
Debug.WriteLine(selectSql);
var sql = @"SELECT *
FROM (
SELECT a.""Id"", a.""Activos"", count(a.""Id"") ""count""
FROM ""QuestDb_Model_Test01"" a
SAMPLE BY 1d
) a
WHERE (a.""Id"" <> '1')";
Assert.Equal(selectSql, sql);
}
[Fact]
public void TestLatestOn()
{
var selectSql = fsql.Select<QuestDb_Model_Test01>()
.LatestOn(q => q.CreateTime, q => new { q.Id, q.NameUpdate })
.ToSql();
Debug.WriteLine(selectSql);
var sql =
@"SELECT a.""Primarys"", a.""Id"", a.""NameUpdate"", a.""NameInsert"", a.""Activos"", a.""CreateTime"", a.""UpdateTime"", a.""IsCompra""
FROM ""QuestDb_Model_Test01"" a
LATEST ON CreateTime PARTITION BY Id,NameUpdate ";
Assert.Equal(selectSql, sql);
}
[Fact]
public void TestGroup()
{
//QUEDTDB的GroupBy PostgrSql有所不同
var selectSql = fsql.Select<QuestDb_Model_Test01>()
.WithTempQuery(q => new { q.Id, q.Activos, count = SqlExt.Count(q.Id).ToValue() })
.Where(q => q.Id != "1" && q.count > 1)
.ToSql();
Debug.WriteLine(selectSql);
var sql = @"SELECT *
FROM (
SELECT a.""Id"", a.""Activos"", count(a.""Id"") ""count""
FROM ""QuestDb_Model_Test01"" a ) a
WHERE (a.""Id"" <> '1' AND a.""count"" > 1)";
Assert.Equal(selectSql, sql);
}
}
}

View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FreeSql.Tests.QuestDb.QuestDbTestModel;
using FreeSql.Tests.QuestDb.Utils;
using Xunit;
using static FreeSql.Tests.QuestDb.QuestDbTest;
namespace FreeSql.Tests.QuestDb.Crud
{
[TestCaseOrderer("FreeSql.Tests.QuestDb.Utils.TestOrders", "FreeSql.Tests")]
public class QuestDbTestUpdate
{
//多线程以及questdb问题转移至 insert中测试
}
}

View File

@ -0,0 +1,43 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FreeSql.DataAnnotations;
using FreeSql.Provider.QuestDb.Subtable;
using FreeSql.Tests.QuestDb.QuestDbTestModel;
using Xunit;
using static FreeSql.Tests.QuestDb.QuestDbTest;
namespace FreeSql.Tests.QuestDb
{
public class QuestDbCodeFirstTest
{
[Fact]
public void Test_SyncStructure()
{
fsql.CodeFirst.SyncStructure<QuestDb_Model_Test01>();
fsql.CodeFirst.SyncStructure(typeof(Topic));
fsql.CodeFirst.SyncStructure(typeof(Category));
fsql.CodeFirst.SyncStructure(typeof(CategoryType));
}
[Fact]
public void Test_SyncStructure_Type()
{
fsql.CodeFirst.SyncStructure<QuestDb_Model_Type01>();
var result = fsql.Insert(new QuestDb_Model_Type01()
{
TestBool = false,
TestDecimal = (decimal?)153.02,
TestDouble = 152.61,
TestInt = 1,
TestLong = 1569212,
TestShort = 2,
TestString = "string",
TestTime = DateTime.Now
}).ExecuteAffrows();
Assert.Equal(1, result);
}
}
}

View File

@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FreeSql.Tests.QuestDb.QuestDbTestModel;
using Xunit;
namespace FreeSql.Tests.QuestDb
{
public class QuestDbDbFirstTest
{
[Fact]
public void Test_ExistsTable()
{
var existsTable = QuestDbTest.fsql.DbFirst.ExistsTable(nameof(QuestDb_Model_Test01));
}
[Fact]
public void Test_GetTablesByDatabase()
{
var tablesByDatabase = QuestDbTest.fsql.DbFirst.GetTablesByDatabase("");
tablesByDatabase.ForEach(d =>
{
Debug.WriteLine(d.Name);
});
}
}
}

View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FreeSql.Tests.QuestDb
{
public class QuestDbTest
{
public static IFreeSql fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.QuestDb,
@"host=192.168.0.36;port=8812;username=admin;password=quest;database=qdb;ServerCompatibilityMode=NoTypeLoading;")
.UseMonitorCommand(cmd => Debug.WriteLine($"Sql{cmd.CommandText}")) //监听SQL语句
.UseNoneCommandParameter(true)
.Build();
}
}

View File

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FreeSql.DataAnnotations;
namespace FreeSql.Tests.QuestDb.QuestDbTestModel
{
public class Topic
{
[Column(IsIdentity = true)] public int Id { get; set; }
public string Title { get; set; }
public int Clicks { get; set; }
public DateTime CreateTime { get; set; }
public int CategoryId { get; set; }
public Category Category { get; set; }
}
public class Category
{
[Column(IsIdentity = true)] public int Id { get; set; }
public string Name { get; set; }
public int ParentId { get; set; }
public CategoryType Parent { get; set; }
public List<Topic> Topics { get; set; }
}
public class CategoryType
{
public int Id { get; set; }
public string Name { get; set; }
}
}

View File

@ -0,0 +1,31 @@
using FreeSql.Provider.QuestDb.Subtable;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FreeSql.DataAnnotations;
namespace FreeSql.Tests.QuestDb.QuestDbTestModel
{
[Index("Id_Index", nameof(Id), false)]
class QuestDb_Model_Test01
{
public string Primarys { get; set; }
[Column(DbType = "symbol",IsPrimary = true)] public string Id { get; set; }
[Column(OldName = "Name")] public string NameUpdate { get; set; }
public string NameInsert { get; set; } = "NameDefault";
public double? Activos { get; set; }
[AutoSubtable(SubtableType.Day)] public DateTime? CreateTime { get; set; }
public DateTime? UpdateTime { get; set; }
public bool? IsCompra { get; set; }
}
}

View File

@ -0,0 +1,31 @@
using FreeSql.Provider.QuestDb.Subtable;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FreeSql.DataAnnotations;
namespace FreeSql.Tests.QuestDb.QuestDbTestModel
{
class QuestDb_Model_Type01
{
public string TestString { get; set; }
public decimal? TestDecimal { get; set; }
public short TestShort { get; set; }
public int TestInt { get; set; }
public long TestLong { get; set; }
public double TestDouble { get; set; }
[AutoSubtable(SubtableType.Day)]
public DateTime? TestTime { get; set; }
public bool? TestBool { get; set; }
}
}

View File

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FreeSql.Tests.QuestDb.Utils
{
/// <summary>
/// 测试方法的执行顺序
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
public class OrderAttribute : Attribute
{
/// <summary>
/// 顺序
/// </summary>
public int Sort
{
get; set;
}
public OrderAttribute(int sort)
{
this.Sort = sort;
}
}
}

View File

@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xunit.Abstractions;
using Xunit.Sdk;
namespace FreeSql.Tests.QuestDb.Utils
{
/// <summary>
/// 单元测试的排序策略
/// </summary>
public class TestOrders : ITestCaseOrderer
{
/// <summary>
/// 执行顺序
/// </summary>
/// <typeparam name="TTestCase"></typeparam>
/// <param name="testCases"></param>
/// <returns></returns>
public IEnumerable<TTestCase> OrderTestCases<TTestCase>(IEnumerable<TTestCase> testCases) where TTestCase : ITestCase
{
string typeName = typeof(OrderAttribute).AssemblyQualifiedName;
var result = testCases.ToList();
result.Sort((x, y) =>
{
var xOrder = x.TestMethod.Method.GetCustomAttributes(typeName)?.FirstOrDefault();
if (xOrder == null)
{
return 0;
}
var yOrder = y.TestMethod.Method.GetCustomAttributes(typeName)?.FirstOrDefault();
if (yOrder == null)
{
return 0;
}
var sortX = xOrder.GetNamedArgument<int>("Sort");
var sortY = yOrder.GetNamedArgument<int>("Sort");
//按照Order标签上的Sort属性从小到大的顺序执行
return sortX - sortY;
});
return result;
}
}
}