Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
164 changes: 164 additions & 0 deletions src/SqlInliner.Tests/ComplexScenarioTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
using NUnit.Framework;

namespace SqlInliner.Tests;

public class ComplexScenarioTests
{
private DatabaseConnection connection;
private readonly InlinerOptions options = InlinerOptions.Recommended();

[SetUp]
public void Setup()
{
connection = new();
connection.AddViewDefinition(DatabaseConnection.ToObjectName("dbo", "VPeople"),
"CREATE VIEW dbo.VPeople AS SELECT p.Id, p.FirstName, p.LastName, p.IsActive FROM dbo.People p");
connection.AddViewDefinition(DatabaseConnection.ToObjectName("dbo", "VOrders"),
"CREATE VIEW dbo.VOrders AS SELECT o.Id, o.PersonId, o.Amount, o.OrderDate FROM dbo.Orders o");
}

[Test]
public void ViewWithLeftOuterJoin_Inlines()
{
const string viewSql = "CREATE VIEW dbo.VTest AS SELECT p.Id, p.FirstName, o.Amount FROM dbo.VPeople p LEFT OUTER JOIN dbo.VOrders o ON p.Id = o.PersonId";

var inliner = new DatabaseViewInliner(connection, viewSql, options);
Assert.AreEqual(0, inliner.Errors.Count);
Assert.IsTrue(inliner.Result.ConvertedSql.Contains("dbo.People"));
Assert.IsTrue(inliner.Result.ConvertedSql.Contains("dbo.Orders"));
Assert.IsFalse(inliner.Result.ConvertedSql.Contains("dbo.VPeople"));
Assert.IsFalse(inliner.Result.ConvertedSql.Contains("dbo.VOrders"));
}

[Test]
public void ViewWithRightOuterJoin_Inlines()
{
const string viewSql = "CREATE VIEW dbo.VTest AS SELECT p.Id, p.FirstName, o.Amount FROM dbo.VPeople p RIGHT OUTER JOIN dbo.VOrders o ON p.Id = o.PersonId";

var inliner = new DatabaseViewInliner(connection, viewSql, options);
Assert.AreEqual(0, inliner.Errors.Count);
Assert.IsTrue(inliner.Result.ConvertedSql.Contains("dbo.People"));
Assert.IsTrue(inliner.Result.ConvertedSql.Contains("dbo.Orders"));
}

[Test]
public void ViewWithFullOuterJoin_Inlines()
{
const string viewSql = "CREATE VIEW dbo.VTest AS SELECT p.Id, p.FirstName, o.Amount FROM dbo.VPeople p FULL OUTER JOIN dbo.VOrders o ON p.Id = o.PersonId";

var inliner = new DatabaseViewInliner(connection, viewSql, options);
Assert.AreEqual(0, inliner.Errors.Count);
Assert.IsTrue(inliner.Result.ConvertedSql.Contains("dbo.People"));
Assert.IsTrue(inliner.Result.ConvertedSql.Contains("dbo.Orders"));
}

[Test]
public void ViewWithMultipleJoins_Inlines()
{
connection.AddViewDefinition(DatabaseConnection.ToObjectName("dbo", "VProducts"),
"CREATE VIEW dbo.VProducts AS SELECT pr.Id, pr.Name, pr.Price FROM dbo.Products pr");

const string viewSql = @"CREATE VIEW dbo.VTest AS
SELECT p.Id, p.FirstName, o.Amount, pr.Name
FROM dbo.VPeople p
INNER JOIN dbo.VOrders o ON p.Id = o.PersonId
INNER JOIN dbo.VProducts pr ON o.Id = pr.Id";

var inliner = new DatabaseViewInliner(connection, viewSql, options);
Assert.AreEqual(0, inliner.Errors.Count);
Assert.IsTrue(inliner.Result.ConvertedSql.Contains("dbo.People"));
Assert.IsTrue(inliner.Result.ConvertedSql.Contains("dbo.Orders"));
Assert.IsTrue(inliner.Result.ConvertedSql.Contains("dbo.Products"));
}

[Test]
public void ThreeLevelNesting_Inlines()
{
connection.AddViewDefinition(DatabaseConnection.ToObjectName("dbo", "VLevel2"),
"CREATE VIEW dbo.VLevel2 AS SELECT p.Id, p.FirstName FROM dbo.VPeople p");
connection.AddViewDefinition(DatabaseConnection.ToObjectName("dbo", "VLevel3"),
"CREATE VIEW dbo.VLevel3 AS SELECT l2.Id, l2.FirstName FROM dbo.VLevel2 l2");

const string viewSql = "CREATE VIEW dbo.VLevel4 AS SELECT l3.Id FROM dbo.VLevel3 l3";

var inliner = new DatabaseViewInliner(connection, viewSql, options);
Assert.AreEqual(0, inliner.Errors.Count);
Assert.IsTrue(inliner.Result.ConvertedSql.Contains("dbo.People"));
Assert.IsFalse(inliner.Result.ConvertedSql.Contains("VLevel2"));
Assert.IsFalse(inliner.Result.ConvertedSql.Contains("VLevel3"));
}

[Test]
public void ViewWithSubquery_Inlines()
{
const string viewSql = @"CREATE VIEW dbo.VTest AS
SELECT p.Id, p.FirstName,
(SELECT COUNT(*) FROM dbo.VOrders o WHERE o.PersonId = p.Id) OrderCount
FROM dbo.VPeople p";

var inliner = new DatabaseViewInliner(connection, viewSql, options);
Assert.AreEqual(0, inliner.Errors.Count);
Assert.IsTrue(inliner.Result.ConvertedSql.Contains("dbo.People"));
}

[Test]
public void ViewWithGroupBy_Inlines()
{
const string viewSql = @"CREATE VIEW dbo.VTest AS
SELECT p.Id, p.FirstName, COUNT(*) OrderCount
FROM dbo.VPeople p
INNER JOIN dbo.VOrders o ON p.Id = o.PersonId
GROUP BY p.Id, p.FirstName";

var inliner = new DatabaseViewInliner(connection, viewSql, options);
Assert.AreEqual(0, inliner.Errors.Count);
Assert.IsTrue(inliner.Result.ConvertedSql.Contains("dbo.People"));
}

[Test]
public void ViewWithOrderBy_Inlines()
{
const string viewSql = "CREATE VIEW dbo.VTest AS SELECT TOP 100 p.Id, p.FirstName FROM dbo.VPeople p ORDER BY p.FirstName";

var inliner = new DatabaseViewInliner(connection, viewSql, options);
Assert.AreEqual(0, inliner.Errors.Count);
Assert.IsTrue(inliner.Result.ConvertedSql.Contains("dbo.People"));
}

[Test]
public void ViewWithCaseStatement_Inlines()
{
const string viewSql = @"CREATE VIEW dbo.VTest AS
SELECT p.Id,
CASE WHEN p.IsActive = 1 THEN 'Active' ELSE 'Inactive' END Status
FROM dbo.VPeople p";

var inliner = new DatabaseViewInliner(connection, viewSql, options);
Assert.AreEqual(0, inliner.Errors.Count);
Assert.IsTrue(inliner.Result.ConvertedSql.Contains("dbo.People"));
}

[Test]
public void ViewWithDistinct_Inlines()
{
const string viewSql = "CREATE VIEW dbo.VTest AS SELECT DISTINCT p.LastName FROM dbo.VPeople p";

var inliner = new DatabaseViewInliner(connection, viewSql, options);
Assert.AreEqual(0, inliner.Errors.Count);
Assert.IsTrue(inliner.Result.ConvertedSql.Contains("dbo.People"));
Assert.IsTrue(inliner.Result.ConvertedSql.Contains("DISTINCT"));
}

[Test]
public void ViewWithMultipleWhereClauses_Inlines()
{
const string viewSql = @"CREATE VIEW dbo.VTest AS
SELECT p.Id, p.FirstName
FROM dbo.VPeople p
WHERE p.IsActive = 1 AND p.LastName IS NOT NULL";

var inliner = new DatabaseViewInliner(connection, viewSql, options);
Assert.AreEqual(0, inliner.Errors.Count);
Assert.IsTrue(inliner.Result.ConvertedSql.Contains("dbo.People"));
}
}
116 changes: 116 additions & 0 deletions src/SqlInliner.Tests/DatabaseConnectionTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
using NUnit.Framework;

