CreateCommandTests.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Data.Common;
  5. using System.Data.SqlClient;
  6. using System.Linq;
  7. using Shouldly;
  8. using Xunit;
  9. namespace PetaPoco.Tests.Unit
  10. {
  11. public class CreateCommandTests : IDisposable
  12. {
  13. public readonly DbConnection _conn = new SqlConnection();
  14. public readonly Database _db = new Database("foo", "System.Data.SqlClient");
  15. public static IEnumerable<object[]> QueryParamData
  16. => new[]
  17. {
  18. new object[]
  19. {
  20. "select * from foo where bar=@0",
  21. new object[] { "baz" },
  22. new (string, object)[] { ("@0", "baz") }
  23. },
  24. new object[]
  25. {
  26. "select * from MyTable where bar=@0 and baz=@1",
  27. new object[] { 3, 7 },
  28. new (string, object)[] { ("@0", 3), ("@1", 7) }
  29. },
  30. new object[]
  31. {
  32. "select * from foo",
  33. new object[0],
  34. new (string, object)[0]
  35. },
  36. };
  37. public static IEnumerable<object[]> ProcParamData
  38. => new[]
  39. {
  40. new object[]
  41. {
  42. "AnonymousType",
  43. new object[] { new { Foo = "Bar", Baz = 3 } },
  44. new (string, object)[] { ("@Foo", "Bar"), ("@Baz", 3) }
  45. },
  46. new object[]
  47. {
  48. "TwoAnonymousTypes",
  49. new object[] { new { Foo = "Bar" }, new { Baz = 3 } },
  50. new (string, object)[] { ("@Foo", "Bar"), ("@Baz", 3) }
  51. },
  52. new object[]
  53. {
  54. "SqlParameter",
  55. new object[] { new SqlParameter("@Foo", "Bar") },
  56. new (string, object)[] { ("@Foo", "Bar") }
  57. },
  58. new object[]
  59. {
  60. "NoArgs",
  61. new object[0],
  62. new (string, object)[0]
  63. },
  64. new object[]
  65. {
  66. "Array",
  67. new object[] { new object[] { new { Foo = "Bar" }, new { Baz = 3 } } },
  68. new (string, object)[] { ("@Foo", "Bar"), ("@Baz", 3) }
  69. },
  70. };
  71. public void Dispose()
  72. {
  73. _conn.Dispose();
  74. _db.Dispose();
  75. }
  76. private static void Compare(IDbCommand output, (string name, object value)[] expected)
  77. {
  78. var parms = output.Parameters.Cast<SqlParameter>();
  79. parms.Count().ShouldBe(expected.Count());
  80. foreach (var (name, value) in expected)
  81. {
  82. parms.ShouldContain(p => p.ParameterName == name && p.Value.Equals(value));
  83. }
  84. }
  85. [Theory]
  86. [MemberData(nameof(QueryParamData))]
  87. public void QueryWithParams_Should_Match(string sql, object[] args, (string, object)[] expected)
  88. {
  89. var output = _db.CreateCommand(_conn, sql, args);
  90. output.CommandType.ShouldBe(CommandType.Text);
  91. output.CommandText.ShouldBe(sql);
  92. Compare(output, expected);
  93. }
  94. [Fact]
  95. public void QueryWithNamedParams_Should_Match()
  96. {
  97. var inputSql = "select * from foo where bar=@thing1";
  98. var args = new { thing1 = "baz" };
  99. var expectedSql = "select * from foo where bar=@0";
  100. var expectedArgs = new (string, object)[] { ("@0", "baz") };
  101. var output = _db.CreateCommand(_conn, inputSql, args);
  102. output.CommandType.ShouldBe(CommandType.Text);
  103. output.CommandText.ShouldBe(expectedSql);
  104. Compare(output, expectedArgs);
  105. }
  106. [Fact]
  107. public void QueryWithSql_Should_Work()
  108. {
  109. var sql = Sql.Builder.Select("*").From("SomeTable");
  110. sql.Where("foo=@0", "thing1");
  111. sql.Where("bar=@0", 4);
  112. var output = _db.CreateCommand(_conn, sql.SQL, sql.Arguments);
  113. output.CommandType.ShouldBe(CommandType.Text);
  114. output.CommandText.ShouldBe("SELECT *\nFROM SomeTable\nWHERE (foo=@0)\nAND (bar=@1)");
  115. var expected = new (string, object)[] { ("@0", "thing1"), ("@1", 4) };
  116. Compare(output, expected);
  117. }
  118. [Theory]
  119. [MemberData(nameof(ProcParamData))]
  120. public void ProcWithParams_Should_Match(string sql, object[] args, (string, object)[] expected)
  121. {
  122. var output = _db.CreateCommand(_conn, CommandType.StoredProcedure, sql, args);
  123. output.CommandType.ShouldBe(CommandType.StoredProcedure);
  124. output.CommandText.ShouldBe(sql);
  125. Compare(output, expected);
  126. }
  127. [Theory]
  128. [InlineData("foo")]
  129. [InlineData(4)]
  130. public void ValueTypes_Should_Throw(object arg)
  131. {
  132. Action act = () => _db.CreateCommand(_conn, CommandType.StoredProcedure, "procname", arg);
  133. act.ShouldThrow<ArgumentException>();
  134. }
  135. [Fact]
  136. public void ByteArray_Should_Map_To_Binary()
  137. {
  138. var sql = Sql.Builder.Select("*").From("SomeTable");
  139. sql.Where("foo=@0", new byte[] { 1, 2, 3 });
  140. var output = _db.CreateCommand(_conn, sql.SQL, sql.Arguments);
  141. output.Parameters.Count.ShouldBe(1);
  142. var parm = output.Parameters[0] as IDataParameter;
  143. parm.DbType.ShouldBe(DbType.Binary);
  144. }
  145. }
  146. }