Dreamine.FullKit.Tests 1.0.0.0
Dreamine.FullKit.Tests 기능을 검증하는 자동화 테스트 프로젝트입니다.
로딩중...
검색중...
일치하는것 없음
SqliteDatabaseProviderTests.cs
이 파일의 문서화 페이지로 가기
1using Dreamine.Database.Abstractions.Mapping;
2using Dreamine.Database.Sqlite;
3
5
14public sealed class SqliteDatabaseProviderTests
15{
24 [Fact]
26 {
27 using var database = TemporarySqliteDatabase.Create();
28 var provider = new SqliteDatabaseProvider(database.ConnectionString);
29
30 provider.EnsureDatabaseExists();
31 provider.CreateTable<SampleUser>();
32
33 Assert.True(provider.IsTableExists<SampleUser>());
34
35 Assert.True(provider.Insert(new SampleUser
36 {
37 Id = 1,
38 Name = "Minsu",
39 Age = 30,
40 Ignored = "not persisted"
41 }));
42
43 var inserted = provider.Query<SampleUser>("SELECT Id, Name, Age FROM SampleUsers WHERE Id = @Id", new { Id = 1 })
44 .Single();
45
46 Assert.Equal("Minsu", inserted.Name);
47 Assert.Equal(30, inserted.Age);
48
49 inserted.Name = "Dreamine";
50 inserted.Age = 31;
51
52 Assert.True(provider.Update(inserted));
53 Assert.Equal("Dreamine", provider.ExecuteScalar<string>("SELECT Name FROM SampleUsers WHERE Id = @Id", new { Id = 1 }));
54
55 Assert.True(provider.Delete(inserted));
56 Assert.Equal(0, provider.ExecuteScalar<long>("SELECT COUNT(1) FROM SampleUsers"));
57 }
58
67 [Fact]
69 {
70 // Two separate provider instances that share the same static SQL cache.
71 // The observable contract is that the same entity type always produces identical SQL
72 // regardless of which provider instance triggers the build.
73 using var db1 = TemporarySqliteDatabase.Create();
74 using var db2 = TemporarySqliteDatabase.Create();
75 var p1 = new SqliteDatabaseProvider(db1.ConnectionString);
76 var p2 = new SqliteDatabaseProvider(db2.ConnectionString);
77
78 var method = typeof(SqliteDatabaseProvider)
79 .BaseType!
80 .GetMethod("BuildInsertSql", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)!;
81
82 var map = Dreamine.Database.Core.Mapping.DatabaseEntityMap.Create<SampleUser>();
83 var sql1 = (string)method.Invoke(p1, [map])!;
84 var sql2 = (string)method.Invoke(p2, [map])!;
85
86 Assert.NotEmpty(sql1);
87 Assert.Equal(sql1, sql2);
88 Assert.Contains("INSERT INTO", sql1);
89 Assert.Contains("SampleUsers", sql1);
90 }
91
108[Fact]
110 {
111 using var database = TemporarySqliteDatabase.Create();
112 var provider = new SqliteDatabaseProvider(database.ConnectionString);
113
114 await provider.EnsureDatabaseExistsAsync();
115 await provider.CreateTableAsync<SampleUser>();
116
117 Assert.True(await provider.IsTableExistsAsync<SampleUser>());
118
119 var inserted = await provider.InsertAsync(new SampleUser
120 {
121 Id = 2,
122 Name = "Async",
123 Age = 7
124 });
125
126 Assert.True(inserted);
127
128 var rows = await provider.QueryAsync<SampleUser>(
129 "SELECT Id, Name, Age FROM SampleUsers WHERE Name = @Name",
130 new { Name = "Async" });
131
132 Assert.Single(rows);
133 Assert.Equal(7, rows[0].Age);
134
135 rows[0].Age = 8;
136 Assert.True(await provider.UpdateAsync(rows[0]));
137 Assert.Equal(8, await provider.ExecuteScalarAsync<int>("SELECT Age FROM SampleUsers WHERE Id = @Id", new { Id = 2 }));
138 }
139
148 private sealed class TemporarySqliteDatabase : IDisposable
149 {
166 private TemporarySqliteDatabase(string path)
167 {
168 Path = path;
169 ConnectionString = $"Data Source={path};Pooling=False";
170 }
171
180 public string Path { get; }
181
190 public string ConnectionString { get; }
191
209 {
210 var path = System.IO.Path.Combine(
211 System.IO.Path.GetTempPath(),
212 "Dreamine.Database.Tests",
213 Guid.NewGuid().ToString("N") + ".db");
214
215 Directory.CreateDirectory(System.IO.Path.GetDirectoryName(path)!);
216 return new TemporarySqliteDatabase(path);
217 }
218
227 public void Dispose()
228 {
229 if (File.Exists(Path))
230 {
231 File.Delete(Path);
232 }
233 }
234 }
235
244 [DatabaseTable("SampleUsers")]
245 private sealed class SampleUser
246 {
255 [DatabaseKey]
256 public int Id { get; set; }
257
266 public string Name { get; set; } = string.Empty;
267
276 public int Age { get; set; }
277
286 [DatabaseIgnore]
287 public string? Ignored { get; set; }
288 }
289}