Files
sql-utilities/tests/Strata.SqlTools.Tests/ExpressionTests/ConditionalExpressionTests.cs
T

118 lines
5.6 KiB
C#

using Strata.SqlTools.SqlBreakdown.Classes;
using Strata.SqlTools.SqlBreakdown.Expressions;
using Strata.SqlTools.SqlBreakdown.Expressions.Functions.Aggregate;
using Strata.SqlTools.SqlBreakdown.Expressions.Functions.Conditional;
namespace Strata.SqlTools.SqlBreakdown.Tests.ExpressionTests;
[TestFixture]
public class ConditionalExpressionTests : ExpressionTestsBase
{
private static IEnumerable<TestCaseData> ConditionalExpressionTestCases()
{
var testCases = new[]
{
new ExpressionTestCase
{
Name = "CaseExpression_{m}",
Arrange = new Dictionary<string, Expression>(),
Act = (columns, visitor) =>
{
var table = new RegisteredTableSource(101, "CLIENT_DSS", "DEPT", "PES");
var nameCol = new RegisteredTableColumnExpression(1, "DEPARTMENT_NAME", table);
var revenueCol = new RegisteredTableColumnExpression(2, "NET_REVENUE", table);
var caseExp = new CaseExpression(nameCol == "department 1", revenueCol, 0);
return caseExp.Accept(visitor);
},
Assertions = result =>
{
var sql = (string)result;
Assert.That(sql, Does.Contain("CASE"));
Assert.That(sql, Does.Contain("WHEN"));
Assert.That(sql, Does.Contain("THEN"));
Assert.That(sql, Does.Contain("ELSE"));
Assert.That(sql, Does.Contain("END"));
return true;
}
},
new ExpressionTestCase
{
Name = "CaseExpressionWithSum_{m}",
Arrange = new Dictionary<string, Expression>(),
Act = (columns, visitor) =>
{
var table = new RegisteredTableSource(101, "CLIENT_DSS", "DEPT", "PES");
var nameCol = new RegisteredTableColumnExpression(1, "DEPARTMENT_NAME", table);
var revenueCol = new RegisteredTableColumnExpression(2, "NET_REVENUE", table);
var caseExp = new CaseExpression(nameCol == "department 1", revenueCol, 0);
var sumCaseExp = new SumFunction(caseExp);
return sumCaseExp.Accept(visitor);
},
Assertions = result =>
{
var sql = (string)result;
Assert.That(sql, Does.Contain("SUM"));
Assert.That(sql, Does.Contain("CASE"));
Assert.That(sql, Does.Contain("WHEN"));
Assert.That(sql, Is.EqualTo("SUM(CASE\n WHEN PES.DEPARTMENT_NAME = 'department 1' THEN PES.NET_REVENUE\n ELSE 0\nEND)"));
return true;
}
},
new ExpressionTestCase
{
Name = "CaseExpressionWithSumInSelectColumn_{m}",
Arrange = new Dictionary<string, Expression>(),
Act = (columns, visitor) =>
{
var table = new RegisteredTableSource(101, "CLIENT_DSS", "DEPT", "PES");
var nameCol = new RegisteredTableColumnExpression(1, "DEPARTMENT_NAME", table);
var revenueCol = new RegisteredTableColumnExpression(2, "NET_REVENUE", table);
var caseExp = new CaseExpression(nameCol == "department 1", revenueCol, 0);
var sumCaseExp = new SumFunction(caseExp);
var column = new SelectClauseColumn(sumCaseExp, "mySumCaseCol");
return column.Accept(visitor);
},
Assertions = result =>
{
var sql = (string)result;
Assert.That(sql, Does.Contain("SUM"));
Assert.That(sql, Does.Contain("CASE"));
Assert.That(sql, Does.Contain("mySumCaseCol"));
Assert.That(sql, Is.EqualTo("SUM(CASE\n WHEN PES.DEPARTMENT_NAME = 'department 1' THEN PES.NET_REVENUE\n ELSE 0\nEND) AS mySumCaseCol"));
return true;
}
},
new ExpressionTestCase
{
Name = "IfThenElseExpression_{m}",
Arrange = new Dictionary<string, Expression>(),
Act = (columns, visitor) =>
{
var table = new RegisteredTableSource(101, "CLIENT_DSS", "DEPT", "PES");
var nameCol = new RegisteredTableColumnExpression(1, "DEPARTMENT_NAME", table);
var revenueCol = new RegisteredTableColumnExpression(2, "NET_REVENUE", table);
var costCol = new RegisteredTableColumnExpression(3, "COST", table);
var ifElseExp = new IfThenElseExpression(nameCol == "myDeptName", revenueCol, costCol);
return ifElseExp.Accept(visitor);
},
Assertions = result =>
{
var sql = (string)result;
Assert.That(sql, Does.Contain("IFF"));
Assert.That(sql, Is.EqualTo("IFF(PES.DEPARTMENT_NAME = 'myDeptName', PES.NET_REVENUE, PES.COST)"));
return true;
}
}
};
foreach (var testCase in testCases)
{
yield return new TestCaseData(testCase).SetName(testCase.Name);
}
}
[TestCaseSource(nameof(ConditionalExpressionTestCases))]
public void ConditionalExpression_GeneratesCorrectSql(ExpressionTestCase testCase)
=> ExecuteExpressionTest(testCase);
}