using Strata.SqlTools.Breakdowns.Snowflake; using Strata.SqlTools.Markdown.Snowflake; namespace Strata.SqlTools.Markdown.Tests.Snowflake; [TestFixture] public class SqlStatementGeneratorTests { private SqlStatementGenerator _generator = null!; [SetUp] public void Setup() { _generator = new SqlStatementGenerator(); } [Test] public void GenerateSequenceDiagram_SnowflakeQuery_GeneratesValidDiagram() { // Arrange var query = QueryBreakdown.Parse(@" SELECT USER_ID, USER_NAME, EMAIL FROM USERS WHERE STATUS = 'ACTIVE' ", isMicrosoftSql: false); // Act var result = _generator.GenerateSequenceDiagram(query, "User Query Flow"); // Assert Assert.That(result, Does.Contain("```mermaid")); Assert.That(result, Does.Contain("sequenceDiagram")); Assert.That(result, Does.Contain("### User Query Flow")); Assert.That(result, Does.Contain("```")); } [Test] public void GenerateSequenceDiagram_WithSnowflakeCTE_ShowsMainStatement() { // Arrange var query = QueryBreakdown.Parse(@" WITH ACTIVE_CUSTOMERS AS ( SELECT CUSTOMER_ID, CUSTOMER_NAME FROM CUSTOMERS WHERE STATUS = 'ACTIVE' ) SELECT C.CUSTOMER_ID, C.CUSTOMER_NAME, COUNT(O.ORDER_ID) AS ORDER_COUNT FROM ACTIVE_CUSTOMERS C LEFT JOIN ORDERS O ON C.CUSTOMER_ID = O.CUSTOMER_ID GROUP BY C.CUSTOMER_ID, C.CUSTOMER_NAME ", isMicrosoftSql: false); // Act var result = _generator.GenerateSequenceDiagram(query); // Assert Assert.That(result, Does.Contain("Execute Main Statement")); Assert.That(result, Does.Contain("activate DB")); Assert.That(result, Does.Contain("deactivate DB")); } [Test] public void GenerateSequenceDiagram_ComplexSnowflakeQuery_GeneratesSequenceDiagram() { // Arrange var query = QueryBreakdown.Parse(@" SELECT REGION, PRODUCT, SUM(SALES) AS TOTAL_SALES FROM SALES_DATA WHERE SALE_DATE >= :startDate GROUP BY REGION, PRODUCT HAVING SUM(SALES) > 1000 ORDER BY TOTAL_SALES DESC ", isMicrosoftSql: false); // Act var result = _generator.GenerateSequenceDiagram(query, "Sales Analysis"); // Assert Assert.That(result, Does.Contain("### Sales Analysis")); Assert.That(result, Does.Contain("sequenceDiagram")); Assert.That(result, Does.Contain("Execute Main Statement")); Assert.That(result, Does.Contain("activate DB")); Assert.That(result, Does.Contain("Return Results")); } [Test] public void GenerateEntityRelationshipDiagram_SnowflakeTables_GeneratesERDiagram() { // Arrange - Snowflake typically uses uppercase table names var tables = new[] { "CUSTOMERS", "ORDERS", "ORDER_ITEMS", "PRODUCTS" }; // Act var result = _generator.GenerateEntityRelationshipDiagram(tables, "E-Commerce Schema"); // Assert Assert.That(result, Does.Contain("```mermaid")); Assert.That(result, Does.Contain("erDiagram")); Assert.That(result, Does.Contain("### E-Commerce Schema")); Assert.That(result, Does.Contain("CUSTOMERS")); Assert.That(result, Does.Contain("ORDERS")); Assert.That(result, Does.Contain("ORDER_ITEMS")); Assert.That(result, Does.Contain("PRODUCTS")); } [Test] public void GenerateEntityRelationshipDiagram_WithDoubleQuotedNames_HandlesQuotedIdentifiers() { // Arrange - Snowflake case-sensitive identifiers var tables = new[] { "\"customers\"", "\"orders\"", "\"orderItems\"" }; // Act var result = _generator.GenerateEntityRelationshipDiagram(tables); // Assert Assert.That(result, Does.Contain("erDiagram")); Assert.That(result, Does.Contain("```")); } [Test] public void GenerateEntityRelationshipDiagram_SingleTable_GeneratesDiagram() { // Arrange var tables = new[] { "USERS" }; // Act var result = _generator.GenerateEntityRelationshipDiagram(tables); // Assert Assert.That(result, Does.Contain("erDiagram")); Assert.That(result, Does.Contain("USERS")); } [Test] public void GenerateSequenceDiagram_NullTitle_GeneratesWithoutTitle() { // Arrange var query = new QueryBreakdown("ORDER_ID", "ORDERS"); // Act var result = _generator.GenerateSequenceDiagram(query, null); // Assert Assert.That(result, Does.Not.Contain("###")); Assert.That(result, Does.Contain("sequenceDiagram")); } }