Files
jdescopingtool/NEW/tests/JdeScoping.DataSync.Tests/Etl/Scripts/CommonScriptsTests.cs
T
Joseph Doherty 0e07a76438 feat(etl): add ParseTableName and QUOTENAME to CommonScripts
- Add ParseTableName method to parse table names with optional schema
  - Supports: "Table", "dbo.Table", "[dbo].[Table]"
  - Returns (schema, table) tuple, defaults to "dbo" schema
- Update DisableIndexes, RebuildIndexes, UpdateStatistics to:
  - Use QUOTENAME() for SQL injection protection
  - Pass schema and table as parameters via SqlScriptRunner
  - Support non-dbo schemas
- Update CustomSql to accept optional parameters and timeout
- Add comprehensive tests for ParseTableName with various formats
2026-01-03 10:56:05 -05:00

102 lines
3.6 KiB
C#

using JdeScoping.DataAccess.Interfaces;
using JdeScoping.DataSync.Etl.Scripts;
using NSubstitute;
namespace JdeScoping.DataSync.Tests.Etl.Scripts;
public class CommonScriptsTests
{
private readonly IDbConnectionFactory _factory = Substitute.For<IDbConnectionFactory>();
[Theory]
[InlineData("WorkOrder", "dbo", "WorkOrder")]
[InlineData("dbo.WorkOrder", "dbo", "WorkOrder")]
[InlineData("[dbo].[WorkOrder]", "dbo", "WorkOrder")]
[InlineData("Config.Settings", "Config", "Settings")]
[InlineData("[Config].[Settings]", "Config", "Settings")]
[InlineData("myschema.MyTable", "myschema", "MyTable")]
[InlineData("[other].[table.with.dots]", "other", "table.with.dots")]
public void ParseTableName_VariousFormats_ParsesCorrectly(string input, string expectedSchema, string expectedTable)
{
// Act
var (schema, table) = CommonScripts.ParseTableName(input);
// Assert
Assert.Equal(expectedSchema, schema);
Assert.Equal(expectedTable, table);
}
[Fact]
public void DisableIndexes_ReturnsRunnerWithCorrectName()
{
var runner = CommonScripts.DisableIndexes(_factory, "WorkOrder");
Assert.Equal("DisableIndexes:dbo.WorkOrder", runner.ScriptName);
}
[Fact]
public void DisableIndexes_WithSchema_ReturnsRunnerWithCorrectName()
{
var runner = CommonScripts.DisableIndexes(_factory, "Config.Settings");
Assert.Equal("DisableIndexes:Config.Settings", runner.ScriptName);
}
[Fact]
public void DisableIndexes_WithBracketedSchema_ReturnsRunnerWithCorrectName()
{
var runner = CommonScripts.DisableIndexes(_factory, "[dbo].[WorkOrder]");
Assert.Equal("DisableIndexes:dbo.WorkOrder", runner.ScriptName);
}
[Fact]
public void RebuildIndexes_ReturnsRunnerWithCorrectName()
{
var runner = CommonScripts.RebuildIndexes(_factory, "WorkOrder");
Assert.Equal("RebuildIndexes:dbo.WorkOrder", runner.ScriptName);
}
[Fact]
public void RebuildIndexes_WithSchema_ReturnsRunnerWithCorrectName()
{
var runner = CommonScripts.RebuildIndexes(_factory, "Config.Settings");
Assert.Equal("RebuildIndexes:Config.Settings", runner.ScriptName);
}
[Fact]
public void UpdateStatistics_ReturnsRunnerWithCorrectName()
{
var runner = CommonScripts.UpdateStatistics(_factory, "WorkOrder");
Assert.Equal("UpdateStats:dbo.WorkOrder", runner.ScriptName);
}
[Fact]
public void UpdateStatistics_WithSchema_ReturnsRunnerWithCorrectName()
{
var runner = CommonScripts.UpdateStatistics(_factory, "Config.Settings");
Assert.Equal("UpdateStats:Config.Settings", runner.ScriptName);
}
[Fact]
public void CustomSql_ReturnsRunnerWithProvidedName()
{
var runner = CommonScripts.CustomSql(_factory, "SELECT 1", "MyCustomScript");
Assert.Equal("MyCustomScript", runner.ScriptName);
}
[Fact]
public void CustomSql_WithParameters_ReturnsRunner()
{
var parameters = new { value = 42 };
var runner = CommonScripts.CustomSql(_factory, "SELECT @value", "ParameterizedScript", parameters);
Assert.Equal("ParameterizedScript", runner.ScriptName);
Assert.NotNull(runner);
}
[Fact]
public void CustomSql_WithTimeout_ReturnsRunner()
{
var runner = CommonScripts.CustomSql(_factory, "SELECT 1", "TimeoutScript", timeoutSeconds: 120);
Assert.Equal("TimeoutScript", runner.ScriptName);
Assert.NotNull(runner);
}
}