using Strata.SqlTools.Breakdowns.SqlServer; using Strata.SqlTools.Markdown.SqlServer; using Interfaces = Strata.SqlTools.SqlBreakdown.Interfaces; namespace Strata.SqlTools.Markdown.Tests.SqlServer; [TestFixture] public class QueryBreakdownGeneratorTests { [Test] public void GenerateMermaidDiagram_WithSimpleQuery_GeneratesFlowchart() { // Arrange var query = new QueryBreakdown("ID, Name", "Users"); // Act var result = QueryBreakdownGenerator.GenerateMermaidDiagram(query); // Assert Assert.That(result, Does.Contain("```mermaid")); Assert.That(result, Does.Contain("flowchart TD")); Assert.That(result, Does.Contain("SELECT")); Assert.That(result, Does.Contain("FROM")); Assert.That(result, Does.Contain("```")); } [Test] public void GenerateMermaidDiagram_WithComplexQuery_IncludesAllClauses() { // Arrange var query = new QueryBreakdown( "u.ID, u.Name, COUNT(o.OrderID) as OrderCount", "Users u JOIN Orders o ON u.ID = o.UserID", "u.Active = 1" ); query.GroupByClause.Clause = "u.ID, u.Name"; query.HavingClause.Clause = "COUNT(o.OrderID) > 5"; query.OrderByClause.Clause = "OrderCount DESC"; // Act var result = QueryBreakdownGenerator.GenerateMermaidDiagram(query, "User Orders Query"); // Assert Assert.That(result, Does.Contain("### User Orders Query")); Assert.That(result, Does.Contain("SELECT")); Assert.That(result, Does.Contain("FROM")); Assert.That(result, Does.Contain("WHERE")); Assert.That(result, Does.Contain("GROUP BY")); Assert.That(result, Does.Contain("HAVING")); Assert.That(result, Does.Contain("ORDER BY")); } [Test] public void GenerateMermaidDiagram_WithWhereClause_UsesDecisionShape() { // Arrange var query = new QueryBreakdown("*", "Products", "Price > 100"); // Act var result = QueryBreakdownGenerator.GenerateMermaidDiagram(query); // Assert Assert.That(result, Does.Contain("WHERE")); Assert.That(result, Does.Contain("{")); Assert.That(result, Does.Contain("}")); } [Test] public void GenerateMermaidDiagram_ParsedQuery_GeneratesDiagram() { // Arrange var sql = @" SELECT u.ID, u.Name, u.Email FROM Users u WHERE u.Active = 1 ORDER BY u.Name"; var query = QueryBreakdown.Parse(sql); // Act var result = QueryBreakdownGenerator.GenerateMermaidDiagram(query); // Assert Assert.That(result, Is.Not.Null); Assert.That(result, Does.Contain("mermaid")); Assert.That(result, Does.Contain("SELECT")); Assert.That(result.Length, Is.GreaterThan(100)); } [Test] public void GenerateMermaidDiagram_WithTitle_IncludesTitle() { // Arrange var query = new QueryBreakdown("*", "Users"); // Act var result = QueryBreakdownGenerator.GenerateMermaidDiagram(query, "Test Query"); // Assert Assert.That(result, Does.StartWith("### Test Query")); } [Test] public void GenerateMermaidDiagram_WithoutTitle_NoTitle() { // Arrange var query = new QueryBreakdown("*", "Users"); // Act var result = QueryBreakdownGenerator.GenerateMermaidDiagram(query); // Assert Assert.That(result, Does.Not.StartWith("###")); Assert.That(result, Does.StartWith("```mermaid")); } [Test] public void GenerateMermaidDiagram_WithLongClause_TruncatesText() { // Arrange var longSelect = string.Join(", ", Enumerable.Range(1, 50).Select(i => $"Column{i}")); var query = new QueryBreakdown(longSelect, "LargeTable"); // Act var result = QueryBreakdownGenerator.GenerateMermaidDiagram(query); // Assert Assert.That(result, Does.Contain("...")); } [Test] public void GenerateMermaidDiagram_ISqlBreakdown_GeneratesSimpleDiagram() { // Arrange var query = new QueryBreakdown("*", "Users"); query.SetupClauses.Add("CREATE TEMP TABLE #Temp (ID INT)"); // Act var result = QueryBreakdownGenerator.GenerateMermaidDiagram((Interfaces.ISqlBreakdown)query); // Assert Assert.That(result, Does.Contain("mermaid")); Assert.That(result, Does.Contain("flowchart TD")); Assert.That(result, Does.Contain("Users")); } }