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