chore(sonar): wrap independent assertions in Assert.Multiple (NUnit2045)
Driven by `dotnet format analyzers --diagnostics NUnit2045`. The fixer
groups consecutive independent `Assert.That(...)` calls into
`Assert.Multiple(() => { ... })`, so a failing assertion no longer
short-circuits the block — every failure inside the group is reported,
which gives much better diagnostics on multi-property tests.
Audit confirmed no Assert.Throws / Assert.Fail / Assert.Catch / Assert.Pass
/ Assert.DoesNotThrow got pulled inside a Multiple block (those need to
short-circuit). All 1180 tests pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
505ada5017
commit
67512d23e1
@@ -13,13 +13,16 @@ public class QueryBreakdownTests
|
||||
// Arrange & Act
|
||||
var queryBreakdown = new QueryBreakdown();
|
||||
|
||||
// Assert
|
||||
Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo(string.Empty));
|
||||
Assert.That(queryBreakdown.FromClause.Clause, Is.EqualTo(string.Empty));
|
||||
Assert.That(queryBreakdown.WhereClause.Clause, Is.EqualTo(string.Empty));
|
||||
Assert.That(queryBreakdown.OrderByClause.Clause, Is.EqualTo(string.Empty));
|
||||
Assert.That(queryBreakdown.GroupByClause.Clause, Is.EqualTo(string.Empty));
|
||||
Assert.That(queryBreakdown.HavingClause.Clause, Is.EqualTo(string.Empty));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo(string.Empty));
|
||||
Assert.That(queryBreakdown.FromClause.Clause, Is.EqualTo(string.Empty));
|
||||
Assert.That(queryBreakdown.WhereClause.Clause, Is.EqualTo(string.Empty));
|
||||
Assert.That(queryBreakdown.OrderByClause.Clause, Is.EqualTo(string.Empty));
|
||||
Assert.That(queryBreakdown.GroupByClause.Clause, Is.EqualTo(string.Empty));
|
||||
Assert.That(queryBreakdown.HavingClause.Clause, Is.EqualTo(string.Empty));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -32,9 +35,12 @@ public class QueryBreakdownTests
|
||||
// Act
|
||||
var queryBreakdown = new QueryBreakdown(selectClause, fromClause);
|
||||
|
||||
// Assert
|
||||
Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo(selectClause));
|
||||
Assert.That(queryBreakdown.FromClause.Clause, Is.EqualTo(fromClause));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo(selectClause));
|
||||
Assert.That(queryBreakdown.FromClause.Clause, Is.EqualTo(fromClause));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -48,10 +54,13 @@ public class QueryBreakdownTests
|
||||
// Act
|
||||
var queryBreakdown = new QueryBreakdown(selectClause, fromClause, whereClause);
|
||||
|
||||
// Assert
|
||||
Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo(selectClause));
|
||||
Assert.That(queryBreakdown.FromClause.Clause, Is.EqualTo(fromClause));
|
||||
Assert.That(queryBreakdown.WhereClause.Clause, Is.EqualTo(whereClause));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo(selectClause));
|
||||
Assert.That(queryBreakdown.FromClause.Clause, Is.EqualTo(fromClause));
|
||||
Assert.That(queryBreakdown.WhereClause.Clause, Is.EqualTo(whereClause));
|
||||
});
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -231,11 +240,14 @@ public class QueryBreakdownTests
|
||||
var innerParams = innerCte.ParameterList.Count();
|
||||
var middleParams = middleCte.ParameterList.Count();
|
||||
|
||||
// Assert - Each CTE maintains its own parameters
|
||||
Assert.That(innerParams, Is.EqualTo(1));
|
||||
Assert.That(middleParams, Is.EqualTo(1));
|
||||
// SQL should contain both WITH clauses
|
||||
Assert.That(sql, Does.Contain("WITH"));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert - Each CTE maintains its own parameters
|
||||
Assert.That(innerParams, Is.EqualTo(1));
|
||||
Assert.That(middleParams, Is.EqualTo(1));
|
||||
// SQL should contain both WITH clauses
|
||||
Assert.That(sql, Does.Contain("WITH"));
|
||||
});
|
||||
Assert.That(sql, Does.Contain("RECENT_USERS"));
|
||||
Assert.That(sql, Does.Contain("FILTERED_USERS"));
|
||||
}
|
||||
@@ -289,8 +301,11 @@ public class QueryBreakdownTests
|
||||
// Assert - Verify WITH clause appears before main SELECT
|
||||
var withIndex = sql.IndexOf("WITH");
|
||||
var mainSelectIndex = sql.LastIndexOf("SELECT");
|
||||
Assert.That(withIndex, Is.GreaterThan(-1));
|
||||
Assert.That(mainSelectIndex, Is.GreaterThan(-1));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(withIndex, Is.GreaterThan(-1));
|
||||
Assert.That(mainSelectIndex, Is.GreaterThan(-1));
|
||||
});
|
||||
Assert.That(withIndex, Is.LessThan(mainSelectIndex));
|
||||
|
||||
// Assert - Verify CTE definition
|
||||
@@ -312,13 +327,19 @@ public class QueryBreakdownTests
|
||||
var sql = mainQuery.GetSql();
|
||||
var withClause = mainQuery.WithClauses[0];
|
||||
|
||||
// Assert: Verify WithClause properties
|
||||
Assert.That(withClause.TableName, Is.EqualTo("SALES_TEAM"));
|
||||
Assert.That(withClause.Query, Is.Not.Null);
|
||||
Assert.That(withClause.Sql, Is.Not.Null);
|
||||
Assert.That(withClause.Sql?.SelectClause?.Clause, Contains.Substring("ID, NAME"));
|
||||
Assert.That(withClause.Sql?.FromClause?.Clause, Contains.Substring("EMPLOYEES"));
|
||||
Assert.That(withClause.Sql?.WhereClause?.Clause, Contains.Substring("DEPARTMENT = 'Sales'"));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert: Verify WithClause properties
|
||||
Assert.That(withClause.TableName, Is.EqualTo("SALES_TEAM"));
|
||||
Assert.That(withClause.Query, Is.Not.Null);
|
||||
Assert.That(withClause.Sql, Is.Not.Null);
|
||||
});
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(withClause.Sql?.SelectClause?.Clause, Contains.Substring("ID, NAME"));
|
||||
Assert.That(withClause.Sql?.FromClause?.Clause, Contains.Substring("EMPLOYEES"));
|
||||
Assert.That(withClause.Sql?.WhereClause?.Clause, Contains.Substring("DEPARTMENT = 'Sales'"));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -334,9 +355,12 @@ public class QueryBreakdownTests
|
||||
var cte = new QueryBreakdown("ID, NAME", "SOURCE_TABLE");
|
||||
query.AddWithClause("SOURCE_CTE", cte);
|
||||
|
||||
// Assert - Now using WITH clause
|
||||
Assert.That(query.IsUsingWithClause, Is.True);
|
||||
Assert.That(query.WithClauses, Has.Count.EqualTo(1));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert - Now using WITH clause
|
||||
Assert.That(query.IsUsingWithClause, Is.True);
|
||||
Assert.That(query.WithClauses, Has.Count.EqualTo(1));
|
||||
});
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -357,8 +381,11 @@ public class QueryBreakdownTests
|
||||
// Assert
|
||||
// Snowflake stores parameters in both @ and : formats, so count is doubled
|
||||
Assert.That(merged.Count, Is.GreaterThanOrEqualTo(2));
|
||||
Assert.That(merged.ContainsKey("@UserId") || merged.ContainsKey(":UserId"), Is.True);
|
||||
Assert.That(merged.ContainsKey("@ActiveStatus") || merged.ContainsKey(":ActiveStatus"), Is.True);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(merged.ContainsKey("@UserId") || merged.ContainsKey(":UserId"), Is.True);
|
||||
Assert.That(merged.ContainsKey("@ActiveStatus") || merged.ContainsKey(":ActiveStatus"), Is.True);
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -378,8 +405,11 @@ public class QueryBreakdownTests
|
||||
// Assert
|
||||
// Should have parameters from both CTE and main query
|
||||
var keys = merged.Keys.ToList();
|
||||
Assert.That(keys.Any(k => k.Contains("MinDate")));
|
||||
Assert.That(keys.Any(k => k.Contains("ResultLimit")));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(keys.Any(k => k.Contains("MinDate")));
|
||||
Assert.That(keys.Any(k => k.Contains("ResultLimit")));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -402,9 +432,12 @@ public class QueryBreakdownTests
|
||||
|
||||
// Assert
|
||||
var keys = merged.Keys.ToList();
|
||||
Assert.That(keys.Any(k => k.Contains("Status1")));
|
||||
Assert.That(keys.Any(k => k.Contains("MinDate")));
|
||||
Assert.That(keys.Any(k => k.Contains("ResultLimit")));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(keys.Any(k => k.Contains("Status1")));
|
||||
Assert.That(keys.Any(k => k.Contains("MinDate")));
|
||||
Assert.That(keys.Any(k => k.Contains("ResultLimit")));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -452,9 +485,12 @@ public class QueryBreakdownTests
|
||||
|
||||
// Assert - All parameters from all levels should be present
|
||||
var keys = merged.Keys.ToList();
|
||||
Assert.That(keys.Any(k => k.Contains("InnerParam")));
|
||||
Assert.That(keys.Any(k => k.Contains("MiddleParam")));
|
||||
Assert.That(keys.Any(k => k.Contains("MainParam")));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(keys.Any(k => k.Contains("InnerParam")));
|
||||
Assert.That(keys.Any(k => k.Contains("MiddleParam")));
|
||||
Assert.That(keys.Any(k => k.Contains("MainParam")));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -480,10 +516,13 @@ public class QueryBreakdownTests
|
||||
var dateValues = merged.Values.OfType<DateTime>().Count();
|
||||
var decimalValues = merged.Values.OfType<decimal>().Count();
|
||||
|
||||
Assert.That(intValues, Is.GreaterThan(0), "Should have at least one int value");
|
||||
Assert.That(stringValues, Is.GreaterThan(0), "Should have at least one string value");
|
||||
Assert.That(dateValues, Is.GreaterThan(0), "Should have at least one DateTime value");
|
||||
Assert.That(decimalValues, Is.GreaterThan(0), "Should have at least one decimal value");
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(intValues, Is.GreaterThan(0), "Should have at least one int value");
|
||||
Assert.That(stringValues, Is.GreaterThan(0), "Should have at least one string value");
|
||||
Assert.That(dateValues, Is.GreaterThan(0), "Should have at least one DateTime value");
|
||||
Assert.That(decimalValues, Is.GreaterThan(0), "Should have at least one decimal value");
|
||||
});
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -499,9 +538,12 @@ public class QueryBreakdownTests
|
||||
// Act
|
||||
var queryBreakdown = QueryBreakdown.Parse(sql, false);
|
||||
|
||||
// Assert
|
||||
Assert.That(queryBreakdown.SelectClause.Clause?.Trim(), Does.Contain("ID, NAME"));
|
||||
Assert.That(queryBreakdown.FromClause.Clause?.Trim(), Does.Contain("USERS"));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(queryBreakdown.SelectClause.Clause?.Trim(), Does.Contain("ID, NAME"));
|
||||
Assert.That(queryBreakdown.FromClause.Clause?.Trim(), Does.Contain("USERS"));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -606,9 +648,12 @@ public class QueryBreakdownTests
|
||||
// Act
|
||||
var queryBreakdown = QueryBreakdown.Parse(sql, false);
|
||||
|
||||
// Assert
|
||||
Assert.That(queryBreakdown.IsUsingWithClause, Is.True);
|
||||
Assert.That(queryBreakdown.SelectClause.Clause?.Trim(), Does.Contain("P.*, PS.TOTAL_QTY"));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(queryBreakdown.IsUsingWithClause, Is.True);
|
||||
Assert.That(queryBreakdown.SelectClause.Clause?.Trim(), Does.Contain("P.*, PS.TOTAL_QTY"));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -637,9 +682,12 @@ public class QueryBreakdownTests
|
||||
// Act
|
||||
var success = QueryBreakdown.TryParse(sql, out var queryBreakdown, false);
|
||||
|
||||
// Assert
|
||||
Assert.That(success, Is.True);
|
||||
Assert.That(queryBreakdown, Is.Not.Null);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(success, Is.True);
|
||||
Assert.That(queryBreakdown, Is.Not.Null);
|
||||
});
|
||||
Assert.That(queryBreakdown, Is.InstanceOf<QueryBreakdown>());
|
||||
}
|
||||
|
||||
@@ -652,10 +700,13 @@ public class QueryBreakdownTests
|
||||
// Act
|
||||
var success = QueryBreakdown.TryParse(sql, out var queryBreakdown, out var error, false);
|
||||
|
||||
// Assert
|
||||
Assert.That(success, Is.False);
|
||||
Assert.That(queryBreakdown, Is.Null);
|
||||
Assert.That(error, Is.Not.Null);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(success, Is.False);
|
||||
Assert.That(queryBreakdown, Is.Null);
|
||||
Assert.That(error, Is.Not.Null);
|
||||
});
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -672,9 +723,12 @@ public class QueryBreakdownTests
|
||||
queryBreakdown.AddParameter("UserId", 123);
|
||||
queryBreakdown.AddWhereClause("ACTIVE = 1");
|
||||
|
||||
// Assert
|
||||
Assert.That(queryBreakdown.Parameters, Does.ContainKey("@UserId"));
|
||||
Assert.That(queryBreakdown.WhereClause.Clause, Does.Contain("ACTIVE = 1"));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(queryBreakdown.Parameters, Does.ContainKey("@UserId"));
|
||||
Assert.That(queryBreakdown.WhereClause.Clause, Does.Contain("ACTIVE = 1"));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -687,9 +741,12 @@ public class QueryBreakdownTests
|
||||
// Act
|
||||
queryBreakdown.AddWithClause("ORDER_CTE", cte);
|
||||
|
||||
// Assert
|
||||
Assert.That(queryBreakdown.WithClauses, Has.Count.EqualTo(1));
|
||||
Assert.That(queryBreakdown.IsUsingWithClause, Is.True);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(queryBreakdown.WithClauses, Has.Count.EqualTo(1));
|
||||
Assert.That(queryBreakdown.IsUsingWithClause, Is.True);
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -740,8 +797,11 @@ public class QueryBreakdownTests
|
||||
Assert.That(sql, Does.Contain("WITH"));
|
||||
Assert.That(sql, Does.Contain("SALES_SUMMARY AS ("));
|
||||
Assert.That(sql, Does.Contain("ACTIVE_PRODUCTS AS ("));
|
||||
Assert.That(sql, Does.Contain("LIMIT 100"));
|
||||
Assert.That(mainQueryBreakdown.Parameters, Does.ContainKey(":minSales"));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(sql, Does.Contain("LIMIT 100"));
|
||||
Assert.That(mainQueryBreakdown.Parameters, Does.ContainKey(":minSales"));
|
||||
});
|
||||
Assert.That(mainQueryBreakdown.Parameters, Does.ContainKey(":startDate"));
|
||||
}
|
||||
|
||||
@@ -762,8 +822,11 @@ public class QueryBreakdownTests
|
||||
|
||||
// Assert
|
||||
Assert.That(sql, Does.Contain("WITH"));
|
||||
Assert.That(sql, Does.Contain("MIDDLE_CTE AS ("));
|
||||
Assert.That(mainQueryBreakdown.WithClauses, Has.Count.EqualTo(1));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(sql, Does.Contain("MIDDLE_CTE AS ("));
|
||||
Assert.That(mainQueryBreakdown.WithClauses, Has.Count.EqualTo(1));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -887,9 +950,12 @@ public class QueryBreakdownTests
|
||||
// Act
|
||||
var queryBreakdown = QueryBreakdown.Parse(sql, false);
|
||||
|
||||
// Assert
|
||||
Assert.That(queryBreakdown.SelectClause.Clause, Does.Contain("F.VALUE"));
|
||||
Assert.That(queryBreakdown.FromClause.Clause, Does.Contain("FLATTEN"));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(queryBreakdown.SelectClause.Clause, Does.Contain("F.VALUE"));
|
||||
Assert.That(queryBreakdown.FromClause.Clause, Does.Contain("FLATTEN"));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -1148,9 +1214,12 @@ public class QueryBreakdownTests
|
||||
// Act
|
||||
var success = QueryBreakdown.TryParse(sql, out _, out var error, false);
|
||||
|
||||
// Assert
|
||||
Assert.That(success, Is.False);
|
||||
Assert.That(error, Is.Not.Null.And.Not.Empty);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(success, Is.False);
|
||||
Assert.That(error, Is.Not.Null.And.Not.Empty);
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -1196,9 +1265,12 @@ public class QueryBreakdownTests
|
||||
// Act
|
||||
var queryBreakdown = QueryBreakdown.Parse(sql, false);
|
||||
|
||||
// Assert
|
||||
Assert.That(queryBreakdown.SelectClause.Clause, Does.Contain("$1"));
|
||||
Assert.That(queryBreakdown.FromClause.Clause, Does.Contain("@MY_STAGE"));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(queryBreakdown.SelectClause.Clause, Does.Contain("$1"));
|
||||
Assert.That(queryBreakdown.FromClause.Clause, Does.Contain("@MY_STAGE"));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -1245,8 +1317,11 @@ public class QueryBreakdownTests
|
||||
Assert.That(sql, Does.Contain("SALES_SUMMARY AS ("));
|
||||
Assert.That(sql, Does.Contain("TOP_PRODUCTS AS ("));
|
||||
Assert.That(sql, Does.Contain("ROW_NUMBER()"));
|
||||
Assert.That(sql, Does.Contain("LIMIT 100"));
|
||||
Assert.That(mainQueryBreakdown.Parameters.Count, Is.GreaterThanOrEqualTo(2));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(sql, Does.Contain("LIMIT 100"));
|
||||
Assert.That(mainQueryBreakdown.Parameters.Count, Is.GreaterThanOrEqualTo(2));
|
||||
});
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -1265,9 +1340,12 @@ public class QueryBreakdownTests
|
||||
// Assert
|
||||
Assert.That(result, Is.Not.Null);
|
||||
Assert.That(result, Is.InstanceOf<QueryBreakdown>(), "Should return Snowflake QueryBreakdown instance");
|
||||
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("Id, Name"));
|
||||
Assert.That(result.FromClause.Clause?.Trim(), Does.Contain("Users"));
|
||||
Assert.That(result.WhereClause.Clause?.Trim(), Does.Contain("Active = 1"));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("Id, Name"));
|
||||
Assert.That(result.FromClause.Clause?.Trim(), Does.Contain("Users"));
|
||||
Assert.That(result.WhereClause.Clause?.Trim(), Does.Contain("Active = 1"));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -1300,12 +1378,15 @@ public class QueryBreakdownTests
|
||||
|
||||
// Assert
|
||||
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("DepartmentId"));
|
||||
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("COUNT(*)"));
|
||||
Assert.That(result.FromClause.Clause?.Trim(), Does.Contain("Employees"));
|
||||
Assert.That(result.WhereClause.Clause?.Trim(), Does.Contain("Active = 1"));
|
||||
Assert.That(result.GroupByClause.Clause?.Trim(), Does.Contain("DepartmentId"));
|
||||
Assert.That(result.HavingClause.Clause?.Trim(), Does.Contain("COUNT(*) > 5"));
|
||||
Assert.That(result.OrderByClause.Clause?.Trim(), Does.Contain("EmployeeCount DESC"));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("COUNT(*)"));
|
||||
Assert.That(result.FromClause.Clause?.Trim(), Does.Contain("Employees"));
|
||||
Assert.That(result.WhereClause.Clause?.Trim(), Does.Contain("Active = 1"));
|
||||
Assert.That(result.GroupByClause.Clause?.Trim(), Does.Contain("DepartmentId"));
|
||||
Assert.That(result.HavingClause.Clause?.Trim(), Does.Contain("COUNT(*) > 5"));
|
||||
Assert.That(result.OrderByClause.Clause?.Trim(), Does.Contain("EmployeeCount DESC"));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -1343,11 +1424,17 @@ public class QueryBreakdownTests
|
||||
// Act
|
||||
var result = QueryBreakdown.Parse(tsqlQuery, isMicrosoftSql: true);
|
||||
|
||||
// Assert
|
||||
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("o.OrderId"));
|
||||
Assert.That(result.FromClause.Clause?.Trim(), Does.Contain("INNER JOIN"));
|
||||
Assert.That(result.FromClause.Clause?.Trim(), Does.Contain("LEFT JOIN"));
|
||||
Assert.That(result.WhereClause.Clause?.Trim(), Does.Contain("OrderDate"));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("o.OrderId"));
|
||||
Assert.That(result.FromClause.Clause?.Trim(), Does.Contain("INNER JOIN"));
|
||||
});
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(result.FromClause.Clause?.Trim(), Does.Contain("LEFT JOIN"));
|
||||
Assert.That(result.WhereClause.Clause?.Trim(), Does.Contain("OrderDate"));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -1361,9 +1448,12 @@ public class QueryBreakdownTests
|
||||
// Act
|
||||
var result = QueryBreakdown.Parse(tsqlQuery, isMicrosoftSql: true);
|
||||
|
||||
// Assert
|
||||
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("CustomerId, CustomerName"));
|
||||
Assert.That(result.WhereClause.Clause?.Trim(), Does.Contain("IN"));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("CustomerId, CustomerName"));
|
||||
Assert.That(result.WhereClause.Clause?.Trim(), Does.Contain("IN"));
|
||||
});
|
||||
Assert.That(result.WhereClause.Clause?.Trim(), Does.Contain("SELECT"));
|
||||
}
|
||||
|
||||
@@ -1376,9 +1466,12 @@ public class QueryBreakdownTests
|
||||
// Act
|
||||
var success = QueryBreakdown.TryParse(tsqlQuery, out var result, isMicrosoftSql: true);
|
||||
|
||||
// Assert
|
||||
Assert.That(success, Is.True);
|
||||
Assert.That(result, Is.Not.Null);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(success, Is.True);
|
||||
Assert.That(result, Is.Not.Null);
|
||||
});
|
||||
Assert.That(result, Is.InstanceOf<QueryBreakdown>());
|
||||
}
|
||||
|
||||
@@ -1391,10 +1484,13 @@ public class QueryBreakdownTests
|
||||
// Act
|
||||
var success = QueryBreakdown.TryParse(invalidQuery, out var result, out var errorMessage, isMicrosoftSql: true);
|
||||
|
||||
// Assert
|
||||
Assert.That(success, Is.False);
|
||||
Assert.That(result, Is.Null);
|
||||
Assert.That(errorMessage, Is.Not.Null.And.Not.Empty);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(success, Is.False);
|
||||
Assert.That(result, Is.Null);
|
||||
Assert.That(errorMessage, Is.Not.Null.And.Not.Empty);
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -1406,10 +1502,13 @@ public class QueryBreakdownTests
|
||||
// Act
|
||||
var result = QueryBreakdown.Parse(tsqlQuery, isMicrosoftSql: true);
|
||||
|
||||
// Assert
|
||||
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("[Order Id]"));
|
||||
Assert.That(result.FromClause.Clause?.Trim(), Does.Contain("[Order Details]"));
|
||||
Assert.That(result.WhereClause.Clause?.Trim(), Does.Contain("[Active]"));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("[Order Id]"));
|
||||
Assert.That(result.FromClause.Clause?.Trim(), Does.Contain("[Order Details]"));
|
||||
Assert.That(result.WhereClause.Clause?.Trim(), Does.Contain("[Active]"));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -1428,9 +1527,12 @@ public class QueryBreakdownTests
|
||||
// Act
|
||||
var result = QueryBreakdown.Parse(tsqlQuery, isMicrosoftSql: true);
|
||||
|
||||
// Assert
|
||||
Assert.That(result.IsUsingWithClause, Is.True);
|
||||
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("DepartmentName"));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(result.IsUsingWithClause, Is.True);
|
||||
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("DepartmentName"));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -1452,8 +1554,11 @@ public class QueryBreakdownTests
|
||||
|
||||
// Assert
|
||||
Assert.That(snowflakeSql, Does.Contain("WITH"));
|
||||
Assert.That(snowflakeSql, Does.Contain("SELECT"));
|
||||
Assert.That(result.IsUsingWithClause, Is.True, "Should have WITH clause parsed");
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(snowflakeSql, Does.Contain("SELECT"));
|
||||
Assert.That(result.IsUsingWithClause, Is.True, "Should have WITH clause parsed");
|
||||
});
|
||||
// Note: WITH clause content is stored in WithClause property when parsed via isMicrosoftSql
|
||||
// The GetSql() will output it if WithClauses collection is populated or if we manually add it
|
||||
}
|
||||
@@ -1482,14 +1587,20 @@ public class QueryBreakdownTests
|
||||
|
||||
// Assert - Verify parsing
|
||||
Assert.That(result, Is.InstanceOf<QueryBreakdown>());
|
||||
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("YEAR"));
|
||||
Assert.That(result.GroupByClause.Clause?.Trim(), Does.Contain("YEAR"));
|
||||
Assert.That(result.HavingClause.Clause?.Trim(), Does.Contain("COUNT"));
|
||||
Assert.That(result.Parameters, Does.ContainKey("@startDate"));
|
||||
Assert.That(result.Parameters, Does.ContainKey("@endDate"));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("YEAR"));
|
||||
Assert.That(result.GroupByClause.Clause?.Trim(), Does.Contain("YEAR"));
|
||||
Assert.That(result.HavingClause.Clause?.Trim(), Does.Contain("COUNT"));
|
||||
Assert.That(result.Parameters, Does.ContainKey("@startDate"));
|
||||
});
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(result.Parameters, Does.ContainKey("@endDate"));
|
||||
|
||||
// Assert - Verify Snowflake SQL generation
|
||||
Assert.That(snowflakeSql, Does.Contain("SELECT"));
|
||||
// Assert - Verify Snowflake SQL generation
|
||||
Assert.That(snowflakeSql, Does.Contain("SELECT"));
|
||||
});
|
||||
Assert.That(snowflakeSql, Does.Contain("FROM"));
|
||||
Assert.That(snowflakeSql, Does.Contain("WHERE"));
|
||||
Assert.That(snowflakeSql, Does.Contain("GROUP BY"));
|
||||
@@ -1510,9 +1621,12 @@ public class QueryBreakdownTests
|
||||
result.AddWithClause("ProductSummary", cteQuery);
|
||||
var snowflakeSql = result.GetSql();
|
||||
|
||||
// Assert
|
||||
Assert.That(result.WithClauses, Has.Count.EqualTo(1));
|
||||
Assert.That(snowflakeSql, Does.Contain("WITH"));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(result.WithClauses, Has.Count.EqualTo(1));
|
||||
Assert.That(snowflakeSql, Does.Contain("WITH"));
|
||||
});
|
||||
Assert.That(snowflakeSql, Does.Contain("ProductSummary AS ("));
|
||||
}
|
||||
|
||||
@@ -1528,9 +1642,12 @@ public class QueryBreakdownTests
|
||||
|
||||
// Assert
|
||||
Assert.That(clone, Is.InstanceOf<QueryBreakdown>());
|
||||
Assert.That(clone.SelectClause.Clause, Is.EqualTo(original.SelectClause.Clause));
|
||||
Assert.That(clone.FromClause.Clause, Is.EqualTo(original.FromClause.Clause));
|
||||
Assert.That(clone.WhereClause.Clause, Is.EqualTo(original.WhereClause.Clause));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(clone.SelectClause.Clause, Is.EqualTo(original.SelectClause.Clause));
|
||||
Assert.That(clone.FromClause.Clause, Is.EqualTo(original.FromClause.Clause));
|
||||
Assert.That(clone.WhereClause.Clause, Is.EqualTo(original.WhereClause.Clause));
|
||||
});
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -1608,9 +1725,12 @@ public class QueryBreakdownTests
|
||||
// Act
|
||||
query.AddSelectExpression(expr, "/* Primary key */");
|
||||
|
||||
// Assert
|
||||
Assert.That(query.SelectClause.Clause, Is.EqualTo("CUSTOMERS.CUSTOMER_ID"));
|
||||
Assert.That(query.SelectClause.Comment, Is.EqualTo("/* Primary key */"));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(query.SelectClause.Clause, Is.EqualTo("CUSTOMERS.CUSTOMER_ID"));
|
||||
Assert.That(query.SelectClause.Comment, Is.EqualTo("/* Primary key */"));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -1888,12 +2008,18 @@ public class QueryBreakdownTests
|
||||
// Act - Use Snowflake :param syntax
|
||||
query.AddWhereClause("USER_ID = :UserId AND STATUS = :Status", false);
|
||||
|
||||
// Assert
|
||||
Assert.That(query.WhereClause.Clause, Is.EqualTo("USER_ID = :UserId AND STATUS = :Status"));
|
||||
Assert.That(query.Parameters, Does.ContainKey(":UserId"));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(query.WhereClause.Clause, Is.EqualTo("USER_ID = :UserId AND STATUS = :Status"));
|
||||
Assert.That(query.Parameters, Does.ContainKey(":UserId"));
|
||||
});
|
||||
Assert.That(query.Parameters, Does.ContainKey(":Status"));
|
||||
Assert.That(query.Parameters[":UserId"], Is.Null);
|
||||
Assert.That(query.Parameters[":Status"], Is.Null);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(query.Parameters[":UserId"], Is.Null);
|
||||
Assert.That(query.Parameters[":Status"], Is.Null);
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -1905,9 +2031,12 @@ public class QueryBreakdownTests
|
||||
// Act - Use Microsoft @param syntax with isMicrosoftSql=true
|
||||
query.AddWhereClause("USER_ID = @UserId AND STATUS = @Status", "and", true);
|
||||
|
||||
// Assert
|
||||
Assert.That(query.WhereClause.Clause, Is.EqualTo("USER_ID = @UserId AND STATUS = @Status"));
|
||||
Assert.That(query.Parameters, Does.ContainKey("@UserId"));
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
// Assert
|
||||
Assert.That(query.WhereClause.Clause, Is.EqualTo("USER_ID = @UserId AND STATUS = @Status"));
|
||||
Assert.That(query.Parameters, Does.ContainKey("@UserId"));
|
||||
});
|
||||
Assert.That(query.Parameters, Does.ContainKey("@Status"));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user