Dreamine.FullKit.Tests 1.0.0.0
Dreamine.FullKit.Tests 기능을 검증하는 자동화 테스트 프로젝트입니다.
로딩중...
검색중...
일치하는것 없음
DatabaseProviderDialectTests.cs
이 파일의 문서화 페이지로 가기
1using System.Reflection;
2using Dreamine.Database.Abstractions.Mapping;
3using Dreamine.Database.Core.Mapping;
4using Dreamine.Database.MySql;
5using Dreamine.Database.Oracle;
6using Dreamine.Database.SqlServer;
7using Dreamine.Database.Sqlite;
8
10
20{
29 [Fact]
31 {
32 var sql = BuildCreateTableSql(new SqliteDatabaseProvider("Data Source=:memory:"));
33
34 Assert.Contains("\"DialectSamples\"", sql);
35 Assert.Contains("\"Id\" INTEGER PRIMARY KEY AUTOINCREMENT", sql);
36 Assert.Contains("\"Name\" TEXT", sql);
37 }
38
47 [Fact]
49 {
50 var sql = BuildCreateTableSql(new MySqlDatabaseProvider("Server=localhost;Database=dreamine;User Id=user;Password=password;"));
51
52 Assert.Contains("`DialectSamples`", sql);
53 Assert.Contains("`Id` INT AUTO_INCREMENT PRIMARY KEY", sql);
54 Assert.Contains("`Name` TEXT", sql);
55 }
56
65 [Fact]
67 {
68 var sql = BuildCreateTableSql(new OracleDatabaseProvider("User Id=user;Password=password;Data Source=localhost/XEPDB1;"));
69
70 Assert.Contains("\"DIALECTSAMPLES\"", sql);
71 Assert.Contains("\"ID\" NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY", sql);
72 Assert.Contains("\"NAME\" NVARCHAR2(2000)", sql);
73 }
74
83 [Fact]
85 {
86 var sql = BuildCreateTableSql(new SqlServerDatabaseProvider("Server=localhost;Database=dreamine;User Id=user;Password=password;TrustServerCertificate=True;"));
87
88 Assert.Contains("IF OBJECT_ID", sql);
89 Assert.Contains("[DialectSamples]", sql);
90 Assert.Contains("[Id] INT IDENTITY(1,1) PRIMARY KEY", sql);
91 Assert.Contains("[Name] NVARCHAR(MAX)", sql);
92 }
93
102 [Fact]
104 {
105 var first = DatabaseEntityMap.Create<DialectSample>();
106 var second = DatabaseEntityMap.Create<DialectSample>();
107
108 Assert.Same(first, second);
109 Assert.Same(first.InsertableProperties, second.InsertableProperties);
110 Assert.Same(first.UpdatableProperties, second.UpdatableProperties);
111 }
112
129 [Fact]
131 {
132 // GetOrBuildSql<T> caches INSERT/UPDATE/DELETE SQL strings per (entity type, provider kind).
133 // Calling the method twice must return the same string reference — no redundant rebuild.
134 var provider = new SqliteDatabaseProvider("Data Source=:memory:");
135
136 // GetOrBuildSql is declared on the abstract base class — search the hierarchy.
137 var baseType = provider.GetType().BaseType
138 ?? throw new InvalidOperationException("DatabaseProviderBase not found.");
139 var getOrBuildSql = baseType
140 .GetMethod("GetOrBuildSql", BindingFlags.Instance | BindingFlags.NonPublic)
141 ?.MakeGenericMethod(typeof(DialectSample))
142 ?? throw new InvalidOperationException("GetOrBuildSql<T> not found via reflection.");
143
144 // SqlKind is a private nested enum on the abstract base class.
145 var sqlKindType = baseType.GetNestedType("SqlKind", BindingFlags.NonPublic)
146 ?? throw new InvalidOperationException("SqlKind enum not found on base type.");
147 var insertKind = Enum.ToObject(sqlKindType, 0); // 0 = Insert
148
149 var first = (string)getOrBuildSql.Invoke(provider, [insertKind])!;
150 var second = (string)getOrBuildSql.Invoke(provider, [insertKind])!;
151
152 Assert.Same(first, second);
153 }
154
187 private static string BuildCreateTableSql(object provider)
188 {
189 var method = provider
190 .GetType()
191 .GetMethod("BuildCreateTableSql", BindingFlags.Instance | BindingFlags.NonPublic)
192 ?? throw new InvalidOperationException("BuildCreateTableSql was not found.");
193
194 var map = DatabaseEntityMap.Create<DialectSample>();
195 return (string)method.Invoke(provider, [map])!;
196 }
197
206 [DatabaseTable("DialectSamples")]
207 private sealed class DialectSample
208 {
217 [DatabaseKey]
218 [DatabaseGenerated]
219 public int Id { get; set; }
220
229 public string Name { get; set; } = string.Empty;
230
239 public DateTime CreatedAt { get; set; }
240 }
241}