Files
sql-utilities/tests/Strata.SqlTools.SqlServer.Tests/Performance/GetClausesCachingTests.cs
T
Thom LambandClaude Opus 4.7 67512d23e1 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>
2026-05-27 11:59:47 -05:00

231 lines
8.3 KiB
C#

using NUnit.Framework;
using Strata.SqlTools.Breakdowns.SqlServer;
using Strata.SqlTools.SqlBreakdown.Classes;
namespace Strata.SqlTools.SqlBreakdown.Tests.SqlServer.Performance;
[TestFixture]
public class GetClausesCachingTests
{
[Test]
public void GetClauses_CalledMultipleTimes_ReturnsSameInstance()
{
// Arrange
var query = new QueryBreakdown("id, name", "users");
// Act
var clauses1 = query.GetClauses();
var clauses2 = query.GetClauses();
// Assert
Assert.That(clauses2, Is.SameAs(clauses1), "GetClauses should return the same cached instance when clauses haven't changed");
}
[Test]
public void GetClauses_AfterSelectClauseChange_ReturnsNewInstance()
{
// Arrange
var query = new QueryBreakdown("id", "users");
var clauses1 = query.GetClauses();
// Act - Replace entire clause object to trigger property setter
query.SelectClause = new SqlExpressionClause { Clause = "id, name, email" };
var clauses2 = query.GetClauses();
// Assert
Assert.That(clauses2, Is.Not.SameAs(clauses1), "GetClauses should return a new instance after SelectClause changes");
Assert.That(clauses2.SelectClause?.Clause, Is.EqualTo("id, name, email"));
}
[Test]
public void GetClauses_AfterFromClauseChange_ReturnsNewInstance()
{
// Arrange
var query = new QueryBreakdown("id", "users");
var clauses1 = query.GetClauses();
// Act - Replace entire clause object to trigger property setter
query.FromClause = new SqlClause { Clause = "customers" };
var clauses2 = query.GetClauses();
// Assert
Assert.That(clauses2, Is.Not.SameAs(clauses1), "GetClauses should return a new instance after FromClause changes");
Assert.That(clauses2.FromClause?.Clause, Is.EqualTo("customers"));
}
[Test]
public void GetClauses_AfterWhereClauseChange_ReturnsNewInstance()
{
// Arrange
var query = new QueryBreakdown("id", "users", "active = 1");
var clauses1 = query.GetClauses();
// Act - Replace entire clause object to trigger property setter
query.WhereClause = new SqlExpressionClause { Clause = "active = 1 AND deleted = 0" };
var clauses2 = query.GetClauses();
// Assert
Assert.That(clauses2, Is.Not.SameAs(clauses1), "GetClauses should return a new instance after WhereClause changes");
Assert.That(clauses2.WhereClause?.Clause, Is.EqualTo("active = 1 AND deleted = 0"));
}
[Test]
public void GetClauses_AfterGroupByClauseChange_ReturnsNewInstance()
{
// Arrange
var query = new QueryBreakdown("COUNT(*) AS total", "users");
query.GroupByClause = new SqlExpressionClause { Clause = "status" };
var clauses1 = query.GetClauses();
// Act - Replace entire clause object to trigger property setter
query.GroupByClause = new SqlExpressionClause { Clause = "status, type" };
var clauses2 = query.GetClauses();
// Assert
Assert.That(clauses2, Is.Not.SameAs(clauses1), "GetClauses should return a new instance after GroupByClause changes");
Assert.That(clauses2.GroupByClause?.Clause, Is.EqualTo("status, type"));
}
[Test]
public void GetClauses_AfterHavingClauseChange_ReturnsNewInstance()
{
// Arrange
var query = new QueryBreakdown("COUNT(*) AS total", "users");
query.HavingClause = new SqlExpressionClause { Clause = "COUNT(*) > 10" };
var clauses1 = query.GetClauses();
// Act - Replace entire clause object to trigger property setter
query.HavingClause = new SqlExpressionClause { Clause = "COUNT(*) > 100" };
var clauses2 = query.GetClauses();
// Assert
Assert.That(clauses2, Is.Not.SameAs(clauses1), "GetClauses should return a new instance after HavingClause changes");
Assert.That(clauses2.HavingClause?.Clause, Is.EqualTo("COUNT(*) > 100"));
}
[Test]
public void GetClauses_AfterOrderByClauseChange_ReturnsNewInstance()
{
// Arrange
var query = new QueryBreakdown("id, name", "users");
query.OrderByClause = new SqlExpressionClause { Clause = "id ASC" };
var clauses1 = query.GetClauses();
// Act - Replace entire clause object to trigger property setter
query.OrderByClause = new SqlExpressionClause { Clause = "name DESC" };
var clauses2 = query.GetClauses();
// Assert
Assert.That(clauses2, Is.Not.SameAs(clauses1), "GetClauses should return a new instance after OrderByClause changes");
Assert.That(clauses2.OrderByClause?.Clause, Is.EqualTo("name DESC"));
}
[Test]
public void GetClauses_AfterMultipleChanges_CacheInvalidatedEachTime()
{
// Arrange
var query = new QueryBreakdown("id", "users");
var clauses1 = query.GetClauses();
// Act & Assert - Change 1
query.SelectClause = new SqlExpressionClause { Clause = "id, name" };
var clauses2 = query.GetClauses();
Assert.That(clauses2, Is.Not.SameAs(clauses1));
// Get again without changes - should return cached
var clauses2b = query.GetClauses();
Assert.That(clauses2b, Is.SameAs(clauses2));
// Act & Assert - Change 2
query.WhereClause = new SqlExpressionClause { Clause = "active = 1" };
var clauses3 = query.GetClauses();
Assert.That(clauses3, Is.Not.SameAs(clauses2));
// Get again without changes - should return cached
var clauses3b = query.GetClauses();
Assert.That(clauses3b, Is.SameAs(clauses3));
}
[Test]
public void GetClauses_ReplacingEntireClauseObject_ReturnsNewInstance()
{
// Arrange
var query = new QueryBreakdown("id", "users");
var clauses1 = query.GetClauses();
// Act - Replace entire clause object
query.SelectClause = new SqlExpressionClause { Clause = "id, name, email" };
var clauses2 = query.GetClauses();
// Assert
Assert.That(clauses2, Is.Not.SameAs(clauses1), "GetClauses should return a new instance when clause object is replaced");
Assert.That(clauses2.SelectClause?.Clause, Is.EqualTo("id, name, email"));
}
[Test]
public void GetClauses_ApplyClauses_InvalidatesCache()
{
// Arrange
var query = new QueryBreakdown("id", "users");
var clauses1 = query.GetClauses();
var newClauses = new SqlClauses
{
SelectClause = new SqlExpressionClause { Clause = "id, name" },
FromClause = new SqlClause { Clause = "customers" }
};
// Act
query.ApplyClauses(newClauses);
var clauses2 = query.GetClauses();
// Assert
Assert.That(clauses2, Is.Not.SameAs(clauses1), "GetClauses should return a new instance after ApplyClauses");
Assert.Multiple(() =>
{
Assert.That(clauses2.SelectClause?.Clause, Is.EqualTo("id, name"));
Assert.That(clauses2.FromClause?.Clause, Is.EqualTo("customers"));
});
}
[Test]
public void GetClauses_InitialCall_ReturnsPopulatedObject()
{
// Arrange
var query = new QueryBreakdown("id, name", "users", "active = 1");
query.OrderByClause.Clause = "name ASC";
// Act
var clauses = query.GetClauses();
// Assert
Assert.That(clauses, Is.Not.Null);
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]
public void GetClauses_AfterNoChanges_ReturnsSameCachedInstance()
{
// Arrange
var query = new QueryBreakdown("id, name", "users");
// Act - Call GetClauses multiple times without any modifications
var clauses1 = query.GetClauses();
var clauses2 = query.GetClauses();
var clauses3 = query.GetClauses();
Assert.Multiple(() =>
{
// Assert - All should be the same instance
Assert.That(clauses2, Is.SameAs(clauses1));
Assert.That(clauses3, Is.SameAs(clauses1));
});
}
}