Introduces new unit tests for Snowflake and SQL Server-specific SQL breakdown classes (DELETE, INSERT, UPDATE, PROCEDURE) and various general SQL utility functions. This significantly increases test coverage, ensuring robustness and correctness across different SQL dialects and helper logic.
209 lines
5.9 KiB
C#
209 lines
5.9 KiB
C#
using Strata.SqlTools.Breakdowns.SqlServer;
|
|
|
|
namespace Strata.SqlTools.SqlBreakdown.Tests.SqlServer;
|
|
|
|
[TestFixture]
|
|
public class UpdateBreakdownTests
|
|
{
|
|
#region Constructor Tests
|
|
|
|
[Test]
|
|
public void Constructor_Default_InitializesEmptyClauses()
|
|
{
|
|
// Arrange & Act
|
|
var breakdown = new UpdateBreakdown();
|
|
|
|
Assert.Multiple(() =>
|
|
{
|
|
// Assert
|
|
Assert.That(breakdown.TableName.Clause, Is.EqualTo(string.Empty));
|
|
Assert.That(breakdown.SetClause.Clause, Is.EqualTo(string.Empty));
|
|
Assert.That(breakdown.FromClause.Clause, Is.EqualTo(string.Empty));
|
|
Assert.That(breakdown.WhereClause.Clause, Is.EqualTo(string.Empty));
|
|
Assert.That(breakdown.IsUsingFromClause, Is.False);
|
|
Assert.That(breakdown.IsUsingWhereClause, Is.False);
|
|
});
|
|
}
|
|
|
|
[Test]
|
|
public void Constructor_WithClauses_SetsProperties()
|
|
{
|
|
// Arrange & Act
|
|
var breakdown = new UpdateBreakdown("Users", "Name = @Name", "Id = @Id");
|
|
|
|
Assert.Multiple(() =>
|
|
{
|
|
// Assert
|
|
Assert.That(breakdown.TableName.Clause, Is.EqualTo("Users"));
|
|
Assert.That(breakdown.SetClause.Clause, Is.EqualTo("Name = @Name"));
|
|
Assert.That(breakdown.WhereClause.Clause, Is.EqualTo("Id = @Id"));
|
|
Assert.That(breakdown.IsUsingWhereClause, Is.True);
|
|
});
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region GetSql Tests
|
|
|
|
[Test]
|
|
public void GetSql_WithWhere_RendersUpdateSetWhere()
|
|
{
|
|
// Arrange
|
|
var breakdown = new UpdateBreakdown("Users", "Name = @Name", "Id = @Id");
|
|
|
|
// Act
|
|
var sql = breakdown.GetSql();
|
|
|
|
Assert.Multiple(() =>
|
|
{
|
|
// Assert
|
|
Assert.That(sql, Does.Contain("UPDATE"));
|
|
Assert.That(sql, Does.Contain("Users"));
|
|
Assert.That(sql, Does.Contain("SET"));
|
|
Assert.That(sql, Does.Contain("Name = @Name"));
|
|
Assert.That(sql, Does.Contain("WHERE"));
|
|
Assert.That(sql, Does.Contain("Id = @Id"));
|
|
});
|
|
}
|
|
|
|
[Test]
|
|
public void GetSql_WithoutWhere_OmitsWhereKeyword()
|
|
{
|
|
// Arrange
|
|
var breakdown = new UpdateBreakdown("Users", "Name = @Name", string.Empty);
|
|
|
|
// Act
|
|
var sql = breakdown.GetSql();
|
|
|
|
Assert.Multiple(() =>
|
|
{
|
|
// Assert
|
|
Assert.That(sql, Does.Contain("UPDATE"));
|
|
Assert.That(sql, Does.Not.Contain("WHERE"));
|
|
});
|
|
}
|
|
|
|
[Test]
|
|
public void GetSql_WithFromClause_RendersFromSection()
|
|
{
|
|
// Arrange
|
|
var breakdown = new UpdateBreakdown("u", "u.Name = s.Name", "u.Id = s.Id")
|
|
{
|
|
FromClause = { Clause = "Users u INNER JOIN Staging s ON u.Id = s.Id" }
|
|
};
|
|
|
|
// Act
|
|
var sql = breakdown.GetSql();
|
|
|
|
Assert.Multiple(() =>
|
|
{
|
|
// Assert
|
|
Assert.That(breakdown.IsUsingFromClause, Is.True);
|
|
Assert.That(sql, Does.Contain("FROM"));
|
|
Assert.That(sql, Does.Contain("INNER JOIN Staging"));
|
|
});
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Parse Tests
|
|
|
|
[Test]
|
|
public void Parse_SimpleUpdate_PopulatesClauses()
|
|
{
|
|
// Arrange
|
|
var input = "UPDATE Users SET Name = 'Bob' WHERE Id = 1";
|
|
|
|
// Act
|
|
var breakdown = UpdateBreakdown.Parse(input);
|
|
|
|
Assert.Multiple(() =>
|
|
{
|
|
// Assert
|
|
Assert.That(breakdown.TableName.Clause, Is.EqualTo("Users"));
|
|
Assert.That(breakdown.SetClause.Clause, Is.EqualTo("Name = 'Bob'"));
|
|
Assert.That(breakdown.WhereClause.Clause, Is.EqualTo("Id = 1"));
|
|
});
|
|
}
|
|
|
|
[Test]
|
|
public void Parse_UpdateWithFrom_PopulatesFromClause()
|
|
{
|
|
// Arrange
|
|
var input = "UPDATE u SET u.Name = s.Name FROM Users u INNER JOIN Staging s ON u.Id = s.Id WHERE s.Active = 1";
|
|
|
|
// Act
|
|
var breakdown = UpdateBreakdown.Parse(input);
|
|
|
|
Assert.Multiple(() =>
|
|
{
|
|
// Assert
|
|
Assert.That(breakdown.TableName.Clause, Is.EqualTo("u"));
|
|
Assert.That(breakdown.IsUsingFromClause, Is.True);
|
|
Assert.That(breakdown.FromClause.Clause, Does.Contain("INNER JOIN Staging"));
|
|
Assert.That(breakdown.WhereClause.Clause, Is.EqualTo("s.Active = 1"));
|
|
});
|
|
}
|
|
|
|
[Test]
|
|
public void Parse_UpdateWithoutWhere_LeavesWhereEmpty()
|
|
{
|
|
// Arrange
|
|
var input = "UPDATE Users SET Name = 'Bob'";
|
|
|
|
// Act
|
|
var breakdown = UpdateBreakdown.Parse(input);
|
|
|
|
Assert.Multiple(() =>
|
|
{
|
|
// Assert
|
|
Assert.That(breakdown.SetClause.Clause, Is.EqualTo("Name = 'Bob'"));
|
|
Assert.That(breakdown.IsUsingWhereClause, Is.False);
|
|
});
|
|
}
|
|
|
|
[Test]
|
|
public void Parse_NullOrWhitespace_ThrowsArgumentNullException()
|
|
{
|
|
// Act & Assert
|
|
Assert.Throws<ArgumentNullException>(() => UpdateBreakdown.Parse(string.Empty));
|
|
}
|
|
|
|
[Test]
|
|
public void Parse_NotAnUpdateStatement_ThrowsFormatException()
|
|
{
|
|
// Act & Assert
|
|
Assert.Throws<FormatException>(() => UpdateBreakdown.Parse("DELETE FROM Users"));
|
|
}
|
|
|
|
[Test]
|
|
public void TryParse_WrongPrefix_ReturnsFalseWithMessage()
|
|
{
|
|
// Act
|
|
var success = UpdateBreakdown.TryParse("SELECT * FROM Users", out _, out var error);
|
|
|
|
Assert.Multiple(() =>
|
|
{
|
|
// Assert
|
|
Assert.That(success, Is.False);
|
|
Assert.That(error, Does.Contain("UPDATE"));
|
|
});
|
|
}
|
|
|
|
[Test]
|
|
public void TryParse_ValidUpdate_ReturnsTrue()
|
|
{
|
|
// Act
|
|
var success = UpdateBreakdown.TryParse("UPDATE Users SET Name = 'Bob' WHERE Id = 1", out var breakdown);
|
|
|
|
Assert.Multiple(() =>
|
|
{
|
|
// Assert
|
|
Assert.That(success, Is.True);
|
|
Assert.That(breakdown.TableName.Clause, Is.EqualTo("Users"));
|
|
});
|
|
}
|
|
|
|
#endregion
|
|
}
|