namespace SqlInliner.Tests;

public class DatabaseConnectionTests
{
[Test]
public void EmptyConnection_HasNoViews()
{
var connection = new DatabaseConnection();
Assert.AreEqual(0, connection.Views.Count);
}

[Test]
public void EmptyConnection_HasNullConnection()
{
var connection = new DatabaseConnection();
Assert.IsNull(connection.Connection);
}

[Test]
public void AddViewDefinition_AddsToViews()
{
var connection = new DatabaseConnection();
var viewName = DatabaseConnection.ToObjectName("dbo", "VTest");
const string definition = "CREATE VIEW dbo.VTest AS SELECT 1";

connection.AddViewDefinition(viewName, definition);

Assert.AreEqual(1, connection.Views.Count);
}

[Test]
public void AddViewDefinition_CanRetrieveDefinition()
{
var connection = new DatabaseConnection();
var viewName = DatabaseConnection.ToObjectName("dbo", "VTest");
const string definition = "CREATE VIEW dbo.VTest AS SELECT 1";

connection.AddViewDefinition(viewName, definition);
var retrieved = connection.GetViewDefinition(viewName.GetName());

Assert.AreEqual(definition, retrieved);
}

[Test]
public void AddViewDefinition_MultipleViews_AllAccessible()
{
var connection = new DatabaseConnection();
var view1 = DatabaseConnection.ToObjectName("dbo", "VTest1");
var view2 = DatabaseConnection.ToObjectName("dbo", "VTest2");
const string def1 = "CREATE VIEW dbo.VTest1 AS SELECT 1";
const string def2 = "CREATE VIEW dbo.VTest2 AS SELECT 2";

connection.AddViewDefinition(view1, def1);
connection.AddViewDefinition(view2, def2);

Assert.AreEqual(2, connection.Views.Count);
Assert.AreEqual(def1, connection.GetViewDefinition(view1.GetName()));
Assert.AreEqual(def2, connection.GetViewDefinition(view2.GetName()));
}

[Test]
public void IsView_ViewExists_ReturnsTrue()
{
var connection = new DatabaseConnection();
var viewName = DatabaseConnection.ToObjectName("dbo", "VTest");
connection.AddViewDefinition(viewName, "CREATE VIEW dbo.VTest AS SELECT 1");

Assert.IsTrue(connection.IsView(viewName));
}

[Test]
public void IsView_ViewDoesNotExist_ReturnsFalse()
{
var connection = new DatabaseConnection();
var viewName = DatabaseConnection.ToObjectName("dbo", "VTest");

Assert.IsFalse(connection.IsView(viewName));
}

[Test]
public void IsView_DifferentSchema_ReturnsFalse()
{
var connection = new DatabaseConnection();
var viewName1 = DatabaseConnection.ToObjectName("dbo", "VTest");
var viewName2 = DatabaseConnection.ToObjectName("other", "VTest");
connection.AddViewDefinition(viewName1, "CREATE VIEW dbo.VTest AS SELECT 1");

Assert.IsFalse(connection.IsView(viewName2));
}

[Test]
public void AddViewDefinition_UpdatesExistingView()
{
var connection = new DatabaseConnection();
var viewName = DatabaseConnection.ToObjectName("dbo", "VTest");
const string def1 = "CREATE VIEW dbo.VTest AS SELECT 1";
const string def2 = "CREATE VIEW dbo.VTest AS SELECT 2";

connection.AddViewDefinition(viewName, def1);
connection.AddViewDefinition(viewName, def2);

Assert.AreEqual(def2, connection.GetViewDefinition(viewName.GetName()));
}

[Test]
public void ToObjectName_CreatesValidSchemaObjectName()
{
var objectName = DatabaseConnection.ToObjectName("myschema", "myview");

Assert.IsNotNull(objectName);
Assert.AreEqual("myschema", objectName.SchemaIdentifier.Value);
Assert.AreEqual("myview", objectName.BaseIdentifier.Value);
}
}
Loading
Loading