MssqlPreExecuteTests.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. using PetaPoco.Providers;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using Xunit;
  9. using Shouldly;
  10. namespace PetaPoco.Tests.Integration.Databases.MSSQL
  11. {
  12. [Collection("Mssql")]
  13. public class MssqlPreExecuteTests : BaseDatabase
  14. {
  15. public MsssqlPreExecuteDatabaseProvider Provider => DB.Provider as MsssqlPreExecuteDatabaseProvider;
  16. public MssqlPreExecuteTests() : base(new MssqlPreExecuteDBTestProvider())
  17. {
  18. Provider.ThrowExceptions = true;
  19. }
  20. [Fact]
  21. public void Query_Calls_PreExecute()
  22. {
  23. var expected = Guid.NewGuid().ToString();
  24. var sql = Sql.Builder
  25. .Select("*")
  26. .From("sometable")
  27. .Where("foo = @0", expected);
  28. void act() => DB.Query<string>(sql).First();
  29. Should.Throw<PreExecuteException>(act);
  30. Provider.Parameters.Count().ShouldBe(1);
  31. Provider.Parameters.First().Value.ShouldBe(expected);
  32. }
  33. [Fact]
  34. public void Execute_Calls_PreExecute()
  35. {
  36. var expected = Guid.NewGuid().ToString();
  37. var sql = Sql.Builder
  38. .Select("*")
  39. .From("sometable")
  40. .Where("foo = @0", expected);
  41. void act() => DB.Execute(sql);
  42. Should.Throw<PreExecuteException>(act);
  43. Provider.Parameters.Count().ShouldBe(1);
  44. Provider.Parameters.First().Value.ShouldBe(expected);
  45. }
  46. [Fact]
  47. public void Insert_Calls_PreExecute()
  48. {
  49. var expected = Guid.NewGuid().ToString();
  50. void act() => DB.Insert("sometable", new { Foo = expected });
  51. Should.Throw<PreExecuteException>(act);
  52. Provider.Parameters.Count().ShouldBe(1);
  53. Provider.Parameters.First().Value.ShouldBe(expected);
  54. }
  55. [Fact]
  56. public void Update_Calls_PreExecute()
  57. {
  58. var expected = Guid.NewGuid().ToString();
  59. void act() => DB.Update("sometable", "id", new { ID = 3, Foo = expected });
  60. Should.Throw<PreExecuteException>(act);
  61. Provider.Parameters.Count().ShouldBe(2);
  62. Provider.Parameters.First().Value.ShouldBe(expected);
  63. }
  64. [Fact]
  65. public void ExecuteScalar_Calls_PreExecute()
  66. {
  67. var expected = Guid.NewGuid().ToString();
  68. var sql = Sql.Builder
  69. .Select("count(*)")
  70. .From("sometable")
  71. .Where("foo = @0", expected);
  72. void act() => DB.ExecuteScalar<int>(sql);
  73. Should.Throw<PreExecuteException>(act);
  74. Provider.Parameters.Count().ShouldBe(1);
  75. Provider.Parameters.First().Value.ShouldBe(expected);
  76. }
  77. [Fact]
  78. public void QueryAsync_Calls_PreExecute()
  79. {
  80. var expected = Guid.NewGuid().ToString();
  81. var sql = Sql.Builder
  82. .Select("*")
  83. .From("sometable")
  84. .Where("foo = @0", expected);
  85. async Task act() => await DB.QueryAsync<string>(sql).Result.ReadAsync();
  86. Should.Throw<PreExecuteException>(act);
  87. Provider.Parameters.Count().ShouldBe(1);
  88. Provider.Parameters.First().Value.ShouldBe(expected);
  89. }
  90. [Fact]
  91. public void ExecuteAsync_Calls_PreExecute()
  92. {
  93. var expected = Guid.NewGuid().ToString();
  94. var sql = Sql.Builder
  95. .Select("*")
  96. .From("sometable")
  97. .Where("foo = @0", expected);
  98. async Task act() => await DB.ExecuteAsync(sql);
  99. Should.Throw<PreExecuteException>(act);
  100. Provider.Parameters.Count().ShouldBe(1);
  101. Provider.Parameters.First().Value.ShouldBe(expected);
  102. }
  103. [Fact]
  104. public void InsertAsync_Calls_PreExecute()
  105. {
  106. var expected = Guid.NewGuid().ToString();
  107. async Task act() => await DB.InsertAsync("sometable", new { Foo = expected });
  108. Should.Throw<PreExecuteException>(act);
  109. Provider.Parameters.Count().ShouldBe(1);
  110. Provider.Parameters.First().Value.ShouldBe(expected);
  111. }
  112. [Fact]
  113. public void UpdateAsync_Calls_PreExecute()
  114. {
  115. var expected = Guid.NewGuid().ToString();
  116. async Task act() => await DB.UpdateAsync("sometable", "id", new { ID = 3, Foo = expected });
  117. Should.Throw<PreExecuteException>(act);
  118. Provider.Parameters.Count().ShouldBe(2);
  119. Provider.Parameters.First().Value.ShouldBe(expected);
  120. }
  121. [Fact]
  122. public void ExecuteScalarAsync_Calls_PreExecute()
  123. {
  124. var expected = Guid.NewGuid().ToString();
  125. var sql = Sql.Builder
  126. .Select("count(*)")
  127. .From("sometable")
  128. .Where("foo = @0", expected);
  129. async Task act() => await DB.ExecuteScalarAsync<int>(sql);
  130. Should.Throw<PreExecuteException>(act);
  131. Provider.Parameters.Count().ShouldBe(1);
  132. Provider.Parameters.First().Value.ShouldBe(expected);
  133. }
  134. public class MssqlPreExecuteDBTestProvider : MssqlDBTestProvider
  135. {
  136. protected override IDatabase LoadFromConnectionName(string name)
  137. {
  138. var config = BuildFromConnectionName(name);
  139. config.UsingProvider<MsssqlPreExecuteDatabaseProvider>();
  140. return config.Create();
  141. }
  142. }
  143. public class MsssqlPreExecuteDatabaseProvider : SqlServerDatabaseProvider
  144. {
  145. public bool ThrowExceptions { get; set; }
  146. public List<IDataParameter> Parameters { get; set; } = new List<IDataParameter>();
  147. public override void PreExecute(IDbCommand cmd)
  148. {
  149. Parameters.Clear();
  150. if (ThrowExceptions)
  151. {
  152. Parameters = cmd.Parameters.Cast<IDataParameter>().ToList();
  153. throw new PreExecuteException();
  154. }
  155. }
  156. }
  157. public class PreExecuteException : Exception { }
  158. }
  159. }