Add typed procedure descriptors and Exec invoker

This commit is contained in:
2026-02-27 16:27:49 +01:00
parent 9ce10273f1
commit 416404f8d1
7 changed files with 410 additions and 23 deletions

View File

@@ -139,4 +139,18 @@ namespace DynamORM.Tests.Helpers
[ProcedureParameter("status", Direction = ParameterDirection.Output, Order = 1, DbType = DbType.Int32)]
public int Status { get; set; }
}
[Procedure(Name = "sp_exec_test", Owner = "dbo")]
public class ExecProcedureDescriptor : Procedure<ProcedureParameterObject>
{
}
public class ExecProcedureDefaultDescriptor : Procedure<ProcedureParameterObject>
{
}
[Procedure(Name = "sp_exec_result")]
public class ExecProcedureDescriptorWithExplicitResult : Procedure<ProcedureParameterColumnFallbackObject, ProcedureAttributedResult>
{
}
}

View File

@@ -5,6 +5,7 @@
*/
using System.Data;
using System.Dynamic;
using DynamORM.Helpers;
using DynamORM.Tests.Helpers;
using NUnit.Framework;
@@ -122,6 +123,55 @@ namespace DynamORM.Tests.Procedure
Assert.IsNull(DynamicProcedureResultBinder.GetDeclaredResultType(new object()));
}
[Test]
public void TestProcedureDescriptorResolvesAttributeNameAndArguments()
{
var descriptor = DynamicProcedureDescriptor.Resolve(typeof(ExecProcedureDescriptor));
Assert.AreEqual(typeof(ExecProcedureDescriptor), descriptor.ProcedureType);
Assert.AreEqual(typeof(ProcedureParameterObject), descriptor.ArgumentsType);
Assert.IsNull(descriptor.ResultType);
Assert.AreEqual("dbo.sp_exec_test", descriptor.ProcedureName);
Assert.AreEqual("sp_exec_test", descriptor.ResultName);
}
[Test]
public void TestProcedureDescriptorResolvesDefaultNameAndExplicitResult()
{
var defaultDescriptor = DynamicProcedureDescriptor.Resolve(typeof(ExecProcedureDefaultDescriptor));
var explicitDescriptor = DynamicProcedureDescriptor.Resolve(typeof(ExecProcedureDescriptorWithExplicitResult));
Assert.AreEqual("ExecProcedureDefaultDescriptor", defaultDescriptor.ProcedureName);
Assert.AreEqual(typeof(ProcedureParameterObject), defaultDescriptor.ArgumentsType);
Assert.IsNull(defaultDescriptor.ResultType);
Assert.AreEqual("sp_exec_result", explicitDescriptor.ProcedureName);
Assert.AreEqual(typeof(ProcedureParameterColumnFallbackObject), explicitDescriptor.ArgumentsType);
Assert.AreEqual(typeof(ProcedureAttributedResult), explicitDescriptor.ResultType);
}
[Test]
public void TestExecRejectsWrongArgumentsType()
{
dynamic procedures = new DynamicProcedureInvoker(null);
Assert.Throws<System.InvalidOperationException>(() =>
{
var ignored = procedures.Exec<ExecProcedureDescriptor>(new ProcedureParameterColumnFallbackObject());
});
}
[Test]
public void TestExecRejectsMultipleArguments()
{
dynamic procedures = new DynamicProcedureInvoker(null);
Assert.Throws<System.InvalidOperationException>(() =>
{
var ignored = procedures.Exec<ExecProcedureDescriptor>(new ProcedureParameterObject(), new ProcedureParameterObject());
});
}
[Test]
public void TestDeclaredResultPayloadBindingMapsMainAndOutValues()
{