chore: initial git load of code space

This commit is contained in:
Thom Lamb
2026-05-12 08:52:33 -05:00
parent 9abada692f
commit 5e467bcc9c
384 changed files with 65960 additions and 2 deletions
@@ -0,0 +1,319 @@
using Strata.SqlTools.Breakdowns.PostgreSql;
using Strata.SqlTools.Markdown.PostgreSql;
namespace Strata.SqlTools.Markdown.Tests.PostgreSql;
[TestFixture]
public class QueryBreakdownCollectionGeneratorTests
{
private QueryBreakdownCollection _collection = null!;
[SetUp]
public void Setup()
{
_collection = new QueryBreakdownCollection();
}
[Test]
public void GenerateCollectionReport_WithTitle_IncludesTitle()
{
// Arrange
_collection.Add(new QueryBreakdown("id, name", "users"));
var title = "PostgreSQL Query Report";
// Act
var report = QueryBreakdownCollectionGenerator.GenerateCollectionReport(_collection, title);
// Assert
Assert.That(report, Does.Contain(title));
Assert.That(report, Does.Contain("# PostgreSQL Query Report"));
}
[Test]
public void GenerateCollectionReport_WithMultipleQueries_GeneratesCompleteReport()
{
// Arrange
_collection.Add(new QueryBreakdown("id, name, email", "users"));
_collection.Add(new QueryBreakdown("order_id, amount", "orders"));
// Act
var report = QueryBreakdownCollectionGenerator.GenerateCollectionReport(_collection);
// Assert
Assert.That(report, Does.Contain("Collection Summary"));
Assert.That(report, Does.Contain("Parameter Analysis"));
Assert.That(report, Does.Contain("Query Composition Report"));
}
[Test]
public void GenerateCollectionSummary_WithQueries_IncludesSummaryMetrics()
{
// Arrange
_collection.Add(new QueryBreakdown("id, name, email", "users"));
_collection.Add(new QueryBreakdown("order_id, amount", "orders"));
// Act
var summary = QueryBreakdownCollectionGenerator.GenerateCollectionSummary(_collection);
// Assert
Assert.That(summary, Does.Contain("Collection Summary"));
Assert.That(summary, Does.Contain("Total Queries"));
Assert.That(summary, Does.Contain("2"));
}
[Test]
public void GenerateParameterAnalysis_NoParameters_IndicatesNoParameters()
{
// Arrange
_collection.Add(new QueryBreakdown("id, name", "users"));
// Act
var analysis = QueryBreakdownCollectionGenerator.GenerateParameterAnalysis(_collection);
// Assert
Assert.That(analysis, Does.Contain("Parameters"));
Assert.That(analysis, Does.Contain("No parameters"));
}
[Test]
public void GenerateParameterAnalysis_WithPositionalParameters_ShowsPostgreSqlSyntax()
{
// Arrange - PostgreSQL positional parameters $1, $2
var query = new QueryBreakdown("id, name", "users", "id = $1");
query.Parameters["1"] = 123;
_collection.Add(query);
// Act
var analysis = QueryBreakdownCollectionGenerator.GenerateParameterAnalysis(_collection);
// Assert
Assert.That(analysis, Does.Contain("Parameter Analysis"));
Assert.That(analysis, Does.Contain("$1"));
Assert.That(analysis, Does.Contain("Parameter Dependency Diagram"));
}
[Test]
public void GenerateParameterAnalysis_WithNamedParameters_ShowsColonSyntax()
{
// Arrange - PostgreSQL named parameters with :
var query = new QueryBreakdown("id, name", "users", "id = :userId");
query.Parameters["userId"] = 123;
_collection.Add(query);
// Act
var analysis = QueryBreakdownCollectionGenerator.GenerateParameterAnalysis(_collection);
// Assert
Assert.That(analysis, Does.Contain("Parameter Analysis"));
Assert.That(analysis, Does.Contain(":userId"));
Assert.That(analysis, Does.Contain("Parameter Dependency Diagram"));
}
[Test]
public void GenerateParameterDependencyDiagram_WithParameters_GeneratesMermaidDiagram()
{
// Arrange
var query1 = new QueryBreakdown("id, name", "users", "id = $1");
var query2 = new QueryBreakdown("order_id", "orders", "user_id = $1");
query1.Parameters["1"] = 123;
query2.Parameters["1"] = 123;
_collection.Add(query1);
_collection.Add(query2);
// Act
var diagram = QueryBreakdownCollectionGenerator.GenerateParameterDependencyDiagram(_collection);
// Assert
Assert.That(diagram, Does.Contain("```mermaid"));
Assert.That(diagram, Does.Contain("graph TD"));
Assert.That(diagram, Does.Contain("$1"));
Assert.That(diagram, Does.Contain("Query #0"));
Assert.That(diagram, Does.Contain("Query #1"));
Assert.That(diagram, Does.Contain("```"));
}
[Test]
public void GenerateQueryCompositionReport_WithQueries_IncludesAllQueryDetails()
{
// Arrange
var query = new QueryBreakdown("id, name", "users", "id > 10");
query.GroupByClause.Clause = "region";
query.OrderByClause.Clause = "name ASC";
_collection.Add(query);
// Act
var report = QueryBreakdownCollectionGenerator.GenerateQueryCompositionReport(_collection);
// Assert
Assert.That(report, Does.Contain("Query Composition Report"));
Assert.That(report, Does.Contain("Query #0"));
Assert.That(report, Does.Contain("SELECT Clause"));
Assert.That(report, Does.Contain("✓ Yes"));
Assert.That(report, Does.Contain("WHERE Clause"));
}
[Test]
public void GenerateQueryCompositionReport_WithCTEs_IncludesCTEList()
{
// Arrange
var query = new QueryBreakdown("id, name", "users");
var cteQuery = new QueryBreakdown("id, name", "archive_users");
query.AddWithClause("active_users", cteQuery);
_collection.Add(query);
// Act
var report = QueryBreakdownCollectionGenerator.GenerateQueryCompositionReport(_collection);
// Assert
Assert.That(report, Does.Contain("CTEs Defined"));
Assert.That(report, Does.Contain("active_users"));
}
[Test]
public void GenerateQueryCompositionReport_WithParameters_IncludesParameterValues()
{
// Arrange - PostgreSQL positional parameters
var query = new QueryBreakdown("id, name", "users", "id = $1 AND status = $2");
query.Parameters["1"] = 123;
query.Parameters["2"] = "Active";
_collection.Add(query);
// Act
var report = QueryBreakdownCollectionGenerator.GenerateQueryCompositionReport(_collection);
// Assert
Assert.That(report, Does.Contain("Parameters Used"));
Assert.That(report, Does.Contain("$1"));
Assert.That(report, Does.Contain("$2"));
Assert.That(report, Does.Contain("123"));
Assert.That(report, Does.Contain("Active"));
}
[Test]
public void GenerateBatchFlowDiagram_WithQueries_GeneratesFlowDiagram()
{
// Arrange
_collection.Add(new QueryBreakdown("id, name", "users"));
_collection.Add(new QueryBreakdown("order_id", "orders"));
// Act
var diagram = QueryBreakdownCollectionGenerator.GenerateBatchFlowDiagram(_collection);
// Assert
Assert.That(diagram, Does.Contain("```mermaid"));
Assert.That(diagram, Does.Contain("flowchart TD"));
Assert.That(diagram, Does.Contain("Batch Start"));
Assert.That(diagram, Does.Contain("Query 0"));
Assert.That(diagram, Does.Contain("Query 1"));
Assert.That(diagram, Does.Contain("Batch Complete"));
Assert.That(diagram, Does.Contain("```"));
}
[Test]
public void GenerateBatchFlowDiagram_WithTransaction_IncludesBeginCommit()
{
// Arrange
_collection.Add(new QueryBreakdown("id, name", "users"));
// Act
var diagram = QueryBreakdownCollectionGenerator.GenerateBatchFlowDiagram(_collection, includeTransaction: true);
// Assert
Assert.That(diagram, Does.Contain("BEGIN"));
Assert.That(diagram, Does.Contain("COMMIT"));
}
[Test]
public void GenerateBatchFlowDiagram_WithQueries_ValidatesProperConnections()
{
// Arrange
_collection.Add(new QueryBreakdown("id, name", "users"));
_collection.Add(new QueryBreakdown("order_id", "orders"));
_collection.Add(new QueryBreakdown("product_id", "products"));
// Act
var diagram = QueryBreakdownCollectionGenerator.GenerateBatchFlowDiagram(_collection);
// Assert
// Verify proper connections between nodes
Assert.That(diagram, Does.Contain("Start([Batch Start]) --> node0")); // Start connects to first node
Assert.That(diagram, Does.Contain("node0[\"Query 0\"] --> node1")); // Query 0 to Query 1
Assert.That(diagram, Does.Contain("node1[\"Query 1\"] --> node2")); // Query 1 to Query 2
Assert.That(diagram, Does.Contain("node2[\"Query 2\"] --> End")); // Last query connects to End
// Verify no dangling nodes
Assert.That(diagram, Does.Not.Contain("node3")); // No extra unconnected node
}
[Test]
public void GenerateBatchFlowDiagram_WithTransaction_ValidatesProperConnections()
{
// Arrange
_collection.Add(new QueryBreakdown("id, name", "users"));
_collection.Add(new QueryBreakdown("order_id", "orders"));
// Act
var diagram = QueryBreakdownCollectionGenerator.GenerateBatchFlowDiagram(_collection, includeTransaction: true);
// Assert
// Verify proper transaction flow
Assert.That(diagram, Does.Contain("Start([Batch Start]) --> node0")); // Start connects to BEGIN
Assert.That(diagram, Does.Contain("node0[\"BEGIN\"]")); // BEGIN node
Assert.That(diagram, Does.Contain("node0 --> node1")); // BEGIN to first query
Assert.That(diagram, Does.Contain("node1[\"Query 0\"] --> node2")); // Query 0 to Query 1
Assert.That(diagram, Does.Contain("node2[\"Query 1\"] --> node3")); // Last query to COMMIT
Assert.That(diagram, Does.Contain("node3[\"COMMIT\"]")); // COMMIT node
Assert.That(diagram, Does.Contain("node3 --> End")); // COMMIT to End
}
[Test]
public void GenerateCollectionReport_EmptyCollection_GeneratesValidMarkdown()
{
// Act
var report = QueryBreakdownCollectionGenerator.GenerateCollectionReport(_collection);
// Assert
Assert.That(report, Does.Contain("Collection Summary"));
Assert.That(report, Does.Contain("Parameter Analysis"));
Assert.That(report, Does.Contain("Total Queries"));
Assert.That(report, Does.Contain("0"));
}
[Test]
public void GenerateCollectionReport_WithMultipleQueries_ContainsAllSections()
{
// Arrange
_collection.Add(new QueryBreakdown("id, name", "users"));
// Act
var report = QueryBreakdownCollectionGenerator.GenerateCollectionReport(_collection);
// Assert
Assert.That(report, Does.Contain("## Collection Summary"));
Assert.That(report, Does.Contain("## Parameter Analysis"));
Assert.That(report, Does.Contain("## Query Composition Report"));
}
[Test]
public void GenerateBatchFlowDiagram_EmptyCollection_GeneratesValidDiagram()
{
// Act
var diagram = QueryBreakdownCollectionGenerator.GenerateBatchFlowDiagram(_collection);
// Assert
Assert.That(diagram, Does.Contain("```mermaid"));
Assert.That(diagram, Does.Contain("flowchart TD"));
Assert.That(diagram, Does.Contain("Batch Start"));
Assert.That(diagram, Does.Contain("Batch Complete"));
}
[Test]
public void GenerateBatchFlowDiagram_EmptyCollectionWithTransaction_IncludesTransactionNodes()
{
// Act
var diagram = QueryBreakdownCollectionGenerator.GenerateBatchFlowDiagram(_collection, includeTransaction: true);
// Assert
Assert.That(diagram, Does.Contain("BEGIN"));
Assert.That(diagram, Does.Contain("COMMIT"));
}
}