using Strata.SqlTools.Breakdowns.PostgreSql; using Strata.SqlTools.Markdown.PostgreSql; namespace Strata.SqlTools.Markdown.Tests.PostgreSql; [TestFixture] public class SqlStatementGeneratorTests { [Test] public void GenerateSequenceDiagram_PostgreSqlQuery_GeneratesValidDiagram() { // Arrange var query = QueryBreakdown.Parse(@" SELECT user_id, user_name, email FROM users WHERE status = 'ACTIVE' "); // Act var result = SqlStatementGenerator.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_WithPostgreSqlCTE_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 "); // Act var result = SqlStatementGenerator.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_ComplexPostgreSqlQuery_GeneratesSequenceDiagram() { // Arrange var query = QueryBreakdown.Parse(@" SELECT region, product, SUM(sales) AS total_sales FROM sales_data WHERE sale_date >= $1 GROUP BY region, product HAVING SUM(sales) > 1000 ORDER BY total_sales DESC "); // Act var result = SqlStatementGenerator.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_PostgreSqlTables_GeneratesERDiagram() { // Arrange - PostgreSQL typically uses lowercase table names var tables = new[] { "customers", "orders", "order_items", "products" }; // Act var result = SqlStatementGenerator.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 - PostgreSQL case-sensitive identifiers var tables = new[] { "\"Customers\"", "\"Orders\"", "\"OrderItems\"" }; // Act var result = SqlStatementGenerator.GenerateEntityRelationshipDiagram(tables); // Assert Assert.That(result, Does.Contain("erDiagram")); Assert.That(result, Does.Contain("```")); } [Test] public void GenerateEntityRelationshipDiagram_WithSchemaQualifiedNames_HandlesSchemaDotTable() { // Arrange - PostgreSQL schema.table qualified names var tables = new[] { "public.users", "sales.orders", "inventory.products" }; // Act var result = SqlStatementGenerator.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 = SqlStatementGenerator.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 = SqlStatementGenerator.GenerateSequenceDiagram(query, null); // Assert Assert.That(result, Does.Not.Contain("###")); Assert.That(result, Does.Contain("sequenceDiagram")); } [Test] public void GenerateSequenceDiagram_WithPositionalParameters_HandlesParametrizedQuery() { // Arrange - PostgreSQL positional parameters $1, $2 var query = QueryBreakdown.Parse(@" SELECT product_id, product_name, price FROM products WHERE category_id = $1 AND price > $2 ORDER BY price DESC "); // Act var result = SqlStatementGenerator.GenerateSequenceDiagram(query); // Assert Assert.That(result, Does.Contain("sequenceDiagram")); Assert.That(result, Does.Contain("Execute Main Statement")); } }