using Strata.SqlTools.Breakdowns.LinqToSql; using Strata.SqlTools.Markdown.LinqToSql; namespace Strata.SqlTools.Markdown.Tests.LinqToSql; [TestFixture] public class QueryBreakdownGeneratorTests { private TestDataContext _context = null!; [SetUp] public void Setup() { _context = new TestDataContext(); } [Test] public void GenerateMermaidDiagram_SimpleLinqQuery_GeneratesValidMermaid() { // Arrange var query = TestDataContext.Users.Where(u => u.Age > 21); var breakdown = LinqQueryBreakdown.Analyze(query); // Act var result = QueryBreakdownGenerator.GenerateMermaidDiagram(breakdown, "Simple User Query"); // Assert Assert.That(result, Does.Contain("```mermaid")); Assert.That(result, Does.Contain("flowchart TD")); Assert.That(result, Does.Contain("### Simple User Query")); Assert.That(result, Does.Contain("SELECT")); Assert.That(result, Does.Contain("WHERE")); Assert.That(result, Does.Contain("```")); } [Test] public void GenerateMethodChainDiagram_WithMethodCalls_ShowsChain() { // Arrange var query = TestDataContext.Users .Where(u => u.Age > 18) .OrderBy(u => u.Name) .Select(u => new { u.Id, u.Name }); var breakdown = LinqQueryBreakdown.Analyze(query); // Act var result = QueryBreakdownGenerator.GenerateMethodChainDiagram(breakdown, "Method Chain"); // Assert Assert.That(result, Does.Contain("```mermaid")); Assert.That(result, Does.Contain("flowchart LR")); Assert.That(result, Does.Contain("### Method Chain")); Assert.That(result, Does.Contain("Where")); Assert.That(result, Does.Contain("OrderBy")); Assert.That(result, Does.Contain("Select")); Assert.That(result, Does.Contain("IQueryable")); Assert.That(result, Does.Contain("Result")); } [Test] public void GenerateMethodChainDiagram_EmptyChain_ShowsBasicFlow() { // Arrange var breakdown = new LinqQueryBreakdown("*", "Users"); // Act var result = QueryBreakdownGenerator.GenerateMethodChainDiagram(breakdown); // Assert Assert.That(result, Does.Contain("IQueryable")); Assert.That(result, Does.Contain("Result")); } [Test] public void GenerateCombinedDiagram_IncludesBothDiagrams() { // Arrange var query = TestDataContext.Users.Where(u => u.Age > 21).OrderBy(u => u.Name); var breakdown = LinqQueryBreakdown.Analyze(query); // Act var result = QueryBreakdownGenerator.GenerateCombinedDiagram(breakdown, "User Query Analysis"); // Assert Assert.That(result, Does.Contain("## User Query Analysis")); Assert.That(result, Does.Contain("### LINQ Method Chain")); Assert.That(result, Does.Contain("### SQL Query Structure")); Assert.That(result, Does.Contain("flowchart LR")); Assert.That(result, Does.Contain("flowchart TD")); } [Test] public void GenerateMermaidDiagram_WithProjection_ShowsSelectedFields() { // Arrange var query = TestDataContext.Users.Select(u => new { u.Id, u.Name, u.Email }); var breakdown = LinqQueryBreakdown.Analyze(query); // Act var result = QueryBreakdownGenerator.GenerateMermaidDiagram(breakdown); // Assert Assert.That(result, Does.Contain("SELECT")); Assert.That(result, Does.Contain("```mermaid")); } [Test] public void GenerateMermaidDiagram_NullTitle_GeneratesWithoutTitle() { // Arrange var query = TestDataContext.Users; var breakdown = LinqQueryBreakdown.Analyze(query); // Act var result = QueryBreakdownGenerator.GenerateMermaidDiagram(breakdown, null); // Assert Assert.That(result, Does.Not.Contain("###")); Assert.That(result, Does.Contain("```mermaid")); } } // Test data context public class TestDataContext { public static IQueryable Users => new List().AsQueryable(); } public class User { public int Id { get; set; } public string Name { get; set; } = string.Empty; public string Email { get; set; } = string.Empty; public int Age { get; set; } }