XCode/XUnitTest.XCode/DataAccessLayer/KingBaseTests.cs

349 lines
12 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using NewLife;
using NewLife.Data;
using NewLife.Log;
using NewLife.Security;
using XCode;
using XCode.DataAccessLayer;
using XCode.Membership;
using Xunit;
using XUnitTest.XCode.TestEntity;
namespace XUnitTest.XCode.DataAccessLayer;
[TestCaseOrderer("NewLife.UnitTest.DefaultOrderer", "NewLife.UnitTest")]
public class KingBaseTests
{
private static String _ConnStr = "Server=127.0.0.1;User ID=system;Password=123456!@;Database=test;Port=54321";
public KingBaseTests()
{
var f = "Config\\KingBase.config".GetFullPath();
if (File.Exists(f))
_ConnStr = File.ReadAllText(f);
else
File.WriteAllText(f.EnsureDirectory(), _ConnStr);
}
[Fact(Skip = "跳过")]
public void InitTest()
{
var db = DbFactory.Create(DatabaseType.KingBase);
Assert.NotNull(db);
var factory = db.Factory;
Assert.NotNull(factory);
var conn = factory.CreateConnection();
Assert.NotNull(conn);
var cmd = factory.CreateCommand();
Assert.NotNull(cmd);
var adp = factory.CreateDataAdapter();
Assert.NotNull(adp);
var dp = factory.CreateParameter();
Assert.NotNull(dp);
}
[Fact(Skip = "跳过")]
public void ConnectTest()
{
var db = DbFactory.Create(DatabaseType.KingBase);
var factory = db.Factory;
var conn = factory.CreateConnection();
conn.ConnectionString = _ConnStr;
conn.Open();
}
[Fact(Skip = "跳过")]
public void DALTest()
{
DAL.AddConnStr("KingBase", _ConnStr, null, "KingBase");
var dal = DAL.Create("KingBase");
Assert.NotNull(dal);
Assert.Equal("KingBase", dal.ConnName);
Assert.Equal(DatabaseType.KingBase, dal.DbType);
var db = dal.Db;
var connstr = db.ConnectionString;
Assert.EndsWith(_ConnStr, connstr);
var ver = db.ServerVersion;
Assert.NotEmpty(ver);
}
[Fact(Skip = "跳过")]
public void MetaTest()
{
DAL.AddConnStr("KingBase", _ConnStr, null, "KingBase");
var dal = DAL.Create("KingBase");
// 反向工程
dal.SetTables(User.Meta.Table.DataTable);
var tables = dal.Tables;
Assert.NotNull(tables);
Assert.True(tables.Count > 0);
var tb = tables.FirstOrDefault(e => e.Name == "User");
Assert.NotNull(tb);
Assert.NotEmpty(tb.Description);
}
[Fact(Skip = "跳过")]
public void SelectTest()
{
DAL.AddConnStr("KingBase", _ConnStr, null, "KingBase");
var dal = DAL.Create("KingBase");
try
{
dal.Execute("drop database if EXISTS \"test\"");
}
catch (Exception ex) { XTrace.WriteException(ex); }
var connStr = _ConnStr.Replace("Database=test;", "Database=Membership_Test;");
DAL.AddConnStr("KingBase_Select", connStr, null, "KingBase");
Role.Meta.ConnName = "KingBase_Select";
Area.Meta.ConnName = "KingBase_Select";
Role.Meta.Session.InitData();
var count = Role.Meta.Count;
Assert.True(count > 0);
var list = Role.FindAll();
Assert.True(list.Count >= 4);
var list2 = Role.FindAll(Role._.Name == "管理员");
Assert.Equal(1, list2.Count);
var list3 = Role.Search("用户", null);
Assert.Equal(2, list3.Count);
var list4 = Role.FindAll(Role._.Name.Contains("用户"));
Assert.Equal(2, list4.Count);
var list5 = Role.FindAll(Role._.Name.StartsWith("用户"));
var list6 = Role.FindAll(Role._.Name.EndsWith("用户"));
Assert.Equal(2, list6.Count);
var list7 = Role.FindAll(Role._.Name.NotContains("用户"));
Assert.Equal(2, list7.Count);
// 来个耗时操作,把前面堵住
Area.FetchAndSave();
// 清理现场
try
{
dal.Execute("drop database if EXISTS \"Membership_Test\"");
}
catch (Exception ex) { XTrace.WriteException(ex); }
}
[Fact(Skip = "跳过")]
public void TablePrefixTest()
{
DAL.AddConnStr("KingBase", _ConnStr, null, "KingBase");
var dal = DAL.Create("KingBase");
try
{
dal.Execute("drop database if EXISTS \"Membership_Table_Prefix\"");
}
catch (Exception ex) { XTrace.WriteException(ex); }
var connStr = _ConnStr.Replace("Database=test;", "Database=Membership_Table_Prefix;");
connStr += ";TablePrefix=member_";
DAL.AddConnStr("KingBase_Table_Prefix", connStr, null, "KingBase");
Role.Meta.ConnName = "KingBase_Table_Prefix";
Role.Meta.Session.InitData();
var count = Role.Meta.Count;
Assert.True(count > 0);
var list = Role.FindAll();
Assert.Equal(4, list.Count);
var list2 = Role.FindAll(Role._.Name == "管理员");
Assert.Equal(1, list2.Count);
var list3 = Role.Search("用户", null);
Assert.Equal(2, list3.Count);
}
private IDisposable CreateForBatch(String action)
{
var connStr = _ConnStr.Replace("Database=test;", "Database=Membership_Batch;");
DAL.AddConnStr("Membership_Batch", connStr, null, "KingBase");
var dt = Role2.Meta.Table.DataTable.Clone() as IDataTable;
dt.TableName = $"Role2_{action}";
// 分表
var split = Role2.Meta.CreateSplit("Membership_Batch", dt.TableName);
var session = Role2.Meta.Session;
session.Dal.SetTables(dt);
// 清空数据
session.Truncate();
return split;
}
[Fact(Skip = "跳过")]
public void BatchInsert()
{
using var split = CreateForBatch("BatchInsert");
var list = new List<Role2>
{
new Role2 { Name = "管理员" },
new Role2 { Name = "高级用户" },
new Role2 { Name = "普通用户" }
};
var rs = list.BatchInsert();
Assert.Equal(list.Count, rs);
var list2 = Role2.FindAll();
Assert.Equal(list.Count, list2.Count);
Assert.Contains(list2, e => e.Name == "管理员");
Assert.Contains(list2, e => e.Name == "高级用户");
Assert.Contains(list2, e => e.Name == "普通用户");
}
[Fact(Skip = "跳过")]
public void PositiveAndNegative()
{
var connName = GetType().Name;
DAL.AddConnStr(connName, _ConnStr, null, "KingBase");
var dal = DAL.Create(connName);
var table = User.Meta.Table.DataTable.Clone() as IDataTable;
table.TableName = $"user_{Rand.Next(1000, 10000)}";
dal.SetTables(table);
var tableNames = dal.GetTableNames();
XTrace.WriteLine("tableNames: {0}", tableNames.Join());
Assert.Contains(table.TableName, tableNames);
var tables = dal.Tables;
XTrace.WriteLine("tables: {0}", tables.Join());
Assert.Contains(tables, t => t.TableName == table.TableName);
dal.Db.CreateMetaData().SetSchema(DDLSchema.DropTable, table);
tableNames = dal.GetTableNames();
XTrace.WriteLine("tableNames: {0}", tableNames.Join());
Assert.DoesNotContain(table.TableName, tableNames);
}
[Fact(Skip = "跳过")]
public void QuerySqlTest()
{
var connStr = _ConnStr.Replace("Database=test;", "Database=Membership;");
DAL.AddConnStr("Membership", connStr, null, "KingBase");
var dal = DAL.Create("Membership");
var a = dal.Query<Role>("select * from \"Role\" order by \"ID\"");
var p1 = new PageParameter() { PageSize = 20, PageIndex = 1, Sort = "\"ID\"", RetrieveTotalCount = true, Desc = false };
a = dal.Query<Role>("select * from \"Role\" ", null, p1);
var p2 = new PageParameter() { PageSize = 20, PageIndex = 1, Sort = "\"ID\"", RetrieveTotalCount = true, Desc = false };
a = dal.Query<Role>("select * from \"Role\"", null, p2);
dal.Query<Role>("select * from \"Role\" order by \"ID\"");
var p11 = new PageParameter() { PageSize = 20, PageIndex = 2, Sort = "\"ID\"", RetrieveTotalCount = true, Desc = false };
a = dal.Query<Role>("select * from \"Role\" ", null, p11);
var p21 = new PageParameter() { PageSize = 20, PageIndex = 2, Sort = "\"ID\"", RetrieveTotalCount = true, Desc = false };
a = dal.Query<Role>("select * from \"Role\"", null, p21);
// 清理现场
//try
//{
// dal.Execute("drop database membership_test");
//}
//catch (Exception ex) { XTrace.WriteException(ex); }
}
[Fact(Skip = "跳过")]
public void CreateTableWithStringLength()
{
//var table = User.Meta.Table.DataTable.Clone() as IDataTable;
//table.TableName = "user_sqlserver";
//table.DbType = DatabaseType.SqlServer;
var str = """
<EntityModel>
<Table Name="ActEvtLog" TableName="ACT_EVT_LOG" DbType="HighGo">
<Columns>
<Column Name="LogNr" ColumnName="LOG_NR_" DataType="Int32" RawType="numeric(19, 0)" Identity="True" PrimaryKey="True" />
<Column Name="Type" ColumnName="TYPE_" DataType="String" Length="64" />
<Column Name="ProcDefId" ColumnName="PROC_DEF_ID_" DataType="String" Length="64" />
<Column Name="ProcInstId" ColumnName="PROC_INST_ID_" DataType="String" Length="64" />
<Column Name="ExecutionId" ColumnName="EXECUTION_ID_" DataType="String" Length="64" />
<Column Name="TaskId" ColumnName="TASK_ID_" DataType="String" Length="64" />
<Column Name="TimeStamp" ColumnName="TIME_STAMP_" DataType="DateTime" Scale="3" Nullable="False" />
<Column Name="UserId" ColumnName="USER_ID_" DataType="String" Length="255" />
<Column Name="Data" ColumnName="DATA_" DataType="Byte[]" />
<Column Name="LockOwner" ColumnName="LOCK_OWNER_" DataType="String" Length="255" />
<Column Name="LockTime" ColumnName="LOCK_TIME_" DataType="DateTime" Scale="3" />
<Column Name="IsProcessed" ColumnName="IS_PROCESSED_" DataType="Byte" Nullable="True" />
</Columns>
</Table>
</EntityModel>
""";
var table = DAL.Import(str).FirstOrDefault();
Assert.NotNull(table);
Assert.Equal("ActEvtLog", table.Name);
Assert.Equal("ACT_EVT_LOG", table.TableName);
Assert.Equal(DatabaseType.HighGo, table.DbType);
var db = DbFactory.Create(DatabaseType.HighGo);
var meta = db.CreateMetaData();
var sql = meta.GetSchemaSQL(DDLSchema.CreateTable, table);
var targetSql = @$"Create Table ""ACT_EVT_LOG""(
""LOG_NR_"" serial Primary Key,
""TYPE_"" varchar(64) NULL,
""PROC_DEF_ID_"" varchar(64) NULL,
""PROC_INST_ID_"" varchar(64) NULL,
""EXECUTION_ID_"" varchar(64) NULL,
""TASK_ID_"" varchar(64) NULL,
""TIME_STAMP_"" timestamp NOT NULL DEFAULT '0001-01-01',
""USER_ID_"" varchar(255) NULL,
""DATA_"" bytea NULL,
""LOCK_OWNER_"" varchar(255) NULL,
""LOCK_TIME_"" timestamp NULL,
""IS_PROCESSED_"" bit null
)";
Assert.Equal(targetSql, sql);
}
[Fact(Skip = "跳过")]
public void BuildDeleteSql()
{
DAL.AddConnStr("KingBase", _ConnStr, null, "KingBase");
var dal = DAL.Create("KingBase");
Role.Meta.ConnName = "KingBase";
Role.Meta.Session.InitData();
var count = Role.Delete(Role._.Name == "管理员");
Assert.Equal(count, 1);
}
}