PageRenderTime 42ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/ServiceStack.OrmLite.Tests/CaptureSqlFilterTests.cs

https://github.com/ServiceStack/ServiceStack.OrmLite
C# | 267 lines | 218 code | 49 blank | 0 comment | 12 complexity | bf4401693f314eefe236cd2e0ab16cc6 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using NUnit.Framework;
  4. using ServiceStack.OrmLite.Tests.Shared;
  5. using ServiceStack.Text;
  6. namespace ServiceStack.OrmLite.Tests
  7. {
  8. [TestFixtureOrmLite]
  9. public class CaptureSqlFilterTests : OrmLiteProvidersTestBase
  10. {
  11. public CaptureSqlFilterTests(DialectContext context) : base(context) {}
  12. [Test]
  13. public void Can_capture_each_type_of_API()
  14. {
  15. using var captured = new CaptureSqlFilter();
  16. using var db = OpenDbConnection();
  17. db.CreateTable<Person>();
  18. db.Select<Person>(x => x.Age > 40);
  19. db.Single<Person>(x => x.Age == 42);
  20. db.Count<Person>(x => x.Age < 50);
  21. db.Insert(new Person { Id = 7, FirstName = "Amy", LastName = "Winehouse" });
  22. db.Update(new Person { Id = 1, FirstName = "Jimi", LastName = "Hendrix" });
  23. db.Delete<Person>(new { FirstName = "Jimi", Age = 27 });
  24. db.SqlColumn<string>("SELECT LastName FROM Person WHERE Age < @age",
  25. new { age = 50 });
  26. db.SqlList<Person>("exec sp_name @firstName, @age",
  27. new { firstName = "aName", age = 1 });
  28. db.ExecuteNonQuery("UPDATE Person SET LastName={0} WHERE Id={1}"
  29. .SqlFmt(DialectProvider, "WaterHouse", 7));
  30. var sql = string.Join(";\n\n", captured.SqlStatements.ToArray());
  31. sql.Print();
  32. }
  33. [Test]
  34. public void Can_capture_CreateTable_APIs()
  35. {
  36. using (var db = OpenDbConnection())
  37. {
  38. db.DropTable<Person>();
  39. }
  40. using (var captured = new CaptureSqlFilter())
  41. using (var db = OpenDbConnection())
  42. {
  43. int i = 0;
  44. i++; db.CreateTable<Person>();
  45. Assert.That(captured.SqlStatements.Last().NormalizeSql(),
  46. Does.Contain("create table person"));
  47. Assert.That(captured.SqlCommandHistory.Count, Is.EqualTo(i)
  48. .Or.EqualTo(i + 1)); //Check table if exists
  49. var sql = string.Join(";\n", captured.SqlStatements.ToArray());
  50. sql.Print();
  51. }
  52. }
  53. [Test]
  54. public void Can_capture_Select_APIs()
  55. {
  56. using var captured = new CaptureSqlFilter();
  57. using var db = OpenDbConnection();
  58. int i = 0;
  59. i++; db.Select<Person>(x => x.Age > 40);
  60. Assert.That(captured.SqlStatements.Last().NormalizeSql(),
  61. Is.EqualTo("select id, firstname, lastname, age from person where (age > 40)").
  62. Or.EqualTo("select id, firstname, lastname, age from person where (age > @0)"));
  63. i++; db.Select(db.From<Person>().Where(x => x.Age > 40));
  64. i++; db.Select<Person>("Age > 40");
  65. i++; db.Select<Person>("SELECT * FROM Person WHERE Age > 40");
  66. i++; db.Select<Person>("Age > @age", new { age = 40 });
  67. i++; db.Select<Person>("SELECT * FROM Person WHERE Age > @age", new { age = 40 });
  68. i++; db.Select<Person>("Age > @age", new Dictionary<string, object> { { "age", 40 } });
  69. i++; db.Where<Person>("Age", 27);
  70. i++; db.Where<Person>(new { Age = 27 });
  71. i++; db.SelectByIds<Person>(new[] { 1, 2, 3 });
  72. i++; db.SelectByIds<Person>(new[] { 1, 2, 3 });
  73. i++; db.SelectNonDefaults(new Person { Id = 1 });
  74. i++; db.SelectNonDefaults("Age > @Age", new Person { Age = 40 });
  75. i++; db.SelectLazy<Person>().ToList();
  76. i++; db.WhereLazy<Person>(new { Age = 27 }).ToList();
  77. i++; db.Select<Person>();
  78. i++; db.Single<Person>(x => x.Age == 42);
  79. i++; db.Single(db.From<Person>().Where(x => x.Age == 42));
  80. i++; db.Single<Person>(new { Age = 42 });
  81. i++; db.Single<Person>("Age = @age", new { age = 42 });
  82. i++; db.SingleById<Person>(1);
  83. i++; db.SingleWhere<Person>("Age", 42);
  84. i++; db.Exists<Person>(new { Age = 42 });
  85. i++; db.Exists<Person>("SELECT * FROM Person WHERE Age = @age", new { age = 42 });
  86. Assert.That(captured.SqlStatements.Count, Is.EqualTo(i));
  87. var sql = string.Join(";\n", captured.SqlStatements.ToArray());
  88. sql.Print();
  89. }
  90. [Test]
  91. public void Can_capture_all_Single_Apis()
  92. {
  93. using var captured = new CaptureSqlFilter();
  94. using var db = OpenDbConnection();
  95. int i = 0;
  96. i++; db.Single<Person>(x => x.Age == 42);
  97. var p = "@0"; //Normalized
  98. Assert.That(captured.SqlStatements.Last().NormalizeSql(),
  99. Is.EqualTo("select id, firstname, lastname, age from person where (age = {0}) limit 1".Fmt(p)). //sqlite
  100. Or.EqualTo("select top 1 id, firstname, lastname, age from person where (age = {0})".Fmt(p)). //SqlServer
  101. Or.EqualTo("select id, firstname, lastname, age from person where (age = {0}) order by 1 offset 0 rows fetch next 1 rows only".Fmt(p)). //SqlServer 2012+
  102. Or.EqualTo("select first 1 id, firstname, lastname, age from person where (age = {0})".Fmt(p)). //Firebird
  103. Or.EqualTo("select * from (\r select ssormlite1.*, rownum rnum from (\r select id, firstname, lastname, age from person where (age = {0}) order by person.id) ssormlite1\r where rownum <= 0 + 1) ssormlite2 where ssormlite2.rnum > 0".Fmt(p)) //Oracle
  104. );
  105. i++; db.Exists<Person>("Age = @age", new { age = 42 });
  106. i++; db.Single(db.From<Person>().Where(x => x.Age == 42));
  107. i++; db.Single<Person>(new { Age = 42 });
  108. i++; db.Single<Person>("Age = @age", new { age = 42 });
  109. i++; db.SingleById<Person>(1);
  110. i++; db.Exists<Person>("Age = @age", new { age = 42 });
  111. i++; db.SingleWhere<Person>("Age", 42);
  112. Assert.That(captured.SqlStatements.Count, Is.EqualTo(i));
  113. var sql = string.Join(";\n", captured.SqlStatements.ToArray());
  114. sql.Print();
  115. }
  116. [Test]
  117. public void Can_capture_all_Scalar_Apis()
  118. {
  119. using var captured = new CaptureSqlFilter();
  120. using var db = OpenDbConnection();
  121. int i = 0;
  122. i++; db.Scalar<Person, int>(x => Sql.Max(x.Age));
  123. Assert.That(captured.SqlStatements.Last().NormalizeSql(),
  124. Is.EqualTo("select max(age) from person"));
  125. i++; db.Scalar<Person, int>(x => Sql.Max(x.Age));
  126. i++; db.Scalar<Person, int>(x => Sql.Max(x.Age), x => x.Age < 50);
  127. i++; db.Count<Person>(x => x.Age < 50);
  128. i++; db.Count(db.From<Person>().Where(x => x.Age < 50));
  129. i++; db.Scalar<int>("SELECT COUNT(*) FROM Person WHERE Age > @age", new { age = 40 });
  130. i++; db.SqlScalar<int>("SELECT COUNT(*) FROM Person WHERE Age < @age", new { age = 50 });
  131. i++; db.SqlScalar<int>("SELECT COUNT(*) FROM Person WHERE Age < @age", new Dictionary<string, object> { { "age", 50 } });
  132. Assert.That(captured.SqlStatements.Count, Is.EqualTo(i));
  133. var sql = string.Join(";\n", captured.SqlStatements.ToArray());
  134. sql.Print();
  135. }
  136. [Test]
  137. public void Can_capture_Update_Apis()
  138. {
  139. using var captured = new CaptureSqlFilter();
  140. using var db = OpenDbConnection();
  141. int i = 0;
  142. i++; db.Update(new Person { Id = 1, FirstName = "Jimi", LastName = "Hendrix", Age = 27 });
  143. Assert.That(captured.SqlStatements.Last().NormalizeSql(),
  144. Does.StartWith("update person set firstname=@firstname, lastname=@lastname"));
  145. i++; db.Update(new[] { new Person { Id = 1, FirstName = "Jimi", LastName = "Hendrix", Age = 27 } });
  146. i++; db.UpdateAll(new[] { new Person { Id = 1, FirstName = "Jimi", LastName = "Hendrix", Age = 27 } });
  147. i++; db.Update(new Person { Id = 1, FirstName = "JJ", Age = 27 }, p => p.LastName == "Hendrix");
  148. i++; db.Update<Person>(new { FirstName = "JJ" }, p => p.LastName == "Hendrix");
  149. i++; db.UpdateNonDefaults(new Person { FirstName = "JJ" }, p => p.LastName == "Hendrix");
  150. i++; db.UpdateOnlyFields(new Person { FirstName = "JJ" }, p => p.FirstName);
  151. i++; db.UpdateOnlyFields(new Person { FirstName = "JJ" }, p => p.FirstName, p => p.LastName == "Hendrix");
  152. i++; db.UpdateOnlyFields(new Person { FirstName = "JJ", LastName = "Hendo" }, db.From<Person>().Update(p => p.FirstName));
  153. i++; db.UpdateOnlyFields(new Person { FirstName = "JJ" }, db.From<Person>().Update(p => p.FirstName).Where(x => x.FirstName == "Jimi"));
  154. Assert.That(captured.SqlStatements.Count, Is.EqualTo(i));
  155. var sql = string.Join(";\n", captured.SqlStatements.ToArray());
  156. sql.Print();
  157. }
  158. [Test]
  159. public void Can_capture_Delete_Apis()
  160. {
  161. using var captured = new CaptureSqlFilter();
  162. using var db = OpenDbConnection();
  163. int i = 0;
  164. i++; db.Delete<Person>(new { FirstName = "Jimi", Age = 27 });
  165. Assert.That(captured.SqlStatements.Last().NormalizeSql(),
  166. Is.EqualTo("delete from person where firstname=@firstname and age=@age"));
  167. i++; db.Delete<Person>(new { FirstName = "Jimi", Age = 27 });
  168. i++; db.Delete(new Person { Id = 1, FirstName = "Jimi", LastName = "Hendrix", Age = 27 });
  169. i++; db.DeleteNonDefaults(new Person { FirstName = "Jimi", Age = 27 });
  170. i++; db.DeleteById<Person>(1);
  171. i++; db.DeleteByIds<Person>(new[] { 1, 2, 3 });
  172. i++; db.Delete<Person>("Age = @age", new { age = 27 });
  173. i++; db.Delete(typeof(Person), "Age = @age", new { age = 27 });
  174. i++; db.Delete<Person>(p => p.Age == 27);
  175. i++; db.Delete(db.From<Person>().Where(p => p.Age == 27));
  176. Assert.That(captured.SqlStatements.Count, Is.EqualTo(i));
  177. var sql = string.Join(";\n", captured.SqlStatements.ToArray());
  178. sql.Print();
  179. }
  180. [Test]
  181. public void Can_capture_CustomSql_Apis()
  182. {
  183. using var captured = new CaptureSqlFilter();
  184. using var db = OpenDbConnection();
  185. int i = 0;
  186. i++; db.SqlColumn<string>("SELECT LastName FROM Person WHERE Age < @age", new { age = 50 });
  187. Assert.That(captured.SqlStatements.Last().NormalizeSql(),
  188. Is.EqualTo("select lastname from person where age < @age"));
  189. i++; db.SqlColumn<string>("SELECT LastName FROM Person WHERE Age < @age", new { age = 50 });
  190. i++; db.SqlColumn<string>("SELECT LastName FROM Person WHERE Age < @age", new Dictionary<string, object> { { "age", 50 } });
  191. i++; db.SqlScalar<int>("SELECT COUNT(*) FROM Person WHERE Age < @age", new { age = 50 });
  192. i++; db.SqlScalar<int>("SELECT COUNT(*) FROM Person WHERE Age < @age", new Dictionary<string, object> { { "age", 50 } });
  193. i++; db.ExecuteNonQuery("UPDATE Person SET LastName={0} WHERE Id={1}".SqlFmt(DialectProvider, "WaterHouse", 7));
  194. i++; db.ExecuteNonQuery("UPDATE Person SET LastName=@name WHERE Id=@id", new { name = "WaterHouse", id = 7 });
  195. i++; db.SqlList<Person>("exec sp_name @firstName, @age", new { firstName = "aName", age = 1 });
  196. i++; db.SqlScalar<Person>("exec sp_name @firstName, @age", new { firstName = "aName", age = 1 });
  197. Assert.That(captured.SqlStatements.Count, Is.EqualTo(i));
  198. var sql = string.Join(";\n", captured.SqlStatements.ToArray());
  199. sql.Print();
  200. }
  201. [Test]
  202. public void Can_capture_Insert_Apis()
  203. {
  204. using var captured = new CaptureSqlFilter();
  205. using var db = OpenDbConnection();
  206. int i = 0;
  207. i++; db.Insert(new Person { Id = 7, FirstName = "Amy", LastName = "Winehouse", Age = 27 });
  208. Assert.That(captured.SqlStatements.Last().NormalizeSql(),
  209. Does.Contain("insert into person (id,firstname,lastname,age) values"));
  210. i++; db.Insert(new Person { Id = 7, FirstName = "Amy", LastName = "Winehouse", Age = 27 });
  211. i++; db.InsertAll(new[] { new Person { Id = 10, FirstName = "Biggie", LastName = "Smalls", Age = 24 } });
  212. i++; db.InsertOnly(new PersonWithAutoId { FirstName = "Amy", Age = 27 }, p => new { p.FirstName, p.Age });
  213. Assert.That(captured.SqlStatements.Count, Is.EqualTo(i));
  214. var sql = string.Join(";\n", captured.SqlStatements.ToArray());
  215. sql.Print();
  216. }
  217. }
  218. }