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:
Thom Lamb
2026-05-27 11:59:47 -05:00
co-authored by Claude Opus 4.7
parent 505ada5017
commit 67512d23e1
47 changed files with 2132 additions and 1113 deletions
@@ -27,9 +27,12 @@ public class QueryBreakdownMapperTests
// Assert // Assert
Assert.That(entity, Is.Not.Null); Assert.That(entity, Is.Not.Null);
Assert.That(entity.SelectClause, Is.EqualTo("ID, Name")); Assert.Multiple(() =>
Assert.That(entity.FromClause, Is.EqualTo("Users")); {
Assert.That(entity.CreatedAt, Is.LessThanOrEqualTo(DateTime.UtcNow)); Assert.That(entity.SelectClause, Is.EqualTo("ID, Name"));
Assert.That(entity.FromClause, Is.EqualTo("Users"));
Assert.That(entity.CreatedAt, Is.LessThanOrEqualTo(DateTime.UtcNow));
});
} }
[Test] [Test]
@@ -46,11 +49,14 @@ public class QueryBreakdownMapperTests
// Act // Act
var entity = _mapper.MapToEntity(queryBreakdown); var entity = _mapper.MapToEntity(queryBreakdown);
// Assert Assert.Multiple(() =>
Assert.That(entity.SelectClause, Is.EqualTo("ID, Name")); {
Assert.That(entity.FromClause, Is.EqualTo("Users")); // Assert
Assert.That(entity.WhereClause, Is.EqualTo("Active = 1")); Assert.That(entity.SelectClause, Is.EqualTo("ID, Name"));
Assert.That(entity.OrderByClause, Is.EqualTo("Name ASC")); Assert.That(entity.FromClause, Is.EqualTo("Users"));
Assert.That(entity.WhereClause, Is.EqualTo("Active = 1"));
Assert.That(entity.OrderByClause, Is.EqualTo("Name ASC"));
});
} }
[Test] [Test]
@@ -72,9 +78,12 @@ public class QueryBreakdownMapperTests
// Assert // Assert
Assert.That(queryBreakdown, Is.Not.Null); Assert.That(queryBreakdown, Is.Not.Null);
Assert.That(queryBreakdown.SelectClause?.Clause, Is.EqualTo("ID, Name")); Assert.Multiple(() =>
Assert.That(queryBreakdown.FromClause?.Clause, Is.EqualTo("Users")); {
Assert.That(queryBreakdown.WhereClause?.Clause, Is.EqualTo("Active = 1")); Assert.That(queryBreakdown.SelectClause?.Clause, Is.EqualTo("ID, Name"));
Assert.That(queryBreakdown.FromClause?.Clause, Is.EqualTo("Users"));
Assert.That(queryBreakdown.WhereClause?.Clause, Is.EqualTo("Active = 1"));
});
} }
[Test] [Test]
@@ -110,11 +119,14 @@ public class QueryBreakdownMapperTests
var entity = _mapper.MapToEntity(originalQuery); var entity = _mapper.MapToEntity(originalQuery);
var restoredQuery = _mapper.MapToDomainModel(entity); var restoredQuery = _mapper.MapToDomainModel(entity);
// Assert Assert.Multiple(() =>
Assert.That(restoredQuery.SelectClause?.Clause, Is.EqualTo(originalQuery.SelectClause?.Clause)); {
Assert.That(restoredQuery.FromClause?.Clause, Is.EqualTo(originalQuery.FromClause?.Clause)); // Assert
Assert.That(restoredQuery.WhereClause?.Clause, Is.EqualTo(originalQuery.WhereClause?.Clause)); Assert.That(restoredQuery.SelectClause?.Clause, Is.EqualTo(originalQuery.SelectClause?.Clause));
Assert.That(restoredQuery.OrderByClause?.Clause, Is.EqualTo(originalQuery.OrderByClause?.Clause)); Assert.That(restoredQuery.FromClause?.Clause, Is.EqualTo(originalQuery.FromClause?.Clause));
Assert.That(restoredQuery.WhereClause?.Clause, Is.EqualTo(originalQuery.WhereClause?.Clause));
Assert.That(restoredQuery.OrderByClause?.Clause, Is.EqualTo(originalQuery.OrderByClause?.Clause));
});
} }
[Test] [Test]
@@ -127,10 +139,16 @@ public class QueryBreakdownMapperTests
// Act // Act
var (entity, parameters, withClauses) = _mapper.MapToEntityWithRelations(queryBreakdown); var (entity, parameters, withClauses) = _mapper.MapToEntityWithRelations(queryBreakdown);
// Assert Assert.Multiple(() =>
Assert.That(entity, Is.Not.Null); {
Assert.That(parameters, Is.Not.Empty); // Assert
Assert.That(parameters.First().ParameterName, Is.EqualTo("UserId")); Assert.That(entity, Is.Not.Null);
Assert.That(withClauses, Is.Empty); Assert.That(parameters, Is.Not.Empty);
});
Assert.Multiple(() =>
{
Assert.That(parameters.First().ParameterName, Is.EqualTo("UserId"));
Assert.That(withClauses, Is.Empty);
});
} }
} }
@@ -58,8 +58,11 @@ public class QueryBreakdownRepositoryTests
// Assert // Assert
Assert.That(retrieved, Is.Not.Null); Assert.That(retrieved, Is.Not.Null);
Assert.That(retrieved?.SelectClause?.Clause, Is.EqualTo("ID, Name")); Assert.Multiple(() =>
Assert.That(retrieved?.FromClause?.Clause, Is.EqualTo("Users")); {
Assert.That(retrieved?.SelectClause?.Clause, Is.EqualTo("ID, Name"));
Assert.That(retrieved?.FromClause?.Clause, Is.EqualTo("Users"));
});
} }
[Test] [Test]
@@ -117,9 +120,12 @@ public class QueryBreakdownRepositoryTests
bool deleted = await _repository.DeleteAsync(id); bool deleted = await _repository.DeleteAsync(id);
var retrieved = await _repository.GetByIdAsync(id); var retrieved = await _repository.GetByIdAsync(id);
// Assert Assert.Multiple(() =>
Assert.That(deleted, Is.True); {
Assert.That(retrieved, Is.Null); // Assert
Assert.That(deleted, Is.True);
Assert.That(retrieved, Is.Null);
});
} }
[Test] [Test]
@@ -23,9 +23,12 @@ public class LinqQueryBreakdownBuilderTests
// Assert // Assert
Assert.That(breakdown, Is.Not.Null); Assert.That(breakdown, Is.Not.Null);
Assert.That(breakdown.SelectClause.Clause, Contains.Substring("Id")); Assert.Multiple(() =>
Assert.That(breakdown.FromClause.Clause, Is.EqualTo("Users")); {
Assert.That(breakdown.WhereClause.Clause, Is.EqualTo("Age > 18")); Assert.That(breakdown.SelectClause.Clause, Contains.Substring("Id"));
Assert.That(breakdown.FromClause.Clause, Is.EqualTo("Users"));
Assert.That(breakdown.WhereClause.Clause, Is.EqualTo("Age > 18"));
});
} }
[Test] [Test]
@@ -375,13 +378,16 @@ public class LinqQueryBreakdownBuilderTests
.OrderByDescending("AvgSalary") .OrderByDescending("AvgSalary")
.Build(); .Build();
// Assert Assert.Multiple(() =>
Assert.That(breakdown.SelectClause.Clause, Contains.Substring("Department")); {
Assert.That(breakdown.FromClause.Clause, Is.EqualTo("Employees")); // Assert
Assert.That(breakdown.WhereClause.Clause, Is.EqualTo("IsActive = true")); Assert.That(breakdown.SelectClause.Clause, Contains.Substring("Department"));
Assert.That(breakdown.GroupByClause.Clause, Is.EqualTo("Department, Position")); Assert.That(breakdown.FromClause.Clause, Is.EqualTo("Employees"));
Assert.That(breakdown.HavingClause.Clause, Is.EqualTo("COUNT(*) >= 3")); Assert.That(breakdown.WhereClause.Clause, Is.EqualTo("IsActive = true"));
Assert.That(breakdown.OrderByClause.Clause, Is.EqualTo("AvgSalary DESC")); Assert.That(breakdown.GroupByClause.Clause, Is.EqualTo("Department, Position"));
Assert.That(breakdown.HavingClause.Clause, Is.EqualTo("COUNT(*) >= 3"));
Assert.That(breakdown.OrderByClause.Clause, Is.EqualTo("AvgSalary DESC"));
});
} }
[Test] [Test]
@@ -396,10 +402,13 @@ public class LinqQueryBreakdownBuilderTests
.OrderByAscending("Id") .OrderByAscending("Id")
.Build(); .Build();
// Assert Assert.Multiple(() =>
Assert.That(breakdown.SelectClause.Clause, Contains.Substring("Id")); {
Assert.That(breakdown.WhereClause.Clause, Is.EqualTo("IsActive = true")); // Assert
Assert.That(breakdown.OrderByClause.Clause, Is.EqualTo("Id ASC")); Assert.That(breakdown.SelectClause.Clause, Contains.Substring("Id"));
Assert.That(breakdown.WhereClause.Clause, Is.EqualTo("IsActive = true"));
Assert.That(breakdown.OrderByClause.Clause, Is.EqualTo("Id ASC"));
});
} }
#endregion #endregion
@@ -503,9 +512,12 @@ public class LinqQueryBreakdownBuilderTests
.FromTable("Orders"); .FromTable("Orders");
var breakdown2 = builder2.Build(); var breakdown2 = builder2.Build();
// Assert Assert.Multiple(() =>
Assert.That(breakdown1.FromClause.Clause, Is.EqualTo("Users")); {
Assert.That(breakdown2.FromClause.Clause, Is.EqualTo("Orders")); // Assert
Assert.That(breakdown1.FromClause.Clause, Is.EqualTo("Users"));
Assert.That(breakdown2.FromClause.Clause, Is.EqualTo("Orders"));
});
} }
#endregion #endregion
@@ -27,8 +27,11 @@ public class LinqQueryBreakdownTests
// Assert // Assert
Assert.That(breakdown, Is.Not.Null); Assert.That(breakdown, Is.Not.Null);
Assert.That(breakdown.EntityType, Is.EqualTo(typeof(User))); Assert.Multiple(() =>
Assert.That(breakdown.FromClause?.Clause, Does.Contain("User")); {
Assert.That(breakdown.EntityType, Is.EqualTo(typeof(User)));
Assert.That(breakdown.FromClause?.Clause, Does.Contain("User"));
});
} }
[Test] [Test]
@@ -92,10 +95,13 @@ public class LinqQueryBreakdownTests
// Act // Act
var breakdown = LinqQueryBreakdown.Analyze(query); var breakdown = LinqQueryBreakdown.Analyze(query);
// Assert Assert.Multiple(() =>
Assert.That(breakdown.WhereClause?.Clause, Is.Not.Null); {
Assert.That(breakdown.OrderByClause?.Clause, Is.Not.Null); // Assert
Assert.That(breakdown.SelectClause?.Clause, Is.Not.Null); Assert.That(breakdown.WhereClause?.Clause, Is.Not.Null);
Assert.That(breakdown.OrderByClause?.Clause, Is.Not.Null);
Assert.That(breakdown.SelectClause?.Clause, Is.Not.Null);
});
} }
[Test] [Test]
@@ -159,10 +165,13 @@ public class LinqQueryBreakdownTests
// Act // Act
var success = LinqQueryBreakdown.TryAnalyze(query, out var breakdown, out var error); var success = LinqQueryBreakdown.TryAnalyze(query, out var breakdown, out var error);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.True); {
Assert.That(breakdown, Is.Not.Null); // Assert
Assert.That(error, Is.Empty); Assert.That(success, Is.True);
Assert.That(breakdown, Is.Not.Null);
Assert.That(error, Is.Empty);
});
} }
[Test] [Test]
@@ -174,9 +183,12 @@ public class LinqQueryBreakdownTests
// Act // Act
var success = LinqQueryBreakdown.TryAnalyze(query!, out var breakdown, out var error); var success = LinqQueryBreakdown.TryAnalyze(query!, out var breakdown, out var error);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.False); {
Assert.That(error, Is.Not.Empty); // Assert
Assert.That(success, Is.False);
Assert.That(error, Is.Not.Empty);
});
} }
[Test] [Test]
@@ -194,10 +206,16 @@ public class LinqQueryBreakdownTests
// Assert // Assert
Assert.That(breakdown.SelectClause?.Clause, Does.Contain("Id")); Assert.That(breakdown.SelectClause?.Clause, Does.Contain("Id"));
Assert.That(breakdown.SelectClause?.Clause, Does.Contain("Name")); Assert.That(breakdown.SelectClause?.Clause, Does.Contain("Name"));
Assert.That(breakdown.SelectClause?.Clause, Does.Contain("Email")); Assert.Multiple(() =>
Assert.That(breakdown.WhereClause?.Clause, Does.Contain("Age")); {
Assert.That(breakdown.WhereClause?.Clause, Does.Contain("IsActive")); Assert.That(breakdown.SelectClause?.Clause, Does.Contain("Email"));
Assert.That(breakdown.OrderByClause?.Clause, Does.Contain("Name")); Assert.That(breakdown.WhereClause?.Clause, Does.Contain("Age"));
});
Assert.Multiple(() =>
{
Assert.That(breakdown.WhereClause?.Clause, Does.Contain("IsActive"));
Assert.That(breakdown.OrderByClause?.Clause, Does.Contain("Name"));
});
} }
#region Round-Trip and Query Modification Tests #region Round-Trip and Query Modification Tests
@@ -278,9 +296,12 @@ public class LinqQueryBreakdownTests
var activeSql = activeBreakdown.GetSql(); var activeSql = activeBreakdown.GetSql();
var recentSql = recentBreakdown.GetSql(); var recentSql = recentBreakdown.GetSql();
// Assert - Both queries are valid and different Assert.Multiple(() =>
Assert.That(activeSql, Does.Contain("IsActive")); {
Assert.That(recentSql, Does.Contain("Age")); // Assert - Both queries are valid and different
Assert.That(activeSql, Does.Contain("IsActive"));
Assert.That(recentSql, Does.Contain("Age"));
});
Assert.That(activeSql, Is.Not.EqualTo(recentSql)); Assert.That(activeSql, Is.Not.EqualTo(recentSql));
} }
@@ -328,8 +349,11 @@ public class LinqQueryBreakdownTests
// Assert // Assert
Assert.That(paginatedSql, Does.Contain("ORDER BY")); Assert.That(paginatedSql, Does.Contain("ORDER BY"));
Assert.That(paginatedSql, Does.Contain("Id ASC")); Assert.Multiple(() =>
Assert.That(breakdown.SetupClauses, Has.Count.EqualTo(1)); {
Assert.That(paginatedSql, Does.Contain("Id ASC"));
Assert.That(breakdown.SetupClauses, Has.Count.EqualTo(1));
});
} }
[Test] [Test]
@@ -351,12 +375,15 @@ public class LinqQueryBreakdownTests
var hasOrdering = !string.IsNullOrEmpty(breakdown.OrderByClause?.Clause); var hasOrdering = !string.IsNullOrEmpty(breakdown.OrderByClause?.Clause);
var summary = breakdown.GetQuerySummary(); var summary = breakdown.GetQuerySummary();
// Assert - Verify analytics Assert.Multiple(() =>
Assert.That(methodCount, Is.GreaterThan(0)); {
Assert.That(hasProjection, Is.True); // Assert - Verify analytics
Assert.That(hasFilters, Is.True); Assert.That(methodCount, Is.GreaterThan(0));
Assert.That(hasOrdering, Is.True); Assert.That(hasProjection, Is.True);
Assert.That(summary, Does.Contain("SELECT")); Assert.That(hasFilters, Is.True);
Assert.That(hasOrdering, Is.True);
Assert.That(summary, Does.Contain("SELECT"));
});
Assert.That(summary, Does.Contain("WHERE")); Assert.That(summary, Does.Contain("WHERE"));
Assert.That(summary, Does.Contain("ORDER BY")); Assert.That(summary, Does.Contain("ORDER BY"));
} }
@@ -523,9 +550,12 @@ public class GetQueryTests
var linqResult = linqBreakdown.GetQuery<User>(); var linqResult = linqBreakdown.GetQuery<User>();
var sqlResult = sqlBreakdown.GetQuery<User>(); var sqlResult = sqlBreakdown.GetQuery<User>();
// Assert Assert.Multiple(() =>
Assert.That(linqResult, Is.Null); {
Assert.That(sqlResult, Is.Null); // Assert
Assert.That(linqResult, Is.Null);
Assert.That(sqlResult, Is.Null);
});
} }
#endregion #endregion
@@ -543,9 +573,12 @@ public class GetQueryTests
// Assert // Assert
Assert.That(breakdown, Is.Not.Null); Assert.That(breakdown, Is.Not.Null);
Assert.That(breakdown.TableName.Clause, Is.EqualTo("User")); Assert.Multiple(() =>
Assert.That(breakdown.InsertIntoClause.Clause, Is.Not.Empty); {
Assert.That(breakdown.ValuesClause.Clause, Is.Not.Empty); Assert.That(breakdown.TableName.Clause, Is.EqualTo("User"));
Assert.That(breakdown.InsertIntoClause.Clause, Is.Not.Empty);
Assert.That(breakdown.ValuesClause.Clause, Is.Not.Empty);
});
Assert.That(breakdown.InsertIntoClause.Clause, Does.Contain("Id")); Assert.That(breakdown.InsertIntoClause.Clause, Does.Contain("Id"));
Assert.That(breakdown.InsertIntoClause.Clause, Does.Contain("Name")); Assert.That(breakdown.InsertIntoClause.Clause, Does.Contain("Name"));
} }
@@ -565,9 +598,12 @@ public class GetQueryTests
// Assert // Assert
Assert.That(breakdown, Is.Not.Null); Assert.That(breakdown, Is.Not.Null);
Assert.That(breakdown.TableName.Clause, Is.EqualTo("User")); Assert.Multiple(() =>
Assert.That(breakdown.InsertIntoClause.Clause, Is.Not.Empty); {
Assert.That(breakdown.ValuesClause.Clause, Does.Contain("(")); Assert.That(breakdown.TableName.Clause, Is.EqualTo("User"));
Assert.That(breakdown.InsertIntoClause.Clause, Is.Not.Empty);
Assert.That(breakdown.ValuesClause.Clause, Does.Contain("("));
});
} }
[Test] [Test]
@@ -690,8 +726,11 @@ public class GetQueryTests
// Assert // Assert
Assert.That(breakdown, Is.Not.Null); Assert.That(breakdown, Is.Not.Null);
Assert.That(breakdown.ProcedureName.Clause, Is.EqualTo(procName)); Assert.Multiple(() =>
Assert.That(breakdown.Parameters, Is.Not.Empty); {
Assert.That(breakdown.ProcedureName.Clause, Is.EqualTo(procName));
Assert.That(breakdown.Parameters, Is.Not.Empty);
});
Assert.That(breakdown.Parameters, Has.Count.EqualTo(2)); Assert.That(breakdown.Parameters, Has.Count.EqualTo(2));
} }
@@ -763,10 +802,13 @@ public class GetQueryTests
// Assert // Assert
Assert.That(sqlServerBreakdown, Is.Not.Null); Assert.That(sqlServerBreakdown, Is.Not.Null);
Assert.That(sqlServerBreakdown.SelectClause?.Clause, Is.EqualTo(breakdown.SelectClause?.Clause)); Assert.Multiple(() =>
Assert.That(sqlServerBreakdown.FromClause?.Clause, Is.EqualTo(breakdown.FromClause?.Clause)); {
Assert.That(sqlServerBreakdown.WhereClause?.Clause, Is.EqualTo(breakdown.WhereClause?.Clause)); Assert.That(sqlServerBreakdown.SelectClause?.Clause, Is.EqualTo(breakdown.SelectClause?.Clause));
Assert.That(sqlServerBreakdown.OrderByClause?.Clause, Is.EqualTo(breakdown.OrderByClause?.Clause)); Assert.That(sqlServerBreakdown.FromClause?.Clause, Is.EqualTo(breakdown.FromClause?.Clause));
Assert.That(sqlServerBreakdown.WhereClause?.Clause, Is.EqualTo(breakdown.WhereClause?.Clause));
Assert.That(sqlServerBreakdown.OrderByClause?.Clause, Is.EqualTo(breakdown.OrderByClause?.Clause));
});
} }
[Test] [Test]
@@ -784,10 +826,13 @@ public class GetQueryTests
// Assert // Assert
Assert.That(postgresBreakdown, Is.Not.Null); Assert.That(postgresBreakdown, Is.Not.Null);
Assert.That(postgresBreakdown.SelectClause?.Clause, Is.EqualTo(breakdown.SelectClause?.Clause)); Assert.Multiple(() =>
Assert.That(postgresBreakdown.FromClause?.Clause, Is.EqualTo(breakdown.FromClause?.Clause)); {
Assert.That(postgresBreakdown.WhereClause?.Clause, Is.EqualTo(breakdown.WhereClause?.Clause)); Assert.That(postgresBreakdown.SelectClause?.Clause, Is.EqualTo(breakdown.SelectClause?.Clause));
Assert.That(postgresBreakdown.OrderByClause?.Clause, Is.EqualTo(breakdown.OrderByClause?.Clause)); Assert.That(postgresBreakdown.FromClause?.Clause, Is.EqualTo(breakdown.FromClause?.Clause));
Assert.That(postgresBreakdown.WhereClause?.Clause, Is.EqualTo(breakdown.WhereClause?.Clause));
Assert.That(postgresBreakdown.OrderByClause?.Clause, Is.EqualTo(breakdown.OrderByClause?.Clause));
});
} }
[Test] [Test]
@@ -802,10 +847,13 @@ public class GetQueryTests
// Assert // Assert
Assert.That(snowflakeBreakdown, Is.Not.Null); Assert.That(snowflakeBreakdown, Is.Not.Null);
Assert.That(snowflakeBreakdown.SelectClause?.Clause, Is.EqualTo(breakdown.SelectClause?.Clause)); Assert.Multiple(() =>
Assert.That(snowflakeBreakdown.FromClause?.Clause, Is.EqualTo(breakdown.FromClause?.Clause)); {
Assert.That(snowflakeBreakdown.WhereClause?.Clause, Is.EqualTo(breakdown.WhereClause?.Clause)); Assert.That(snowflakeBreakdown.SelectClause?.Clause, Is.EqualTo(breakdown.SelectClause?.Clause));
Assert.That(snowflakeBreakdown.OrderByClause?.Clause, Is.EqualTo(breakdown.OrderByClause?.Clause)); Assert.That(snowflakeBreakdown.FromClause?.Clause, Is.EqualTo(breakdown.FromClause?.Clause));
Assert.That(snowflakeBreakdown.WhereClause?.Clause, Is.EqualTo(breakdown.WhereClause?.Clause));
Assert.That(snowflakeBreakdown.OrderByClause?.Clause, Is.EqualTo(breakdown.OrderByClause?.Clause));
});
} }
[Test] [Test]
@@ -819,9 +867,12 @@ public class GetQueryTests
// Act // Act
var sqlServerBreakdown = breakdown.ConvertToSqlServerBreakdown(); var sqlServerBreakdown = breakdown.ConvertToSqlServerBreakdown();
// Assert Assert.Multiple(() =>
Assert.That(sqlServerBreakdown.SelectClause?.Comment, Is.EqualTo("Select user columns")); {
Assert.That(sqlServerBreakdown.WhereClause?.Comment, Is.EqualTo("Filter adult users")); // Assert
Assert.That(sqlServerBreakdown.SelectClause?.Comment, Is.EqualTo("Select user columns"));
Assert.That(sqlServerBreakdown.WhereClause?.Comment, Is.EqualTo("Filter adult users"));
});
} }
[Test] [Test]
@@ -837,12 +888,15 @@ public class GetQueryTests
// Act // Act
var postgresBreakdown = breakdown.ConvertToPostgreSqlBreakdown(); var postgresBreakdown = breakdown.ConvertToPostgreSqlBreakdown();
// Assert Assert.Multiple(() =>
Assert.That(postgresBreakdown.SelectClause?.Clause, Is.Not.Null); {
Assert.That(postgresBreakdown.FromClause?.Clause, Is.Not.Null); // Assert
Assert.That(postgresBreakdown.WhereClause?.Clause, Is.Not.Null); Assert.That(postgresBreakdown.SelectClause?.Clause, Is.Not.Null);
Assert.That(postgresBreakdown.GroupByClause?.Clause, Is.Not.Null); Assert.That(postgresBreakdown.FromClause?.Clause, Is.Not.Null);
Assert.That(postgresBreakdown.OrderByClause?.Clause, Is.Not.Null); Assert.That(postgresBreakdown.WhereClause?.Clause, Is.Not.Null);
Assert.That(postgresBreakdown.GroupByClause?.Clause, Is.Not.Null);
Assert.That(postgresBreakdown.OrderByClause?.Clause, Is.Not.Null);
});
} }
[Test] [Test]
@@ -854,9 +908,12 @@ public class GetQueryTests
// Act // Act
var snowflakeBreakdown = breakdown.ConvertToSnowflakeBreakdown(); var snowflakeBreakdown = breakdown.ConvertToSnowflakeBreakdown();
// Assert Assert.Multiple(() =>
Assert.That(snowflakeBreakdown.FromClause?.Clause, Is.EqualTo(breakdown.FromClause?.Clause)); {
Assert.That(snowflakeBreakdown.OrderByClause?.Clause, Is.EqualTo(breakdown.OrderByClause?.Clause)); // Assert
Assert.That(snowflakeBreakdown.FromClause?.Clause, Is.EqualTo(breakdown.FromClause?.Clause));
Assert.That(snowflakeBreakdown.OrderByClause?.Clause, Is.EqualTo(breakdown.OrderByClause?.Clause));
});
} }
[Test] [Test]
@@ -21,8 +21,11 @@ public class LinqQueryBreakdownWithClauseTests
// Assert // Assert
Assert.That(mainQuery.WithClauses, Has.Count.EqualTo(1)); Assert.That(mainQuery.WithClauses, Has.Count.EqualTo(1));
Assert.That(mainQuery.WithClauses[0].TableName, Is.EqualTo("active_users")); Assert.Multiple(() =>
Assert.That(mainQuery.WithClauses[0].Query, Is.EqualTo(cte)); {
Assert.That(mainQuery.WithClauses[0].TableName, Is.EqualTo("active_users"));
Assert.That(mainQuery.WithClauses[0].Query, Is.EqualTo(cte));
});
} }
[Test] [Test]
@@ -81,8 +84,11 @@ public class LinqQueryBreakdownWithClauseTests
// Assert // Assert
var keys = merged.Keys.ToList(); var keys = merged.Keys.ToList();
Assert.That(keys.Any(k => k.Contains("Status")), "Should include CTE parameters"); Assert.Multiple(() =>
Assert.That(keys.Any(k => k.Contains("Limit")), "Should include main query parameters"); {
Assert.That(keys.Any(k => k.Contains("Status")), "Should include CTE parameters");
Assert.That(keys.Any(k => k.Contains("Limit")), "Should include main query parameters");
});
} }
[Test] [Test]
@@ -101,8 +107,11 @@ public class LinqQueryBreakdownWithClauseTests
// Assert // Assert
var valueKey = merged.Keys.FirstOrDefault(k => k.Contains("Value")); var valueKey = merged.Keys.FirstOrDefault(k => k.Contains("Value"));
Assert.That(valueKey, Is.Not.Null, "Should have a Value parameter"); Assert.Multiple(() =>
Assert.That(merged[valueKey], Is.EqualTo("main_value"), "Main query parameter should take precedence"); {
Assert.That(valueKey, Is.Not.Null, "Should have a Value parameter");
Assert.That(merged[valueKey], Is.EqualTo("main_value"), "Main query parameter should take precedence");
});
} }
#endregion #endregion
@@ -152,8 +161,11 @@ public class LinqQueryBreakdownWithClauseTests
// Assert // Assert
Assert.That(query.WithClauses, Has.Count.EqualTo(2)); Assert.That(query.WithClauses, Has.Count.EqualTo(2));
var keys = merged.Keys.ToList(); var keys = merged.Keys.ToList();
Assert.That(keys.Any(k => k.Contains("MinDate"))); Assert.Multiple(() =>
Assert.That(keys.Any(k => k.Contains("Status"))); {
Assert.That(keys.Any(k => k.Contains("MinDate")));
Assert.That(keys.Any(k => k.Contains("Status")));
});
} }
#endregion #endregion
@@ -213,9 +225,12 @@ public class LinqQueryBreakdownWithClauseTests
// Assert // Assert
var keys = merged.Keys.ToList(); var keys = merged.Keys.ToList();
Assert.That(keys.Any(k => k.Contains("AnchorLevel")), "Should include anchor parameters"); Assert.Multiple(() =>
Assert.That(keys.Any(k => k.Contains("MaxLevel")), "Should include recursive parameters"); {
Assert.That(keys.Any(k => k.Contains("QueryLimit")), "Should include main query parameters"); Assert.That(keys.Any(k => k.Contains("AnchorLevel")), "Should include anchor parameters");
Assert.That(keys.Any(k => k.Contains("MaxLevel")), "Should include recursive parameters");
Assert.That(keys.Any(k => k.Contains("QueryLimit")), "Should include main query parameters");
});
} }
#endregion #endregion
@@ -279,10 +294,13 @@ public class LinqQueryBreakdownWithClauseTests
// Assert // Assert
var keys = merged.Keys.ToList(); var keys = merged.Keys.ToList();
Assert.That(keys.Any(k => k.Contains("InnerParam"))); Assert.Multiple(() =>
Assert.That(keys.Any(k => k.Contains("OuterParam"))); {
Assert.That(keys.Any(k => k.Contains("MainParam"))); Assert.That(keys.Any(k => k.Contains("InnerParam")));
Assert.That(sql, Contains.Substring("WITH")); Assert.That(keys.Any(k => k.Contains("OuterParam")));
Assert.That(keys.Any(k => k.Contains("MainParam")));
Assert.That(sql, Contains.Substring("WITH"));
});
} }
#endregion #endregion
@@ -19,10 +19,13 @@ public class QueryCollectionAnalyzerTests
// Act // Act
var stats = analyzer.Analyze(); var stats = analyzer.Analyze();
// Assert Assert.Multiple(() =>
Assert.That(stats.TotalQueries, Is.EqualTo(0)); {
Assert.That(stats.UniqueQueries, Is.EqualTo(0)); // Assert
Assert.That(stats.DuplicateQueries, Is.Empty); Assert.That(stats.TotalQueries, Is.EqualTo(0));
Assert.That(stats.UniqueQueries, Is.EqualTo(0));
Assert.That(stats.DuplicateQueries, Is.Empty);
});
} }
[Test] [Test]
@@ -43,10 +46,13 @@ public class QueryCollectionAnalyzerTests
// Act // Act
var stats = analyzer.Analyze(); var stats = analyzer.Analyze();
// Assert Assert.Multiple(() =>
Assert.That(stats.TotalQueries, Is.EqualTo(1)); {
Assert.That(stats.UniqueQueries, Is.EqualTo(1)); // Assert
Assert.That(stats.DuplicateQueries, Is.Empty); Assert.That(stats.TotalQueries, Is.EqualTo(1));
Assert.That(stats.UniqueQueries, Is.EqualTo(1));
Assert.That(stats.DuplicateQueries, Is.Empty);
});
} }
[Test] [Test]
@@ -77,10 +83,13 @@ public class QueryCollectionAnalyzerTests
// Act // Act
var stats = analyzer.Analyze(); var stats = analyzer.Analyze();
// Assert Assert.Multiple(() =>
Assert.That(stats.TotalQueries, Is.EqualTo(3)); {
Assert.That(stats.UniqueQueries, Is.EqualTo(1)); // Assert
Assert.That(stats.DuplicateQueries, Has.Count.EqualTo(2)); Assert.That(stats.TotalQueries, Is.EqualTo(3));
Assert.That(stats.UniqueQueries, Is.EqualTo(1));
Assert.That(stats.DuplicateQueries, Has.Count.EqualTo(2));
});
} }
#endregion #endregion
@@ -207,9 +216,12 @@ public class QueryCollectionAnalyzerTests
// Act // Act
var stats = analyzer.Analyze(); var stats = analyzer.Analyze();
// Assert Assert.Multiple(() =>
Assert.That(stats.TableUsageFrequency["Users"], Is.EqualTo(3)); {
Assert.That(stats.TableUsageFrequency["Orders"], Is.EqualTo(1)); // Assert
Assert.That(stats.TableUsageFrequency["Users"], Is.EqualTo(3));
Assert.That(stats.TableUsageFrequency["Orders"], Is.EqualTo(1));
});
} }
[Test] [Test]
@@ -246,11 +258,14 @@ public class QueryCollectionAnalyzerTests
// Act // Act
var stats = analyzer.Analyze(); var stats = analyzer.Analyze();
// Assert Assert.Multiple(() =>
Assert.That(stats.ColumnSelectionFrequency.ContainsKey("Id"), Is.True); {
Assert.That(stats.ColumnSelectionFrequency["Id"], Is.EqualTo(3)); // Assert
Assert.That(stats.ColumnSelectionFrequency["Name"], Is.EqualTo(2)); Assert.That(stats.ColumnSelectionFrequency.ContainsKey("Id"), Is.True);
Assert.That(stats.ColumnSelectionFrequency["Email"], Is.EqualTo(1)); Assert.That(stats.ColumnSelectionFrequency["Id"], Is.EqualTo(3));
Assert.That(stats.ColumnSelectionFrequency["Name"], Is.EqualTo(2));
Assert.That(stats.ColumnSelectionFrequency["Email"], Is.EqualTo(1));
});
} }
[Test] [Test]
@@ -267,9 +282,12 @@ public class QueryCollectionAnalyzerTests
// Act // Act
var stats = analyzer.Analyze(); var stats = analyzer.Analyze();
// Assert Assert.Multiple(() =>
Assert.That(stats.ColumnSelectionFrequency.ContainsKey("*"), Is.False); {
Assert.That(stats.ColumnSelectionFrequency["Id"], Is.EqualTo(1)); // Assert
Assert.That(stats.ColumnSelectionFrequency.ContainsKey("*"), Is.False);
Assert.That(stats.ColumnSelectionFrequency["Id"], Is.EqualTo(1));
});
} }
#endregion #endregion
@@ -488,9 +506,12 @@ public class QueryCollectionAnalyzerTests
// Act // Act
var stats = analyzer.Analyze(); var stats = analyzer.Analyze();
// Assert Assert.Multiple(() =>
Assert.That(stats.TotalQueries, Is.EqualTo(100)); {
Assert.That(stats.UniqueQueries, Is.EqualTo(1)); // Assert
Assert.That(stats.TotalQueries, Is.EqualTo(100));
Assert.That(stats.UniqueQueries, Is.EqualTo(1));
});
} }
#endregion #endregion
@@ -62,9 +62,12 @@ public class QueryValidatorTests
validator.Validate(breakdown2); validator.Validate(breakdown2);
var count2 = validator.Issues.Count; var count2 = validator.Issues.Count;
// Assert Assert.Multiple(() =>
Assert.That(count1, Is.GreaterThan(0)); {
Assert.That(count2, Is.GreaterThan(0)); // Assert
Assert.That(count1, Is.GreaterThan(0));
Assert.That(count2, Is.GreaterThan(0));
});
} }
#endregion #endregion
@@ -324,10 +327,13 @@ public class QueryValidatorTests
var infos = validator.GetIssuesBySeverity(ValidationSeverity.Info); var infos = validator.GetIssuesBySeverity(ValidationSeverity.Info);
var errors = validator.GetIssuesBySeverity(ValidationSeverity.Error); var errors = validator.GetIssuesBySeverity(ValidationSeverity.Error);
// Assert Assert.Multiple(() =>
Assert.That(warnings, Is.Not.Empty); {
Assert.That(infos, Is.Not.Empty); // Assert
Assert.That(errors, Is.Empty); Assert.That(warnings, Is.Not.Empty);
Assert.That(infos, Is.Not.Empty);
Assert.That(errors, Is.Empty);
});
} }
#endregion #endregion
@@ -349,8 +355,11 @@ public class QueryValidatorTests
// Assert // Assert
Assert.That(validator.Issues, Has.Count.EqualTo(1)); Assert.That(validator.Issues, Has.Count.EqualTo(1));
Assert.That(validator.Issues[0].Code, Is.EqualTo("CUSTOM_001")); Assert.Multiple(() =>
Assert.That(validator.HasErrors, Is.True); {
Assert.That(validator.Issues[0].Code, Is.EqualTo("CUSTOM_001"));
Assert.That(validator.HasErrors, Is.True);
});
} }
[Test] [Test]
@@ -365,9 +374,12 @@ public class QueryValidatorTests
.AddIssue(ValidationSeverity.Warning, "WARN_001", "Warning 1") .AddIssue(ValidationSeverity.Warning, "WARN_001", "Warning 1")
.AddIssue(ValidationSeverity.Info, "INFO_001", "Info 1"); .AddIssue(ValidationSeverity.Info, "INFO_001", "Info 1");
// Assert Assert.Multiple(() =>
Assert.That(result, Is.SameAs(validator)); {
Assert.That(validator.Issues, Has.Count.EqualTo(3)); // Assert
Assert.That(result, Is.SameAs(validator));
Assert.That(validator.Issues, Has.Count.EqualTo(3));
});
} }
#endregion #endregion
@@ -480,9 +492,12 @@ public class QueryValidatorTests
// Act // Act
var validator = QueryValidator.ValidateQuery(breakdown); var validator = QueryValidator.ValidateQuery(breakdown);
// Assert Assert.Multiple(() =>
Assert.That(validator.Issues.Count, Is.GreaterThan(1)); {
Assert.That(validator.HasWarnings, Is.True); // Assert
Assert.That(validator.Issues.Count, Is.GreaterThan(1));
Assert.That(validator.HasWarnings, Is.True);
});
} }
[Test] [Test]
@@ -27,10 +27,13 @@ public class ReverseConverterTests
// Assert // Assert
Assert.That(linqBreakdown, Is.Not.Null); Assert.That(linqBreakdown, Is.Not.Null);
Assert.That(linqBreakdown.SelectClause.Clause, Contains.Substring("Id")); Assert.Multiple(() =>
Assert.That(linqBreakdown.FromClause.Clause, Is.EqualTo("Users")); {
Assert.That(linqBreakdown.WhereClause.Clause, Is.EqualTo("IsActive = 1")); Assert.That(linqBreakdown.SelectClause.Clause, Contains.Substring("Id"));
Assert.That(linqBreakdown.OrderByClause.Clause, Is.EqualTo("Name ASC")); Assert.That(linqBreakdown.FromClause.Clause, Is.EqualTo("Users"));
Assert.That(linqBreakdown.WhereClause.Clause, Is.EqualTo("IsActive = 1"));
Assert.That(linqBreakdown.OrderByClause.Clause, Is.EqualTo("Name ASC"));
});
} }
[Test] [Test]
@@ -46,9 +49,12 @@ public class ReverseConverterTests
// Act // Act
var linqBreakdown = sqlServerBreakdown.ToLinqQueryBreakdown(); var linqBreakdown = sqlServerBreakdown.ToLinqQueryBreakdown();
// Assert Assert.Multiple(() =>
Assert.That(linqBreakdown.GroupByClause.Clause, Is.EqualTo("Department")); {
Assert.That(linqBreakdown.HavingClause.Clause, Is.EqualTo("COUNT(*) > 5")); // Assert
Assert.That(linqBreakdown.GroupByClause.Clause, Is.EqualTo("Department"));
Assert.That(linqBreakdown.HavingClause.Clause, Is.EqualTo("COUNT(*) > 5"));
});
} }
[Test] [Test]
@@ -81,9 +87,12 @@ public class ReverseConverterTests
// Assert // Assert
Assert.That(linqBreakdown, Is.Not.Null); Assert.That(linqBreakdown, Is.Not.Null);
Assert.That(linqBreakdown.SelectClause.Clause, Contains.Substring("user_id")); Assert.Multiple(() =>
Assert.That(linqBreakdown.FromClause.Clause, Is.EqualTo("users")); {
Assert.That(linqBreakdown.WhereClause.Clause, Is.EqualTo("is_active = true")); Assert.That(linqBreakdown.SelectClause.Clause, Contains.Substring("user_id"));
Assert.That(linqBreakdown.FromClause.Clause, Is.EqualTo("users"));
Assert.That(linqBreakdown.WhereClause.Clause, Is.EqualTo("is_active = true"));
});
} }
[Test] [Test]
@@ -116,9 +125,12 @@ public class ReverseConverterTests
// Assert // Assert
Assert.That(linqBreakdown, Is.Not.Null); Assert.That(linqBreakdown, Is.Not.Null);
Assert.That(linqBreakdown.SelectClause.Clause, Contains.Substring("USER_ID")); Assert.Multiple(() =>
Assert.That(linqBreakdown.FromClause.Clause, Is.EqualTo("USERS")); {
Assert.That(linqBreakdown.WhereClause.Clause, Is.EqualTo("IS_ACTIVE = TRUE")); Assert.That(linqBreakdown.SelectClause.Clause, Contains.Substring("USER_ID"));
Assert.That(linqBreakdown.FromClause.Clause, Is.EqualTo("USERS"));
Assert.That(linqBreakdown.WhereClause.Clause, Is.EqualTo("IS_ACTIVE = TRUE"));
});
} }
[Test] [Test]
@@ -252,10 +264,13 @@ public class ReverseConverterTests
var result2 = sqlServerBreakdown.ConvertToDialect("POSTGRESQL"); var result2 = sqlServerBreakdown.ConvertToDialect("POSTGRESQL");
var result3 = sqlServerBreakdown.ConvertToDialect("postgresql"); var result3 = sqlServerBreakdown.ConvertToDialect("postgresql");
// Assert Assert.Multiple(() =>
Assert.That(result1, Is.TypeOf<PostgreSqlBreakdown>()); {
Assert.That(result2, Is.TypeOf<PostgreSqlBreakdown>()); // Assert
Assert.That(result3, Is.TypeOf<PostgreSqlBreakdown>()); Assert.That(result1, Is.TypeOf<PostgreSqlBreakdown>());
Assert.That(result2, Is.TypeOf<PostgreSqlBreakdown>());
Assert.That(result3, Is.TypeOf<PostgreSqlBreakdown>());
});
} }
#endregion #endregion
@@ -281,10 +296,13 @@ public class ReverseConverterTests
var backToLinq2 = toPostgres!.ToLinqQueryBreakdown(); var backToLinq2 = toPostgres!.ToLinqQueryBreakdown();
var finalToSqlServer = backToLinq2.ConvertToSqlServerBreakdown(); var finalToSqlServer = backToLinq2.ConvertToSqlServerBreakdown();
// Assert - Check that clauses are preserved Assert.Multiple(() =>
Assert.That(backToLinq.SelectClause.Clause, Contains.Substring("Id")); {
Assert.That(backToLinq.FromClause.Clause, Is.EqualTo("Users")); // Assert - Check that clauses are preserved
Assert.That(backToLinq.WhereClause.Clause, Is.EqualTo("IsActive = true")); Assert.That(backToLinq.SelectClause.Clause, Contains.Substring("Id"));
Assert.That(backToLinq.FromClause.Clause, Is.EqualTo("Users"));
Assert.That(backToLinq.WhereClause.Clause, Is.EqualTo("IsActive = true"));
});
} }
#endregion #endregion
@@ -333,11 +351,14 @@ public class ReverseConverterTests
var resultSqlServer1 = sqlServerBreakdown.ConvertToDialect("sqlserver"); var resultSqlServer1 = sqlServerBreakdown.ConvertToDialect("sqlserver");
var resultSqlServer2 = sqlServerBreakdown.ConvertToDialect("sql_server"); var resultSqlServer2 = sqlServerBreakdown.ConvertToDialect("sql_server");
// Assert Assert.Multiple(() =>
Assert.That(resultPostgres1, Is.TypeOf<PostgreSqlBreakdown>()); {
Assert.That(resultPostgres2, Is.TypeOf<PostgreSqlBreakdown>()); // Assert
Assert.That(resultSqlServer1, Is.SameAs(sqlServerBreakdown)); Assert.That(resultPostgres1, Is.TypeOf<PostgreSqlBreakdown>());
Assert.That(resultSqlServer2, Is.SameAs(sqlServerBreakdown)); Assert.That(resultPostgres2, Is.TypeOf<PostgreSqlBreakdown>());
Assert.That(resultSqlServer1, Is.SameAs(sqlServerBreakdown));
Assert.That(resultSqlServer2, Is.SameAs(sqlServerBreakdown));
});
} }
#endregion #endregion
@@ -20,9 +20,12 @@ public class CTEColumnListTests
// Act & Assert // Act & Assert
Assert.That(withClause.ColumnList, Has.Count.EqualTo(3)); Assert.That(withClause.ColumnList, Has.Count.EqualTo(3));
Assert.That(withClause.ColumnList[0], Is.EqualTo("user_id")); Assert.Multiple(() =>
Assert.That(withClause.ColumnList[1], Is.EqualTo("user_name")); {
Assert.That(withClause.ColumnList[2], Is.EqualTo("user_email")); Assert.That(withClause.ColumnList[0], Is.EqualTo("user_id"));
Assert.That(withClause.ColumnList[1], Is.EqualTo("user_name"));
Assert.That(withClause.ColumnList[2], Is.EqualTo("user_email"));
});
} }
[Test] [Test]
@@ -269,8 +272,11 @@ public class CTEColumnListTests
// Assert // Assert
Assert.That(sql, Contains.Substring("customer_transactions (trans_date, prod_id, cust_id, trans_amount, transaction_rank)")); Assert.That(sql, Contains.Substring("customer_transactions (trans_date, prod_id, cust_id, trans_amount, transaction_rank)"));
var paramKeys = params_all.Keys.ToList(); var paramKeys = params_all.Keys.ToList();
Assert.That(paramKeys.Any(k => k.Contains("StartDate"))); Assert.Multiple(() =>
Assert.That(paramKeys.Any(k => k.Contains("MinAmount"))); {
Assert.That(paramKeys.Any(k => k.Contains("StartDate")));
Assert.That(paramKeys.Any(k => k.Contains("MinAmount")));
});
} }
#endregion #endregion
@@ -182,9 +182,12 @@ public class QueryBreakdownCollectionTests
// Act // Act
var result = _collection.ParseBatch(batchSql); var result = _collection.ParseBatch(batchSql);
// Assert Assert.Multiple(() =>
Assert.That(result, Is.True); {
Assert.That(_collection.Count, Is.GreaterThan(0)); // Assert
Assert.That(result, Is.True);
Assert.That(_collection.Count, Is.GreaterThan(0));
});
} }
[Test] [Test]
@@ -199,9 +202,12 @@ public class QueryBreakdownCollectionTests
// Act // Act
var result = _collection.ParseBatch(batchSql); var result = _collection.ParseBatch(batchSql);
// Assert Assert.Multiple(() =>
Assert.That(result, Is.True); {
Assert.That(_collection.Count, Is.GreaterThan(0)); // Assert
Assert.That(result, Is.True);
Assert.That(_collection.Count, Is.GreaterThan(0));
});
} }
[Test] [Test]
@@ -284,8 +290,11 @@ public class QueryBreakdownCollectionTests
// Assert // Assert
Assert.That(sql, Does.Contain("SELECT")); Assert.That(sql, Does.Contain("SELECT"));
Assert.That(sql, Does.Contain(";")); Assert.Multiple(() =>
Assert.That(_collection, Has.Count.EqualTo(3)); {
Assert.That(sql, Does.Contain(";"));
Assert.That(_collection, Has.Count.EqualTo(3));
});
} }
#endregion #endregion
@@ -13,11 +13,14 @@ public class QueryBreakdownTests
// Arrange & Act // Arrange & Act
var queryBreakdown = new QueryBreakdown(); var queryBreakdown = new QueryBreakdown();
// Assert Assert.Multiple(() =>
Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo(string.Empty)); {
Assert.That(queryBreakdown.FromClause.Clause, Is.EqualTo(string.Empty)); // Assert
Assert.That(queryBreakdown.WhereClause.Clause, Is.EqualTo(string.Empty)); Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo(string.Empty));
Assert.That(queryBreakdown.OrderByClause.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));
});
} }
[Test] [Test]
@@ -30,9 +33,12 @@ public class QueryBreakdownTests
// Act // Act
var queryBreakdown = new QueryBreakdown(selectClause, fromClause); var queryBreakdown = new QueryBreakdown(selectClause, fromClause);
// Assert Assert.Multiple(() =>
Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo(selectClause)); {
Assert.That(queryBreakdown.FromClause.Clause, Is.EqualTo(fromClause)); // Assert
Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo(selectClause));
Assert.That(queryBreakdown.FromClause.Clause, Is.EqualTo(fromClause));
});
} }
[Test] [Test]
@@ -46,10 +52,13 @@ public class QueryBreakdownTests
// Act // Act
var queryBreakdown = new QueryBreakdown(selectClause, fromClause, whereClause); var queryBreakdown = new QueryBreakdown(selectClause, fromClause, whereClause);
// Assert Assert.Multiple(() =>
Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo(selectClause)); {
Assert.That(queryBreakdown.FromClause.Clause, Is.EqualTo(fromClause)); // Assert
Assert.That(queryBreakdown.WhereClause.Clause, Is.EqualTo(whereClause)); Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo(selectClause));
Assert.That(queryBreakdown.FromClause.Clause, Is.EqualTo(fromClause));
Assert.That(queryBreakdown.WhereClause.Clause, Is.EqualTo(whereClause));
});
} }
[Test] [Test]
@@ -64,11 +73,14 @@ public class QueryBreakdownTests
// Act // Act
var queryBreakdown = new QueryBreakdown(selectClause, fromClause, whereClause, orderByClause); var queryBreakdown = new QueryBreakdown(selectClause, fromClause, whereClause, orderByClause);
// Assert Assert.Multiple(() =>
Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo(selectClause)); {
Assert.That(queryBreakdown.FromClause.Clause, Is.EqualTo(fromClause)); // Assert
Assert.That(queryBreakdown.WhereClause.Clause, Is.EqualTo(whereClause)); Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo(selectClause));
Assert.That(queryBreakdown.OrderByClause.Clause, Is.EqualTo(orderByClause)); Assert.That(queryBreakdown.FromClause.Clause, Is.EqualTo(fromClause));
Assert.That(queryBreakdown.WhereClause.Clause, Is.EqualTo(whereClause));
Assert.That(queryBreakdown.OrderByClause.Clause, Is.EqualTo(orderByClause));
});
} }
#endregion #endregion
@@ -130,9 +142,12 @@ public class QueryBreakdownTests
// Act // Act
queryBreakdown.AddParameter("userId", 123); queryBreakdown.AddParameter("userId", 123);
// Assert Assert.Multiple(() =>
Assert.That(queryBreakdown.Parameters.ContainsKey("userId"), Is.True); {
Assert.That(queryBreakdown.Parameters["userId"], Is.EqualTo(123)); // Assert
Assert.That(queryBreakdown.Parameters.ContainsKey("userId"), Is.True);
Assert.That(queryBreakdown.Parameters["userId"], Is.EqualTo(123));
});
} }
[Test] [Test]
@@ -148,9 +163,12 @@ public class QueryBreakdownTests
// Assert // Assert
Assert.That(queryBreakdown.Parameters.Count, Is.GreaterThanOrEqualTo(3)); Assert.That(queryBreakdown.Parameters.Count, Is.GreaterThanOrEqualTo(3));
Assert.That(queryBreakdown.Parameters.ContainsKey("param1"), Is.True); Assert.Multiple(() =>
Assert.That(queryBreakdown.Parameters.ContainsKey("param2"), Is.True); {
Assert.That(queryBreakdown.Parameters.ContainsKey("param3"), Is.True); Assert.That(queryBreakdown.Parameters.ContainsKey("param1"), Is.True);
Assert.That(queryBreakdown.Parameters.ContainsKey("param2"), Is.True);
Assert.That(queryBreakdown.Parameters.ContainsKey("param3"), Is.True);
});
} }
[Test] [Test]
@@ -182,8 +200,11 @@ public class QueryBreakdownTests
// Assert // Assert
Assert.That(queryBreakdown, Is.Not.Null); Assert.That(queryBreakdown, Is.Not.Null);
Assert.That(queryBreakdown.SelectClause.Clause, Is.Not.Empty); Assert.Multiple(() =>
Assert.That(queryBreakdown.FromClause.Clause, Is.Not.Empty); {
Assert.That(queryBreakdown.SelectClause.Clause, Is.Not.Empty);
Assert.That(queryBreakdown.FromClause.Clause, Is.Not.Empty);
});
} }
[Test] [Test]
@@ -195,9 +216,12 @@ public class QueryBreakdownTests
// Act // Act
var queryBreakdown = QueryBreakdown.Parse(sql); var queryBreakdown = QueryBreakdown.Parse(sql);
// Assert Assert.Multiple(() =>
Assert.That(queryBreakdown.WhereClause.Clause, Is.Not.Empty); {
Assert.That(queryBreakdown.FromClause.Clause, Does.Contain("users")); // Assert
Assert.That(queryBreakdown.WhereClause.Clause, Is.Not.Empty);
Assert.That(queryBreakdown.FromClause.Clause, Does.Contain("users"));
});
} }
[Test] [Test]
@@ -244,13 +268,16 @@ public class QueryBreakdownTests
// Act // Act
var queryBreakdown = QueryBreakdown.Parse(sql); var queryBreakdown = QueryBreakdown.Parse(sql);
// Assert Assert.Multiple(() =>
Assert.That(queryBreakdown.SelectClause.Clause, Is.Not.Empty); {
Assert.That(queryBreakdown.FromClause.Clause, Is.Not.Empty); // Assert
Assert.That(queryBreakdown.WhereClause.Clause, Is.Not.Empty); Assert.That(queryBreakdown.SelectClause.Clause, Is.Not.Empty);
Assert.That(queryBreakdown.GroupByClause.Clause, Is.Not.Empty); Assert.That(queryBreakdown.FromClause.Clause, Is.Not.Empty);
Assert.That(queryBreakdown.HavingClause.Clause, Is.Not.Empty); Assert.That(queryBreakdown.WhereClause.Clause, Is.Not.Empty);
Assert.That(queryBreakdown.OrderByClause.Clause, Is.Not.Empty); Assert.That(queryBreakdown.GroupByClause.Clause, Is.Not.Empty);
Assert.That(queryBreakdown.HavingClause.Clause, Is.Not.Empty);
Assert.That(queryBreakdown.OrderByClause.Clause, Is.Not.Empty);
});
} }
[Test] [Test]
@@ -262,10 +289,13 @@ public class QueryBreakdownTests
// Act // Act
var success = QueryBreakdown.TryParse(sql, out var queryBreakdown, out var errorMessage); var success = QueryBreakdown.TryParse(sql, out var queryBreakdown, out var errorMessage);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.True); {
Assert.That(queryBreakdown, Is.Not.Null); // Assert
Assert.That(errorMessage, Is.Empty); Assert.That(success, Is.True);
Assert.That(queryBreakdown, Is.Not.Null);
Assert.That(errorMessage, Is.Empty);
});
} }
[Test] [Test]
@@ -277,9 +307,12 @@ public class QueryBreakdownTests
// Act // Act
var success = QueryBreakdown.TryParse(sql, out var queryBreakdown, out var errorMessage); var success = QueryBreakdown.TryParse(sql, out var queryBreakdown, out var errorMessage);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.False); {
Assert.That(errorMessage, Is.Not.Empty); // Assert
Assert.That(success, Is.False);
Assert.That(errorMessage, Is.Not.Empty);
});
} }
#endregion #endregion
@@ -308,9 +341,12 @@ public class QueryBreakdownTests
// Act // Act
var queryBreakdown = QueryBreakdown.Parse(sql); var queryBreakdown = QueryBreakdown.Parse(sql);
// Assert Assert.Multiple(() =>
Assert.That(queryBreakdown.SelectClause.Clause, Is.Not.Empty); {
Assert.That(queryBreakdown.FromClause.Clause, Is.Not.Empty); // Assert
Assert.That(queryBreakdown.SelectClause.Clause, Is.Not.Empty);
Assert.That(queryBreakdown.FromClause.Clause, Is.Not.Empty);
});
} }
[Test] [Test]
@@ -353,9 +389,12 @@ public class QueryBreakdownTests
queryBreakdown.SelectClause.Clause = "id, name"; queryBreakdown.SelectClause.Clause = "id, name";
queryBreakdown.FromClause.Clause = "users"; queryBreakdown.FromClause.Clause = "users";
// Assert Assert.Multiple(() =>
Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo("id, name")); {
Assert.That(queryBreakdown.FromClause.Clause, Is.EqualTo("users")); // Assert
Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo("id, name"));
Assert.That(queryBreakdown.FromClause.Clause, Is.EqualTo("users"));
});
} }
[Test] [Test]
@@ -387,8 +426,11 @@ public class QueryBreakdownTests
// Assert // Assert
Assert.That(mainQuery.WithClauses, Has.Count.EqualTo(1)); Assert.That(mainQuery.WithClauses, Has.Count.EqualTo(1));
Assert.That(mainQuery.WithClauses[0].TableName, Is.EqualTo("active_users_cte")); Assert.Multiple(() =>
Assert.That(mainQuery.WithClauses[0].Query, Is.EqualTo(cte)); {
Assert.That(mainQuery.WithClauses[0].TableName, Is.EqualTo("active_users_cte"));
Assert.That(mainQuery.WithClauses[0].Query, Is.EqualTo(cte));
});
} }
[Test] [Test]
@@ -448,8 +490,11 @@ public class QueryBreakdownTests
// PostgreSQL stores parameters with positional and name-based formats // PostgreSQL stores parameters with positional and name-based formats
Assert.That(merged.Count, Is.GreaterThanOrEqualTo(2)); Assert.That(merged.Count, Is.GreaterThanOrEqualTo(2));
var keys = merged.Keys.ToList(); var keys = merged.Keys.ToList();
Assert.That(keys.Any(k => k.Contains("UserId"))); Assert.Multiple(() =>
Assert.That(keys.Any(k => k.Contains("ActiveStatus"))); {
Assert.That(keys.Any(k => k.Contains("UserId")));
Assert.That(keys.Any(k => k.Contains("ActiveStatus")));
});
} }
[Test] [Test]
@@ -468,8 +513,11 @@ public class QueryBreakdownTests
// Assert // Assert
var keys = merged.Keys.ToList(); var keys = merged.Keys.ToList();
Assert.That(keys.Any(k => k.Contains("MinDate"))); Assert.Multiple(() =>
Assert.That(keys.Any(k => k.Contains("ResultLimit"))); {
Assert.That(keys.Any(k => k.Contains("MinDate")));
Assert.That(keys.Any(k => k.Contains("ResultLimit")));
});
} }
[Test] [Test]
@@ -492,9 +540,12 @@ public class QueryBreakdownTests
// Assert // Assert
var keys = merged.Keys.ToList(); var keys = merged.Keys.ToList();
Assert.That(keys.Any(k => k.Contains("Status1"))); Assert.Multiple(() =>
Assert.That(keys.Any(k => k.Contains("MinDate"))); {
Assert.That(keys.Any(k => k.Contains("ResultLimit"))); 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] [Test]
@@ -514,8 +565,11 @@ public class QueryBreakdownTests
// Assert // Assert
// Find the UserId parameter value // Find the UserId parameter value
var userIdKey = merged.Keys.FirstOrDefault(k => k.Contains("UserId") && !k.Contains('$')); var userIdKey = merged.Keys.FirstOrDefault(k => k.Contains("UserId") && !k.Contains('$'));
Assert.That(userIdKey, Is.Not.Null); Assert.Multiple(() =>
Assert.That(merged[userIdKey], Is.EqualTo(123)); // Main query value, not CTE value {
Assert.That(userIdKey, Is.Not.Null);
Assert.That(merged[userIdKey], Is.EqualTo(123)); // Main query value, not CTE value
});
} }
[Test] [Test]
@@ -538,9 +592,12 @@ public class QueryBreakdownTests
// Assert // Assert
var keys = merged.Keys.ToList(); var keys = merged.Keys.ToList();
Assert.That(keys.Any(k => k.Contains("Status")), "Should include Status from nested CTE"); Assert.Multiple(() =>
Assert.That(keys.Any(k => k.Contains("Level")), "Should include Level from middle CTE"); {
Assert.That(keys.Any(k => k.Contains("Limit")), "Should include Limit from main query"); Assert.That(keys.Any(k => k.Contains("Status")), "Should include Status from nested CTE");
Assert.That(keys.Any(k => k.Contains("Level")), "Should include Level from middle CTE");
Assert.That(keys.Any(k => k.Contains("Limit")), "Should include Limit from main query");
});
} }
[Test] [Test]
@@ -563,14 +620,17 @@ public class QueryBreakdownTests
var boolKey = merged.Keys.FirstOrDefault(k => k.Contains("IsActive") && !k.Contains('$')); var boolKey = merged.Keys.FirstOrDefault(k => k.Contains("IsActive") && !k.Contains('$'));
var doubleKey = merged.Keys.FirstOrDefault(k => k.Contains("Threshold") && !k.Contains('$')); var doubleKey = merged.Keys.FirstOrDefault(k => k.Contains("Threshold") && !k.Contains('$'));
Assert.That(dateKey, Is.Not.Null); Assert.Multiple(() =>
Assert.That(merged[dateKey], Is.TypeOf<DateTime>()); {
Assert.That(dateKey, Is.Not.Null);
Assert.That(merged[dateKey], Is.TypeOf<DateTime>());
Assert.That(boolKey, Is.Not.Null); Assert.That(boolKey, Is.Not.Null);
Assert.That(merged[boolKey], Is.TypeOf<bool>()); Assert.That(merged[boolKey], Is.TypeOf<bool>());
Assert.That(doubleKey, Is.Not.Null); Assert.That(doubleKey, Is.Not.Null);
Assert.That(merged[doubleKey], Is.TypeOf<double>()); Assert.That(merged[doubleKey], Is.TypeOf<double>());
});
} }
#endregion #endregion
@@ -33,9 +33,12 @@ public class RecursiveCTETests
var isRecursive = withClause.IsRecursive; var isRecursive = withClause.IsRecursive;
var hasRecursiveQuery = withClause.RecursiveQuery != null; var hasRecursiveQuery = withClause.RecursiveQuery != null;
// Assert Assert.Multiple(() =>
Assert.That(isRecursive, Is.True); {
Assert.That(hasRecursiveQuery, Is.True); // Assert
Assert.That(isRecursive, Is.True);
Assert.That(hasRecursiveQuery, Is.True);
});
} }
[Test] [Test]
@@ -143,10 +146,13 @@ public class RecursiveCTETests
// Assert // Assert
var keys = merged.Keys.ToList(); var keys = merged.Keys.ToList();
Assert.That(keys.Any(k => k.Contains("AnchorStatus")), "Should include anchor query parameters"); Assert.Multiple(() =>
Assert.That(keys.Any(k => k.Contains("RecursiveLevel")), "Should include recursive query parameters"); {
Assert.That(keys.Any(k => k.Contains("RecursiveStatus")), "Should include recurring query parameters"); Assert.That(keys.Any(k => k.Contains("AnchorStatus")), "Should include anchor query parameters");
Assert.That(keys.Any(k => k.Contains("MainLimit")), "Should include main query parameters"); Assert.That(keys.Any(k => k.Contains("RecursiveLevel")), "Should include recursive query parameters");
Assert.That(keys.Any(k => k.Contains("RecursiveStatus")), "Should include recurring query parameters");
Assert.That(keys.Any(k => k.Contains("MainLimit")), "Should include main query parameters");
});
} }
[Test] [Test]
@@ -176,8 +182,11 @@ public class RecursiveCTETests
// Assert // Assert
// PostgreSQL stores parameters with positional syntax // PostgreSQL stores parameters with positional syntax
var statusKey = merged.Keys.FirstOrDefault(k => k.Contains("Status") && !k.StartsWith('$')); var statusKey = merged.Keys.FirstOrDefault(k => k.Contains("Status") && !k.StartsWith('$'));
Assert.That(statusKey, Is.Not.Null); Assert.Multiple(() =>
Assert.That(merged[statusKey], Is.EqualTo("active"), "Main query parameter should take precedence"); {
Assert.That(statusKey, Is.Not.Null);
Assert.That(merged[statusKey], Is.EqualTo("active"), "Main query parameter should take precedence");
});
} }
#endregion #endregion
@@ -23,9 +23,12 @@ public class StatementReaderTests
// Assert // Assert
Assert.That(tokens, Is.Not.Empty); Assert.That(tokens, Is.Not.Empty);
Assert.That(tokens[0].Type, Is.EqualTo(TokenType.LeftParenthesis)); Assert.Multiple(() =>
Assert.That(tokens[1].Type, Is.EqualTo(TokenType.Number)); {
Assert.That(tokens[1].Value, Is.EqualTo("1")); Assert.That(tokens[0].Type, Is.EqualTo(TokenType.LeftParenthesis));
Assert.That(tokens[1].Type, Is.EqualTo(TokenType.Number));
Assert.That(tokens[1].Value, Is.EqualTo("1"));
});
} }
[Test] [Test]
@@ -44,10 +47,13 @@ public class StatementReaderTests
// Assert // Assert
Assert.That(tokens, Has.Count.EqualTo(5)); // "COLUMN_1" + "COLUMN_2" * 2 Assert.That(tokens, Has.Count.EqualTo(5)); // "COLUMN_1" + "COLUMN_2" * 2
Assert.That(tokens[0].Type, Is.EqualTo(TokenType.ColumnIdentifier)); Assert.Multiple(() =>
Assert.That(tokens[0].Value, Is.EqualTo("COLUMN_1")); {
Assert.That(tokens[1].Type, Is.EqualTo(TokenType.Plus)); Assert.That(tokens[0].Type, Is.EqualTo(TokenType.ColumnIdentifier));
Assert.That(tokens[2].Type, Is.EqualTo(TokenType.ColumnIdentifier)); Assert.That(tokens[0].Value, Is.EqualTo("COLUMN_1"));
Assert.That(tokens[1].Type, Is.EqualTo(TokenType.Plus));
Assert.That(tokens[2].Type, Is.EqualTo(TokenType.ColumnIdentifier));
});
} }
[Test] [Test]
@@ -64,11 +70,14 @@ public class StatementReaderTests
tokens.Add((sqlReader.TokenType, sqlReader.TokenValue)); tokens.Add((sqlReader.TokenType, sqlReader.TokenValue));
} }
// Assert Assert.Multiple(() =>
Assert.That(tokens[0].Type, Is.EqualTo(TokenType.ColumnIdentifier)); {
Assert.That(tokens[0].Value, Is.EqualTo("MyColumn")); // Assert
Assert.That(tokens[2].Type, Is.EqualTo(TokenType.ColumnIdentifier)); Assert.That(tokens[0].Type, Is.EqualTo(TokenType.ColumnIdentifier));
Assert.That(tokens[2].Value, Is.EqualTo("AnotherColumn")); Assert.That(tokens[0].Value, Is.EqualTo("MyColumn"));
Assert.That(tokens[2].Type, Is.EqualTo(TokenType.ColumnIdentifier));
Assert.That(tokens[2].Value, Is.EqualTo("AnotherColumn"));
});
} }
[Test] [Test]
@@ -89,8 +98,11 @@ public class StatementReaderTests
Assert.That(tokens.Count, Is.GreaterThan(0)); Assert.That(tokens.Count, Is.GreaterThan(0));
var paramTokens = tokens.Where(t => t.Type == TokenType.Parameter).ToList(); var paramTokens = tokens.Where(t => t.Type == TokenType.Parameter).ToList();
Assert.That(paramTokens, Has.Count.EqualTo(2)); Assert.That(paramTokens, Has.Count.EqualTo(2));
Assert.That(paramTokens[0].Value, Is.EqualTo("$1")); Assert.Multiple(() =>
Assert.That(paramTokens[1].Value, Is.EqualTo("$2")); {
Assert.That(paramTokens[0].Value, Is.EqualTo("$1"));
Assert.That(paramTokens[1].Value, Is.EqualTo("$2"));
});
} }
[Test] [Test]
@@ -12,8 +12,11 @@ public class MarkdownParserTests
{ {
var result = Markdown.Parse("42"); var result = Markdown.Parse("42");
Assert.That(result, Is.InstanceOf<NumberLiteral>()); Assert.Multiple(() =>
Assert.That(((NumberLiteral)result).Value, Is.EqualTo(42m)); {
Assert.That(result, Is.InstanceOf<NumberLiteral>());
Assert.That(((NumberLiteral)result).Value, Is.EqualTo(42m));
});
} }
[Test] [Test]
@@ -21,8 +24,11 @@ public class MarkdownParserTests
{ {
var result = Markdown.Parse("3.14"); var result = Markdown.Parse("3.14");
Assert.That(result, Is.InstanceOf<NumberLiteral>()); Assert.Multiple(() =>
Assert.That(((NumberLiteral)result).Value, Is.EqualTo(3.14m)); {
Assert.That(result, Is.InstanceOf<NumberLiteral>());
Assert.That(((NumberLiteral)result).Value, Is.EqualTo(3.14m));
});
} }
[Test] [Test]
@@ -30,8 +36,11 @@ public class MarkdownParserTests
{ {
var result = Markdown.Parse("\"hello world\""); var result = Markdown.Parse("\"hello world\"");
Assert.That(result, Is.InstanceOf<StringLiteral>()); Assert.Multiple(() =>
Assert.That(((StringLiteral)result).Value, Is.EqualTo("hello world")); {
Assert.That(result, Is.InstanceOf<StringLiteral>());
Assert.That(((StringLiteral)result).Value, Is.EqualTo("hello world"));
});
} }
[Test] [Test]
@@ -39,8 +48,11 @@ public class MarkdownParserTests
{ {
var result = Markdown.Parse("'test string'"); var result = Markdown.Parse("'test string'");
Assert.That(result, Is.InstanceOf<StringLiteral>()); Assert.Multiple(() =>
Assert.That(((StringLiteral)result).Value, Is.EqualTo("test string")); {
Assert.That(result, Is.InstanceOf<StringLiteral>());
Assert.That(((StringLiteral)result).Value, Is.EqualTo("test string"));
});
} }
[Test] [Test]
@@ -48,8 +60,11 @@ public class MarkdownParserTests
{ {
var result = Markdown.Parse("true"); var result = Markdown.Parse("true");
Assert.That(result, Is.InstanceOf<Literal>()); Assert.Multiple(() =>
Assert.That(((Literal)result).Value, Is.EqualTo(true)); {
Assert.That(result, Is.InstanceOf<Literal>());
Assert.That(((Literal)result).Value, Is.EqualTo(true));
});
} }
[Test] [Test]
@@ -57,8 +72,11 @@ public class MarkdownParserTests
{ {
var result = Markdown.Parse("false"); var result = Markdown.Parse("false");
Assert.That(result, Is.InstanceOf<Literal>()); Assert.Multiple(() =>
Assert.That(((Literal)result).Value, Is.EqualTo(false)); {
Assert.That(result, Is.InstanceOf<Literal>());
Assert.That(((Literal)result).Value, Is.EqualTo(false));
});
} }
#endregion #endregion
@@ -72,8 +90,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<Property>()); Assert.That(result, Is.InstanceOf<Property>());
var prop = (Property)result; var prop = (Property)result;
Assert.That(prop.PropertyName, Is.EqualTo("PropertyName")); Assert.Multiple(() =>
Assert.That(prop.Expression, Is.Null); {
Assert.That(prop.PropertyName, Is.EqualTo("PropertyName"));
Assert.That(prop.Expression, Is.Null);
});
} }
[Test] [Test]
@@ -83,8 +104,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<Property>()); Assert.That(result, Is.InstanceOf<Property>());
var prop = (Property)result; var prop = (Property)result;
Assert.That(prop.PropertyName, Is.EqualTo("Age")); Assert.Multiple(() =>
Assert.That(prop.Expression, Is.InstanceOf<Parameter>()); {
Assert.That(prop.PropertyName, Is.EqualTo("Age"));
Assert.That(prop.Expression, Is.InstanceOf<Parameter>());
});
} }
[Test] [Test]
@@ -94,8 +118,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<Property>()); Assert.That(result, Is.InstanceOf<Property>());
var prop = (Property)result; var prop = (Property)result;
Assert.That(prop.PropertyName, Is.EqualTo("Department")); Assert.Multiple(() =>
Assert.That(prop.Expression, Is.InstanceOf<Parameter>()); {
Assert.That(prop.PropertyName, Is.EqualTo("Department"));
Assert.That(prop.Expression, Is.InstanceOf<Parameter>());
});
} }
[Test] [Test]
@@ -103,8 +130,11 @@ public class MarkdownParserTests
{ {
var result = Markdown.Parse("\\text{some text}"); var result = Markdown.Parse("\\text{some text}");
Assert.That(result, Is.InstanceOf<StringLiteral>()); Assert.Multiple(() =>
Assert.That(((StringLiteral)result).Value, Is.EqualTo("some text")); {
Assert.That(result, Is.InstanceOf<StringLiteral>());
Assert.That(((StringLiteral)result).Value, Is.EqualTo("some text"));
});
} }
#endregion #endregion
@@ -118,8 +148,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<Equal>()); Assert.That(result, Is.InstanceOf<Equal>());
var equal = (Equal)result; var equal = (Equal)result;
Assert.That(equal.Left, Is.InstanceOf<Property>()); Assert.Multiple(() =>
Assert.That(equal.Right, Is.InstanceOf<NumberLiteral>()); {
Assert.That(equal.Left, Is.InstanceOf<Property>());
Assert.That(equal.Right, Is.InstanceOf<NumberLiteral>());
});
} }
[Test] [Test]
@@ -129,8 +162,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<NotEqual>()); Assert.That(result, Is.InstanceOf<NotEqual>());
var notEqual = (NotEqual)result; var notEqual = (NotEqual)result;
Assert.That(notEqual.Left, Is.InstanceOf<Property>()); Assert.Multiple(() =>
Assert.That(notEqual.Right, Is.InstanceOf<StringLiteral>()); {
Assert.That(notEqual.Left, Is.InstanceOf<Property>());
Assert.That(notEqual.Right, Is.InstanceOf<StringLiteral>());
});
} }
[Test] [Test]
@@ -140,8 +176,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<NotEqual>()); Assert.That(result, Is.InstanceOf<NotEqual>());
var notEqual = (NotEqual)result; var notEqual = (NotEqual)result;
Assert.That(notEqual.Left, Is.InstanceOf<Property>()); Assert.Multiple(() =>
Assert.That(notEqual.Right, Is.InstanceOf<NumberLiteral>()); {
Assert.That(notEqual.Left, Is.InstanceOf<Property>());
Assert.That(notEqual.Right, Is.InstanceOf<NumberLiteral>());
});
} }
[Test] [Test]
@@ -151,8 +190,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<GreaterThan>()); Assert.That(result, Is.InstanceOf<GreaterThan>());
var greaterThan = (GreaterThan)result; var greaterThan = (GreaterThan)result;
Assert.That(greaterThan.Left, Is.InstanceOf<Property>()); Assert.Multiple(() =>
Assert.That(greaterThan.Right, Is.InstanceOf<NumberLiteral>()); {
Assert.That(greaterThan.Left, Is.InstanceOf<Property>());
Assert.That(greaterThan.Right, Is.InstanceOf<NumberLiteral>());
});
} }
[Test] [Test]
@@ -162,8 +204,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<GreaterThan>()); Assert.That(result, Is.InstanceOf<GreaterThan>());
var greaterThan = (GreaterThan)result; var greaterThan = (GreaterThan)result;
Assert.That(greaterThan.Left, Is.InstanceOf<Property>()); Assert.Multiple(() =>
Assert.That(greaterThan.Right, Is.InstanceOf<NumberLiteral>()); {
Assert.That(greaterThan.Left, Is.InstanceOf<Property>());
Assert.That(greaterThan.Right, Is.InstanceOf<NumberLiteral>());
});
} }
#endregion #endregion
@@ -177,8 +222,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<And>()); Assert.That(result, Is.InstanceOf<And>());
var and = (And)result; var and = (And)result;
Assert.That(and.Left, Is.InstanceOf<GreaterThan>()); Assert.Multiple(() =>
Assert.That(and.Right, Is.InstanceOf<Equal>()); {
Assert.That(and.Left, Is.InstanceOf<GreaterThan>());
Assert.That(and.Right, Is.InstanceOf<Equal>());
});
} }
[Test] [Test]
@@ -188,8 +236,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<Or>()); Assert.That(result, Is.InstanceOf<Or>());
var or = (Or)result; var or = (Or)result;
Assert.That(or.Left, Is.InstanceOf<Equal>()); Assert.Multiple(() =>
Assert.That(or.Right, Is.InstanceOf<Equal>()); {
Assert.That(or.Left, Is.InstanceOf<Equal>());
Assert.That(or.Right, Is.InstanceOf<Equal>());
});
} }
[Test] [Test]
@@ -199,8 +250,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<And>()); Assert.That(result, Is.InstanceOf<And>());
var and = (And)result; var and = (And)result;
Assert.That(and.Left, Is.InstanceOf<Equal>()); Assert.Multiple(() =>
Assert.That(and.Right, Is.InstanceOf<GreaterThan>()); {
Assert.That(and.Left, Is.InstanceOf<Equal>());
Assert.That(and.Right, Is.InstanceOf<GreaterThan>());
});
} }
[Test] [Test]
@@ -210,8 +264,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<Or>()); Assert.That(result, Is.InstanceOf<Or>());
var or = (Or)result; var or = (Or)result;
Assert.That(or.Left, Is.InstanceOf<Equal>()); Assert.Multiple(() =>
Assert.That(or.Right, Is.InstanceOf<Equal>()); {
Assert.That(or.Left, Is.InstanceOf<Equal>());
Assert.That(or.Right, Is.InstanceOf<Equal>());
});
} }
[Test] [Test]
@@ -241,8 +298,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<Or>()); Assert.That(result, Is.InstanceOf<Or>());
var or = (Or)result; var or = (Or)result;
Assert.That(or.Left, Is.InstanceOf<And>()); Assert.Multiple(() =>
Assert.That(or.Right, Is.InstanceOf<Equal>()); {
Assert.That(or.Left, Is.InstanceOf<And>());
Assert.That(or.Right, Is.InstanceOf<Equal>());
});
} }
[Test] [Test]
@@ -252,8 +312,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<And>()); Assert.That(result, Is.InstanceOf<And>());
var and = (And)result; var and = (And)result;
Assert.That(and.Left, Is.InstanceOf<Equal>()); Assert.Multiple(() =>
Assert.That(and.Right, Is.InstanceOf<Equal>()); {
Assert.That(and.Left, Is.InstanceOf<Equal>());
Assert.That(and.Right, Is.InstanceOf<Equal>());
});
} }
[Test] [Test]
@@ -263,12 +326,18 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<And>()); Assert.That(result, Is.InstanceOf<And>());
var and = (And)result; var and = (And)result;
Assert.That(and.Left, Is.InstanceOf<GreaterThan>()); Assert.Multiple(() =>
Assert.That(and.Right, Is.InstanceOf<Or>()); {
Assert.That(and.Left, Is.InstanceOf<GreaterThan>());
Assert.That(and.Right, Is.InstanceOf<Or>());
});
var or = (Or)and.Right; var or = (Or)and.Right;
Assert.That(or.Left, Is.InstanceOf<Equal>()); Assert.Multiple(() =>
Assert.That(or.Right, Is.InstanceOf<Equal>()); {
Assert.That(or.Left, Is.InstanceOf<Equal>());
Assert.That(or.Right, Is.InstanceOf<Equal>());
});
} }
#endregion #endregion
@@ -332,8 +401,11 @@ public class MarkdownParserTests
{ {
var success = Markdown.TryParse("x.Age = 25", out var expression); var success = Markdown.TryParse("x.Age = 25", out var expression);
Assert.That(success, Is.True); Assert.Multiple(() =>
Assert.That(expression, Is.Not.Null); {
Assert.That(success, Is.True);
Assert.That(expression, Is.Not.Null);
});
Assert.That(expression, Is.InstanceOf<Equal>()); Assert.That(expression, Is.InstanceOf<Equal>());
} }
@@ -342,8 +414,11 @@ public class MarkdownParserTests
{ {
var success = Markdown.TryParse("@#$%", out var expression); var success = Markdown.TryParse("@#$%", out var expression);
Assert.That(success, Is.False); Assert.Multiple(() =>
Assert.That(expression, Is.Null); {
Assert.That(success, Is.False);
Assert.That(expression, Is.Null);
});
} }
#endregion #endregion
@@ -364,10 +439,13 @@ public class MarkdownParserTests
var greaterThan = (GreaterThan)and.Left; var greaterThan = (GreaterThan)and.Left;
Assert.That(greaterThan.Left, Is.InstanceOf<Property>()); Assert.That(greaterThan.Left, Is.InstanceOf<Property>());
var userAge = (Property)greaterThan.Left; var userAge = (Property)greaterThan.Left;
Assert.That(userAge.PropertyName, Is.EqualTo("Age")); Assert.Multiple(() =>
{
Assert.That(userAge.PropertyName, Is.EqualTo("Age"));
// Right side: user.Status = "active" // Right side: user.Status = "active"
Assert.That(and.Right, Is.InstanceOf<Equal>()); Assert.That(and.Right, Is.InstanceOf<Equal>());
});
var equal = (Equal)and.Right; var equal = (Equal)and.Right;
Assert.That(equal.Left, Is.InstanceOf<Property>()); Assert.That(equal.Left, Is.InstanceOf<Property>());
var userStatus = (Property)equal.Left; var userStatus = (Property)equal.Left;
@@ -387,18 +465,27 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<Or>()); Assert.That(result, Is.InstanceOf<Or>());
var or = (Or)result; var or = (Or)result;
Assert.That(or.Left, Is.InstanceOf<And>()); Assert.Multiple(() =>
Assert.That(or.Right, Is.InstanceOf<And>()); {
Assert.That(or.Left, Is.InstanceOf<And>());
Assert.That(or.Right, Is.InstanceOf<And>());
});
// Left AND: TotalCharges > 1000 AND Status = 'pending' // Left AND: TotalCharges > 1000 AND Status = 'pending'
var leftAnd = (And)or.Left; var leftAnd = (And)or.Left;
Assert.That(leftAnd.Left, Is.InstanceOf<GreaterThan>()); Assert.Multiple(() =>
Assert.That(leftAnd.Right, Is.InstanceOf<Equal>()); {
Assert.That(leftAnd.Left, Is.InstanceOf<GreaterThan>());
Assert.That(leftAnd.Right, Is.InstanceOf<Equal>());
});
// Right AND: Priority = 'urgent' AND ApprovedBy != '' // Right AND: Priority = 'urgent' AND ApprovedBy != ''
var rightAnd = (And)or.Right; var rightAnd = (And)or.Right;
Assert.That(rightAnd.Left, Is.InstanceOf<Equal>()); Assert.Multiple(() =>
Assert.That(rightAnd.Right, Is.InstanceOf<NotEqual>()); {
Assert.That(rightAnd.Left, Is.InstanceOf<Equal>());
Assert.That(rightAnd.Right, Is.InstanceOf<NotEqual>());
});
} }
#endregion #endregion
@@ -609,9 +609,12 @@ public class RuleEngineTests
var result1 = await engine.RunRules(ruleSet1, input); var result1 = await engine.RunRules(ruleSet1, input);
var result2 = await engine.RunRules(ruleSet2, input); var result2 = await engine.RunRules(ruleSet2, input);
// Assert Assert.Multiple(() =>
Assert.That(result1, Is.False, "First rule set should fail"); {
Assert.That(result2, Is.True, "Second rule set should pass"); // Assert
Assert.That(result1, Is.False, "First rule set should fail");
Assert.That(result2, Is.True, "Second rule set should pass");
});
} }
#endregion #endregion
@@ -20,9 +20,12 @@ public class CTEColumnListTests
// Act & Assert // Act & Assert
Assert.That(withClause.ColumnList, Has.Count.EqualTo(3)); Assert.That(withClause.ColumnList, Has.Count.EqualTo(3));
Assert.That(withClause.ColumnList[0], Is.EqualTo("user_id")); Assert.Multiple(() =>
Assert.That(withClause.ColumnList[1], Is.EqualTo("user_name")); {
Assert.That(withClause.ColumnList[2], Is.EqualTo("user_email")); Assert.That(withClause.ColumnList[0], Is.EqualTo("user_id"));
Assert.That(withClause.ColumnList[1], Is.EqualTo("user_name"));
Assert.That(withClause.ColumnList[2], Is.EqualTo("user_email"));
});
} }
[Test] [Test]
@@ -274,8 +277,11 @@ public class CTEColumnListTests
// Assert // Assert
Assert.That(sql, Contains.Substring("high_value_sales (sale_date_key, product_key, customer_key, units_sold, total_revenue)")); Assert.That(sql, Contains.Substring("high_value_sales (sale_date_key, product_key, customer_key, units_sold, total_revenue)"));
var paramKeys = params_all.Keys.ToList(); var paramKeys = params_all.Keys.ToList();
Assert.That(paramKeys.Any(k => k.Contains("StartDateSk"))); Assert.Multiple(() =>
Assert.That(paramKeys.Any(k => k.Contains("MinRevenue"))); {
Assert.That(paramKeys.Any(k => k.Contains("StartDateSk")));
Assert.That(paramKeys.Any(k => k.Contains("MinRevenue")));
});
} }
#endregion #endregion
@@ -21,8 +21,11 @@ public class CommentTests
// Assert // Assert
Assert.That(query.SelectClause.Clause, Does.Contain("ID")); Assert.That(query.SelectClause.Clause, Does.Contain("ID"));
Assert.That(query.SelectClause.Clause, Does.Contain("NAME")); Assert.That(query.SelectClause.Clause, Does.Contain("NAME"));
Assert.That(query.SelectClause.Clause, Does.Contain("EMAIL")); Assert.Multiple(() =>
Assert.That(query.SelectClause.Comment, Does.Contain("-- This is a customer name")); {
Assert.That(query.SelectClause.Clause, Does.Contain("EMAIL"));
Assert.That(query.SelectClause.Comment, Does.Contain("-- This is a customer name"));
});
} }
[Test] [Test]
@@ -42,8 +45,11 @@ public class CommentTests
// Assert // Assert
Assert.That(query.SelectClause.Clause, Does.Contain("ID")); Assert.That(query.SelectClause.Clause, Does.Contain("ID"));
Assert.That(query.SelectClause.Clause, Does.Contain("NAME")); Assert.Multiple(() =>
Assert.That(query.SelectClause.Comment, Does.Contain("/* Multi-line comment")); {
Assert.That(query.SelectClause.Clause, Does.Contain("NAME"));
Assert.That(query.SelectClause.Comment, Does.Contain("/* Multi-line comment"));
});
Assert.That(query.SelectClause.Comment, Does.Contain("explaining the query */")); Assert.That(query.SelectClause.Comment, Does.Contain("explaining the query */"));
} }
@@ -64,11 +70,14 @@ public class CommentTests
// Act // Act
var query = QueryBreakdown.Parse(sql); var query = QueryBreakdown.Parse(sql);
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Comment, Does.Contain("-- Select specific columns")); {
Assert.That(query.FromClause.Comment, Does.Contain("-- Main user table")); // Assert
Assert.That(query.WhereClause.Comment, Does.Contain("/* Active users only */")); Assert.That(query.SelectClause.Comment, Does.Contain("-- Select specific columns"));
Assert.That(query.OrderByClause.Comment, Does.Contain("-- Sort by name")); Assert.That(query.FromClause.Comment, Does.Contain("-- Main user table"));
Assert.That(query.WhereClause.Comment, Does.Contain("/* Active users only */"));
Assert.That(query.OrderByClause.Comment, Does.Contain("-- Sort by name"));
});
} }
[Test] [Test]
@@ -100,10 +109,13 @@ public class CommentTests
// Act // Act
var query = QueryBreakdown.Parse(sql); var query = QueryBreakdown.Parse(sql);
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Comment, Is.Null.Or.Empty); {
Assert.That(query.FromClause.Comment, Is.Null.Or.Empty); // Assert
Assert.That(query.WhereClause.Comment, Is.Null.Or.Empty); Assert.That(query.SelectClause.Comment, Is.Null.Or.Empty);
Assert.That(query.FromClause.Comment, Is.Null.Or.Empty);
Assert.That(query.WhereClause.Comment, Is.Null.Or.Empty);
});
} }
[Test] [Test]
@@ -121,10 +133,13 @@ public class CommentTests
// Act // Act
var cloned = (QueryBreakdown)original.Clone(); var cloned = (QueryBreakdown)original.Clone();
// Assert Assert.Multiple(() =>
Assert.That(cloned.SelectClause.Comment, Is.EqualTo(original.SelectClause.Comment)); {
Assert.That(cloned.FromClause.Comment, Is.EqualTo(original.FromClause.Comment)); // Assert
Assert.That(cloned.WhereClause.Comment, Is.EqualTo(original.WhereClause.Comment)); Assert.That(cloned.SelectClause.Comment, Is.EqualTo(original.SelectClause.Comment));
Assert.That(cloned.FromClause.Comment, Is.EqualTo(original.FromClause.Comment));
Assert.That(cloned.WhereClause.Comment, Is.EqualTo(original.WhereClause.Comment));
});
} }
[Test] [Test]
@@ -221,10 +236,16 @@ public class CommentTests
// Assert // Assert
Assert.That(comments, Has.Count.EqualTo(2)); Assert.That(comments, Has.Count.EqualTo(2));
Assert.That(comments[0], Does.Contain("-- Single line")); Assert.Multiple(() =>
Assert.That(comments[1], Does.Contain("/* Multi")); {
Assert.That(comments[1], Does.Contain("line */")); Assert.That(comments[0], Does.Contain("-- Single line"));
Assert.That(cleanSql, Does.Not.Contain("-- Single line")); Assert.That(comments[1], Does.Contain("/* Multi"));
});
Assert.Multiple(() =>
{
Assert.That(comments[1], Does.Contain("line */"));
Assert.That(cleanSql, Does.Not.Contain("-- Single line"));
});
Assert.That(cleanSql, Does.Not.Contain("/*")); Assert.That(cleanSql, Does.Not.Contain("/*"));
} }
@@ -257,15 +278,21 @@ public class CommentTests
Assert.That(query.SelectClause.Clause, Does.Contain("NAME")); Assert.That(query.SelectClause.Clause, Does.Contain("NAME"));
Assert.That(query.SelectClause.Clause, Does.Contain("EMAIL")); Assert.That(query.SelectClause.Clause, Does.Contain("EMAIL"));
Assert.That(query.SelectClause.Clause, Does.Not.Contain("--")); Assert.That(query.SelectClause.Clause, Does.Not.Contain("--"));
Assert.That(query.SelectClause.Clause, Does.Not.Contain("/*")); Assert.Multiple(() =>
{
Assert.That(query.SelectClause.Clause, Does.Not.Contain("/*"));
Assert.That(query.SelectClause.Comment, Does.Contain("-- Primary key")); Assert.That(query.SelectClause.Comment, Does.Contain("-- Primary key"));
});
Assert.That(query.SelectClause.Comment, Does.Contain("-- Customer name field")); Assert.That(query.SelectClause.Comment, Does.Contain("-- Customer name field"));
Assert.That(query.SelectClause.Comment, Does.Contain("/* Email address for notifications */")); Assert.Multiple(() =>
{
Assert.That(query.SelectClause.Comment, Does.Contain("/* Email address for notifications */"));
Assert.That(query.FromClause.Comment, Does.Contain("-- Main user table")); Assert.That(query.FromClause.Comment, Does.Contain("-- Main user table"));
Assert.That(query.WhereClause.Comment, Does.Contain("/* Filter for active users only */")); Assert.That(query.WhereClause.Comment, Does.Contain("/* Filter for active users only */"));
Assert.That(query.OrderByClause.Comment, Does.Contain("-- Sort alphabetically")); Assert.That(query.OrderByClause.Comment, Does.Contain("-- Sort alphabetically"));
});
// Act - Generate SQL // Act - Generate SQL
var regeneratedSql = query.GetSql(); var regeneratedSql = query.GetSql();
@@ -325,8 +352,11 @@ public class CommentTests
// Assert // Assert
Assert.That(query.WhereClause.Comment, Does.Contain("-- Filter by status parameter")); Assert.That(query.WhereClause.Comment, Does.Contain("-- Filter by status parameter"));
Assert.That(query.WhereClause.Comment, Does.Contain("-- Additional condition")); Assert.Multiple(() =>
Assert.That(query.Parameters, Contains.Key(":status")); {
Assert.That(query.WhereClause.Comment, Does.Contain("-- Additional condition"));
Assert.That(query.Parameters, Contains.Key(":status"));
});
Assert.That(query.Parameters, Contains.Key(":start_date")); Assert.That(query.Parameters, Contains.Key(":start_date"));
} }
@@ -188,8 +188,11 @@ public class QueryBreakdownCollectionTests
// Assert // Assert
Assert.That(summaries, Has.Count.EqualTo(2)); Assert.That(summaries, Has.Count.EqualTo(2));
Assert.That(summaries[0].UsesSemiStructuredData, Is.True); Assert.Multiple(() =>
Assert.That(summaries[1].UsesStageReference, Is.True); {
Assert.That(summaries[0].UsesSemiStructuredData, Is.True);
Assert.That(summaries[1].UsesStageReference, Is.True);
});
} }
[Test] [Test]
@@ -220,9 +223,12 @@ public class QueryBreakdownCollectionTests
// Act // Act
_collection.AddParameterToAll("CompanyId", 99); _collection.AddParameterToAll("CompanyId", 99);
// Assert Assert.Multiple(() =>
Assert.That(_collection.QueryBreakdowns[0].Parameters["CompanyId"], Is.EqualTo(99)); {
Assert.That(_collection.QueryBreakdowns[1].Parameters["CompanyId"], Is.EqualTo(99)); // Assert
Assert.That(_collection.QueryBreakdowns[0].Parameters["CompanyId"], Is.EqualTo(99));
Assert.That(_collection.QueryBreakdowns[1].Parameters["CompanyId"], Is.EqualTo(99));
});
} }
[Test] [Test]
@@ -13,13 +13,16 @@ public class QueryBreakdownTests
// Arrange & Act // Arrange & Act
var queryBreakdown = new QueryBreakdown(); var queryBreakdown = new QueryBreakdown();
// Assert Assert.Multiple(() =>
Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo(string.Empty)); {
Assert.That(queryBreakdown.FromClause.Clause, Is.EqualTo(string.Empty)); // Assert
Assert.That(queryBreakdown.WhereClause.Clause, Is.EqualTo(string.Empty)); Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo(string.Empty));
Assert.That(queryBreakdown.OrderByClause.Clause, Is.EqualTo(string.Empty)); Assert.That(queryBreakdown.FromClause.Clause, Is.EqualTo(string.Empty));
Assert.That(queryBreakdown.GroupByClause.Clause, Is.EqualTo(string.Empty)); Assert.That(queryBreakdown.WhereClause.Clause, Is.EqualTo(string.Empty));
Assert.That(queryBreakdown.HavingClause.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] [Test]
@@ -32,9 +35,12 @@ public class QueryBreakdownTests
// Act // Act
var queryBreakdown = new QueryBreakdown(selectClause, fromClause); var queryBreakdown = new QueryBreakdown(selectClause, fromClause);
// Assert Assert.Multiple(() =>
Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo(selectClause)); {
Assert.That(queryBreakdown.FromClause.Clause, Is.EqualTo(fromClause)); // Assert
Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo(selectClause));
Assert.That(queryBreakdown.FromClause.Clause, Is.EqualTo(fromClause));
});
} }
[Test] [Test]
@@ -48,10 +54,13 @@ public class QueryBreakdownTests
// Act // Act
var queryBreakdown = new QueryBreakdown(selectClause, fromClause, whereClause); var queryBreakdown = new QueryBreakdown(selectClause, fromClause, whereClause);
// Assert Assert.Multiple(() =>
Assert.That(queryBreakdown.SelectClause.Clause, Is.EqualTo(selectClause)); {
Assert.That(queryBreakdown.FromClause.Clause, Is.EqualTo(fromClause)); // Assert
Assert.That(queryBreakdown.WhereClause.Clause, Is.EqualTo(whereClause)); 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 #endregion
@@ -231,11 +240,14 @@ public class QueryBreakdownTests
var innerParams = innerCte.ParameterList.Count(); var innerParams = innerCte.ParameterList.Count();
var middleParams = middleCte.ParameterList.Count(); var middleParams = middleCte.ParameterList.Count();
// Assert - Each CTE maintains its own parameters Assert.Multiple(() =>
Assert.That(innerParams, Is.EqualTo(1)); {
Assert.That(middleParams, Is.EqualTo(1)); // Assert - Each CTE maintains its own parameters
// SQL should contain both WITH clauses Assert.That(innerParams, Is.EqualTo(1));
Assert.That(sql, Does.Contain("WITH")); 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("RECENT_USERS"));
Assert.That(sql, Does.Contain("FILTERED_USERS")); Assert.That(sql, Does.Contain("FILTERED_USERS"));
} }
@@ -289,8 +301,11 @@ public class QueryBreakdownTests
// Assert - Verify WITH clause appears before main SELECT // Assert - Verify WITH clause appears before main SELECT
var withIndex = sql.IndexOf("WITH"); var withIndex = sql.IndexOf("WITH");
var mainSelectIndex = sql.LastIndexOf("SELECT"); var mainSelectIndex = sql.LastIndexOf("SELECT");
Assert.That(withIndex, Is.GreaterThan(-1)); Assert.Multiple(() =>
Assert.That(mainSelectIndex, Is.GreaterThan(-1)); {
Assert.That(withIndex, Is.GreaterThan(-1));
Assert.That(mainSelectIndex, Is.GreaterThan(-1));
});
Assert.That(withIndex, Is.LessThan(mainSelectIndex)); Assert.That(withIndex, Is.LessThan(mainSelectIndex));
// Assert - Verify CTE definition // Assert - Verify CTE definition
@@ -312,13 +327,19 @@ public class QueryBreakdownTests
var sql = mainQuery.GetSql(); var sql = mainQuery.GetSql();
var withClause = mainQuery.WithClauses[0]; var withClause = mainQuery.WithClauses[0];
// Assert: Verify WithClause properties Assert.Multiple(() =>
Assert.That(withClause.TableName, Is.EqualTo("SALES_TEAM")); {
Assert.That(withClause.Query, Is.Not.Null); // Assert: Verify WithClause properties
Assert.That(withClause.Sql, Is.Not.Null); Assert.That(withClause.TableName, Is.EqualTo("SALES_TEAM"));
Assert.That(withClause.Sql?.SelectClause?.Clause, Contains.Substring("ID, NAME")); Assert.That(withClause.Query, Is.Not.Null);
Assert.That(withClause.Sql?.FromClause?.Clause, Contains.Substring("EMPLOYEES")); Assert.That(withClause.Sql, Is.Not.Null);
Assert.That(withClause.Sql?.WhereClause?.Clause, Contains.Substring("DEPARTMENT = 'Sales'")); });
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] [Test]
@@ -334,9 +355,12 @@ public class QueryBreakdownTests
var cte = new QueryBreakdown("ID, NAME", "SOURCE_TABLE"); var cte = new QueryBreakdown("ID, NAME", "SOURCE_TABLE");
query.AddWithClause("SOURCE_CTE", cte); query.AddWithClause("SOURCE_CTE", cte);
// Assert - Now using WITH clause Assert.Multiple(() =>
Assert.That(query.IsUsingWithClause, Is.True); {
Assert.That(query.WithClauses, Has.Count.EqualTo(1)); // Assert - Now using WITH clause
Assert.That(query.IsUsingWithClause, Is.True);
Assert.That(query.WithClauses, Has.Count.EqualTo(1));
});
} }
#endregion #endregion
@@ -357,8 +381,11 @@ public class QueryBreakdownTests
// Assert // Assert
// Snowflake stores parameters in both @ and : formats, so count is doubled // Snowflake stores parameters in both @ and : formats, so count is doubled
Assert.That(merged.Count, Is.GreaterThanOrEqualTo(2)); Assert.That(merged.Count, Is.GreaterThanOrEqualTo(2));
Assert.That(merged.ContainsKey("@UserId") || merged.ContainsKey(":UserId"), Is.True); Assert.Multiple(() =>
Assert.That(merged.ContainsKey("@ActiveStatus") || merged.ContainsKey(":ActiveStatus"), Is.True); {
Assert.That(merged.ContainsKey("@UserId") || merged.ContainsKey(":UserId"), Is.True);
Assert.That(merged.ContainsKey("@ActiveStatus") || merged.ContainsKey(":ActiveStatus"), Is.True);
});
} }
[Test] [Test]
@@ -378,8 +405,11 @@ public class QueryBreakdownTests
// Assert // Assert
// Should have parameters from both CTE and main query // Should have parameters from both CTE and main query
var keys = merged.Keys.ToList(); var keys = merged.Keys.ToList();
Assert.That(keys.Any(k => k.Contains("MinDate"))); Assert.Multiple(() =>
Assert.That(keys.Any(k => k.Contains("ResultLimit"))); {
Assert.That(keys.Any(k => k.Contains("MinDate")));
Assert.That(keys.Any(k => k.Contains("ResultLimit")));
});
} }
[Test] [Test]
@@ -402,9 +432,12 @@ public class QueryBreakdownTests
// Assert // Assert
var keys = merged.Keys.ToList(); var keys = merged.Keys.ToList();
Assert.That(keys.Any(k => k.Contains("Status1"))); Assert.Multiple(() =>
Assert.That(keys.Any(k => k.Contains("MinDate"))); {
Assert.That(keys.Any(k => k.Contains("ResultLimit"))); 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] [Test]
@@ -452,9 +485,12 @@ public class QueryBreakdownTests
// Assert - All parameters from all levels should be present // Assert - All parameters from all levels should be present
var keys = merged.Keys.ToList(); var keys = merged.Keys.ToList();
Assert.That(keys.Any(k => k.Contains("InnerParam"))); Assert.Multiple(() =>
Assert.That(keys.Any(k => k.Contains("MiddleParam"))); {
Assert.That(keys.Any(k => k.Contains("MainParam"))); 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] [Test]
@@ -480,10 +516,13 @@ public class QueryBreakdownTests
var dateValues = merged.Values.OfType<DateTime>().Count(); var dateValues = merged.Values.OfType<DateTime>().Count();
var decimalValues = merged.Values.OfType<decimal>().Count(); var decimalValues = merged.Values.OfType<decimal>().Count();
Assert.That(intValues, Is.GreaterThan(0), "Should have at least one int value"); Assert.Multiple(() =>
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(intValues, Is.GreaterThan(0), "Should have at least one int value");
Assert.That(decimalValues, Is.GreaterThan(0), "Should have at least one decimal 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 #endregion
@@ -499,9 +538,12 @@ public class QueryBreakdownTests
// Act // Act
var queryBreakdown = QueryBreakdown.Parse(sql, false); var queryBreakdown = QueryBreakdown.Parse(sql, false);
// Assert Assert.Multiple(() =>
Assert.That(queryBreakdown.SelectClause.Clause?.Trim(), Does.Contain("ID, NAME")); {
Assert.That(queryBreakdown.FromClause.Clause?.Trim(), Does.Contain("USERS")); // Assert
Assert.That(queryBreakdown.SelectClause.Clause?.Trim(), Does.Contain("ID, NAME"));
Assert.That(queryBreakdown.FromClause.Clause?.Trim(), Does.Contain("USERS"));
});
} }
[Test] [Test]
@@ -606,9 +648,12 @@ public class QueryBreakdownTests
// Act // Act
var queryBreakdown = QueryBreakdown.Parse(sql, false); var queryBreakdown = QueryBreakdown.Parse(sql, false);
// Assert Assert.Multiple(() =>
Assert.That(queryBreakdown.IsUsingWithClause, Is.True); {
Assert.That(queryBreakdown.SelectClause.Clause?.Trim(), Does.Contain("P.*, PS.TOTAL_QTY")); // Assert
Assert.That(queryBreakdown.IsUsingWithClause, Is.True);
Assert.That(queryBreakdown.SelectClause.Clause?.Trim(), Does.Contain("P.*, PS.TOTAL_QTY"));
});
} }
[Test] [Test]
@@ -637,9 +682,12 @@ public class QueryBreakdownTests
// Act // Act
var success = QueryBreakdown.TryParse(sql, out var queryBreakdown, false); var success = QueryBreakdown.TryParse(sql, out var queryBreakdown, false);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.True); {
Assert.That(queryBreakdown, Is.Not.Null); // Assert
Assert.That(success, Is.True);
Assert.That(queryBreakdown, Is.Not.Null);
});
Assert.That(queryBreakdown, Is.InstanceOf<QueryBreakdown>()); Assert.That(queryBreakdown, Is.InstanceOf<QueryBreakdown>());
} }
@@ -652,10 +700,13 @@ public class QueryBreakdownTests
// Act // Act
var success = QueryBreakdown.TryParse(sql, out var queryBreakdown, out var error, false); var success = QueryBreakdown.TryParse(sql, out var queryBreakdown, out var error, false);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.False); {
Assert.That(queryBreakdown, Is.Null); // Assert
Assert.That(error, Is.Not.Null); Assert.That(success, Is.False);
Assert.That(queryBreakdown, Is.Null);
Assert.That(error, Is.Not.Null);
});
} }
#endregion #endregion
@@ -672,9 +723,12 @@ public class QueryBreakdownTests
queryBreakdown.AddParameter("UserId", 123); queryBreakdown.AddParameter("UserId", 123);
queryBreakdown.AddWhereClause("ACTIVE = 1"); queryBreakdown.AddWhereClause("ACTIVE = 1");
// Assert Assert.Multiple(() =>
Assert.That(queryBreakdown.Parameters, Does.ContainKey("@UserId")); {
Assert.That(queryBreakdown.WhereClause.Clause, Does.Contain("ACTIVE = 1")); // Assert
Assert.That(queryBreakdown.Parameters, Does.ContainKey("@UserId"));
Assert.That(queryBreakdown.WhereClause.Clause, Does.Contain("ACTIVE = 1"));
});
} }
[Test] [Test]
@@ -687,9 +741,12 @@ public class QueryBreakdownTests
// Act // Act
queryBreakdown.AddWithClause("ORDER_CTE", cte); queryBreakdown.AddWithClause("ORDER_CTE", cte);
// Assert Assert.Multiple(() =>
Assert.That(queryBreakdown.WithClauses, Has.Count.EqualTo(1)); {
Assert.That(queryBreakdown.IsUsingWithClause, Is.True); // Assert
Assert.That(queryBreakdown.WithClauses, Has.Count.EqualTo(1));
Assert.That(queryBreakdown.IsUsingWithClause, Is.True);
});
} }
[Test] [Test]
@@ -740,8 +797,11 @@ public class QueryBreakdownTests
Assert.That(sql, Does.Contain("WITH")); Assert.That(sql, Does.Contain("WITH"));
Assert.That(sql, Does.Contain("SALES_SUMMARY AS (")); Assert.That(sql, Does.Contain("SALES_SUMMARY AS ("));
Assert.That(sql, Does.Contain("ACTIVE_PRODUCTS AS (")); Assert.That(sql, Does.Contain("ACTIVE_PRODUCTS AS ("));
Assert.That(sql, Does.Contain("LIMIT 100")); Assert.Multiple(() =>
Assert.That(mainQueryBreakdown.Parameters, Does.ContainKey(":minSales")); {
Assert.That(sql, Does.Contain("LIMIT 100"));
Assert.That(mainQueryBreakdown.Parameters, Does.ContainKey(":minSales"));
});
Assert.That(mainQueryBreakdown.Parameters, Does.ContainKey(":startDate")); Assert.That(mainQueryBreakdown.Parameters, Does.ContainKey(":startDate"));
} }
@@ -762,8 +822,11 @@ public class QueryBreakdownTests
// Assert // Assert
Assert.That(sql, Does.Contain("WITH")); Assert.That(sql, Does.Contain("WITH"));
Assert.That(sql, Does.Contain("MIDDLE_CTE AS (")); Assert.Multiple(() =>
Assert.That(mainQueryBreakdown.WithClauses, Has.Count.EqualTo(1)); {
Assert.That(sql, Does.Contain("MIDDLE_CTE AS ("));
Assert.That(mainQueryBreakdown.WithClauses, Has.Count.EqualTo(1));
});
} }
[Test] [Test]
@@ -887,9 +950,12 @@ public class QueryBreakdownTests
// Act // Act
var queryBreakdown = QueryBreakdown.Parse(sql, false); var queryBreakdown = QueryBreakdown.Parse(sql, false);
// Assert Assert.Multiple(() =>
Assert.That(queryBreakdown.SelectClause.Clause, Does.Contain("F.VALUE")); {
Assert.That(queryBreakdown.FromClause.Clause, Does.Contain("FLATTEN")); // Assert
Assert.That(queryBreakdown.SelectClause.Clause, Does.Contain("F.VALUE"));
Assert.That(queryBreakdown.FromClause.Clause, Does.Contain("FLATTEN"));
});
} }
[Test] [Test]
@@ -1148,9 +1214,12 @@ public class QueryBreakdownTests
// Act // Act
var success = QueryBreakdown.TryParse(sql, out _, out var error, false); var success = QueryBreakdown.TryParse(sql, out _, out var error, false);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.False); {
Assert.That(error, Is.Not.Null.And.Not.Empty); // Assert
Assert.That(success, Is.False);
Assert.That(error, Is.Not.Null.And.Not.Empty);
});
} }
[Test] [Test]
@@ -1196,9 +1265,12 @@ public class QueryBreakdownTests
// Act // Act
var queryBreakdown = QueryBreakdown.Parse(sql, false); var queryBreakdown = QueryBreakdown.Parse(sql, false);
// Assert Assert.Multiple(() =>
Assert.That(queryBreakdown.SelectClause.Clause, Does.Contain("$1")); {
Assert.That(queryBreakdown.FromClause.Clause, Does.Contain("@MY_STAGE")); // Assert
Assert.That(queryBreakdown.SelectClause.Clause, Does.Contain("$1"));
Assert.That(queryBreakdown.FromClause.Clause, Does.Contain("@MY_STAGE"));
});
} }
[Test] [Test]
@@ -1245,8 +1317,11 @@ public class QueryBreakdownTests
Assert.That(sql, Does.Contain("SALES_SUMMARY AS (")); Assert.That(sql, Does.Contain("SALES_SUMMARY AS ("));
Assert.That(sql, Does.Contain("TOP_PRODUCTS AS (")); Assert.That(sql, Does.Contain("TOP_PRODUCTS AS ("));
Assert.That(sql, Does.Contain("ROW_NUMBER()")); Assert.That(sql, Does.Contain("ROW_NUMBER()"));
Assert.That(sql, Does.Contain("LIMIT 100")); Assert.Multiple(() =>
Assert.That(mainQueryBreakdown.Parameters.Count, Is.GreaterThanOrEqualTo(2)); {
Assert.That(sql, Does.Contain("LIMIT 100"));
Assert.That(mainQueryBreakdown.Parameters.Count, Is.GreaterThanOrEqualTo(2));
});
} }
#endregion #endregion
@@ -1265,9 +1340,12 @@ public class QueryBreakdownTests
// Assert // Assert
Assert.That(result, Is.Not.Null); Assert.That(result, Is.Not.Null);
Assert.That(result, Is.InstanceOf<QueryBreakdown>(), "Should return Snowflake QueryBreakdown instance"); Assert.That(result, Is.InstanceOf<QueryBreakdown>(), "Should return Snowflake QueryBreakdown instance");
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("Id, Name")); Assert.Multiple(() =>
Assert.That(result.FromClause.Clause?.Trim(), Does.Contain("Users")); {
Assert.That(result.WhereClause.Clause?.Trim(), Does.Contain("Active = 1")); 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] [Test]
@@ -1300,12 +1378,15 @@ public class QueryBreakdownTests
// Assert // Assert
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("DepartmentId")); Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("DepartmentId"));
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("COUNT(*)")); Assert.Multiple(() =>
Assert.That(result.FromClause.Clause?.Trim(), Does.Contain("Employees")); {
Assert.That(result.WhereClause.Clause?.Trim(), Does.Contain("Active = 1")); Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("COUNT(*)"));
Assert.That(result.GroupByClause.Clause?.Trim(), Does.Contain("DepartmentId")); Assert.That(result.FromClause.Clause?.Trim(), Does.Contain("Employees"));
Assert.That(result.HavingClause.Clause?.Trim(), Does.Contain("COUNT(*) > 5")); Assert.That(result.WhereClause.Clause?.Trim(), Does.Contain("Active = 1"));
Assert.That(result.OrderByClause.Clause?.Trim(), Does.Contain("EmployeeCount DESC")); 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] [Test]
@@ -1343,11 +1424,17 @@ public class QueryBreakdownTests
// Act // Act
var result = QueryBreakdown.Parse(tsqlQuery, isMicrosoftSql: true); var result = QueryBreakdown.Parse(tsqlQuery, isMicrosoftSql: true);
// Assert Assert.Multiple(() =>
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("o.OrderId")); {
Assert.That(result.FromClause.Clause?.Trim(), Does.Contain("INNER JOIN")); // Assert
Assert.That(result.FromClause.Clause?.Trim(), Does.Contain("LEFT JOIN")); Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("o.OrderId"));
Assert.That(result.WhereClause.Clause?.Trim(), Does.Contain("OrderDate")); 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] [Test]
@@ -1361,9 +1448,12 @@ public class QueryBreakdownTests
// Act // Act
var result = QueryBreakdown.Parse(tsqlQuery, isMicrosoftSql: true); var result = QueryBreakdown.Parse(tsqlQuery, isMicrosoftSql: true);
// Assert Assert.Multiple(() =>
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("CustomerId, CustomerName")); {
Assert.That(result.WhereClause.Clause?.Trim(), Does.Contain("IN")); // 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")); Assert.That(result.WhereClause.Clause?.Trim(), Does.Contain("SELECT"));
} }
@@ -1376,9 +1466,12 @@ public class QueryBreakdownTests
// Act // Act
var success = QueryBreakdown.TryParse(tsqlQuery, out var result, isMicrosoftSql: true); var success = QueryBreakdown.TryParse(tsqlQuery, out var result, isMicrosoftSql: true);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.True); {
Assert.That(result, Is.Not.Null); // Assert
Assert.That(success, Is.True);
Assert.That(result, Is.Not.Null);
});
Assert.That(result, Is.InstanceOf<QueryBreakdown>()); Assert.That(result, Is.InstanceOf<QueryBreakdown>());
} }
@@ -1391,10 +1484,13 @@ public class QueryBreakdownTests
// Act // Act
var success = QueryBreakdown.TryParse(invalidQuery, out var result, out var errorMessage, isMicrosoftSql: true); var success = QueryBreakdown.TryParse(invalidQuery, out var result, out var errorMessage, isMicrosoftSql: true);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.False); {
Assert.That(result, Is.Null); // Assert
Assert.That(errorMessage, Is.Not.Null.And.Not.Empty); Assert.That(success, Is.False);
Assert.That(result, Is.Null);
Assert.That(errorMessage, Is.Not.Null.And.Not.Empty);
});
} }
[Test] [Test]
@@ -1406,10 +1502,13 @@ public class QueryBreakdownTests
// Act // Act
var result = QueryBreakdown.Parse(tsqlQuery, isMicrosoftSql: true); var result = QueryBreakdown.Parse(tsqlQuery, isMicrosoftSql: true);
// Assert Assert.Multiple(() =>
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("[Order Id]")); {
Assert.That(result.FromClause.Clause?.Trim(), Does.Contain("[Order Details]")); // Assert
Assert.That(result.WhereClause.Clause?.Trim(), Does.Contain("[Active]")); 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] [Test]
@@ -1428,9 +1527,12 @@ public class QueryBreakdownTests
// Act // Act
var result = QueryBreakdown.Parse(tsqlQuery, isMicrosoftSql: true); var result = QueryBreakdown.Parse(tsqlQuery, isMicrosoftSql: true);
// Assert Assert.Multiple(() =>
Assert.That(result.IsUsingWithClause, Is.True); {
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("DepartmentName")); // Assert
Assert.That(result.IsUsingWithClause, Is.True);
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("DepartmentName"));
});
} }
[Test] [Test]
@@ -1452,8 +1554,11 @@ public class QueryBreakdownTests
// Assert // Assert
Assert.That(snowflakeSql, Does.Contain("WITH")); Assert.That(snowflakeSql, Does.Contain("WITH"));
Assert.That(snowflakeSql, Does.Contain("SELECT")); Assert.Multiple(() =>
Assert.That(result.IsUsingWithClause, Is.True, "Should have WITH clause parsed"); {
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 // 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 // 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 - Verify parsing
Assert.That(result, Is.InstanceOf<QueryBreakdown>()); Assert.That(result, Is.InstanceOf<QueryBreakdown>());
Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("YEAR")); Assert.Multiple(() =>
Assert.That(result.GroupByClause.Clause?.Trim(), Does.Contain("YEAR")); {
Assert.That(result.HavingClause.Clause?.Trim(), Does.Contain("COUNT")); Assert.That(result.SelectClause.Clause?.Trim(), Does.Contain("YEAR"));
Assert.That(result.Parameters, Does.ContainKey("@startDate")); Assert.That(result.GroupByClause.Clause?.Trim(), Does.Contain("YEAR"));
Assert.That(result.Parameters, Does.ContainKey("@endDate")); 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 - Verify Snowflake SQL generation
Assert.That(snowflakeSql, Does.Contain("SELECT")); Assert.That(snowflakeSql, Does.Contain("SELECT"));
});
Assert.That(snowflakeSql, Does.Contain("FROM")); Assert.That(snowflakeSql, Does.Contain("FROM"));
Assert.That(snowflakeSql, Does.Contain("WHERE")); Assert.That(snowflakeSql, Does.Contain("WHERE"));
Assert.That(snowflakeSql, Does.Contain("GROUP BY")); Assert.That(snowflakeSql, Does.Contain("GROUP BY"));
@@ -1510,9 +1621,12 @@ public class QueryBreakdownTests
result.AddWithClause("ProductSummary", cteQuery); result.AddWithClause("ProductSummary", cteQuery);
var snowflakeSql = result.GetSql(); var snowflakeSql = result.GetSql();
// Assert Assert.Multiple(() =>
Assert.That(result.WithClauses, Has.Count.EqualTo(1)); {
Assert.That(snowflakeSql, Does.Contain("WITH")); // Assert
Assert.That(result.WithClauses, Has.Count.EqualTo(1));
Assert.That(snowflakeSql, Does.Contain("WITH"));
});
Assert.That(snowflakeSql, Does.Contain("ProductSummary AS (")); Assert.That(snowflakeSql, Does.Contain("ProductSummary AS ("));
} }
@@ -1528,9 +1642,12 @@ public class QueryBreakdownTests
// Assert // Assert
Assert.That(clone, Is.InstanceOf<QueryBreakdown>()); Assert.That(clone, Is.InstanceOf<QueryBreakdown>());
Assert.That(clone.SelectClause.Clause, Is.EqualTo(original.SelectClause.Clause)); Assert.Multiple(() =>
Assert.That(clone.FromClause.Clause, Is.EqualTo(original.FromClause.Clause)); {
Assert.That(clone.WhereClause.Clause, Is.EqualTo(original.WhereClause.Clause)); 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 #endregion
@@ -1608,9 +1725,12 @@ public class QueryBreakdownTests
// Act // Act
query.AddSelectExpression(expr, "/* Primary key */"); query.AddSelectExpression(expr, "/* Primary key */");
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo("CUSTOMERS.CUSTOMER_ID")); {
Assert.That(query.SelectClause.Comment, Is.EqualTo("/* Primary key */")); // Assert
Assert.That(query.SelectClause.Clause, Is.EqualTo("CUSTOMERS.CUSTOMER_ID"));
Assert.That(query.SelectClause.Comment, Is.EqualTo("/* Primary key */"));
});
} }
[Test] [Test]
@@ -1888,12 +2008,18 @@ public class QueryBreakdownTests
// Act - Use Snowflake :param syntax // Act - Use Snowflake :param syntax
query.AddWhereClause("USER_ID = :UserId AND STATUS = :Status", false); query.AddWhereClause("USER_ID = :UserId AND STATUS = :Status", false);
// Assert Assert.Multiple(() =>
Assert.That(query.WhereClause.Clause, Is.EqualTo("USER_ID = :UserId AND STATUS = :Status")); {
Assert.That(query.Parameters, Does.ContainKey(":UserId")); // 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, Does.ContainKey(":Status"));
Assert.That(query.Parameters[":UserId"], Is.Null); Assert.Multiple(() =>
Assert.That(query.Parameters[":Status"], Is.Null); {
Assert.That(query.Parameters[":UserId"], Is.Null);
Assert.That(query.Parameters[":Status"], Is.Null);
});
} }
[Test] [Test]
@@ -1905,9 +2031,12 @@ public class QueryBreakdownTests
// Act - Use Microsoft @param syntax with isMicrosoftSql=true // Act - Use Microsoft @param syntax with isMicrosoftSql=true
query.AddWhereClause("USER_ID = @UserId AND STATUS = @Status", "and", true); query.AddWhereClause("USER_ID = @UserId AND STATUS = @Status", "and", true);
// Assert Assert.Multiple(() =>
Assert.That(query.WhereClause.Clause, Is.EqualTo("USER_ID = @UserId AND STATUS = @Status")); {
Assert.That(query.Parameters, Does.ContainKey("@UserId")); // 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, Does.ContainKey("@Status"));
} }
@@ -33,9 +33,12 @@ public class RecursiveCTETests
var isRecursive = withClause.IsRecursive; var isRecursive = withClause.IsRecursive;
var hasRecursiveQuery = withClause.RecursiveQuery != null; var hasRecursiveQuery = withClause.RecursiveQuery != null;
// Assert Assert.Multiple(() =>
Assert.That(isRecursive, Is.True); {
Assert.That(hasRecursiveQuery, Is.True); // Assert
Assert.That(isRecursive, Is.True);
Assert.That(hasRecursiveQuery, Is.True);
});
} }
[Test] [Test]
@@ -143,10 +146,13 @@ public class RecursiveCTETests
// Assert // Assert
var keys = merged.Keys.ToList(); var keys = merged.Keys.ToList();
Assert.That(keys.Any(k => k.Contains("AnchorStatus")), "Should include anchor query parameters"); Assert.Multiple(() =>
Assert.That(keys.Any(k => k.Contains("RecursiveLevel")), "Should include recursive query parameters"); {
Assert.That(keys.Any(k => k.Contains("RecursiveStatus")), "Should include recurring query parameters"); Assert.That(keys.Any(k => k.Contains("AnchorStatus")), "Should include anchor query parameters");
Assert.That(keys.Any(k => k.Contains("MainLimit")), "Should include main query parameters"); Assert.That(keys.Any(k => k.Contains("RecursiveLevel")), "Should include recursive query parameters");
Assert.That(keys.Any(k => k.Contains("RecursiveStatus")), "Should include recurring query parameters");
Assert.That(keys.Any(k => k.Contains("MainLimit")), "Should include main query parameters");
});
} }
[Test] [Test]
@@ -176,8 +182,11 @@ public class RecursiveCTETests
// Assert // Assert
// Snowflake stores parameters with both @ and : formats // Snowflake stores parameters with both @ and : formats
var statusKey = merged.Keys.FirstOrDefault(k => k.Contains("Status") && (k.StartsWith('@') || k.StartsWith(':'))); var statusKey = merged.Keys.FirstOrDefault(k => k.Contains("Status") && (k.StartsWith('@') || k.StartsWith(':')));
Assert.That(statusKey, Is.Not.Null); Assert.Multiple(() =>
Assert.That(merged[statusKey], Is.EqualTo("active"), "Main query parameter should take precedence"); {
Assert.That(statusKey, Is.Not.Null);
Assert.That(merged[statusKey], Is.EqualTo("active"), "Main query parameter should take precedence");
});
} }
#endregion #endregion
@@ -34,8 +34,11 @@ public class StatementExpressionParserTests
// Assert // Assert
Assert.That(result, Is.Not.Null); Assert.That(result, Is.Not.Null);
Assert.That(result, Is.InstanceOf<NumberLiteralExpression>()); Assert.Multiple(() =>
Assert.That(((NumberLiteralExpression)result).Value, Is.EqualTo(42)); {
Assert.That(result, Is.InstanceOf<NumberLiteralExpression>());
Assert.That(((NumberLiteralExpression)result).Value, Is.EqualTo(42));
});
} }
[Test] [Test]
@@ -49,8 +52,11 @@ public class StatementExpressionParserTests
// Assert // Assert
Assert.That(result, Is.Not.Null); Assert.That(result, Is.Not.Null);
Assert.That(result, Is.InstanceOf<NumberLiteralExpression>()); Assert.Multiple(() =>
Assert.That(((NumberLiteralExpression)result).Value, Is.EqualTo(3.14m)); {
Assert.That(result, Is.InstanceOf<NumberLiteralExpression>());
Assert.That(((NumberLiteralExpression)result).Value, Is.EqualTo(3.14m));
});
} }
[Test] [Test]
@@ -64,8 +70,11 @@ public class StatementExpressionParserTests
// Assert // Assert
Assert.That(result, Is.Not.Null); Assert.That(result, Is.Not.Null);
Assert.That(result, Is.InstanceOf<ColumnExpression>()); Assert.Multiple(() =>
Assert.That(((ColumnExpression)result).ColumnName, Is.EqualTo("CUSTOMER_ID")); {
Assert.That(result, Is.InstanceOf<ColumnExpression>());
Assert.That(((ColumnExpression)result).ColumnName, Is.EqualTo("CUSTOMER_ID"));
});
} }
[Test] [Test]
@@ -79,8 +88,11 @@ public class StatementExpressionParserTests
// Assert // Assert
Assert.That(result, Is.Not.Null); Assert.That(result, Is.Not.Null);
Assert.That(result, Is.InstanceOf<ColumnExpression>()); Assert.Multiple(() =>
Assert.That(((ColumnExpression)result).ColumnName, Is.EqualTo("CUSTOMER_ID")); {
Assert.That(result, Is.InstanceOf<ColumnExpression>());
Assert.That(((ColumnExpression)result).ColumnName, Is.EqualTo("CUSTOMER_ID"));
});
} }
#endregion #endregion
@@ -232,8 +244,11 @@ public class StatementExpressionParserTests
// Assert // Assert
Assert.That(result, Is.Not.Null); Assert.That(result, Is.Not.Null);
Assert.That(result, Is.InstanceOf<ColumnExpression>()); Assert.Multiple(() =>
Assert.That(((ColumnExpression)result).ColumnName, Is.EqualTo("ORDER_TOTAL")); {
Assert.That(result, Is.InstanceOf<ColumnExpression>());
Assert.That(((ColumnExpression)result).ColumnName, Is.EqualTo("ORDER_TOTAL"));
});
} }
[Test] [Test]
@@ -247,8 +262,11 @@ public class StatementExpressionParserTests
// Assert // Assert
Assert.That(result, Is.Not.Null); Assert.That(result, Is.Not.Null);
Assert.That(result, Is.InstanceOf<ColumnExpression>()); Assert.Multiple(() =>
Assert.That(((ColumnExpression)result).ColumnName, Is.EqualTo("NET_REVENUE_USD_2024")); {
Assert.That(result, Is.InstanceOf<ColumnExpression>());
Assert.That(((ColumnExpression)result).ColumnName, Is.EqualTo("NET_REVENUE_USD_2024"));
});
} }
[Test] [Test]
@@ -368,9 +386,12 @@ public class StatementExpressionParserTests
// Act // Act
var success = _parser.TryParse(sql, out var result); var success = _parser.TryParse(sql, out var result);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.False); {
Assert.That(result, Is.Null); // Assert
Assert.That(success, Is.False);
Assert.That(result, Is.Null);
});
} }
#endregion #endregion
@@ -23,9 +23,12 @@ public class StatementReaderTests
// Assert // Assert
Assert.That(tokens, Is.Not.Empty); Assert.That(tokens, Is.Not.Empty);
Assert.That(tokens[0].Type, Is.EqualTo(TokenType.LeftParenthesis)); Assert.Multiple(() =>
Assert.That(tokens[1].Type, Is.EqualTo(TokenType.Number)); {
Assert.That(tokens[1].Value, Is.EqualTo("1")); Assert.That(tokens[0].Type, Is.EqualTo(TokenType.LeftParenthesis));
Assert.That(tokens[1].Type, Is.EqualTo(TokenType.Number));
Assert.That(tokens[1].Value, Is.EqualTo("1"));
});
} }
[Test] [Test]
@@ -44,14 +47,17 @@ public class StatementReaderTests
// Assert // Assert
Assert.That(tokens, Has.Count.EqualTo(5)); // "COLUMN_1" + "COLUMN_2" * 2 Assert.That(tokens, Has.Count.EqualTo(5)); // "COLUMN_1" + "COLUMN_2" * 2
Assert.That(tokens[0].Type, Is.EqualTo(TokenType.ColumnIdentifier)); Assert.Multiple(() =>
Assert.That(tokens[0].Value, Is.EqualTo("COLUMN_1")); {
Assert.That(tokens[1].Type, Is.EqualTo(TokenType.Plus)); Assert.That(tokens[0].Type, Is.EqualTo(TokenType.ColumnIdentifier));
Assert.That(tokens[2].Type, Is.EqualTo(TokenType.ColumnIdentifier)); Assert.That(tokens[0].Value, Is.EqualTo("COLUMN_1"));
Assert.That(tokens[2].Value, Is.EqualTo("COLUMN_2")); Assert.That(tokens[1].Type, Is.EqualTo(TokenType.Plus));
Assert.That(tokens[3].Type, Is.EqualTo(TokenType.Multiply)); Assert.That(tokens[2].Type, Is.EqualTo(TokenType.ColumnIdentifier));
Assert.That(tokens[4].Type, Is.EqualTo(TokenType.Number)); Assert.That(tokens[2].Value, Is.EqualTo("COLUMN_2"));
Assert.That(tokens[4].Value, Is.EqualTo("2")); Assert.That(tokens[3].Type, Is.EqualTo(TokenType.Multiply));
Assert.That(tokens[4].Type, Is.EqualTo(TokenType.Number));
Assert.That(tokens[4].Value, Is.EqualTo("2"));
});
} }
[Test] [Test]
@@ -70,14 +76,17 @@ public class StatementReaderTests
// Assert // Assert
Assert.That(tokens, Has.Count.EqualTo(5)); Assert.That(tokens, Has.Count.EqualTo(5));
Assert.That(tokens[0].Type, Is.EqualTo(TokenType.ColumnIdentifier)); Assert.Multiple(() =>
Assert.That(tokens[0].Value, Is.EqualTo("REVENUE")); {
Assert.That(tokens[1].Type, Is.EqualTo(TokenType.Plus)); Assert.That(tokens[0].Type, Is.EqualTo(TokenType.ColumnIdentifier));
Assert.That(tokens[2].Type, Is.EqualTo(TokenType.ColumnIdentifier)); Assert.That(tokens[0].Value, Is.EqualTo("REVENUE"));
Assert.That(tokens[2].Value, Is.EqualTo("COST")); Assert.That(tokens[1].Type, Is.EqualTo(TokenType.Plus));
Assert.That(tokens[3].Type, Is.EqualTo(TokenType.Minus)); Assert.That(tokens[2].Type, Is.EqualTo(TokenType.ColumnIdentifier));
Assert.That(tokens[4].Type, Is.EqualTo(TokenType.String)); Assert.That(tokens[2].Value, Is.EqualTo("COST"));
Assert.That(tokens[4].Value, Is.EqualTo("PROFIT")); Assert.That(tokens[3].Type, Is.EqualTo(TokenType.Minus));
Assert.That(tokens[4].Type, Is.EqualTo(TokenType.String));
Assert.That(tokens[4].Value, Is.EqualTo("PROFIT"));
});
} }
[Test] [Test]
@@ -96,11 +105,14 @@ public class StatementReaderTests
// Assert // Assert
Assert.That(tokens, Is.Not.Empty); Assert.That(tokens, Is.Not.Empty);
Assert.That(tokens[0].Type, Is.EqualTo(TokenType.FunctionStart)); Assert.Multiple(() =>
Assert.That(tokens[0].Value, Is.EqualTo("SUM")); {
Assert.That(tokens[1].Type, Is.EqualTo(TokenType.ColumnIdentifier)); Assert.That(tokens[0].Type, Is.EqualTo(TokenType.FunctionStart));
Assert.That(tokens[1].Value, Is.EqualTo("TOTAL_AMOUNT")); Assert.That(tokens[0].Value, Is.EqualTo("SUM"));
Assert.That(tokens[2].Type, Is.EqualTo(TokenType.FunctionEnd)); Assert.That(tokens[1].Type, Is.EqualTo(TokenType.ColumnIdentifier));
Assert.That(tokens[1].Value, Is.EqualTo("TOTAL_AMOUNT"));
Assert.That(tokens[2].Type, Is.EqualTo(TokenType.FunctionEnd));
});
} }
[Test] [Test]
@@ -119,14 +131,17 @@ public class StatementReaderTests
// Assert // Assert
Assert.That(tokens, Has.Count.EqualTo(5)); Assert.That(tokens, Has.Count.EqualTo(5));
Assert.That(tokens[0].Type, Is.EqualTo(TokenType.ColumnIdentifier)); Assert.Multiple(() =>
Assert.That(tokens[0].Value, Is.EqualTo("3_REVENUE")); {
Assert.That(tokens[1].Type, Is.EqualTo(TokenType.Plus)); Assert.That(tokens[0].Type, Is.EqualTo(TokenType.ColumnIdentifier));
Assert.That(tokens[2].Type, Is.EqualTo(TokenType.ColumnIdentifier)); Assert.That(tokens[0].Value, Is.EqualTo("3_REVENUE"));
Assert.That(tokens[2].Value, Is.EqualTo("4_COST")); Assert.That(tokens[1].Type, Is.EqualTo(TokenType.Plus));
Assert.That(tokens[3].Type, Is.EqualTo(TokenType.Minus)); Assert.That(tokens[2].Type, Is.EqualTo(TokenType.ColumnIdentifier));
Assert.That(tokens[4].Type, Is.EqualTo(TokenType.ColumnIdentifier)); Assert.That(tokens[2].Value, Is.EqualTo("4_COST"));
Assert.That(tokens[4].Value, Is.EqualTo("5_PROFIT")); Assert.That(tokens[3].Type, Is.EqualTo(TokenType.Minus));
Assert.That(tokens[4].Type, Is.EqualTo(TokenType.ColumnIdentifier));
Assert.That(tokens[4].Value, Is.EqualTo("5_PROFIT"));
});
} }
[Test] [Test]
@@ -145,11 +160,14 @@ public class StatementReaderTests
// Assert // Assert
Assert.That(tokens, Has.Count.EqualTo(3)); Assert.That(tokens, Has.Count.EqualTo(3));
Assert.That(tokens[0].Type, Is.EqualTo(TokenType.Number)); Assert.Multiple(() =>
Assert.That(tokens[0].Value, Is.EqualTo("123.45")); {
Assert.That(tokens[1].Type, Is.EqualTo(TokenType.Plus)); Assert.That(tokens[0].Type, Is.EqualTo(TokenType.Number));
Assert.That(tokens[2].Type, Is.EqualTo(TokenType.Number)); Assert.That(tokens[0].Value, Is.EqualTo("123.45"));
Assert.That(tokens[2].Value, Is.EqualTo("67.89")); Assert.That(tokens[1].Type, Is.EqualTo(TokenType.Plus));
Assert.That(tokens[2].Type, Is.EqualTo(TokenType.Number));
Assert.That(tokens[2].Value, Is.EqualTo("67.89"));
});
} }
[Test] [Test]
@@ -168,11 +186,14 @@ public class StatementReaderTests
// Assert // Assert
Assert.That(tokens, Has.Count.EqualTo(3)); Assert.That(tokens, Has.Count.EqualTo(3));
Assert.That(tokens[0].Type, Is.EqualTo(TokenType.String)); Assert.Multiple(() =>
Assert.That(tokens[0].Value, Is.EqualTo("REVENUE")); {
Assert.That(tokens[1].Type, Is.EqualTo(TokenType.Plus)); Assert.That(tokens[0].Type, Is.EqualTo(TokenType.String));
Assert.That(tokens[2].Type, Is.EqualTo(TokenType.String)); Assert.That(tokens[0].Value, Is.EqualTo("REVENUE"));
Assert.That(tokens[2].Value, Is.EqualTo("COST")); Assert.That(tokens[1].Type, Is.EqualTo(TokenType.Plus));
Assert.That(tokens[2].Type, Is.EqualTo(TokenType.String));
Assert.That(tokens[2].Value, Is.EqualTo("COST"));
});
} }
[Test] [Test]
@@ -217,11 +238,14 @@ public class StatementReaderTests
// Assert // Assert
Assert.That(tokens, Is.Not.Empty); Assert.That(tokens, Is.Not.Empty);
Assert.That(tokens[0].Type, Is.EqualTo(TokenType.FunctionStart)); Assert.Multiple(() =>
Assert.That(tokens[0].Value, Is.EqualTo("SUM")); {
Assert.That(tokens[1].Type, Is.EqualTo(TokenType.FunctionStart)); Assert.That(tokens[0].Type, Is.EqualTo(TokenType.FunctionStart));
Assert.That(tokens[1].Value, Is.EqualTo("AVG")); Assert.That(tokens[0].Value, Is.EqualTo("SUM"));
Assert.That(tokens[2].Type, Is.EqualTo(TokenType.ColumnIdentifier)); Assert.That(tokens[1].Type, Is.EqualTo(TokenType.FunctionStart));
Assert.That(tokens[2].Value, Is.EqualTo("REVENUE")); Assert.That(tokens[1].Value, Is.EqualTo("AVG"));
Assert.That(tokens[2].Type, Is.EqualTo(TokenType.ColumnIdentifier));
Assert.That(tokens[2].Value, Is.EqualTo("REVENUE"));
});
} }
} }
@@ -15,11 +15,14 @@ public class WithClauseTests
// Arrange & Act // Arrange & Act
var withClause = new WithClause(); var withClause = new WithClause();
// Assert Assert.Multiple(() =>
Assert.That(withClause.TableName, Is.EqualTo(string.Empty)); {
Assert.That(withClause.Sql, Is.Null); // Assert
Assert.That(withClause.Query, Is.Null); Assert.That(withClause.TableName, Is.EqualTo(string.Empty));
Assert.That(withClause.Clause, Is.Null.Or.Empty); Assert.That(withClause.Sql, Is.Null);
Assert.That(withClause.Query, Is.Null);
Assert.That(withClause.Clause, Is.Null.Or.Empty);
});
} }
[Test] [Test]
@@ -32,10 +35,13 @@ public class WithClauseTests
// Act // Act
var withClause = new WithClause(tableName, query); var withClause = new WithClause(tableName, query);
// Assert Assert.Multiple(() =>
Assert.That(withClause.TableName, Is.EqualTo(tableName)); {
Assert.That(withClause.Query, Is.EqualTo(query)); // Assert
Assert.That(withClause.Sql, Is.Not.Null); Assert.That(withClause.TableName, Is.EqualTo(tableName));
Assert.That(withClause.Query, Is.EqualTo(query));
Assert.That(withClause.Sql, Is.Not.Null);
});
} }
[Test] [Test]
@@ -72,10 +78,13 @@ public class WithClauseTests
// Act // Act
var withClause = new WithClause(tableName, sqlClauses); var withClause = new WithClause(tableName, sqlClauses);
// Assert Assert.Multiple(() =>
Assert.That(withClause.TableName, Is.EqualTo(tableName)); {
Assert.That(withClause.Sql, Is.EqualTo(sqlClauses)); // Assert
Assert.That(withClause.Query, Is.Null); Assert.That(withClause.TableName, Is.EqualTo(tableName));
Assert.That(withClause.Sql, Is.EqualTo(sqlClauses));
Assert.That(withClause.Query, Is.Null);
});
} }
[Test] [Test]
@@ -117,8 +126,11 @@ public class WithClauseTests
// Assert // Assert
Assert.That(sql, Is.Not.Null); Assert.That(sql, Is.Not.Null);
Assert.That(sql!.SelectClause?.Clause, Is.EqualTo("user_id, name")); Assert.Multiple(() =>
Assert.That(sql.FromClause?.Clause, Is.EqualTo("users")); {
Assert.That(sql!.SelectClause?.Clause, Is.EqualTo("user_id, name"));
Assert.That(sql.FromClause?.Clause, Is.EqualTo("users"));
});
} }
[Test] [Test]
@@ -153,9 +165,12 @@ public class WithClauseTests
// Act // Act
withClause.Sql = sqlClauses; withClause.Sql = sqlClauses;
// Assert Assert.Multiple(() =>
Assert.That(withClause.Sql, Is.EqualTo(sqlClauses)); {
Assert.That(withClause.Query, Is.Null); // Assert
Assert.That(withClause.Sql, Is.EqualTo(sqlClauses));
Assert.That(withClause.Query, Is.Null);
});
} }
[Test] [Test]
@@ -173,12 +188,15 @@ public class WithClauseTests
// Act // Act
withClause.Sql = sqlClauses; withClause.Sql = sqlClauses;
// Assert - Clauses are applied to the Query Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo("column1")); {
Assert.That(query.FromClause.Clause, Is.EqualTo("table1")); // Assert - Clauses are applied to the Query
// And Sql property returns the applied clauses (from Query, not stored) Assert.That(query.SelectClause.Clause, Is.EqualTo("column1"));
Assert.That(withClause.Sql?.SelectClause?.Clause, Is.EqualTo("column1")); Assert.That(query.FromClause.Clause, Is.EqualTo("table1"));
Assert.That(withClause.Sql?.FromClause?.Clause, Is.EqualTo("table1")); // And Sql property returns the applied clauses (from Query, not stored)
Assert.That(withClause.Sql?.SelectClause?.Clause, Is.EqualTo("column1"));
Assert.That(withClause.Sql?.FromClause?.Clause, Is.EqualTo("table1"));
});
} }
[Test] [Test]
@@ -197,9 +215,12 @@ public class WithClauseTests
var query = new QueryBreakdown(); var query = new QueryBreakdown();
withClause.Query = query; withClause.Query = query;
// Assert - Stored SQL is applied to Query Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo("column1")); {
Assert.That(query.FromClause.Clause, Is.EqualTo("table1")); // Assert - Stored SQL is applied to Query
Assert.That(query.SelectClause.Clause, Is.EqualTo("column1"));
Assert.That(query.FromClause.Clause, Is.EqualTo("table1"));
});
} }
[Test] [Test]
@@ -237,10 +258,13 @@ public class WithClauseTests
var query = new QueryBreakdown(); var query = new QueryBreakdown();
withClause.Query = query; withClause.Query = query;
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo("old_column")); {
Assert.That(query.FromClause.Clause, Is.EqualTo("old_table")); // Assert
Assert.That(withClause.Query, Is.EqualTo(query)); Assert.That(query.SelectClause.Clause, Is.EqualTo("old_column"));
Assert.That(query.FromClause.Clause, Is.EqualTo("old_table"));
Assert.That(withClause.Query, Is.EqualTo(query));
});
} }
[Test] [Test]
@@ -258,9 +282,12 @@ public class WithClauseTests
}; };
withClause.Sql = sqlClauses; withClause.Sql = sqlClauses;
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo("new_column")); {
Assert.That(query.FromClause.Clause, Is.EqualTo("new_table")); // Assert
Assert.That(query.SelectClause.Clause, Is.EqualTo("new_column"));
Assert.That(query.FromClause.Clause, Is.EqualTo("new_table"));
});
} }
#endregion #endregion
@@ -283,12 +310,15 @@ public class WithClauseTests
// Assert // Assert
Assert.That(sql, Is.Not.Null); Assert.That(sql, Is.Not.Null);
Assert.That(sql!.SelectClause?.Clause, Is.EqualTo("id, name")); Assert.Multiple(() =>
Assert.That(sql.FromClause?.Clause, Is.EqualTo("users")); {
Assert.That(sql.WhereClause?.Clause, Is.EqualTo("active = 1")); Assert.That(sql!.SelectClause?.Clause, Is.EqualTo("id, name"));
Assert.That(sql.GroupByClause?.Clause, Is.EqualTo("department")); Assert.That(sql.FromClause?.Clause, Is.EqualTo("users"));
Assert.That(sql.HavingClause?.Clause, Is.EqualTo("COUNT(*) > 5")); Assert.That(sql.WhereClause?.Clause, Is.EqualTo("active = 1"));
Assert.That(sql.OrderByClause?.Clause, Is.EqualTo("name ASC")); Assert.That(sql.GroupByClause?.Clause, Is.EqualTo("department"));
Assert.That(sql.HavingClause?.Clause, Is.EqualTo("COUNT(*) > 5"));
Assert.That(sql.OrderByClause?.Clause, Is.EqualTo("name ASC"));
});
} }
#endregion #endregion
@@ -315,13 +345,16 @@ public class WithClauseTests
// Act // Act
withClause.Sql = sqlClauses; withClause.Sql = sqlClauses;
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo("id, name")); {
Assert.That(query.FromClause.Clause, Is.EqualTo("users")); // Assert
Assert.That(query.WhereClause.Clause, Is.EqualTo("active = 1")); Assert.That(query.SelectClause.Clause, Is.EqualTo("id, name"));
Assert.That(query.GroupByClause.Clause, Is.EqualTo("department")); Assert.That(query.FromClause.Clause, Is.EqualTo("users"));
Assert.That(query.HavingClause.Clause, Is.EqualTo("COUNT(*) > 5")); Assert.That(query.WhereClause.Clause, Is.EqualTo("active = 1"));
Assert.That(query.OrderByClause.Clause, Is.EqualTo("name ASC")); Assert.That(query.GroupByClause.Clause, Is.EqualTo("department"));
Assert.That(query.HavingClause.Clause, Is.EqualTo("COUNT(*) > 5"));
Assert.That(query.OrderByClause.Clause, Is.EqualTo("name ASC"));
});
} }
[Test] [Test]
@@ -340,9 +373,12 @@ public class WithClauseTests
// Act // Act
withClause.Sql = sqlClauses; withClause.Sql = sqlClauses;
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo("new_select")); {
Assert.That(query.FromClause.Clause, Is.EqualTo("original_from")); // Unchanged // Assert
Assert.That(query.SelectClause.Clause, Is.EqualTo("new_select"));
Assert.That(query.FromClause.Clause, Is.EqualTo("original_from")); // Unchanged
});
} }
#endregion #endregion
@@ -448,14 +484,17 @@ public class WithClauseTests
var innerSql = innerCte.Sql; var innerSql = innerCte.Sql;
var outerSql = outerCte.Sql; var outerSql = outerCte.Sql;
// Assert - Inner CTE has parameter and correct clauses Assert.Multiple(() =>
Assert.That(innerQuery.ParameterList.Count(), Is.EqualTo(1)); {
Assert.That(innerSql?.SelectClause?.Clause, Is.EqualTo("id, name")); // Assert - Inner CTE has parameter and correct clauses
Assert.That(innerSql?.WhereClause?.Clause, Is.EqualTo("created_date >= :start_date")); Assert.That(innerQuery.ParameterList.Count(), Is.EqualTo(1));
Assert.That(innerSql?.SelectClause?.Clause, Is.EqualTo("id, name"));
Assert.That(innerSql?.WhereClause?.Clause, Is.EqualTo("created_date >= :start_date"));
// Assert - Outer CTE references inner CTE // Assert - Outer CTE references inner CTE
Assert.That(outerSql?.SelectClause?.Clause, Is.EqualTo("*")); Assert.That(outerSql?.SelectClause?.Clause, Is.EqualTo("*"));
Assert.That(outerSql?.FromClause?.Clause, Is.EqualTo("recent_users")); Assert.That(outerSql?.FromClause?.Clause, Is.EqualTo("recent_users"));
});
} }
[Test] [Test]
@@ -495,9 +534,12 @@ public class WithClauseTests
Assert.That(sql, Does.Contain("WITH")); Assert.That(sql, Does.Contain("WITH"));
Assert.That(sql, Does.Contain("active_users")); Assert.That(sql, Does.Contain("active_users"));
Assert.That(sql, Does.Contain("AS")); Assert.That(sql, Does.Contain("AS"));
// Check for keywords/content (allowing for formatting variations) Assert.Multiple(() =>
Assert.That(sql.ToUpper(), Does.Contain("SELECT")); {
Assert.That(sql, Does.Contain("id, name")); // Check for keywords/content (allowing for formatting variations)
Assert.That(sql.ToUpper(), Does.Contain("SELECT"));
Assert.That(sql, Does.Contain("id, name"));
});
Assert.That(sql, Does.Contain("users")); Assert.That(sql, Does.Contain("users"));
Assert.That(sql, Does.Contain("active = 1")); Assert.That(sql, Does.Contain("active = 1"));
} }
@@ -523,8 +565,11 @@ public class WithClauseTests
// Verify order: first CTE comes before second CTE // Verify order: first CTE comes before second CTE
var pos1 = sql.IndexOf("active_users"); var pos1 = sql.IndexOf("active_users");
var pos2 = sql.IndexOf("user_orders"); var pos2 = sql.IndexOf("user_orders");
Assert.That(pos1, Is.GreaterThan(-1)); Assert.Multiple(() =>
Assert.That(pos2, Is.GreaterThan(-1)); {
Assert.That(pos1, Is.GreaterThan(-1));
Assert.That(pos2, Is.GreaterThan(-1));
});
Assert.That(pos1, Is.LessThan(pos2)); } Assert.That(pos1, Is.LessThan(pos2)); }
#endregion #endregion
@@ -22,11 +22,14 @@ public class ExceptionHandlingTests
// Act // Act
var exception = new SqlParseException(message, sql, position); var exception = new SqlParseException(message, sql, position);
// Assert Assert.Multiple(() =>
Assert.That(exception.Message, Does.Contain(message)); {
Assert.That(exception.Sql, Is.EqualTo(sql)); // Assert
Assert.That(exception.Position, Is.EqualTo(position)); Assert.That(exception.Message, Does.Contain(message));
Assert.That(exception.NearText, Is.Not.Empty); Assert.That(exception.Sql, Is.EqualTo(sql));
Assert.That(exception.Position, Is.EqualTo(position));
Assert.That(exception.NearText, Is.Not.Empty);
});
} }
[Test] [Test]
@@ -57,10 +60,13 @@ public class ExceptionHandlingTests
// Act // Act
var exception = new SqlParseException(message, sql!, position); var exception = new SqlParseException(message, sql!, position);
// Assert Assert.Multiple(() =>
Assert.That(exception.Message, Does.Contain("SQL is null")); {
Assert.That(exception.Sql, Is.EqualTo(string.Empty)); // Assert
Assert.That(exception.NearText, Is.EqualTo(string.Empty)); Assert.That(exception.Message, Does.Contain("SQL is null"));
Assert.That(exception.Sql, Is.EqualTo(string.Empty));
Assert.That(exception.NearText, Is.EqualTo(string.Empty));
});
} }
[Test] [Test]
@@ -90,9 +96,12 @@ public class ExceptionHandlingTests
// Act // Act
var exception = new SqlParseException(message, sql, position, innerException); var exception = new SqlParseException(message, sql, position, innerException);
// Assert Assert.Multiple(() =>
Assert.That(exception.InnerException, Is.EqualTo(innerException)); {
Assert.That(exception.Message, Does.Contain("Parse failed")); // Assert
Assert.That(exception.InnerException, Is.EqualTo(innerException));
Assert.That(exception.Message, Does.Contain("Parse failed"));
});
} }
#endregion #endregion
@@ -110,10 +119,13 @@ public class ExceptionHandlingTests
// Act // Act
var exception = new CteValidationException(message, cteName, validationRule); var exception = new CteValidationException(message, cteName, validationRule);
// Assert Assert.Multiple(() =>
Assert.That(exception.Message, Does.Contain(message)); {
Assert.That(exception.CteName, Is.EqualTo(cteName)); // Assert
Assert.That(exception.ValidationRule, Is.EqualTo(validationRule)); Assert.That(exception.Message, Does.Contain(message));
Assert.That(exception.CteName, Is.EqualTo(cteName));
Assert.That(exception.ValidationRule, Is.EqualTo(validationRule));
});
} }
[Test] [Test]
@@ -141,9 +153,12 @@ public class ExceptionHandlingTests
// Act // Act
var exception = new CteValidationException(message, "my_cte", validationRule); var exception = new CteValidationException(message, "my_cte", validationRule);
// Assert Assert.Multiple(() =>
Assert.That(exception.ValidationRule, Is.EqualTo(validationRule)); {
Assert.That(exception.Message, Does.Contain("Validation failed")); // Assert
Assert.That(exception.ValidationRule, Is.EqualTo(validationRule));
Assert.That(exception.Message, Does.Contain("Validation failed"));
});
} }
[Test] [Test]
@@ -204,8 +219,11 @@ public class ExceptionHandlingTests
// Act & Assert // Act & Assert
var exception = Assert.Throws<SqlParseException>(() => QueryBreakdown.Parse(sql)); var exception = Assert.Throws<SqlParseException>(() => QueryBreakdown.Parse(sql));
Assert.That(exception!.Sql, Is.EqualTo(sql)); Assert.Multiple(() =>
Assert.That(exception.Message, Does.Contain("Failed to parse")); {
Assert.That(exception!.Sql, Is.EqualTo(sql));
Assert.That(exception.Message, Does.Contain("Failed to parse"));
});
} }
[Test] [Test]
@@ -274,8 +292,11 @@ public class ExceptionHandlingTests
// Act & Assert // Act & Assert
var exception = Assert.Throws<CteValidationException>(() => var exception = Assert.Throws<CteValidationException>(() =>
query.AddWithClause("test_cte", (QueryBreakdown)null!)); query.AddWithClause("test_cte", (QueryBreakdown)null!));
Assert.That(exception!.ValidationRule, Is.EqualTo("QueryRequired")); Assert.Multiple(() =>
Assert.That(exception.CteName, Is.EqualTo("test_cte")); {
Assert.That(exception!.ValidationRule, Is.EqualTo("QueryRequired"));
Assert.That(exception.CteName, Is.EqualTo("test_cte"));
});
} }
[Test] [Test]
@@ -291,8 +312,11 @@ public class ExceptionHandlingTests
// Act & Assert // Act & Assert
var exception = Assert.Throws<CteValidationException>(() => var exception = Assert.Throws<CteValidationException>(() =>
query.AddWithClause("my_cte", cte2)); query.AddWithClause("my_cte", cte2));
Assert.That(exception!.ValidationRule, Is.EqualTo("DuplicateCteName")); Assert.Multiple(() =>
Assert.That(exception.Message, Does.Contain("already exists")); {
Assert.That(exception!.ValidationRule, Is.EqualTo("DuplicateCteName"));
Assert.That(exception.Message, Does.Contain("already exists"));
});
} }
[Test] [Test]
@@ -344,8 +368,11 @@ public class ExceptionHandlingTests
// Act & Assert // Act & Assert
var exception = Assert.Throws<SqlParseException>(() => var exception = Assert.Throws<SqlParseException>(() =>
query.AddWithClause("my_cte", "INVALID SQL")); query.AddWithClause("my_cte", "INVALID SQL"));
Assert.That(exception!.Message, Does.Contain("my_cte")); Assert.Multiple(() =>
Assert.That(exception.Sql, Is.EqualTo("INVALID SQL")); {
Assert.That(exception!.Message, Does.Contain("my_cte"));
Assert.That(exception.Sql, Is.EqualTo("INVALID SQL"));
});
} }
[Test] [Test]
@@ -374,8 +401,11 @@ public class ExceptionHandlingTests
// Act & Assert // Act & Assert
var exception = Assert.Throws<CteValidationException>(() => var exception = Assert.Throws<CteValidationException>(() =>
query.AddWithClause(withClause)); query.AddWithClause(withClause));
Assert.That(exception!.ValidationRule, Is.EqualTo("QueryRequired")); Assert.Multiple(() =>
Assert.That(exception.Message, Does.Contain("Query or Sql")); {
Assert.That(exception!.ValidationRule, Is.EqualTo("QueryRequired"));
Assert.That(exception.Message, Does.Contain("Query or Sql"));
});
} }
[Test] [Test]
@@ -435,9 +465,12 @@ public class ExceptionHandlingTests
// Act // Act
var exception = new SqlParseException("Syntax error", sql, position); var exception = new SqlParseException("Syntax error", sql, position);
// Assert Assert.Multiple(() =>
Assert.That(exception.NearText, Does.Contain("status")); {
Assert.That(exception.Message, Does.Contain("Near:")); // Assert
Assert.That(exception.NearText, Does.Contain("status"));
Assert.That(exception.Message, Does.Contain("Near:"));
});
} }
#endregion #endregion
@@ -24,8 +24,11 @@ public class BooleanExpressionTests : ExpressionTestsBase
// Assert // Assert
Assert.That(firstResult, Is.Not.SameAs(BooleanExpression.False)); Assert.That(firstResult, Is.Not.SameAs(BooleanExpression.False));
Assert.That(firstResult, Is.AssignableTo<BooleanExpression>()); Assert.Multiple(() =>
Assert.That(secondResult, Is.Not.SameAs(BooleanExpression.False)); {
Assert.That(firstResult, Is.AssignableTo<BooleanExpression>());
Assert.That(secondResult, Is.Not.SameAs(BooleanExpression.False));
});
Assert.That(secondResult, Is.TypeOf<AndExpression>()); Assert.That(secondResult, Is.TypeOf<AndExpression>());
} }
@@ -35,11 +35,9 @@ public class GenericColumnExpressionTests : ExpressionTestsBase
Assertions = result => Assertions = result =>
{ {
var results = (Dictionary<string, string>)result; var results = (Dictionary<string, string>)result;
Assert.That(results["priceWithTax"], Does.Contain("Price")); Assert.That(results["priceWithTax"], Does.Contain("Price")); Assert.Multiple(() => { Assert.That(results["priceWithTax"], Does.Contain("1.1"));
Assert.That(results["priceWithTax"], Does.Contain("1.1")); Assert.That(results["priceWithFee"], Does.Contain("Price")); }); Assert.Multiple(() => { Assert.That(results["priceWithFee"], Does.Contain("10"));
Assert.That(results["priceWithFee"], Does.Contain("Price")); Assert.That(results["revenue"], Does.Contain("Quantity")); });
Assert.That(results["priceWithFee"], Does.Contain("10"));
Assert.That(results["revenue"], Does.Contain("Quantity"));
Assert.That(results["revenue"], Does.Contain("Price")); Assert.That(results["revenue"], Does.Contain("Price"));
return true; return true;
} }
@@ -151,9 +149,8 @@ public class GenericColumnExpressionTests : ExpressionTestsBase
}, },
Assertions = result => Assertions = result =>
{ {
var results = (Dictionary<string, string>)result; var results = (Dictionary<string, string>)result; Assert.Multiple(() => { Assert.That(results["customerResult"], Does.Contain("CustomerID"));
Assert.That(results["customerResult"], Does.Contain("CustomerID")); Assert.That(results["orderResult"], Does.Contain("OrderDate")); });
Assert.That(results["orderResult"], Does.Contain("OrderDate"));
return true; return true;
} }
}, },
@@ -182,9 +179,8 @@ public class GenericColumnExpressionTests : ExpressionTestsBase
Assertions = result => Assertions = result =>
{ {
var results = (Dictionary<string, string>)result; var results = (Dictionary<string, string>)result;
Assert.That(results["lowerBound"], Does.Contain("UnitPrice")); Assert.That(results["lowerBound"], Does.Contain("UnitPrice")); Assert.Multiple(() => { Assert.That(results["lowerBound"], Does.Contain("MinPrice"));
Assert.That(results["lowerBound"], Does.Contain("MinPrice")); Assert.That(results["upperBound"], Does.Contain("UnitPrice")); });
Assert.That(results["upperBound"], Does.Contain("UnitPrice"));
Assert.That(results["upperBound"], Does.Contain("MaxPrice")); Assert.That(results["upperBound"], Does.Contain("MaxPrice"));
return true; return true;
} }
@@ -17,9 +17,12 @@ public class QueryBreakdownExtensionsTests
// Act // Act
var result = query.Select("id, name"); var result = query.Select("id, name");
// Assert Assert.Multiple(() =>
Assert.That(result, Is.SameAs(query)); {
Assert.That(query.SelectClause.Clause, Is.EqualTo("id, name")); // Assert
Assert.That(result, Is.SameAs(query));
Assert.That(query.SelectClause.Clause, Is.EqualTo("id, name"));
});
} }
[Test] [Test]
@@ -31,9 +34,12 @@ public class QueryBreakdownExtensionsTests
// Act // Act
var result = query.From("users"); var result = query.From("users");
// Assert Assert.Multiple(() =>
Assert.That(result, Is.SameAs(query)); {
Assert.That(query.FromClause.Clause, Is.EqualTo("users")); // Assert
Assert.That(result, Is.SameAs(query));
Assert.That(query.FromClause.Clause, Is.EqualTo("users"));
});
} }
[Test] [Test]
@@ -45,9 +51,12 @@ public class QueryBreakdownExtensionsTests
// Act // Act
var result = query.Where("active = 1"); var result = query.Where("active = 1");
// Assert Assert.Multiple(() =>
Assert.That(result, Is.SameAs(query)); {
Assert.That(query.WhereClause.Clause, Is.EqualTo("active = 1")); // Assert
Assert.That(result, Is.SameAs(query));
Assert.That(query.WhereClause.Clause, Is.EqualTo("active = 1"));
});
} }
[Test] [Test]
@@ -59,9 +68,12 @@ public class QueryBreakdownExtensionsTests
// Act // Act
var result = query.GroupBy("department"); var result = query.GroupBy("department");
// Assert Assert.Multiple(() =>
Assert.That(result, Is.SameAs(query)); {
Assert.That(query.GroupByClause.Clause, Is.EqualTo("department")); // Assert
Assert.That(result, Is.SameAs(query));
Assert.That(query.GroupByClause.Clause, Is.EqualTo("department"));
});
} }
[Test] [Test]
@@ -73,9 +85,12 @@ public class QueryBreakdownExtensionsTests
// Act // Act
var result = query.Having("COUNT(*) > 5"); var result = query.Having("COUNT(*) > 5");
// Assert Assert.Multiple(() =>
Assert.That(result, Is.SameAs(query)); {
Assert.That(query.HavingClause.Clause, Is.EqualTo("COUNT(*) > 5")); // Assert
Assert.That(result, Is.SameAs(query));
Assert.That(query.HavingClause.Clause, Is.EqualTo("COUNT(*) > 5"));
});
} }
[Test] [Test]
@@ -87,9 +102,12 @@ public class QueryBreakdownExtensionsTests
// Act // Act
var result = query.OrderBy("name ASC"); var result = query.OrderBy("name ASC");
// Assert Assert.Multiple(() =>
Assert.That(result, Is.SameAs(query)); {
Assert.That(query.OrderByClause.Clause, Is.EqualTo("name ASC")); // Assert
Assert.That(result, Is.SameAs(query));
Assert.That(query.OrderByClause.Clause, Is.EqualTo("name ASC"));
});
} }
[Test] [Test]
@@ -101,9 +119,12 @@ public class QueryBreakdownExtensionsTests
// Act // Act
var result = query.AddWhere("AND age > 18"); var result = query.AddWhere("AND age > 18");
// Assert Assert.Multiple(() =>
Assert.That(result, Is.SameAs(query)); {
Assert.That(query.WhereClause.Clause, Does.Contain("active = 1")); // Assert
Assert.That(result, Is.SameAs(query));
Assert.That(query.WhereClause.Clause, Does.Contain("active = 1"));
});
Assert.That(query.WhereClause.Clause, Does.Contain("AND age > 18")); Assert.That(query.WhereClause.Clause, Does.Contain("AND age > 18"));
} }
@@ -120,10 +141,13 @@ public class QueryBreakdownExtensionsTests
.From("users") .From("users")
.Where("active = 1"); .Where("active = 1");
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo("id, name")); {
Assert.That(query.FromClause.Clause, Is.EqualTo("users")); // Assert
Assert.That(query.WhereClause.Clause, Is.EqualTo("active = 1")); Assert.That(query.SelectClause.Clause, Is.EqualTo("id, name"));
Assert.That(query.FromClause.Clause, Is.EqualTo("users"));
Assert.That(query.WhereClause.Clause, Is.EqualTo("active = 1"));
});
} }
[Test] [Test]
@@ -138,13 +162,16 @@ public class QueryBreakdownExtensionsTests
.Having("COUNT(*) > 5") .Having("COUNT(*) > 5")
.OrderBy("employee_count DESC"); .OrderBy("employee_count DESC");
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo("department, COUNT(*) as employee_count")); {
Assert.That(query.FromClause.Clause, Is.EqualTo("employees")); // Assert
Assert.That(query.WhereClause.Clause, Is.EqualTo("salary > 50000")); Assert.That(query.SelectClause.Clause, Is.EqualTo("department, COUNT(*) as employee_count"));
Assert.That(query.GroupByClause.Clause, Is.EqualTo("department")); Assert.That(query.FromClause.Clause, Is.EqualTo("employees"));
Assert.That(query.HavingClause.Clause, Is.EqualTo("COUNT(*) > 5")); Assert.That(query.WhereClause.Clause, Is.EqualTo("salary > 50000"));
Assert.That(query.OrderByClause.Clause, Is.EqualTo("employee_count DESC")); Assert.That(query.GroupByClause.Clause, Is.EqualTo("department"));
Assert.That(query.HavingClause.Clause, Is.EqualTo("COUNT(*) > 5"));
Assert.That(query.OrderByClause.Clause, Is.EqualTo("employee_count DESC"));
});
} }
[Test] [Test]
@@ -186,12 +213,18 @@ public class QueryBreakdownExtensionsTests
.Select("*") .Select("*")
.From("active_users"); .From("active_users");
// Assert Assert.Multiple(() =>
Assert.That(query.IsUsingWithClause, Is.True); {
Assert.That(query.WithClauses, Has.Count.EqualTo(1)); // Assert
Assert.That(query.WithClauses[0].TableName, Is.EqualTo("active_users")); Assert.That(query.IsUsingWithClause, Is.True);
Assert.That(query.SelectClause.Clause, Is.EqualTo("*")); Assert.That(query.WithClauses, Has.Count.EqualTo(1));
Assert.That(query.FromClause.Clause, Is.EqualTo("active_users")); });
Assert.Multiple(() =>
{
Assert.That(query.WithClauses[0].TableName, Is.EqualTo("active_users"));
Assert.That(query.SelectClause.Clause, Is.EqualTo("*"));
Assert.That(query.FromClause.Clause, Is.EqualTo("active_users"));
});
} }
[Test] [Test]
@@ -236,11 +269,17 @@ public class QueryBreakdownExtensionsTests
.From("active_users u LEFT JOIN recent_orders o ON u.id = o.user_id") .From("active_users u LEFT JOIN recent_orders o ON u.id = o.user_id")
.GroupBy("u.id, u.name"); .GroupBy("u.id, u.name");
// Assert Assert.Multiple(() =>
Assert.That(query.IsUsingWithClause, Is.True); {
Assert.That(query.WithClauses, Has.Count.EqualTo(2)); // Assert
Assert.That(query.WithClauses[0].TableName, Is.EqualTo("active_users")); Assert.That(query.IsUsingWithClause, Is.True);
Assert.That(query.WithClauses[1].TableName, Is.EqualTo("recent_orders")); Assert.That(query.WithClauses, Has.Count.EqualTo(2));
});
Assert.Multiple(() =>
{
Assert.That(query.WithClauses[0].TableName, Is.EqualTo("active_users"));
Assert.That(query.WithClauses[1].TableName, Is.EqualTo("recent_orders"));
});
} }
private static readonly string[] columns = new[] { "id", "name", "email" }; private static readonly string[] columns = new[] { "id", "name", "email" };
@@ -259,10 +298,13 @@ public class QueryBreakdownExtensionsTests
var sql = query.GetSql(); var sql = query.GetSql();
// Assert Assert.Multiple(() =>
Assert.That(query.IsUsingWithClause, Is.True); {
Assert.That(query.WithClauses, Has.Count.EqualTo(1)); // Assert
Assert.That(sql, Does.Contain("active_users (id, name, email)")); Assert.That(query.IsUsingWithClause, Is.True);
Assert.That(query.WithClauses, Has.Count.EqualTo(1));
Assert.That(sql, Does.Contain("active_users (id, name, email)"));
});
} }
[Test] [Test]
@@ -280,9 +322,12 @@ public class QueryBreakdownExtensionsTests
.Select("*") .Select("*")
.From("active_users"); .From("active_users");
// Assert Assert.Multiple(() =>
Assert.That(query.IsUsingWithClause, Is.True); {
Assert.That(query.WithClauses, Has.Count.EqualTo(1)); // Assert
Assert.That(query.IsUsingWithClause, Is.True);
Assert.That(query.WithClauses, Has.Count.EqualTo(1));
});
Assert.That(query.WithClauses[0].TableName, Is.EqualTo("active_users")); Assert.That(query.WithClauses[0].TableName, Is.EqualTo("active_users"));
} }
@@ -331,8 +376,11 @@ public class QueryBreakdownExtensionsTests
// Assert // Assert
Assert.That(sql, Does.Contain("WITH")); Assert.That(sql, Does.Contain("WITH"));
Assert.That(sql, Does.Contain("monthly_sales AS")); Assert.That(sql, Does.Contain("monthly_sales AS"));
Assert.That(sql, Does.Contain("LAG(total_sales)")); Assert.Multiple(() =>
Assert.That(query.IsUsingWithClause, Is.True); {
Assert.That(sql, Does.Contain("LAG(total_sales)"));
Assert.That(query.IsUsingWithClause, Is.True);
});
} }
[Test] [Test]
@@ -355,9 +403,12 @@ public class QueryBreakdownExtensionsTests
var sql = query.GetSql(); var sql = query.GetSql();
// Assert Assert.Multiple(() =>
Assert.That(query.WithClauses, Has.Count.EqualTo(2)); {
Assert.That(sql, Does.Contain("active_users AS")); // Assert
Assert.That(query.WithClauses, Has.Count.EqualTo(2));
Assert.That(sql, Does.Contain("active_users AS"));
});
Assert.That(sql, Does.Contain("user_orders AS")); Assert.That(sql, Does.Contain("user_orders AS"));
Assert.That(sql, Does.Contain("customer_tier")); Assert.That(sql, Does.Contain("customer_tier"));
} }
@@ -467,9 +518,12 @@ public class QueryBreakdownExtensionsTests
// Act - Overwrite clauses // Act - Overwrite clauses
query.Select("id, name").Where("active = 0"); query.Select("id, name").Where("active = 0");
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo("id, name")); {
Assert.That(query.WhereClause.Clause, Is.EqualTo("active = 0")); // Assert
Assert.That(query.SelectClause.Clause, Is.EqualTo("id, name"));
Assert.That(query.WhereClause.Clause, Is.EqualTo("active = 0"));
});
} }
[Test] [Test]
@@ -481,10 +535,13 @@ public class QueryBreakdownExtensionsTests
.From("") .From("")
.Where(""); .Where("");
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo("")); {
Assert.That(query.FromClause.Clause, Is.EqualTo("")); // Assert
Assert.That(query.WhereClause.Clause, Is.EqualTo("")); Assert.That(query.SelectClause.Clause, Is.EqualTo(""));
Assert.That(query.FromClause.Clause, Is.EqualTo(""));
Assert.That(query.WhereClause.Clause, Is.EqualTo(""));
});
} }
[Test] [Test]
@@ -495,9 +552,12 @@ public class QueryBreakdownExtensionsTests
.Select(" id, name ") .Select(" id, name ")
.From(" users "); .From(" users ");
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo(" id, name ")); {
Assert.That(query.FromClause.Clause, Is.EqualTo(" users ")); // Assert
Assert.That(query.SelectClause.Clause, Is.EqualTo(" id, name "));
Assert.That(query.FromClause.Clause, Is.EqualTo(" users "));
});
} }
#endregion #endregion
@@ -33,24 +33,30 @@ public class JsonTokenReaderTests
// Validate JSON starts with StartObject and ends with EndObject // Validate JSON starts with StartObject and ends with EndObject
Assert.That(tokens.Count, Is.GreaterThan(2)); Assert.That(tokens.Count, Is.GreaterThan(2));
Assert.That(tokens[0].Type, Is.EqualTo(JsonTokenType.StartObject)); Assert.Multiple(() =>
Assert.That(tokens[^1].Type, Is.EqualTo(JsonTokenType.EndObject)); {
Assert.That(tokens.Count(t => t.Type == JsonTokenType.PropertyName && t.Value == "foo"), Is.EqualTo(1)); Assert.That(tokens[0].Type, Is.EqualTo(JsonTokenType.StartObject));
Assert.That(tokens.Count(t => t.Type == JsonTokenType.String && t.Value == "bar"), Is.EqualTo(1)); Assert.That(tokens[^1].Type, Is.EqualTo(JsonTokenType.EndObject));
Assert.That(tokens.Count(t => t.Type == JsonTokenType.PropertyName && t.Value == "myList"), Is.EqualTo(1)); Assert.That(tokens.Count(t => t.Type == JsonTokenType.PropertyName && t.Value == "foo"), Is.EqualTo(1));
Assert.That(tokens.Count(t => t.Type == JsonTokenType.StartArray), Is.EqualTo(1)); Assert.That(tokens.Count(t => t.Type == JsonTokenType.String && t.Value == "bar"), Is.EqualTo(1));
Assert.That(tokens.Count(t => t.Type == JsonTokenType.PropertyName && t.Value == "another"), Is.EqualTo(1)); Assert.That(tokens.Count(t => t.Type == JsonTokenType.PropertyName && t.Value == "myList"), Is.EqualTo(1));
Assert.That(tokens.Count(t => t.Type == JsonTokenType.Number && t.Value == "12"), Is.EqualTo(1)); Assert.That(tokens.Count(t => t.Type == JsonTokenType.StartArray), Is.EqualTo(1));
Assert.That(tokens.Count(t => t.Type == JsonTokenType.PropertyName && t.Value == "another"), Is.EqualTo(1));
Assert.That(tokens.Count(t => t.Type == JsonTokenType.Number && t.Value == "12"), Is.EqualTo(1));
});
// Deep validation of JSON content structure // Deep validation of JSON content structure
var tokenIndex = 4; var tokenIndex = 4;
// Token 4: [ Assert.Multiple(() =>
Assert.That(tokens[tokenIndex++].Type, Is.EqualTo(JsonTokenType.StartArray)); {
// Token 4: [
Assert.That(tokens[tokenIndex++].Type, Is.EqualTo(JsonTokenType.StartArray));
// Token 5-8: Array elements [1,2,3,4] // Token 5-8: Array elements [1,2,3,4]
Assert.That(tokens[tokenIndex].Type, Is.EqualTo(JsonTokenType.Number)); Assert.That(tokens[tokenIndex].Type, Is.EqualTo(JsonTokenType.Number));
Assert.That(tokens[tokenIndex++].Value, Is.EqualTo("1")); Assert.That(tokens[tokenIndex++].Value, Is.EqualTo("1"));
});
Assert.That(tokens[tokenIndex].Type, Is.EqualTo(JsonTokenType.Number)); Assert.That(tokens[tokenIndex].Type, Is.EqualTo(JsonTokenType.Number));
Assert.That(tokens[tokenIndex++].Value, Is.EqualTo("2")); Assert.That(tokens[tokenIndex++].Value, Is.EqualTo("2"));
Assert.That(tokens[tokenIndex].Type, Is.EqualTo(JsonTokenType.Number)); Assert.That(tokens[tokenIndex].Type, Is.EqualTo(JsonTokenType.Number));
@@ -17,9 +17,12 @@ public class SqlBreakdownCollectionCoreTests : SqlBreakdownCollectionTestBase
// Assert // Assert
Assert.That(collection, Is.Empty); Assert.That(collection, Is.Empty);
Assert.That(collection.IsEmpty, Is.True); Assert.Multiple(() =>
Assert.That(collection.Breakdowns, Is.Empty); {
Assert.That(collection.RawStatements, Is.Empty); Assert.That(collection.IsEmpty, Is.True);
Assert.That(collection.Breakdowns, Is.Empty);
Assert.That(collection.RawStatements, Is.Empty);
});
} }
[Test] [Test]
@@ -104,9 +107,12 @@ public class SqlBreakdownCollectionCoreTests : SqlBreakdownCollectionTestBase
// Act // Act
var result = collection.Remove(breakdown); var result = collection.Remove(breakdown);
// Assert Assert.Multiple(() =>
Assert.That(result, Is.True); {
Assert.That(collection, Is.Empty); // Assert
Assert.That(result, Is.True);
Assert.That(collection, Is.Empty);
});
} }
[Test] [Test]
@@ -119,9 +125,12 @@ public class SqlBreakdownCollectionCoreTests : SqlBreakdownCollectionTestBase
// Act // Act
var result = collection.Remove(otherBreakdown); var result = collection.Remove(otherBreakdown);
// Assert Assert.Multiple(() =>
Assert.That(result, Is.False); {
Assert.That(collection, Has.Count.EqualTo(1)); // Assert
Assert.That(result, Is.False);
Assert.That(collection, Has.Count.EqualTo(1));
});
} }
[Test] [Test]
@@ -160,9 +169,12 @@ public class SqlBreakdownCollectionCoreTests : SqlBreakdownCollectionTestBase
// Assert // Assert
Assert.That(collection.RawStatements, Has.Count.EqualTo(3)); Assert.That(collection.RawStatements, Has.Count.EqualTo(3));
Assert.That(collection.RawStatements[0], Does.Contain("Table1")); Assert.Multiple(() =>
Assert.That(collection.RawStatements[1], Does.Contain("Table2")); {
Assert.That(collection.RawStatements[2], Does.Contain("Table3")); Assert.That(collection.RawStatements[0], Does.Contain("Table1"));
Assert.That(collection.RawStatements[1], Does.Contain("Table2"));
Assert.That(collection.RawStatements[2], Does.Contain("Table3"));
});
} }
[Test] [Test]
@@ -223,8 +235,11 @@ public class SqlBreakdownCollectionCoreTests : SqlBreakdownCollectionTestBase
// Assert // Assert
Assert.That(collection.RawStatements, Has.Count.EqualTo(2)); Assert.That(collection.RawStatements, Has.Count.EqualTo(2));
Assert.That(collection.RawStatements[0], Does.Contain("Table1")); Assert.Multiple(() =>
Assert.That(collection.RawStatements[1], Does.Contain("Table2")); {
Assert.That(collection.RawStatements[0], Does.Contain("Table1"));
Assert.That(collection.RawStatements[1], Does.Contain("Table2"));
});
} }
[Test] [Test]
@@ -32,8 +32,11 @@ public class SqlBreakdownCollectionCreateTests : SqlBreakdownCollectionTestBase
// Assert // Assert
Assert.That(collection, Has.Count.EqualTo(2)); Assert.That(collection, Has.Count.EqualTo(2));
Assert.That(collection.GetRawStatementAt(0), Does.Contain("CREATE TABLE Users")); Assert.Multiple(() =>
Assert.That(collection.GetRawStatementAt(1), Does.Contain("CREATE TABLE Orders")); {
Assert.That(collection.GetRawStatementAt(0), Does.Contain("CREATE TABLE Users"));
Assert.That(collection.GetRawStatementAt(1), Does.Contain("CREATE TABLE Orders"));
});
} }
[Test] [Test]
@@ -52,8 +55,11 @@ public class SqlBreakdownCollectionCreateTests : SqlBreakdownCollectionTestBase
// Assert // Assert
Assert.That(collection, Has.Count.EqualTo(2)); Assert.That(collection, Has.Count.EqualTo(2));
Assert.That(collection.GetRawStatementAt(0), Does.Contain("CREATE INDEX")); Assert.Multiple(() =>
Assert.That(collection.GetRawStatementAt(1), Does.Contain("UNIQUE")); {
Assert.That(collection.GetRawStatementAt(0), Does.Contain("CREATE INDEX"));
Assert.That(collection.GetRawStatementAt(1), Does.Contain("UNIQUE"));
});
} }
[Test] [Test]
@@ -26,9 +26,12 @@ public class SqlBreakdownCollectionDeleteTests : SqlBreakdownCollectionTestBase
// Assert // Assert
Assert.That(collection, Has.Count.EqualTo(3)); Assert.That(collection, Has.Count.EqualTo(3));
Assert.That(collection.GetRawStatementAt(0), Does.Contain("DELETE FROM Orders")); Assert.Multiple(() =>
Assert.That(collection.GetRawStatementAt(1), Does.Contain("NOT IN")); {
Assert.That(collection.GetRawStatementAt(2), Does.Contain("DATEADD")); Assert.That(collection.GetRawStatementAt(0), Does.Contain("DELETE FROM Orders"));
Assert.That(collection.GetRawStatementAt(1), Does.Contain("NOT IN"));
Assert.That(collection.GetRawStatementAt(2), Does.Contain("DATEADD"));
});
} }
[Test] [Test]
@@ -26,8 +26,11 @@ public class SqlBreakdownCollectionDropTests : SqlBreakdownCollectionTestBase
// Assert // Assert
Assert.That(collection, Has.Count.EqualTo(3)); Assert.That(collection, Has.Count.EqualTo(3));
Assert.That(collection.GetRawStatementAt(0), Does.Contain("DROP TABLE")); Assert.Multiple(() =>
Assert.That(collection.GetRawStatementAt(1), Does.Contain("DROP TABLE")); {
Assert.That(collection.GetRawStatementAt(0), Does.Contain("DROP TABLE"));
Assert.That(collection.GetRawStatementAt(1), Does.Contain("DROP TABLE"));
});
} }
[Test] [Test]
@@ -48,8 +51,11 @@ public class SqlBreakdownCollectionDropTests : SqlBreakdownCollectionTestBase
// Assert // Assert
Assert.That(collection, Has.Count.EqualTo(3)); Assert.That(collection, Has.Count.EqualTo(3));
Assert.That(collection.GetRawStatementAt(0), Does.Contain("DROP INDEX")); Assert.Multiple(() =>
Assert.That(collection.GetRawStatementAt(1), Does.Contain("PROCEDURE")); {
Assert.That(collection.GetRawStatementAt(2), Does.Contain("VIEW")); Assert.That(collection.GetRawStatementAt(0), Does.Contain("DROP INDEX"));
Assert.That(collection.GetRawStatementAt(1), Does.Contain("PROCEDURE"));
Assert.That(collection.GetRawStatementAt(2), Does.Contain("VIEW"));
});
} }
} }
@@ -26,9 +26,12 @@ public class SqlBreakdownCollectionInsertTests : SqlBreakdownCollectionTestBase
// Assert // Assert
Assert.That(collection, Has.Count.EqualTo(3)); Assert.That(collection, Has.Count.EqualTo(3));
Assert.That(collection.GetRawStatementAt(0), Does.Contain("INSERT INTO Users")); Assert.Multiple(() =>
Assert.That(collection.GetRawStatementAt(1), Does.Contain("Jane Smith")); {
Assert.That(collection.GetRawStatementAt(2), Does.Contain("Bob Johnson")); Assert.That(collection.GetRawStatementAt(0), Does.Contain("INSERT INTO Users"));
Assert.That(collection.GetRawStatementAt(1), Does.Contain("Jane Smith"));
Assert.That(collection.GetRawStatementAt(2), Does.Contain("Bob Johnson"));
});
} }
[Test] [Test]
@@ -38,12 +38,15 @@ public class SqlBreakdownCollectionMixedCrudTests : SqlBreakdownCollectionTestBa
// Assert // Assert
Assert.That(collection, Has.Count.EqualTo(7)); Assert.That(collection, Has.Count.EqualTo(7));
Assert.That(collection.GetRawStatementAt(0), Does.Contain("CREATE TABLE")); Assert.Multiple(() =>
Assert.That(collection.GetRawStatementAt(1), Does.Contain("INSERT")); {
Assert.That(collection.GetRawStatementAt(3), Does.Contain("SELECT")); Assert.That(collection.GetRawStatementAt(0), Does.Contain("CREATE TABLE"));
Assert.That(collection.GetRawStatementAt(4), Does.Contain("UPDATE")); Assert.That(collection.GetRawStatementAt(1), Does.Contain("INSERT"));
Assert.That(collection.GetRawStatementAt(5), Does.Contain("DELETE")); Assert.That(collection.GetRawStatementAt(3), Does.Contain("SELECT"));
Assert.That(collection.GetRawStatementAt(6), Does.Contain("DROP")); Assert.That(collection.GetRawStatementAt(4), Does.Contain("UPDATE"));
Assert.That(collection.GetRawStatementAt(5), Does.Contain("DELETE"));
Assert.That(collection.GetRawStatementAt(6), Does.Contain("DROP"));
});
} }
[Test] [Test]
@@ -44,8 +44,11 @@ public class SqlBreakdownCollectionParameterTests : SqlBreakdownCollectionTestBa
// Assert // Assert
Assert.That(collection, Has.Count.EqualTo(2)); Assert.That(collection, Has.Count.EqualTo(2));
Assert.That(collection.GetRawStatementAt(0), Does.Contain("@Name")); Assert.Multiple(() =>
Assert.That(collection.GetRawStatementAt(1), Does.Contain("@Status")); {
Assert.That(collection.GetRawStatementAt(0), Does.Contain("@Name"));
Assert.That(collection.GetRawStatementAt(1), Does.Contain("@Status"));
});
} }
[Test] [Test]
@@ -31,8 +31,11 @@ public class SqlBreakdownCollectionSelectTests : SqlBreakdownCollectionTestBase
// Assert // Assert
Assert.That(collection, Has.Count.EqualTo(2)); Assert.That(collection, Has.Count.EqualTo(2));
Assert.That(collection.GetRawStatementAt(0), Does.Contain("LEFT JOIN")); Assert.That(collection.GetRawStatementAt(0), Does.Contain("LEFT JOIN"));
Assert.That(collection.GetRawStatementAt(0), Does.Contain("GROUP BY")); Assert.Multiple(() =>
Assert.That(collection.GetRawStatementAt(1), Does.Contain("BETWEEN")); {
Assert.That(collection.GetRawStatementAt(0), Does.Contain("GROUP BY"));
Assert.That(collection.GetRawStatementAt(1), Does.Contain("BETWEEN"));
});
} }
[Test] [Test]
@@ -80,7 +83,10 @@ public class SqlBreakdownCollectionSelectTests : SqlBreakdownCollectionTestBase
// Assert // Assert
Assert.That(collection, Has.Count.EqualTo(2)); Assert.That(collection, Has.Count.EqualTo(2));
Assert.That(collection.GetRawStatementAt(0), Does.Contain("JOIN")); Assert.Multiple(() =>
Assert.That(collection.GetRawStatementAt(1), Does.Contain("IN")); {
Assert.That(collection.GetRawStatementAt(0), Does.Contain("JOIN"));
Assert.That(collection.GetRawStatementAt(1), Does.Contain("IN"));
});
} }
} }
@@ -26,9 +26,12 @@ public class SqlBreakdownCollectionSeparatorTests : SqlBreakdownCollectionTestBa
// Assert // Assert
Assert.That(collection, Has.Count.EqualTo(3)); Assert.That(collection, Has.Count.EqualTo(3));
Assert.That(collection.GetRawStatementAt(0), Does.Contain("Users")); Assert.Multiple(() =>
Assert.That(collection.GetRawStatementAt(1), Does.Contain("Orders")); {
Assert.That(collection.GetRawStatementAt(2), Does.Contain("Products")); Assert.That(collection.GetRawStatementAt(0), Does.Contain("Users"));
Assert.That(collection.GetRawStatementAt(1), Does.Contain("Orders"));
Assert.That(collection.GetRawStatementAt(2), Does.Contain("Products"));
});
} }
[Test] [Test]
@@ -26,9 +26,12 @@ public class SqlBreakdownCollectionUpdateTests : SqlBreakdownCollectionTestBase
// Assert // Assert
Assert.That(collection, Has.Count.EqualTo(3)); Assert.That(collection, Has.Count.EqualTo(3));
Assert.That(collection.GetRawStatementAt(0), Does.Contain("UPDATE Users")); Assert.Multiple(() =>
Assert.That(collection.GetRawStatementAt(1), Does.Contain("Status")); {
Assert.That(collection.GetRawStatementAt(2), Does.Contain("Price * 1.1")); Assert.That(collection.GetRawStatementAt(0), Does.Contain("UPDATE Users"));
Assert.That(collection.GetRawStatementAt(1), Does.Contain("Status"));
Assert.That(collection.GetRawStatementAt(2), Does.Contain("Price * 1.1"));
});
} }
[Test] [Test]
@@ -53,8 +56,11 @@ public class SqlBreakdownCollectionUpdateTests : SqlBreakdownCollectionTestBase
// Assert // Assert
Assert.That(collection, Has.Count.EqualTo(2)); Assert.That(collection, Has.Count.EqualTo(2));
Assert.That(collection.GetRawStatementAt(0), Does.Contain("UPDATE u")); Assert.Multiple(() =>
Assert.That(collection.GetRawStatementAt(1), Does.Contain("Quantity - 1")); {
Assert.That(collection.GetRawStatementAt(0), Does.Contain("UPDATE u"));
Assert.That(collection.GetRawStatementAt(1), Does.Contain("Quantity - 1"));
});
} }
[Test] [Test]
@@ -181,8 +181,11 @@ public class GetClausesCachingTests
// Assert // Assert
Assert.That(clauses2, Is.Not.SameAs(clauses1), "GetClauses should return a new instance after ApplyClauses"); Assert.That(clauses2, Is.Not.SameAs(clauses1), "GetClauses should return a new instance after ApplyClauses");
Assert.That(clauses2.SelectClause?.Clause, Is.EqualTo("id, name")); Assert.Multiple(() =>
Assert.That(clauses2.FromClause?.Clause, Is.EqualTo("customers")); {
Assert.That(clauses2.SelectClause?.Clause, Is.EqualTo("id, name"));
Assert.That(clauses2.FromClause?.Clause, Is.EqualTo("customers"));
});
} }
[Test] [Test]
@@ -197,10 +200,13 @@ public class GetClausesCachingTests
// Assert // Assert
Assert.That(clauses, Is.Not.Null); Assert.That(clauses, Is.Not.Null);
Assert.That(clauses.SelectClause?.Clause, Is.EqualTo("id, name")); Assert.Multiple(() =>
Assert.That(clauses.FromClause?.Clause, Is.EqualTo("users")); {
Assert.That(clauses.WhereClause?.Clause, Is.EqualTo("active = 1")); Assert.That(clauses.SelectClause?.Clause, Is.EqualTo("id, name"));
Assert.That(clauses.OrderByClause?.Clause, Is.EqualTo("name ASC")); Assert.That(clauses.FromClause?.Clause, Is.EqualTo("users"));
Assert.That(clauses.WhereClause?.Clause, Is.EqualTo("active = 1"));
Assert.That(clauses.OrderByClause?.Clause, Is.EqualTo("name ASC"));
});
} }
[Test] [Test]
@@ -214,8 +220,11 @@ public class GetClausesCachingTests
var clauses2 = query.GetClauses(); var clauses2 = query.GetClauses();
var clauses3 = query.GetClauses(); var clauses3 = query.GetClauses();
// Assert - All should be the same instance Assert.Multiple(() =>
Assert.That(clauses2, Is.SameAs(clauses1)); {
Assert.That(clauses3, Is.SameAs(clauses1)); // Assert - All should be the same instance
Assert.That(clauses2, Is.SameAs(clauses1));
Assert.That(clauses3, Is.SameAs(clauses1));
});
} }
} }
@@ -20,9 +20,12 @@ public class CTEColumnListTests
// Act & Assert // Act & Assert
Assert.That(withClause.ColumnList, Has.Count.EqualTo(3)); Assert.That(withClause.ColumnList, Has.Count.EqualTo(3));
Assert.That(withClause.ColumnList[0], Is.EqualTo("user_id")); Assert.Multiple(() =>
Assert.That(withClause.ColumnList[1], Is.EqualTo("user_name")); {
Assert.That(withClause.ColumnList[2], Is.EqualTo("user_email")); Assert.That(withClause.ColumnList[0], Is.EqualTo("user_id"));
Assert.That(withClause.ColumnList[1], Is.EqualTo("user_name"));
Assert.That(withClause.ColumnList[2], Is.EqualTo("user_email"));
});
} }
[Test] [Test]
@@ -362,9 +365,12 @@ public class CTEColumnListTests
// Assert // Assert
Assert.That(sql, Contains.Substring("recent_sales (cust_id, order_id, sale_date, amount)")); Assert.That(sql, Contains.Substring("recent_sales (cust_id, order_id, sale_date, amount)"));
var paramKeys = params_all.Keys.ToList(); var paramKeys = params_all.Keys.ToList();
Assert.That(paramKeys.Any(k => k.Contains("StartDate"))); Assert.Multiple(() =>
Assert.That(paramKeys.Any(k => k.Contains("MinAmount"))); {
Assert.That(paramKeys.Any(k => k.Contains("CurrencyConversion"))); Assert.That(paramKeys.Any(k => k.Contains("StartDate")));
Assert.That(paramKeys.Any(k => k.Contains("MinAmount")));
Assert.That(paramKeys.Any(k => k.Contains("CurrencyConversion")));
});
} }
#endregion #endregion
@@ -21,8 +21,11 @@ public class CommentTests
// Assert // Assert
Assert.That(query.SelectClause.Clause, Does.Contain("ID")); Assert.That(query.SelectClause.Clause, Does.Contain("ID"));
Assert.That(query.SelectClause.Clause, Does.Contain("Name")); Assert.That(query.SelectClause.Clause, Does.Contain("Name"));
Assert.That(query.SelectClause.Clause, Does.Contain("Email")); Assert.Multiple(() =>
Assert.That(query.SelectClause.Comment, Does.Contain("-- This is a customer name")); {
Assert.That(query.SelectClause.Clause, Does.Contain("Email"));
Assert.That(query.SelectClause.Comment, Does.Contain("-- This is a customer name"));
});
} }
[Test] [Test]
@@ -42,8 +45,11 @@ public class CommentTests
// Assert // Assert
Assert.That(query.SelectClause.Clause, Does.Contain("ID")); Assert.That(query.SelectClause.Clause, Does.Contain("ID"));
Assert.That(query.SelectClause.Clause, Does.Contain("Name")); Assert.Multiple(() =>
Assert.That(query.SelectClause.Comment, Does.Contain("/* Multi-line comment")); {
Assert.That(query.SelectClause.Clause, Does.Contain("Name"));
Assert.That(query.SelectClause.Comment, Does.Contain("/* Multi-line comment"));
});
Assert.That(query.SelectClause.Comment, Does.Contain("explaining the query */")); Assert.That(query.SelectClause.Comment, Does.Contain("explaining the query */"));
} }
@@ -64,11 +70,14 @@ public class CommentTests
// Act // Act
var query = QueryBreakdown.Parse(sql); var query = QueryBreakdown.Parse(sql);
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Comment, Does.Contain("-- Select specific columns")); {
Assert.That(query.FromClause.Comment, Does.Contain("-- Main user table")); // Assert
Assert.That(query.WhereClause.Comment, Does.Contain("/* Active users only */")); Assert.That(query.SelectClause.Comment, Does.Contain("-- Select specific columns"));
Assert.That(query.OrderByClause.Comment, Does.Contain("-- Sort by name")); Assert.That(query.FromClause.Comment, Does.Contain("-- Main user table"));
Assert.That(query.WhereClause.Comment, Does.Contain("/* Active users only */"));
Assert.That(query.OrderByClause.Comment, Does.Contain("-- Sort by name"));
});
} }
[Test] [Test]
@@ -100,10 +109,13 @@ public class CommentTests
// Act // Act
var query = QueryBreakdown.Parse(sql); var query = QueryBreakdown.Parse(sql);
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Comment, Is.Null.Or.Empty); {
Assert.That(query.FromClause.Comment, Is.Null.Or.Empty); // Assert
Assert.That(query.WhereClause.Comment, Is.Null.Or.Empty); Assert.That(query.SelectClause.Comment, Is.Null.Or.Empty);
Assert.That(query.FromClause.Comment, Is.Null.Or.Empty);
Assert.That(query.WhereClause.Comment, Is.Null.Or.Empty);
});
} }
[Test] [Test]
@@ -121,10 +133,13 @@ public class CommentTests
// Act // Act
var cloned = (QueryBreakdown)original.Clone(); var cloned = (QueryBreakdown)original.Clone();
// Assert Assert.Multiple(() =>
Assert.That(cloned.SelectClause.Comment, Is.EqualTo(original.SelectClause.Comment)); {
Assert.That(cloned.FromClause.Comment, Is.EqualTo(original.FromClause.Comment)); // Assert
Assert.That(cloned.WhereClause.Comment, Is.EqualTo(original.WhereClause.Comment)); Assert.That(cloned.SelectClause.Comment, Is.EqualTo(original.SelectClause.Comment));
Assert.That(cloned.FromClause.Comment, Is.EqualTo(original.FromClause.Comment));
Assert.That(cloned.WhereClause.Comment, Is.EqualTo(original.WhereClause.Comment));
});
} }
[Test] [Test]
@@ -221,10 +236,16 @@ public class CommentTests
// Assert // Assert
Assert.That(comments, Has.Count.EqualTo(2)); Assert.That(comments, Has.Count.EqualTo(2));
Assert.That(comments[0], Does.Contain("-- Single line")); Assert.Multiple(() =>
Assert.That(comments[1], Does.Contain("/* Multi")); {
Assert.That(comments[1], Does.Contain("line */")); Assert.That(comments[0], Does.Contain("-- Single line"));
Assert.That(cleanSql, Does.Not.Contain("-- Single line")); Assert.That(comments[1], Does.Contain("/* Multi"));
});
Assert.Multiple(() =>
{
Assert.That(comments[1], Does.Contain("line */"));
Assert.That(cleanSql, Does.Not.Contain("-- Single line"));
});
Assert.That(cleanSql, Does.Not.Contain("/*")); Assert.That(cleanSql, Does.Not.Contain("/*"));
} }
@@ -257,15 +278,21 @@ public class CommentTests
Assert.That(query.SelectClause.Clause, Does.Contain("Name")); Assert.That(query.SelectClause.Clause, Does.Contain("Name"));
Assert.That(query.SelectClause.Clause, Does.Contain("Email")); Assert.That(query.SelectClause.Clause, Does.Contain("Email"));
Assert.That(query.SelectClause.Clause, Does.Not.Contain("--")); Assert.That(query.SelectClause.Clause, Does.Not.Contain("--"));
Assert.That(query.SelectClause.Clause, Does.Not.Contain("/*")); Assert.Multiple(() =>
{
Assert.That(query.SelectClause.Clause, Does.Not.Contain("/*"));
Assert.That(query.SelectClause.Comment, Does.Contain("-- Primary key")); Assert.That(query.SelectClause.Comment, Does.Contain("-- Primary key"));
});
Assert.That(query.SelectClause.Comment, Does.Contain("-- Customer name field")); Assert.That(query.SelectClause.Comment, Does.Contain("-- Customer name field"));
Assert.That(query.SelectClause.Comment, Does.Contain("/* Email address for notifications */")); Assert.Multiple(() =>
{
Assert.That(query.SelectClause.Comment, Does.Contain("/* Email address for notifications */"));
Assert.That(query.FromClause.Comment, Does.Contain("-- Main user table")); Assert.That(query.FromClause.Comment, Does.Contain("-- Main user table"));
Assert.That(query.WhereClause.Comment, Does.Contain("/* Filter for active users only */")); Assert.That(query.WhereClause.Comment, Does.Contain("/* Filter for active users only */"));
Assert.That(query.OrderByClause.Comment, Does.Contain("-- Sort alphabetically")); Assert.That(query.OrderByClause.Comment, Does.Contain("-- Sort alphabetically"));
});
// Act - Generate SQL // Act - Generate SQL
var regeneratedSql = query.GetSql(); var regeneratedSql = query.GetSql();
@@ -87,9 +87,12 @@ public class QueryBreakdownCollectionTests
// Act // Act
var removed = _collection.Remove(query); var removed = _collection.Remove(query);
// Assert Assert.Multiple(() =>
Assert.That(removed, Is.True); {
Assert.That(_collection, Is.Empty); // Assert
Assert.That(removed, Is.True);
Assert.That(_collection, Is.Empty);
});
} }
[Test] [Test]
@@ -103,9 +106,12 @@ public class QueryBreakdownCollectionTests
// Act // Act
var removed = _collection.Remove(query2); var removed = _collection.Remove(query2);
// Assert Assert.Multiple(() =>
Assert.That(removed, Is.False); {
Assert.That(_collection, Has.Count.EqualTo(1)); // Assert
Assert.That(removed, Is.False);
Assert.That(_collection, Has.Count.EqualTo(1));
});
} }
[Test] [Test]
@@ -276,8 +282,11 @@ public class QueryBreakdownCollectionTests
// Assert // Assert
Assert.That(summaries, Has.Count.EqualTo(2)); Assert.That(summaries, Has.Count.EqualTo(2));
Assert.That(summaries[0].HasSelectClause, Is.True); Assert.Multiple(() =>
Assert.That(summaries[1].HasWhereClause, Is.True); {
Assert.That(summaries[0].HasSelectClause, Is.True);
Assert.That(summaries[1].HasWhereClause, Is.True);
});
} }
[Test] [Test]
@@ -327,9 +336,12 @@ public class QueryBreakdownCollectionTests
// Act // Act
_collection.AddParameterToAll("CompanyId", 99); _collection.AddParameterToAll("CompanyId", 99);
// Assert Assert.Multiple(() =>
Assert.That(_collection.QueryBreakdowns[0].Parameters["CompanyId"], Is.EqualTo(99)); {
Assert.That(_collection.QueryBreakdowns[1].Parameters["CompanyId"], Is.EqualTo(99)); // Assert
Assert.That(_collection.QueryBreakdowns[0].Parameters["CompanyId"], Is.EqualTo(99));
Assert.That(_collection.QueryBreakdowns[1].Parameters["CompanyId"], Is.EqualTo(99));
});
} }
[Test] [Test]
@@ -16,16 +16,19 @@ public class QueryBreakdownTests
// Arrange & Act // Arrange & Act
var query = new QueryBreakdown(); var query = new QueryBreakdown();
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo(string.Empty)); {
Assert.That(query.FromClause.Clause, Is.EqualTo(string.Empty)); // Assert
Assert.That(query.WhereClause.Clause, Is.EqualTo(string.Empty)); Assert.That(query.SelectClause.Clause, Is.EqualTo(string.Empty));
Assert.That(query.OrderByClause.Clause, Is.EqualTo(string.Empty)); Assert.That(query.FromClause.Clause, Is.EqualTo(string.Empty));
Assert.That(query.GroupByClause.Clause, Is.EqualTo(string.Empty)); Assert.That(query.WhereClause.Clause, Is.EqualTo(string.Empty));
Assert.That(query.HavingClause.Clause, Is.EqualTo(string.Empty)); Assert.That(query.OrderByClause.Clause, Is.EqualTo(string.Empty));
Assert.That(query.SetupClauses, Is.Not.Null); Assert.That(query.GroupByClause.Clause, Is.EqualTo(string.Empty));
Assert.That(query.FinishClauses, Is.Not.Null); Assert.That(query.HavingClause.Clause, Is.EqualTo(string.Empty));
Assert.That(query.WithClauses, Is.Not.Null); Assert.That(query.SetupClauses, Is.Not.Null);
Assert.That(query.FinishClauses, Is.Not.Null);
Assert.That(query.WithClauses, Is.Not.Null);
});
Assert.That(query.WithClauses, Is.Empty); Assert.That(query.WithClauses, Is.Empty);
Assert.That(query.Parameters, Is.Not.Null); Assert.That(query.Parameters, Is.Not.Null);
Assert.That(query.ParameterList, Is.Not.Null); Assert.That(query.ParameterList, Is.Not.Null);
@@ -41,10 +44,13 @@ public class QueryBreakdownTests
// Act // Act
var query = new QueryBreakdown(selectClause, fromClause); var query = new QueryBreakdown(selectClause, fromClause);
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo(selectClause)); {
Assert.That(query.FromClause.Clause, Is.EqualTo(fromClause)); // Assert
Assert.That(query.WhereClause.Clause, Is.EqualTo(string.Empty)); Assert.That(query.SelectClause.Clause, Is.EqualTo(selectClause));
Assert.That(query.FromClause.Clause, Is.EqualTo(fromClause));
Assert.That(query.WhereClause.Clause, Is.EqualTo(string.Empty));
});
} }
[Test] [Test]
@@ -58,11 +64,14 @@ public class QueryBreakdownTests
// Act // Act
var query = new QueryBreakdown(selectClause, fromClause, whereClause); var query = new QueryBreakdown(selectClause, fromClause, whereClause);
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo(selectClause)); {
Assert.That(query.FromClause.Clause, Is.EqualTo(fromClause)); // Assert
Assert.That(query.WhereClause.Clause, Is.EqualTo(whereClause)); Assert.That(query.SelectClause.Clause, Is.EqualTo(selectClause));
Assert.That(query.OrderByClause.Clause, Is.EqualTo(string.Empty)); Assert.That(query.FromClause.Clause, Is.EqualTo(fromClause));
Assert.That(query.WhereClause.Clause, Is.EqualTo(whereClause));
Assert.That(query.OrderByClause.Clause, Is.EqualTo(string.Empty));
});
} }
[Test] [Test]
@@ -77,11 +86,14 @@ public class QueryBreakdownTests
// Act // Act
var query = new QueryBreakdown(selectClause, fromClause, whereClause, orderByClause); var query = new QueryBreakdown(selectClause, fromClause, whereClause, orderByClause);
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo(selectClause)); {
Assert.That(query.FromClause.Clause, Is.EqualTo(fromClause)); // Assert
Assert.That(query.WhereClause.Clause, Is.EqualTo(whereClause)); Assert.That(query.SelectClause.Clause, Is.EqualTo(selectClause));
Assert.That(query.OrderByClause.Clause, Is.EqualTo(orderByClause)); Assert.That(query.FromClause.Clause, Is.EqualTo(fromClause));
Assert.That(query.WhereClause.Clause, Is.EqualTo(whereClause));
Assert.That(query.OrderByClause.Clause, Is.EqualTo(orderByClause));
});
} }
#endregion #endregion
@@ -147,9 +159,12 @@ public class QueryBreakdownTests
// Act // Act
query.AddParameter("UserId", 123); query.AddParameter("UserId", 123);
// Assert Assert.Multiple(() =>
Assert.That(query.ParameterList.Count(), Is.EqualTo(1)); {
Assert.That(query.Parameters["@UserId"], Is.EqualTo(123)); // Assert
Assert.That(query.ParameterList.Count(), Is.EqualTo(1));
Assert.That(query.Parameters["@UserId"], Is.EqualTo(123));
});
} }
[Test] [Test]
@@ -209,8 +224,11 @@ public class QueryBreakdownTests
// Assert // Assert
Assert.That(merged, Has.Count.EqualTo(2)); Assert.That(merged, Has.Count.EqualTo(2));
Assert.That(merged["@UserId"], Is.EqualTo(123)); Assert.Multiple(() =>
Assert.That(merged["@ActiveStatus"], Is.EqualTo(true)); {
Assert.That(merged["@UserId"], Is.EqualTo(123));
Assert.That(merged["@ActiveStatus"], Is.EqualTo(true));
});
} }
[Test] [Test]
@@ -229,8 +247,11 @@ public class QueryBreakdownTests
// Assert // Assert
Assert.That(merged, Has.Count.EqualTo(2)); Assert.That(merged, Has.Count.EqualTo(2));
Assert.That(merged["@MinDate"], Is.EqualTo(DateTime.Today.AddDays(-30))); Assert.Multiple(() =>
Assert.That(merged["@Limit"], Is.EqualTo(100)); {
Assert.That(merged["@MinDate"], Is.EqualTo(DateTime.Today.AddDays(-30)));
Assert.That(merged["@Limit"], Is.EqualTo(100));
});
} }
[Test] [Test]
@@ -253,9 +274,12 @@ public class QueryBreakdownTests
// Assert // Assert
Assert.That(merged, Has.Count.EqualTo(3)); Assert.That(merged, Has.Count.EqualTo(3));
Assert.That(merged["@Status1"], Is.EqualTo("active")); Assert.Multiple(() =>
Assert.That(merged["@MinDate"], Is.EqualTo(DateTime.Today.AddDays(-30))); {
Assert.That(merged["@ResultLimit"], Is.EqualTo(50)); Assert.That(merged["@Status1"], Is.EqualTo("active"));
Assert.That(merged["@MinDate"], Is.EqualTo(DateTime.Today.AddDays(-30)));
Assert.That(merged["@ResultLimit"], Is.EqualTo(50));
});
} }
[Test] [Test]
@@ -297,9 +321,12 @@ public class QueryBreakdownTests
// Assert - All parameters from all levels should be present // Assert - All parameters from all levels should be present
Assert.That(merged, Has.Count.EqualTo(3)); Assert.That(merged, Has.Count.EqualTo(3));
Assert.That(merged["@InnerParam"], Is.EqualTo("inner_value")); Assert.Multiple(() =>
Assert.That(merged["@MiddleParam"], Is.EqualTo("middle_value")); {
Assert.That(merged["@MainParam"], Is.EqualTo("main_value")); Assert.That(merged["@InnerParam"], Is.EqualTo("inner_value"));
Assert.That(merged["@MiddleParam"], Is.EqualTo("middle_value"));
Assert.That(merged["@MainParam"], Is.EqualTo("main_value"));
});
} }
[Test] [Test]
@@ -336,11 +363,14 @@ public class QueryBreakdownTests
// Act // Act
var merged = mainQuery.GetMergedParameters(); var merged = mainQuery.GetMergedParameters();
// Assert Assert.Multiple(() =>
Assert.That(merged["@IntValue"], Is.TypeOf<int>()); {
Assert.That(merged["@StringValue"], Is.TypeOf<string>()); // Assert
Assert.That(merged["@DateValue"], Is.TypeOf<DateTime>()); Assert.That(merged["@IntValue"], Is.TypeOf<int>());
Assert.That(merged["@DecimalValue"], Is.TypeOf<decimal>()); Assert.That(merged["@StringValue"], Is.TypeOf<string>());
Assert.That(merged["@DateValue"], Is.TypeOf<DateTime>());
Assert.That(merged["@DecimalValue"], Is.TypeOf<decimal>());
});
} }
#endregion #endregion
@@ -413,12 +443,18 @@ public class QueryBreakdownTests
// Act // Act
query.AddWhereClause("UserID = @UserId AND Status = @Status"); query.AddWhereClause("UserID = @UserId AND Status = @Status");
// Assert Assert.Multiple(() =>
Assert.That(query.WhereClause.Clause, Is.EqualTo("UserID = @UserId AND Status = @Status")); {
Assert.That(query.Parameters, Does.ContainKey("@UserId")); // Assert
Assert.That(query.WhereClause.Clause, Is.EqualTo("UserID = @UserId AND Status = @Status"));
Assert.That(query.Parameters, Does.ContainKey("@UserId"));
});
Assert.That(query.Parameters, Does.ContainKey("@Status")); Assert.That(query.Parameters, Does.ContainKey("@Status"));
Assert.That(query.Parameters["@UserId"], Is.Null); Assert.Multiple(() =>
Assert.That(query.Parameters["@Status"], Is.Null); {
Assert.That(query.Parameters["@UserId"], Is.Null);
Assert.That(query.Parameters["@Status"], Is.Null);
});
} }
[Test] [Test]
@@ -481,9 +517,12 @@ public class QueryBreakdownTests
// Act - AddWhereClause should not overwrite existing non-null values // Act - AddWhereClause should not overwrite existing non-null values
query.AddWhereClause("UserID = @UserId AND Status = @Status"); query.AddWhereClause("UserID = @UserId AND Status = @Status");
// Assert - Values should be preserved Assert.Multiple(() =>
Assert.That(query.Parameters["@UserId"], Is.EqualTo(123)); {
Assert.That(query.Parameters["@Status"], Is.EqualTo("Active")); // Assert - Values should be preserved
Assert.That(query.Parameters["@UserId"], Is.EqualTo(123));
Assert.That(query.Parameters["@Status"], Is.EqualTo("Active"));
});
} }
#endregion #endregion
@@ -567,8 +606,11 @@ public class QueryBreakdownTests
// Assert // Assert
Assert.That(mainQuery.WithClauses, Has.Count.EqualTo(1)); Assert.That(mainQuery.WithClauses, Has.Count.EqualTo(1));
Assert.That(mainQuery.WithClauses[0].TableName, Is.EqualTo("ProductOrders")); Assert.Multiple(() =>
Assert.That(mainQuery.WithClauses[0].Query, Is.EqualTo(cteQuery)); {
Assert.That(mainQuery.WithClauses[0].TableName, Is.EqualTo("ProductOrders"));
Assert.That(mainQuery.WithClauses[0].Query, Is.EqualTo(cteQuery));
});
} }
[Test] [Test]
@@ -587,9 +629,12 @@ public class QueryBreakdownTests
// Assert // Assert
Assert.That(mainQuery.WithClauses, Has.Count.EqualTo(3)); Assert.That(mainQuery.WithClauses, Has.Count.EqualTo(3));
Assert.That(mainQuery.WithClauses[0].TableName, Is.EqualTo("CTE1")); Assert.Multiple(() =>
Assert.That(mainQuery.WithClauses[1].TableName, Is.EqualTo("CTE2")); {
Assert.That(mainQuery.WithClauses[2].TableName, Is.EqualTo("CTE3")); Assert.That(mainQuery.WithClauses[0].TableName, Is.EqualTo("CTE1"));
Assert.That(mainQuery.WithClauses[1].TableName, Is.EqualTo("CTE2"));
Assert.That(mainQuery.WithClauses[2].TableName, Is.EqualTo("CTE3"));
});
} }
[Test] [Test]
@@ -604,9 +649,12 @@ public class QueryBreakdownTests
// Assert // Assert
Assert.That(mainQuery.WithClauses, Has.Count.EqualTo(1)); Assert.That(mainQuery.WithClauses, Has.Count.EqualTo(1));
Assert.That(mainQuery.WithClauses[0].TableName, Is.EqualTo("ProductOrders")); Assert.Multiple(() =>
Assert.That(mainQuery.WithClauses[0].Query!.SelectClause.Clause, Does.Contain("ProductID")); {
Assert.That(mainQuery.WithClauses[0].Query!.GroupByClause.Clause, Does.Contain("ProductID")); Assert.That(mainQuery.WithClauses[0].TableName, Is.EqualTo("ProductOrders"));
Assert.That(mainQuery.WithClauses[0].Query!.SelectClause.Clause, Does.Contain("ProductID"));
Assert.That(mainQuery.WithClauses[0].Query!.GroupByClause.Clause, Does.Contain("ProductID"));
});
} }
[Test] [Test]
@@ -665,11 +713,14 @@ public class QueryBreakdownTests
var innerParams = innerCte.ParameterList.Count(); var innerParams = innerCte.ParameterList.Count();
var middleParams = middleCte.ParameterList.Count(); var middleParams = middleCte.ParameterList.Count();
// Assert - Each CTE maintains its own parameters Assert.Multiple(() =>
Assert.That(innerParams, Is.EqualTo(1)); {
Assert.That(middleParams, Is.EqualTo(1)); // Assert - Each CTE maintains its own parameters
// SQL should contain both WITH clauses Assert.That(innerParams, Is.EqualTo(1));
Assert.That(sql, Does.Contain("WITH")); 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("recent_users"));
Assert.That(sql, Does.Contain("filtered_users")); Assert.That(sql, Does.Contain("filtered_users"));
} }
@@ -722,8 +773,11 @@ public class QueryBreakdownTests
// Assert - Verify WITH clause appears before main SELECT // Assert - Verify WITH clause appears before main SELECT
var withIndex = sql.IndexOf("WITH"); var withIndex = sql.IndexOf("WITH");
var mainSelectIndex = sql.LastIndexOf("SELECT"); var mainSelectIndex = sql.LastIndexOf("SELECT");
Assert.That(withIndex, Is.GreaterThan(-1)); Assert.Multiple(() =>
Assert.That(mainSelectIndex, Is.GreaterThan(-1)); {
Assert.That(withIndex, Is.GreaterThan(-1));
Assert.That(mainSelectIndex, Is.GreaterThan(-1));
});
Assert.That(withIndex, Is.LessThan(mainSelectIndex)); Assert.That(withIndex, Is.LessThan(mainSelectIndex));
// Assert - Verify CTE definition // Assert - Verify CTE definition
@@ -745,13 +799,19 @@ public class QueryBreakdownTests
var sql = mainQuery.GetSql(); var sql = mainQuery.GetSql();
var withClause = mainQuery.WithClauses[0]; var withClause = mainQuery.WithClauses[0];
// Assert: Verify WithClause properties Assert.Multiple(() =>
Assert.That(withClause.TableName, Is.EqualTo("sales_team")); {
Assert.That(withClause.Query, Is.Not.Null); // Assert: Verify WithClause properties
Assert.That(withClause.Sql, Is.Not.Null); Assert.That(withClause.TableName, Is.EqualTo("sales_team"));
Assert.That(withClause.Sql?.SelectClause?.Clause, Contains.Substring("id, name")); Assert.That(withClause.Query, Is.Not.Null);
Assert.That(withClause.Sql?.FromClause?.Clause, Contains.Substring("employees")); Assert.That(withClause.Sql, Is.Not.Null);
Assert.That(withClause.Sql?.WhereClause?.Clause, Contains.Substring("department = 'Sales'")); });
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] [Test]
@@ -767,9 +827,12 @@ public class QueryBreakdownTests
var cte = new QueryBreakdown("id, name", "source_table"); var cte = new QueryBreakdown("id, name", "source_table");
query.AddWithClause("source_cte", cte); query.AddWithClause("source_cte", cte);
// Assert - Now using WITH clause Assert.Multiple(() =>
Assert.That(query.IsUsingWithClause, Is.True); {
Assert.That(query.WithClauses, Has.Count.EqualTo(1)); // Assert - Now using WITH clause
Assert.That(query.IsUsingWithClause, Is.True);
Assert.That(query.WithClauses, Has.Count.EqualTo(1));
});
} }
#endregion #endregion
@@ -925,9 +988,12 @@ public class QueryBreakdownTests
// Act // Act
var query = QueryBreakdown.Parse(sql); var query = QueryBreakdown.Parse(sql);
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause?.Trim(), Does.Contain("ID, Name")); {
Assert.That(query.FromClause.Clause?.Trim(), Does.Contain("Users")); // Assert
Assert.That(query.SelectClause.Clause?.Trim(), Does.Contain("ID, Name"));
Assert.That(query.FromClause.Clause?.Trim(), Does.Contain("Users"));
});
} }
[Test] [Test]
@@ -939,10 +1005,13 @@ public class QueryBreakdownTests
// Act // Act
var query = QueryBreakdown.Parse(sql); var query = QueryBreakdown.Parse(sql);
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause?.Trim(), Does.Contain("ID, Name")); {
Assert.That(query.FromClause.Clause?.Trim(), Does.Contain("Users")); // Assert
Assert.That(query.WhereClause.Clause?.Trim(), Does.Contain("Active = 1")); Assert.That(query.SelectClause.Clause?.Trim(), Does.Contain("ID, Name"));
Assert.That(query.FromClause.Clause?.Trim(), Does.Contain("Users"));
Assert.That(query.WhereClause.Clause?.Trim(), Does.Contain("Active = 1"));
});
} }
[Test] [Test]
@@ -954,10 +1023,13 @@ public class QueryBreakdownTests
// Act // Act
var query = QueryBreakdown.Parse(sql); var query = QueryBreakdown.Parse(sql);
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause?.Trim(), Does.Contain("Department")); {
Assert.That(query.GroupByClause.Clause?.Trim(), Does.Contain("Department")); // Assert
Assert.That(query.HavingClause.Clause?.Trim(), Does.Contain("COUNT(*) > 5")); Assert.That(query.SelectClause.Clause?.Trim(), Does.Contain("Department"));
Assert.That(query.GroupByClause.Clause?.Trim(), Does.Contain("Department"));
Assert.That(query.HavingClause.Clause?.Trim(), Does.Contain("COUNT(*) > 5"));
});
} }
[Test] [Test]
@@ -1003,10 +1075,13 @@ public class QueryBreakdownTests
// Act // Act
var query = QueryBreakdown.Parse(sql); var query = QueryBreakdown.Parse(sql);
// Assert Assert.Multiple(() =>
Assert.That(query.IsUsingWithClause, Is.True); {
Assert.That(query.SelectClause.Clause?.Trim(), Does.Contain("p.*, ps.TotalQty")); // Assert
Assert.That(query.FromClause.Clause?.Trim(), Does.Contain("Products p")); Assert.That(query.IsUsingWithClause, Is.True);
Assert.That(query.SelectClause.Clause?.Trim(), Does.Contain("p.*, ps.TotalQty"));
Assert.That(query.FromClause.Clause?.Trim(), Does.Contain("Products p"));
});
} }
[Test] [Test]
@@ -1042,9 +1117,12 @@ public class QueryBreakdownTests
// Act // Act
var success = QueryBreakdown.TryParse(sql, out var query); var success = QueryBreakdown.TryParse(sql, out var query);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.True); {
Assert.That(query, Is.Not.Null); // Assert
Assert.That(success, Is.True);
Assert.That(query, Is.Not.Null);
});
} }
[Test] [Test]
@@ -1056,10 +1134,13 @@ public class QueryBreakdownTests
// Act // Act
var success = QueryBreakdown.TryParse(sql, out var query, out var error); var success = QueryBreakdown.TryParse(sql, out var query, out var error);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.False); {
Assert.That(query, Is.Null); // Assert
Assert.That(error, Is.Not.Null); Assert.That(success, Is.False);
Assert.That(query, Is.Null);
Assert.That(error, Is.Not.Null);
});
} }
#endregion #endregion
@@ -1134,10 +1215,13 @@ public class QueryBreakdownTests
// Assert // Assert
Assert.That(clone, Is.Not.SameAs(original)); Assert.That(clone, Is.Not.SameAs(original));
Assert.That(clone.SelectClause.Clause, Is.EqualTo(original.SelectClause.Clause)); Assert.Multiple(() =>
Assert.That(clone.FromClause.Clause, Is.EqualTo(original.FromClause.Clause)); {
Assert.That(clone.WhereClause.Clause, Is.EqualTo(original.WhereClause.Clause)); Assert.That(clone.SelectClause.Clause, Is.EqualTo(original.SelectClause.Clause));
Assert.That(clone.OrderByClause.Clause, Is.EqualTo(original.OrderByClause.Clause)); Assert.That(clone.FromClause.Clause, Is.EqualTo(original.FromClause.Clause));
Assert.That(clone.WhereClause.Clause, Is.EqualTo(original.WhereClause.Clause));
Assert.That(clone.OrderByClause.Clause, Is.EqualTo(original.OrderByClause.Clause));
});
} }
[Test] [Test]
@@ -1150,9 +1234,12 @@ public class QueryBreakdownTests
// Act // Act
clone.WhereClause.Clause = "Active = 1"; clone.WhereClause.Clause = "Active = 1";
// Assert Assert.Multiple(() =>
Assert.That(original.WhereClause.Clause, Is.EqualTo(string.Empty)); {
Assert.That(clone.WhereClause.Clause, Is.EqualTo("Active = 1")); // Assert
Assert.That(original.WhereClause.Clause, Is.EqualTo(string.Empty));
Assert.That(clone.WhereClause.Clause, Is.EqualTo("Active = 1"));
});
} }
#endregion #endregion
@@ -1202,9 +1289,12 @@ public class QueryBreakdownTests
// Act // Act
var query = QueryBreakdown.Parse(sql); var query = QueryBreakdown.Parse(sql);
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Does.Contain("\"User Name\"")); {
Assert.That(query.FromClause.Clause, Does.Contain("\"User Table\"")); // Assert
Assert.That(query.SelectClause.Clause, Does.Contain("\"User Name\""));
Assert.That(query.FromClause.Clause, Does.Contain("\"User Table\""));
});
} }
[Test] [Test]
@@ -1469,8 +1559,11 @@ public class QueryBreakdownTests
// Assert // Assert
Assert.That(query.SelectClause.Clause, Does.Contain("[Select]")); Assert.That(query.SelectClause.Clause, Does.Contain("[Select]"));
Assert.That(query.SelectClause.Clause, Does.Contain("[From]")); Assert.That(query.SelectClause.Clause, Does.Contain("[From]"));
Assert.That(query.SelectClause.Clause, Does.Contain("[Where]")); Assert.Multiple(() =>
Assert.That(query.FromClause.Clause, Does.Contain("[Order]")); {
Assert.That(query.SelectClause.Clause, Does.Contain("[Where]"));
Assert.That(query.FromClause.Clause, Does.Contain("[Order]"));
});
} }
[Test] [Test]
@@ -1863,9 +1956,12 @@ public class QueryBreakdownTests
// Act // Act
query.AddSelectExpression(expr, "/* Primary key */"); query.AddSelectExpression(expr, "/* Primary key */");
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo("[Customers].[CustomerID]")); {
Assert.That(query.SelectClause.Comment, Is.EqualTo("/* Primary key */")); // Assert
Assert.That(query.SelectClause.Clause, Is.EqualTo("[Customers].[CustomerID]"));
Assert.That(query.SelectClause.Comment, Is.EqualTo("/* Primary key */"));
});
} }
[Test] [Test]
@@ -33,9 +33,12 @@ public class RecursiveCTETests
var isRecursive = withClause.IsRecursive; var isRecursive = withClause.IsRecursive;
var hasRecursiveQuery = withClause.RecursiveQuery != null; var hasRecursiveQuery = withClause.RecursiveQuery != null;
// Assert Assert.Multiple(() =>
Assert.That(isRecursive, Is.True); {
Assert.That(hasRecursiveQuery, Is.True); // Assert
Assert.That(isRecursive, Is.True);
Assert.That(hasRecursiveQuery, Is.True);
});
} }
[Test] [Test]
@@ -143,10 +146,13 @@ public class RecursiveCTETests
// Assert // Assert
var keys = merged.Keys.ToList(); var keys = merged.Keys.ToList();
Assert.That(keys.Any(k => k.Contains("AnchorStatus")), "Should include anchor query parameters"); Assert.Multiple(() =>
Assert.That(keys.Any(k => k.Contains("RecursiveLevel")), "Should include recursive query parameters"); {
Assert.That(keys.Any(k => k.Contains("RecursiveStatus")), "Should include recurring query parameters"); Assert.That(keys.Any(k => k.Contains("AnchorStatus")), "Should include anchor query parameters");
Assert.That(keys.Any(k => k.Contains("MainLimit")), "Should include main query parameters"); Assert.That(keys.Any(k => k.Contains("RecursiveLevel")), "Should include recursive query parameters");
Assert.That(keys.Any(k => k.Contains("RecursiveStatus")), "Should include recurring query parameters");
Assert.That(keys.Any(k => k.Contains("MainLimit")), "Should include main query parameters");
});
} }
[Test] [Test]
@@ -175,8 +181,11 @@ public class RecursiveCTETests
// Assert // Assert
var statusKey = merged.Keys.FirstOrDefault(k => k.Contains("Status") && !k.Contains('@') && !k.Contains('$')); var statusKey = merged.Keys.FirstOrDefault(k => k.Contains("Status") && !k.Contains('@') && !k.Contains('$'));
Assert.That(statusKey, Is.Not.Null); Assert.Multiple(() =>
Assert.That(merged[statusKey], Is.EqualTo("active"), "Main query parameter should take precedence"); {
Assert.That(statusKey, Is.Not.Null);
Assert.That(merged[statusKey], Is.EqualTo("active"), "Main query parameter should take precedence");
});
} }
#endregion #endregion
@@ -280,8 +280,11 @@ public class StatementExpressionParserTests
// Act & Assert // Act & Assert
var ex = Assert.Throws<ArgumentNullException>(() => _parser.Parse(sql)); var ex = Assert.Throws<ArgumentNullException>(() => _parser.Parse(sql));
Assert.That(ex.ParamName, Is.EqualTo("sqlStatement")); Assert.Multiple(() =>
Assert.That(ex.Message, Does.Contain("SQL statement cannot be null or empty")); {
Assert.That(ex.ParamName, Is.EqualTo("sqlStatement"));
Assert.That(ex.Message, Does.Contain("SQL statement cannot be null or empty"));
});
} }
[Test] [Test]
@@ -351,9 +354,12 @@ public class StatementExpressionParserTests
// Act // Act
var success = _parser.TryParse(sql, out var result); var success = _parser.TryParse(sql, out var result);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.True); {
Assert.That(result, Is.Not.Null); // Assert
Assert.That(success, Is.True);
Assert.That(result, Is.Not.Null);
});
Assert.That(result, Is.InstanceOf<NumberLiteralExpression>()); Assert.That(result, Is.InstanceOf<NumberLiteralExpression>());
} }
@@ -366,9 +372,12 @@ public class StatementExpressionParserTests
// Act // Act
var success = _parser.TryParse(sql, out var result); var success = _parser.TryParse(sql, out var result);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.True); {
Assert.That(result, Is.Not.Null); // Assert
Assert.That(success, Is.True);
Assert.That(result, Is.Not.Null);
});
} }
[Test] [Test]
@@ -380,9 +389,12 @@ public class StatementExpressionParserTests
// Act // Act
var success = _parser.TryParse(sql, out var result); var success = _parser.TryParse(sql, out var result);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.True); {
Assert.That(result, Is.Not.Null); // Assert
Assert.That(success, Is.True);
Assert.That(result, Is.Not.Null);
});
Assert.That(result, Is.InstanceOf<SumFunction>()); Assert.That(result, Is.InstanceOf<SumFunction>());
} }
@@ -395,9 +407,12 @@ public class StatementExpressionParserTests
// Act // Act
var success = _parser.TryParse(sql, out var result); var success = _parser.TryParse(sql, out var result);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.False); {
Assert.That(result, Is.Null); // Assert
Assert.That(success, Is.False);
Assert.That(result, Is.Null);
});
} }
[Test] [Test]
@@ -409,9 +424,12 @@ public class StatementExpressionParserTests
// Act // Act
var success = _parser.TryParse(sql, out var result); var success = _parser.TryParse(sql, out var result);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.False); {
Assert.That(result, Is.Null); // Assert
Assert.That(success, Is.False);
Assert.That(result, Is.Null);
});
} }
[Test] [Test]
@@ -423,9 +441,12 @@ public class StatementExpressionParserTests
// Act // Act
var success = _parser.TryParse(sql, out var result); var success = _parser.TryParse(sql, out var result);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.False); {
Assert.That(result, Is.Null); // Assert
Assert.That(success, Is.False);
Assert.That(result, Is.Null);
});
} }
[Test] [Test]
@@ -437,9 +458,12 @@ public class StatementExpressionParserTests
// Act // Act
var success = _parser.TryParse(sql, out var result); var success = _parser.TryParse(sql, out var result);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.False); {
Assert.That(result, Is.Null); // Assert
Assert.That(success, Is.False);
Assert.That(result, Is.Null);
});
} }
[Test] [Test]
@@ -451,10 +475,13 @@ public class StatementExpressionParserTests
// Act // Act
var success = _parser.TryParse(sql, out var result, out var errorMessage); var success = _parser.TryParse(sql, out var result, out var errorMessage);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.True); {
Assert.That(result, Is.Not.Null); // Assert
Assert.That(errorMessage, Is.Null); Assert.That(success, Is.True);
Assert.That(result, Is.Not.Null);
Assert.That(errorMessage, Is.Null);
});
} }
[Test] [Test]
@@ -466,10 +493,13 @@ public class StatementExpressionParserTests
// Act // Act
var success = _parser.TryParse(sql, out var result, out var errorMessage); var success = _parser.TryParse(sql, out var result, out var errorMessage);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.False); {
Assert.That(result, Is.Null); // Assert
Assert.That(errorMessage, Is.Not.Null); Assert.That(success, Is.False);
Assert.That(result, Is.Null);
Assert.That(errorMessage, Is.Not.Null);
});
Assert.That(errorMessage, Does.Contain("SQL statement cannot be null or empty")); Assert.That(errorMessage, Does.Contain("SQL statement cannot be null or empty"));
} }
@@ -482,10 +512,13 @@ public class StatementExpressionParserTests
// Act // Act
var success = _parser.TryParse(sql, out var result, out var errorMessage); var success = _parser.TryParse(sql, out var result, out var errorMessage);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.False); {
Assert.That(result, Is.Null); // Assert
Assert.That(errorMessage, Is.Not.Null); Assert.That(success, Is.False);
Assert.That(result, Is.Null);
Assert.That(errorMessage, Is.Not.Null);
});
Assert.That(errorMessage, Does.Contain("Invalid syntax")); Assert.That(errorMessage, Does.Contain("Invalid syntax"));
} }
@@ -498,10 +531,13 @@ public class StatementExpressionParserTests
// Act // Act
var success = _parser.TryParse(sql, out var result, out var errorMessage); var success = _parser.TryParse(sql, out var result, out var errorMessage);
// Assert Assert.Multiple(() =>
Assert.That(success, Is.False); {
Assert.That(result, Is.Null); // Assert
Assert.That(errorMessage, Is.Not.Null); Assert.That(success, Is.False);
Assert.That(result, Is.Null);
Assert.That(errorMessage, Is.Not.Null);
});
Assert.That(errorMessage, Does.Contain("not recognized")); Assert.That(errorMessage, Does.Contain("not recognized"));
} }
@@ -22,8 +22,11 @@ public class StatementReaderTests
// Assert // Assert
Assert.That(tokens, Is.Not.Empty); Assert.That(tokens, Is.Not.Empty);
Assert.That(tokens[0].Type, Is.EqualTo(TokenType.LeftParenthesis)); Assert.Multiple(() =>
Assert.That(tokens[1].Type, Is.EqualTo(TokenType.Number)); {
Assert.That(tokens[1].Value, Is.EqualTo("1")); Assert.That(tokens[0].Type, Is.EqualTo(TokenType.LeftParenthesis));
Assert.That(tokens[1].Type, Is.EqualTo(TokenType.Number));
Assert.That(tokens[1].Value, Is.EqualTo("1"));
});
} }
} }
@@ -15,11 +15,14 @@ public class WithClauseTests
// Arrange & Act // Arrange & Act
var withClause = new WithClause(); var withClause = new WithClause();
// Assert Assert.Multiple(() =>
Assert.That(withClause.TableName, Is.EqualTo(string.Empty)); {
Assert.That(withClause.Sql, Is.Null); // Assert
Assert.That(withClause.Query, Is.Null); Assert.That(withClause.TableName, Is.EqualTo(string.Empty));
Assert.That(withClause.Clause, Is.Null.Or.Empty); Assert.That(withClause.Sql, Is.Null);
Assert.That(withClause.Query, Is.Null);
Assert.That(withClause.Clause, Is.Null.Or.Empty);
});
} }
[Test] [Test]
@@ -32,10 +35,13 @@ public class WithClauseTests
// Act // Act
var withClause = new WithClause(tableName, query); var withClause = new WithClause(tableName, query);
// Assert Assert.Multiple(() =>
Assert.That(withClause.TableName, Is.EqualTo(tableName)); {
Assert.That(withClause.Query, Is.EqualTo(query)); // Assert
Assert.That(withClause.Sql, Is.Not.Null); Assert.That(withClause.TableName, Is.EqualTo(tableName));
Assert.That(withClause.Query, Is.EqualTo(query));
Assert.That(withClause.Sql, Is.Not.Null);
});
} }
[Test] [Test]
@@ -72,10 +78,13 @@ public class WithClauseTests
// Act // Act
var withClause = new WithClause(tableName, sqlClauses); var withClause = new WithClause(tableName, sqlClauses);
// Assert Assert.Multiple(() =>
Assert.That(withClause.TableName, Is.EqualTo(tableName)); {
Assert.That(withClause.Sql, Is.EqualTo(sqlClauses)); // Assert
Assert.That(withClause.Query, Is.Null); Assert.That(withClause.TableName, Is.EqualTo(tableName));
Assert.That(withClause.Sql, Is.EqualTo(sqlClauses));
Assert.That(withClause.Query, Is.Null);
});
} }
[Test] [Test]
@@ -117,8 +126,11 @@ public class WithClauseTests
// Assert // Assert
Assert.That(sql, Is.Not.Null); Assert.That(sql, Is.Not.Null);
Assert.That(sql!.SelectClause?.Clause, Is.EqualTo("user_id, name")); Assert.Multiple(() =>
Assert.That(sql.FromClause?.Clause, Is.EqualTo("users")); {
Assert.That(sql!.SelectClause?.Clause, Is.EqualTo("user_id, name"));
Assert.That(sql.FromClause?.Clause, Is.EqualTo("users"));
});
} }
[Test] [Test]
@@ -153,9 +165,12 @@ public class WithClauseTests
// Act // Act
withClause.Sql = sqlClauses; withClause.Sql = sqlClauses;
// Assert Assert.Multiple(() =>
Assert.That(withClause.Sql, Is.EqualTo(sqlClauses)); {
Assert.That(withClause.Query, Is.Null); // Assert
Assert.That(withClause.Sql, Is.EqualTo(sqlClauses));
Assert.That(withClause.Query, Is.Null);
});
} }
[Test] [Test]
@@ -173,12 +188,15 @@ public class WithClauseTests
// Act // Act
withClause.Sql = sqlClauses; withClause.Sql = sqlClauses;
// Assert - Clauses are applied to the Query Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo("column1")); {
Assert.That(query.FromClause.Clause, Is.EqualTo("table1")); // Assert - Clauses are applied to the Query
// And Sql property returns the applied clauses (from Query, not stored) Assert.That(query.SelectClause.Clause, Is.EqualTo("column1"));
Assert.That(withClause.Sql?.SelectClause?.Clause, Is.EqualTo("column1")); Assert.That(query.FromClause.Clause, Is.EqualTo("table1"));
Assert.That(withClause.Sql?.FromClause?.Clause, Is.EqualTo("table1")); // And Sql property returns the applied clauses (from Query, not stored)
Assert.That(withClause.Sql?.SelectClause?.Clause, Is.EqualTo("column1"));
Assert.That(withClause.Sql?.FromClause?.Clause, Is.EqualTo("table1"));
});
} }
[Test] [Test]
@@ -197,9 +215,12 @@ public class WithClauseTests
var query = new QueryBreakdown(); var query = new QueryBreakdown();
withClause.Query = query; withClause.Query = query;
// Assert - Stored SQL is applied to Query Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo("column1")); {
Assert.That(query.FromClause.Clause, Is.EqualTo("table1")); // Assert - Stored SQL is applied to Query
Assert.That(query.SelectClause.Clause, Is.EqualTo("column1"));
Assert.That(query.FromClause.Clause, Is.EqualTo("table1"));
});
} }
[Test] [Test]
@@ -237,10 +258,13 @@ public class WithClauseTests
var query = new QueryBreakdown(); var query = new QueryBreakdown();
withClause.Query = query; withClause.Query = query;
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo("old_column")); {
Assert.That(query.FromClause.Clause, Is.EqualTo("old_table")); // Assert
Assert.That(withClause.Query, Is.EqualTo(query)); Assert.That(query.SelectClause.Clause, Is.EqualTo("old_column"));
Assert.That(query.FromClause.Clause, Is.EqualTo("old_table"));
Assert.That(withClause.Query, Is.EqualTo(query));
});
} }
[Test] [Test]
@@ -258,9 +282,12 @@ public class WithClauseTests
}; };
withClause.Sql = sqlClauses; withClause.Sql = sqlClauses;
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo("new_column")); {
Assert.That(query.FromClause.Clause, Is.EqualTo("new_table")); // Assert
Assert.That(query.SelectClause.Clause, Is.EqualTo("new_column"));
Assert.That(query.FromClause.Clause, Is.EqualTo("new_table"));
});
} }
#endregion #endregion
@@ -283,12 +310,15 @@ public class WithClauseTests
// Assert // Assert
Assert.That(sql, Is.Not.Null); Assert.That(sql, Is.Not.Null);
Assert.That(sql!.SelectClause?.Clause, Is.EqualTo("id, name")); Assert.Multiple(() =>
Assert.That(sql.FromClause?.Clause, Is.EqualTo("users")); {
Assert.That(sql.WhereClause?.Clause, Is.EqualTo("active = 1")); Assert.That(sql!.SelectClause?.Clause, Is.EqualTo("id, name"));
Assert.That(sql.GroupByClause?.Clause, Is.EqualTo("department")); Assert.That(sql.FromClause?.Clause, Is.EqualTo("users"));
Assert.That(sql.HavingClause?.Clause, Is.EqualTo("COUNT(*) > 5")); Assert.That(sql.WhereClause?.Clause, Is.EqualTo("active = 1"));
Assert.That(sql.OrderByClause?.Clause, Is.EqualTo("name ASC")); Assert.That(sql.GroupByClause?.Clause, Is.EqualTo("department"));
Assert.That(sql.HavingClause?.Clause, Is.EqualTo("COUNT(*) > 5"));
Assert.That(sql.OrderByClause?.Clause, Is.EqualTo("name ASC"));
});
} }
#endregion #endregion
@@ -315,13 +345,16 @@ public class WithClauseTests
// Act // Act
withClause.Sql = sqlClauses; withClause.Sql = sqlClauses;
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo("id, name")); {
Assert.That(query.FromClause.Clause, Is.EqualTo("users")); // Assert
Assert.That(query.WhereClause.Clause, Is.EqualTo("active = 1")); Assert.That(query.SelectClause.Clause, Is.EqualTo("id, name"));
Assert.That(query.GroupByClause.Clause, Is.EqualTo("department")); Assert.That(query.FromClause.Clause, Is.EqualTo("users"));
Assert.That(query.HavingClause.Clause, Is.EqualTo("COUNT(*) > 5")); Assert.That(query.WhereClause.Clause, Is.EqualTo("active = 1"));
Assert.That(query.OrderByClause.Clause, Is.EqualTo("name ASC")); Assert.That(query.GroupByClause.Clause, Is.EqualTo("department"));
Assert.That(query.HavingClause.Clause, Is.EqualTo("COUNT(*) > 5"));
Assert.That(query.OrderByClause.Clause, Is.EqualTo("name ASC"));
});
} }
[Test] [Test]
@@ -340,9 +373,12 @@ public class WithClauseTests
// Act // Act
withClause.Sql = sqlClauses; withClause.Sql = sqlClauses;
// Assert Assert.Multiple(() =>
Assert.That(query.SelectClause.Clause, Is.EqualTo("new_select")); {
Assert.That(query.FromClause.Clause, Is.EqualTo("original_from")); // Unchanged // Assert
Assert.That(query.SelectClause.Clause, Is.EqualTo("new_select"));
Assert.That(query.FromClause.Clause, Is.EqualTo("original_from")); // Unchanged
});
} }
#endregion #endregion
@@ -448,14 +484,17 @@ public class WithClauseTests
var innerSql = innerCte.Sql; var innerSql = innerCte.Sql;
var outerSql = outerCte.Sql; var outerSql = outerCte.Sql;
// Assert - Inner CTE has parameter and correct clauses Assert.Multiple(() =>
Assert.That(innerQuery.ParameterList.Count(), Is.EqualTo(1)); {
Assert.That(innerSql?.SelectClause?.Clause, Is.EqualTo("id, name")); // Assert - Inner CTE has parameter and correct clauses
Assert.That(innerSql?.WhereClause?.Clause, Is.EqualTo("created_date >= @StartDate")); Assert.That(innerQuery.ParameterList.Count(), Is.EqualTo(1));
Assert.That(innerSql?.SelectClause?.Clause, Is.EqualTo("id, name"));
Assert.That(innerSql?.WhereClause?.Clause, Is.EqualTo("created_date >= @StartDate"));
// Assert - Outer CTE references inner CTE // Assert - Outer CTE references inner CTE
Assert.That(outerSql?.SelectClause?.Clause, Is.EqualTo("*")); Assert.That(outerSql?.SelectClause?.Clause, Is.EqualTo("*"));
Assert.That(outerSql?.FromClause?.Clause, Is.EqualTo("recent_users")); Assert.That(outerSql?.FromClause?.Clause, Is.EqualTo("recent_users"));
});
} }
[Test] [Test]
@@ -495,9 +534,12 @@ public class WithClauseTests
Assert.That(sql, Does.Contain("WITH")); Assert.That(sql, Does.Contain("WITH"));
Assert.That(sql, Does.Contain("active_users")); Assert.That(sql, Does.Contain("active_users"));
Assert.That(sql, Does.Contain("AS")); Assert.That(sql, Does.Contain("AS"));
// Check for keywords/content (allowing for formatting variations) Assert.Multiple(() =>
Assert.That(sql.ToUpper(), Does.Contain("SELECT")); {
Assert.That(sql, Does.Contain("id, name")); // Check for keywords/content (allowing for formatting variations)
Assert.That(sql.ToUpper(), Does.Contain("SELECT"));
Assert.That(sql, Does.Contain("id, name"));
});
Assert.That(sql, Does.Contain("users")); Assert.That(sql, Does.Contain("users"));
Assert.That(sql, Does.Contain("active = 1")); Assert.That(sql, Does.Contain("active = 1"));
} }
@@ -523,8 +565,11 @@ public class WithClauseTests
// Verify order: first CTE comes before second CTE // Verify order: first CTE comes before second CTE
var pos1 = sql.IndexOf("active_users"); var pos1 = sql.IndexOf("active_users");
var pos2 = sql.IndexOf("user_orders"); var pos2 = sql.IndexOf("user_orders");
Assert.That(pos1, Is.GreaterThan(-1)); Assert.Multiple(() =>
Assert.That(pos2, Is.GreaterThan(-1)); {
Assert.That(pos1, Is.GreaterThan(-1));
Assert.That(pos2, Is.GreaterThan(-1));
});
Assert.That(pos1, Is.LessThan(pos2)); } Assert.That(pos1, Is.LessThan(pos2)); }
#endregion #endregion