SqlTests.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. using System;
  2. using PetaPoco.Tests.Unit.Models;
  3. using Shouldly;
  4. using Xunit;
  5. namespace PetaPoco.Tests.Unit.Core
  6. {
  7. [RequiresCleanUp]
  8. public class SqlTests
  9. {
  10. private Sql _sql;
  11. public SqlTests()
  12. {
  13. _sql = new Sql();
  14. }
  15. [Fact]
  16. public void Append_GivenSimpleStrings_ShouldBeValid()
  17. {
  18. _sql.Append("LINE 1");
  19. _sql.Append("LINE 2");
  20. _sql.Append("LINE 3");
  21. _sql.SQL.ShouldBe("LINE 1\nLINE 2\nLINE 3");
  22. _sql.Arguments.Length.ShouldBe(0);
  23. }
  24. [Fact]
  25. public void Append_GivenSignleArgument_ShouldBeValid()
  26. {
  27. _sql.Append("arg @0", "a1");
  28. _sql.SQL.ShouldBe("arg @0");
  29. _sql.Arguments.Length.ShouldBe(1);
  30. _sql.Arguments[0].ShouldBe("a1");
  31. }
  32. [Fact]
  33. public void Append_GivenMultipleArguments_ShouldBeValid()
  34. {
  35. _sql.Append("arg @0 @1", "a1", "a2");
  36. _sql.SQL.ShouldBe("arg @0 @1");
  37. _sql.Arguments.Length.ShouldBe(2);
  38. _sql.Arguments[0].ShouldBe("a1");
  39. _sql.Arguments[1].ShouldBe("a2");
  40. }
  41. [Fact]
  42. [Description("Question: should this not throw?")]
  43. public void Append_GivenUnusedArguments_ShouldBeValid()
  44. {
  45. _sql.Append("arg @0 @2", "a1", "a2", "a3");
  46. _sql.SQL.ShouldBe("arg @0 @1");
  47. _sql.Arguments.Length.ShouldBe(2);
  48. _sql.Arguments[0].ShouldBe("a1");
  49. _sql.Arguments[1].ShouldBe("a3");
  50. }
  51. [Fact]
  52. public void Append_GivenUnorderedArguments_ShouldBeValid()
  53. {
  54. _sql.Append("arg @2 @1", "a1", "a2", "a3");
  55. _sql.SQL.ShouldBe("arg @0 @1");
  56. _sql.Arguments.Length.ShouldBe(2);
  57. _sql.Arguments[0].ShouldBe("a3");
  58. _sql.Arguments[1].ShouldBe("a2");
  59. }
  60. [Fact]
  61. public void Append_GivenRepeatedArguments_ShouldBeValid()
  62. {
  63. _sql.Append("arg @0 @1 @0 @1", "a1", "a2");
  64. _sql.SQL.ShouldBe("arg @0 @1 @2 @3");
  65. _sql.Arguments.Length.ShouldBe(4);
  66. _sql.Arguments[0].ShouldBe("a1");
  67. _sql.Arguments[1].ShouldBe("a2");
  68. _sql.Arguments[2].ShouldBe("a1");
  69. _sql.Arguments[3].ShouldBe("a2");
  70. }
  71. [Fact]
  72. public void Append_GivenMySqlUserVariables_ShouldBeValid()
  73. {
  74. _sql.Append("arg @@user1 @2 @1 @@@system1", "a1", "a2", "a3");
  75. _sql.SQL.ShouldBe("arg @@user1 @0 @1 @@@system1");
  76. _sql.Arguments.Length.ShouldBe(2);
  77. _sql.Arguments[0].ShouldBe("a3");
  78. _sql.Arguments[1].ShouldBe("a2");
  79. }
  80. [Fact]
  81. public void Append_GivenNameArguments_ShouldBeValid()
  82. {
  83. _sql.Append("arg @name @password", new { name = "n", password = "p" });
  84. _sql.SQL.ShouldBe("arg @0 @1");
  85. _sql.Arguments.Length.ShouldBe(2);
  86. _sql.Arguments[0].ShouldBe("n");
  87. _sql.Arguments[1].ShouldBe("p");
  88. }
  89. [Fact]
  90. public void Append_GivenMixedNameAndNumberArguments_ShouldBeValid()
  91. {
  92. _sql.Append("arg @0 @name @1 @password @2", "a1", "a2", "a3", new { name = "n", password = "p" });
  93. _sql.SQL.ShouldBe("arg @0 @1 @2 @3 @4");
  94. _sql.Arguments.Length.ShouldBe(5);
  95. _sql.Arguments[0].ShouldBe("a1");
  96. _sql.Arguments[1].ShouldBe("n");
  97. _sql.Arguments[2].ShouldBe("a2");
  98. _sql.Arguments[3].ShouldBe("p");
  99. _sql.Arguments[4].ShouldBe("a3");
  100. }
  101. [Fact]
  102. public void Append_GivenConsecutiveArguments_ShouldBeValid()
  103. {
  104. _sql.Append("l1 @0", "a0");
  105. _sql.Append("l2 @0", "a1");
  106. _sql.Append("l3 @0", "a2");
  107. _sql.SQL.ShouldBe("l1 @0\nl2 @1\nl3 @2");
  108. _sql.Arguments.Length.ShouldBe(3);
  109. _sql.Arguments[0].ShouldBe("a0");
  110. _sql.Arguments[1].ShouldBe("a1");
  111. _sql.Arguments[2].ShouldBe("a2");
  112. }
  113. [Fact]
  114. public void Append_GivenConsecutiveComplexArguments_ShouldBeValid()
  115. {
  116. _sql.Append("l1");
  117. _sql.Append("l2 @0 @1", "a1", "a2");
  118. _sql.Append("l3 @0", "a3");
  119. _sql.SQL.ShouldBe("l1\nl2 @0 @1\nl3 @2");
  120. _sql.Arguments.Length.ShouldBe(3);
  121. _sql.Arguments[0].ShouldBe("a1");
  122. _sql.Arguments[1].ShouldBe("a2");
  123. _sql.Arguments[2].ShouldBe("a3");
  124. }
  125. [Fact]
  126. public void Append_GivenInvalidNumberOfArguments_ShouldThrow()
  127. {
  128. Should.Throw<ArgumentOutOfRangeException>(() =>
  129. {
  130. _sql.Append("arg @0 @1", "a0");
  131. _sql.SQL.ShouldBe("arg @0 @1");
  132. });
  133. }
  134. [Fact]
  135. public void Append_GivenInvalidArgumentNames_ShouldThrow()
  136. {
  137. Should.Throw<ArgumentException>(() =>
  138. {
  139. _sql.Append("arg @name1 @name2", new { x = 1, y = 2 });
  140. _sql.SQL.ShouldBe("arg @0 @1");
  141. });
  142. }
  143. [Fact]
  144. public void Append_GivenSqLInstance_ShouldBeValid()
  145. {
  146. _sql = new Sql("l0 @0", "a0");
  147. var sql1 = new Sql("l1 @0", "a1");
  148. var sql2 = new Sql("l2 @0", "a2");
  149. _sql.Append(sql1).ShouldBe(_sql);
  150. _sql.Append(sql2).ShouldBe(_sql);
  151. _sql.SQL.ShouldBe("l0 @0\nl1 @1\nl2 @2");
  152. _sql.Arguments.Length.ShouldBe(3);
  153. _sql.Arguments[0].ShouldBe("a0");
  154. _sql.Arguments[1].ShouldBe("a1");
  155. _sql.Arguments[2].ShouldBe("a2");
  156. }
  157. [Fact]
  158. public void Append_GivenConsecutiveSets_ShouldBeValid()
  159. {
  160. _sql = new Sql().Append("UPDATE blah");
  161. _sql.Append("SET a = 1");
  162. _sql.Append("SET b = 2");
  163. _sql.SQL.ShouldBe("UPDATE blah\nSET a = 1\n, b = 2");
  164. }
  165. [Fact]
  166. public void Set_GivenConsecutiveSets_ShouldBeValid()
  167. {
  168. _sql = new Sql().Append("UPDATE blah");
  169. _sql.Set("a = 1");
  170. _sql.Set("b = 2");
  171. _sql.SQL.ShouldBe("UPDATE blah\nSET a = 1\n, b = 2");
  172. }
  173. [Fact]
  174. public void Append_GivenConsecutiveSetsAndWheres_ShouldBeValid()
  175. {
  176. _sql = new Sql().Append("UPDATE blah");
  177. _sql.Append("SET a = 1");
  178. _sql.Append("SET b = 2");
  179. _sql.Append("WHERE x");
  180. _sql.Append("WHERE y");
  181. _sql.SQL.ShouldBe("UPDATE blah\nSET a = 1\n, b = 2\nWHERE x\nAND y");
  182. }
  183. [Fact]
  184. public void Append_GivenConsecutiveWheres_ShouldBeValid()
  185. {
  186. _sql = new Sql().Append("SELECT * FROM blah");
  187. _sql.Append("WHERE x");
  188. _sql.Append("WHERE y");
  189. _sql.SQL.ShouldBe("SELECT * FROM blah\nWHERE x\nAND y");
  190. }
  191. [Fact]
  192. public void Append_GivenConsecutiveOrderBys_ShouldBeValid()
  193. {
  194. _sql = new Sql().Append("SELECT * FROM blah");
  195. _sql.Append("ORDER BY x");
  196. _sql.Append("ORDER BY y");
  197. _sql.SQL.ShouldBe("SELECT * FROM blah\nORDER BY x\n, y");
  198. }
  199. [Fact]
  200. public void Append_GivenArrayAndValue_ShouldBeValid()
  201. {
  202. // Simple collection parameter expansion
  203. _sql = Sql.Builder.Append("@0 IN (@1) @2", 20, new int[] { 1, 2, 3 }, 30);
  204. _sql.SQL.ShouldBe("@0 IN (@1,@2,@3) @4");
  205. _sql.Arguments.Length.ShouldBe(5);
  206. _sql.Arguments[0].ShouldBe(20);
  207. _sql.Arguments[1].ShouldBe(1);
  208. _sql.Arguments[2].ShouldBe(2);
  209. _sql.Arguments[3].ShouldBe(3);
  210. _sql.Arguments[4].ShouldBe(30);
  211. }
  212. [Fact]
  213. public void Append_GivenTwoArrays_ShouldBeValid()
  214. {
  215. // Out of order expansion
  216. _sql = Sql.Builder.Append("IN (@3) (@1)", null, new[] { 1, 2, 3 }, null, new[] { 4, 5, 6 });
  217. _sql.SQL.ShouldBe("IN (@0,@1,@2) (@3,@4,@5)");
  218. _sql.Arguments.Length.ShouldBe(6);
  219. _sql.Arguments[0].ShouldBe(4);
  220. _sql.Arguments[1].ShouldBe(5);
  221. _sql.Arguments[2].ShouldBe(6);
  222. _sql.Arguments[3].ShouldBe(1);
  223. _sql.Arguments[4].ShouldBe(2);
  224. _sql.Arguments[5].ShouldBe(3);
  225. }
  226. [Fact]
  227. public void Append_GivenArray_ShouldBeValid()
  228. {
  229. _sql = Sql.Builder.Append("IN (@numbers)", new { numbers = (new[] { 1, 2, 3 }) });
  230. _sql.SQL.ShouldBe("IN (@0,@1,@2)");
  231. _sql.Arguments.Length.ShouldBe(3);
  232. _sql.Arguments[0].ShouldBe(1);
  233. _sql.Arguments[1].ShouldBe(2);
  234. _sql.Arguments[2].ShouldBe(3);
  235. }
  236. [Fact]
  237. public void Join_GivenTable_ShouldBeValid()
  238. {
  239. _sql = Sql.Builder.Select("*").From("articles").LeftJoin("comments").On("articles.article_id=comments.article_id");
  240. _sql.SQL.ShouldBe("SELECT *\nFROM articles\nLEFT JOIN comments\nON articles.article_id=comments.article_id");
  241. }
  242. [Fact]
  243. [Description("Investigation of reported bug #123")]
  244. public void Append_GivenMultipleAppends_ShouldBeValid()
  245. {
  246. var resource = new
  247. {
  248. ResourceName = "p1",
  249. ResourceDescription = "p2",
  250. ResourceContent = "p3",
  251. ResourceData = "p4",
  252. ResourceGUID = Guid.Parse("C32B630F-FCFE-49FF-A27C-2E4105D4003E"),
  253. LaunchPath = "p5",
  254. ResourceType = OrderStatus.Deleted,
  255. ContentType = "p5",
  256. SchoolID = "p5",
  257. DistrictID = "p5",
  258. UpdatedBy = 87,
  259. UpdatedDate = new DateTime(2000, 1, 1, 1, 1, 1, DateTimeKind.Utc),
  260. IsActive = true,
  261. Extension = "p9",
  262. ResourceID = 99,
  263. };
  264. _sql.Append("UPDATE [Resource] SET ").Append("[ResourceName] = @0", resource.ResourceName).Append(",[ResourceDescription] = @0", resource.ResourceDescription)
  265. .Append(",[ResourceContent] = @0", resource.ResourceContent).Append(",[ResourceData] = @0", resource.ResourceData)
  266. .Append(",[ResourceGUID] = @0", resource.ResourceGUID).Append(",[LaunchPath] = @0", resource.LaunchPath).Append(",[ResourceType] = @0", (int) resource.ResourceType)
  267. .Append(",[ContentType] = @0", resource.ContentType).Append(",[SchoolID] = @0", resource.SchoolID).Append(",[DistrictID] = @0", resource.DistrictID)
  268. .Append(",[IsActive] = @0", resource.IsActive).Append(",[UpdatedBy] = @0", resource.UpdatedBy).Append(",[UpdatedDate] = @0", resource.UpdatedDate)
  269. .Append(",[Extension] = @0", resource.Extension).Append(" WHERE ResourceID=@0", resource.ResourceID);
  270. _sql.SQL.Replace("\n", "").Replace("\r", "").ShouldBe(
  271. @"UPDATE [Resource] SET [ResourceName] = @0,[ResourceDescription] = @1,[ResourceContent] = @2,[ResourceData] = @3,[ResourceGUID] = @4,[LaunchPath] = @5,[ResourceType] = @6,[ContentType] = @7,[SchoolID] = @8,[DistrictID] = @9,[IsActive] = @10,[UpdatedBy] = @11,[UpdatedDate] = @12,[Extension] = @13 WHERE ResourceID=@14");
  272. }
  273. [Fact]
  274. [Description("Investigation of reported bug #106")]
  275. public void Sql_CacheShouldBeResetAfterAdditionalChanges_ShouldBeValid()
  276. {
  277. _sql.Select("field");
  278. var sqlCapture1 = _sql.SQL;
  279. _sql.From("myTable");
  280. var sqlCapture2 = _sql.SQL;
  281. _sql.Where("id = @0", 1);
  282. var sqlCapture3 = _sql.SQL;
  283. sqlCapture1.Replace("\n", " ").ShouldBe("SELECT field");
  284. sqlCapture2.Replace("\n", " ").ShouldBe("SELECT field FROM myTable");
  285. sqlCapture3.Replace("\n", " ").ShouldBe("SELECT field FROM myTable WHERE (id = @0)");
  286. }
  287. }
  288. }