using Strata.SqlTools.SqlBreakdown.Classes; namespace Strata.SqlTools.SqlBreakdown.Tests.SqlBreakdownCollectionTests; /// /// Unit tests for SqlBreakdownCollection with SELECT statements. /// [TestFixture] public class SqlBreakdownCollectionSelectTests : SqlBreakdownCollectionTestBase { [Test] public void ParseBatch_WithComplexSelectStatements_ParsesSuccessfully() { // Arrange var collection = new SqlBreakdownCollection(); var batchSql = @" SELECT u.Id, u.Name, COUNT(o.OrderId) AS OrderCount FROM Users u LEFT JOIN Orders o ON u.Id = o.UserId WHERE u.CreatedDate > '2020-01-01' GROUP BY u.Id, u.Name HAVING COUNT(o.OrderId) > 0 ORDER BY OrderCount DESC GO SELECT * FROM Orders WHERE OrderDate BETWEEN '2020-01-01' AND '2021-12-31' "; // Act collection.ParseBatch(batchSql); // Assert Assert.That(collection, Has.Count.EqualTo(2)); Assert.That(collection.GetRawStatementAt(0), Does.Contain("LEFT JOIN")); Assert.Multiple(() => { Assert.That(collection.GetRawStatementAt(0), Does.Contain("GROUP BY")); Assert.That(collection.GetRawStatementAt(1), Does.Contain("BETWEEN")); }); } [Test] public void ParseBatch_WithSelectWithCommonTableExpression_ParsesSuccessfully() { // Arrange var collection = new SqlBreakdownCollection(); var batchSql = @" WITH UserOrders AS ( SELECT UserId, OrderId, OrderDate FROM Orders WHERE OrderDate > '2020-01-01' ) SELECT u.Id, u.Name, uo.OrderId FROM Users u INNER JOIN UserOrders uo ON u.Id = uo.UserId "; // Act collection.ParseBatch(batchSql); // Assert Assert.That(collection.Count, Is.GreaterThanOrEqualTo(1)); Assert.That(collection.GetRawStatementAt(0), Does.Contain("WITH UserOrders AS")); } [Test] public void ParseBatch_WithSelectFromMultipleTables_ParsesSuccessfully() { // Arrange var collection = new SqlBreakdownCollection(); var batchSql = @" SELECT u.Id, u.Name, o.OrderId, p.ProductName FROM Users u JOIN Orders o ON u.Id = o.UserId JOIN OrderItems oi ON o.OrderId = oi.OrderId JOIN Products p ON oi.ProductId = p.Id WHERE u.Country = 'USA' GO SELECT * FROM UserProfiles WHERE UserId IN (SELECT Id FROM Users) "; // Act collection.ParseBatch(batchSql); // Assert Assert.That(collection, Has.Count.EqualTo(2)); Assert.Multiple(() => { Assert.That(collection.GetRawStatementAt(0), Does.Contain("JOIN")); Assert.That(collection.GetRawStatementAt(1), Does.Contain("IN")); }); } }