using System; using System.Collections.Generic; using System.Text; using NUnit.Framework; using Rhino.Mocks; namespace ScrewTurn.Wiki.Plugins.SqlCommon.Tests { [TestFixture] public class QueryBuilderTests { private MockRepository mocks = new MockRepository(); /// /// Gets a new command builder for testing purposes. /// /// The command builder. private ICommandBuilder MockCommandBuilderWithNamedParameters() { ICommandBuilder builder = mocks.StrictMock(); Expect.Call(builder.ObjectNamePrefix).Return("[").Repeat.Any(); Expect.Call(builder.ObjectNameSuffix).Return("]").Repeat.Any(); Expect.Call(builder.ParameterNamePrefix).Return("@").Repeat.Any(); Expect.Call(builder.ParameterNameSuffix).Return("").Repeat.Any(); Expect.Call(builder.UseNamedParameters).Return(true).Repeat.Any(); Expect.Call(builder.BatchQuerySeparator).Return("; ").Repeat.Any(); mocks.Replay(builder); return builder; } /// /// Gets a new command builder for testing purposes. /// /// The command builder. private ICommandBuilder MockCommandBuilderWithoutNamedParameters() { ICommandBuilder builder = mocks.StrictMock(); Expect.Call(builder.ObjectNamePrefix).Return("[").Repeat.Any(); Expect.Call(builder.ObjectNameSuffix).Return("]").Repeat.Any(); Expect.Call(builder.ParameterPlaceholder).Return("?").Repeat.Any(); Expect.Call(builder.UseNamedParameters).Return(false).Repeat.Any(); Expect.Call(builder.BatchQuerySeparator).Return("; ").Repeat.Any(); mocks.Replay(builder); return builder; } [Test] public void SelectFrom_Columns() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom("Table", new string[] { "Col1", "Col2" }); Assert.AreEqual("select [Col1], [Col2] from [Table]", query, "Wrong query"); } [Test] public void SelectFrom_All() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom("Table"); Assert.AreEqual("select * from [Table]", query, "Wrong query"); } [Test] public void SelectFrom_ColumnsJoin() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom( "Table", "Joined", "Col1", "Col2", Join.InnerJoin, new string[] { "Col1", "Col2" }, new string[] { "Col5", "Col9" }); Assert.AreEqual("select [Table].[Col1] as [Table_Col1], [Table].[Col2] as [Table_Col2], [Joined].[Col5] as [Joined_Col5], [Joined].[Col9] as [Joined_Col9] from [Table] inner join [Joined] on [Table].[Col1] = [Joined].[Col2]", query, "Wrong query"); } [Test] public void SelectFrom_ColumnsJoinMultiple() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom( "Table", "Joined", new string[] { "Col1", "Col2" }, new string[] { "Col3", "Col4" }, Join.RightJoin, new string[] { "Col6", "Col7" }, new string[] { "Col8", "Col9" }); Assert.AreEqual("select [Table].[Col6] as [Table_Col6], [Table].[Col7] as [Table_Col7], [Joined].[Col8] as [Joined_Col8], [Joined].[Col9] as [Joined_Col9] from [Table] right join [Joined] on [Table].[Col1] = [Joined].[Col3] and [Table].[Col2] = [Joined].[Col4]", query, "Wrong query"); } [Test] public void SelectFrom_AllJoin() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom( "Table", "Joined", "Col1", "Col2", Join.LeftJoin); Assert.AreEqual("select * from [Table] left join [Joined] on [Table].[Col1] = [Joined].[Col2]", query, "Wrong query"); } [Test] public void SelectFrom_ColumnsJoin2() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom( "Table1", "Table2", "Col1", "Col2", Join.Join, new string[] { "Col1", "Col2" }, new string[] { "Col4", "Col6" }, "Table3", "Col5", Join.LeftJoin, new string[] { "Col34" }); Assert.AreEqual("select [Table1].[Col1] as [Table1_Col1], [Table1].[Col2] as [Table1_Col2], [Table2].[Col4] as [Table2_Col4], [Table2].[Col6] as [Table2_Col6], [Table3].[Col34] as [Table3_Col34] from [Table1] join [Table2] on [Table1].[Col1] = [Table2].[Col2] left join [Table3] on [Table1].[Col1] = [Table3].[Col5]", query, "Wrong query"); } [Test] public void SelectCountFrom() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectCountFrom("Table"); Assert.AreEqual("select count(*) from [Table]", query, "Wrong query"); } [Test] public void Where_AndWhere_NamedParameter() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).Where(query, "Col1", WhereOperator.LessThanOrEqualTo, "Param1"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).AndWhere(query, "Col2", WhereOperator.Equals, "Param2"); Assert.AreEqual("select * from [Table] where [Col1] <= @Param1 and [Col2] = @Param2", query, "Wrong query"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).Where(query, "Col1", WhereOperator.LessThanOrEqualTo, "Param1", true, false); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).AndWhere(query, "Col2", WhereOperator.Equals, "Param2", true, false); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).AndWhere(query, "Col3", WhereOperator.Equals, "Param3", false, true) + ")"; Assert.AreEqual("select * from [Table] where ([Col1] <= @Param1 and ([Col2] = @Param2 and [Col3] = @Param3))", query, "Wrong query"); } [Test] public void Where_AndWhere_UnnamedParameter() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).Where(query, "Col1", WhereOperator.LessThanOrEqualTo, "Param1"); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).AndWhere(query, "Col2", WhereOperator.Equals, "Param2"); Assert.AreEqual("select * from [Table] where [Col1] <= ? and [Col2] = ?", query, "Wrong query"); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).Where(query, "Col1", WhereOperator.LessThanOrEqualTo, "Param1", true, false); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).AndWhere(query, "Col2", WhereOperator.Equals, "Param2", true, false); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).AndWhere(query, "Col3", WhereOperator.Equals, "Param3", false, true) + ")"; Assert.AreEqual("select * from [Table] where ([Col1] <= ? and ([Col2] = ? and [Col3] = ?))", query, "Wrong query"); } [Test] public void Where_OrWhere_NamedParameter() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).Where(query, "Col1", WhereOperator.LessThanOrEqualTo, "Param1"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).OrWhere(query, "Col2", WhereOperator.Equals, "Param2"); Assert.AreEqual("select * from [Table] where [Col1] <= @Param1 or [Col2] = @Param2", query, "Wrong query"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).Where(query, "Col1", WhereOperator.LessThanOrEqualTo, "Param1", true, false); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).OrWhere(query, "Col2", WhereOperator.Equals, "Param2", true, false); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).OrWhere(query, "Col3", WhereOperator.Equals, "Param3", false, true) + ")"; Assert.AreEqual("select * from [Table] where ([Col1] <= @Param1 or ([Col2] = @Param2 or [Col3] = @Param3))", query, "Wrong query"); } [Test] public void Where_OrWhere_UnnamedParameter() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).Where(query, "Col1", WhereOperator.LessThanOrEqualTo, "Param1"); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).OrWhere(query, "Col2", WhereOperator.Equals, "Param2"); Assert.AreEqual("select * from [Table] where [Col1] <= ? or [Col2] = ?", query, "Wrong query"); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).Where(query, "Col1", WhereOperator.LessThanOrEqualTo, "Param1", true, false); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).OrWhere(query, "Col2", WhereOperator.Equals, "Param2", true, false); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).OrWhere(query, "Col3", WhereOperator.Equals, "Param3", false, true) + ")"; Assert.AreEqual("select * from [Table] where ([Col1] <= ? or ([Col2] = ? or [Col3] = ?))", query, "Wrong query"); } [Test] public void Where_Table_AndWhere_Table_NamedParameter() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).Where(query, "Table", "Col1", WhereOperator.LessThanOrEqualTo, "Param1"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).AndWhere(query, "Table", "Col2", WhereOperator.Equals, "Param2"); Assert.AreEqual("select * from [Table] where [Table].[Col1] <= @Param1 and [Table].[Col2] = @Param2", query, "Wrong query"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).Where(query, "Table", "Col1", WhereOperator.LessThanOrEqualTo, "Param1", true, false); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).AndWhere(query, "Table", "Col2", WhereOperator.Equals, "Param2", true, false); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).AndWhere(query, "Table", "Col3", WhereOperator.Equals, "Param3", false, true) + ")"; Assert.AreEqual("select * from [Table] where ([Table].[Col1] <= @Param1 and ([Table].[Col2] = @Param2 and [Table].[Col3] = @Param3))", query, "Wrong query"); } [Test] public void Where_Table_AndWhere_Table_UnnamedParameter() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).Where(query, "Table", "Col1", WhereOperator.LessThanOrEqualTo, "Param1"); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).AndWhere(query, "Table", "Col2", WhereOperator.Equals, "Param2"); Assert.AreEqual("select * from [Table] where [Table].[Col1] <= ? and [Table].[Col2] = ?", query, "Wrong query"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).Where(query, "Table", "Col1", WhereOperator.LessThanOrEqualTo, "Param1", true, false); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).AndWhere(query, "Table", "Col2", WhereOperator.Equals, "Param2", true, false); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).AndWhere(query, "Table", "Col3", WhereOperator.Equals, "Param3", false, true) + ")"; Assert.AreEqual("select * from [Table] where ([Table].[Col1] <= ? and ([Table].[Col2] = ? and [Table].[Col3] = ?))", query, "Wrong query"); } [Test] public void Where_Table_OrWhere_Table_NamedParameter() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).Where(query, "Table", "Col1", WhereOperator.LessThanOrEqualTo, "Param1"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).OrWhere(query, "Table", "Col2", WhereOperator.Equals, "Param2"); Assert.AreEqual("select * from [Table] where [Table].[Col1] <= @Param1 or [Table].[Col2] = @Param2", query, "Wrong query"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).Where(query, "Table", "Col1", WhereOperator.LessThanOrEqualTo, "Param1", true, false); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).OrWhere(query, "Table", "Col2", WhereOperator.Equals, "Param2", true, false); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).OrWhere(query, "Table", "Col3", WhereOperator.Equals, "Param3", false, true) + ")"; Assert.AreEqual("select * from [Table] where ([Table].[Col1] <= @Param1 or ([Table].[Col2] = @Param2 or [Table].[Col3] = @Param3))", query, "Wrong query"); } [Test] public void Where_Table_OrWhere_Table_UnnamedParameter() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).Where(query, "Table", "Col1", WhereOperator.LessThanOrEqualTo, "Param1"); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).OrWhere(query, "Table", "Col2", WhereOperator.Equals, "Param2"); Assert.AreEqual("select * from [Table] where [Table].[Col1] <= ? or [Table].[Col2] = ?", query, "Wrong query"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).Where(query, "Table", "Col1", WhereOperator.LessThanOrEqualTo, "Param1", true, false); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).OrWhere(query, "Table", "Col2", WhereOperator.Equals, "Param2", true, false); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).OrWhere(query, "Table", "Col3", WhereOperator.Equals, "Param3", false, true) + ")"; Assert.AreEqual("select * from [Table] where ([Table].[Col1] <= ? or ([Table].[Col2] = ? or [Table].[Col3] = ?))", query, "Wrong query"); } [Test] public void WhereIn_NamedParameters() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).WhereIn(query, "Col1", new string[] { "Param1", "Param2" }); Assert.AreEqual("select * from [Table] where [Col1] in (@Param1, @Param2)", query, "Wrong query"); } [Test] public void WhereIn_UnnamedParameters() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).WhereIn(query, "Col1", new string[] { "Param1", "Param2" }); Assert.AreEqual("select * from [Table] where [Col1] in (?, ?)", query, "Wrong query"); } [Test] public void WhereIn_Table_NamedParameters() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).WhereIn(query, "Table", "Col1", new string[] { "Param1", "Param2" }); Assert.AreEqual("select * from [Table] where [Table].[Col1] in (@Param1, @Param2)", query, "Wrong query"); } [Test] public void WhereIn_Table_UnnamedParameters() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).WhereIn(query, "Table", "Col1", new string[] { "Param1", "Param2" }); Assert.AreEqual("select * from [Table] where [Table].[Col1] in (?, ?)", query, "Wrong query"); } [Test] public void WhereNotIn_NamedParameters() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).DeleteFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).WhereNotInSubquery(query, "Table", "Col1", "fake_sub_query"); Assert.AreEqual("delete from [Table] where [Table].[Col1] not in (fake_sub_query)", query, "Wrong query"); } [Test] public void WhereNotIn_UnnamedParameters() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).DeleteFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).WhereNotInSubquery(query, "Table", "Col1", "fake_sub_query"); Assert.AreEqual("delete from [Table] where [Table].[Col1] not in (fake_sub_query)", query, "Wrong query"); } [Test] public void OrderBy() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom("Table"); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).OrderBy(query, new string[] { "Col1", "Col2", "Col3" }, new Ordering[] { Ordering.Asc, Ordering.Desc, Ordering.Asc }); Assert.AreEqual("select * from [Table] order by [Col1] asc, [Col2] desc, [Col3] asc", query, "Wrong query"); } [Test] public void GroupBy() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).SelectFrom("Table", new string[] { "Col1", "Col2" }); query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).GroupBy(query, new string[] { "Col2", "Col1" }); Assert.AreEqual("select [Col1], [Col2] from [Table] group by [Col2], [Col1]", query, "Wrong query"); } [Test] public void InsertInto_NamedParameters() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).InsertInto("Table", new string[] { "Col1", "Col2" }, new string[] { "Param1", "Param2" }); Assert.AreEqual("insert into [Table] ([Col1], [Col2]) values (@Param1, @Param2)", query, "Wrong query"); } [Test] public void InsertInto_UnnamedParameters() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).InsertInto("Table", new string[] { "Col1", "Col2" }, new string[] { "Param1", "Param2" }); Assert.AreEqual("insert into [Table] ([Col1], [Col2]) values (?, ?)", query, "Wrong query"); } [Test] public void Update_NamedParameters() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).Update("Table", new string[] { "Col1", "Col2" }, new string[] { "Param1", "Param2" }); Assert.AreEqual("update [Table] set [Col1] = @Param1, [Col2] = @Param2", query, "Wrong query"); } [Test] public void Update_UnnamedParameters() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithoutNamedParameters()).Update("Table", new string[] { "Col1", "Col2" }, new string[] { "Param1", "Param2" }); Assert.AreEqual("update [Table] set [Col1] = ?, [Col2] = ?", query, "Wrong query"); } [Test] public void UpdateIncrement_Positive() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).UpdateIncrement("Table", "Col1", 3); Assert.AreEqual("update [Table] set [Col1] = [Col1] + 3", query, "Wrong query"); } [Test] public void UpdateIncrement_Negative() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).UpdateIncrement("Table", "Col1", -8); Assert.AreEqual("update [Table] set [Col1] = [Col1] - 8", query, "Wrong query"); } [Test] public void DeleteFrom() { string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).DeleteFrom("Table"); Assert.AreEqual("delete from [Table]", query, "Wrong query"); } [Test] public void AppendForBatch() { string query1 = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).DeleteFrom("Table"); string query2 = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).DeleteFrom("Table2"); string query = QueryBuilder.NewQuery(MockCommandBuilderWithNamedParameters()).AppendForBatch(query1, query2); Assert.AreEqual("delete from [Table]; delete from [Table2]", query, "Wrong query"); } } }