From 558c2edbd51bdfc0e85b489bef15098c9f182ade Mon Sep 17 00:00:00 2001 From: Anusha Kolan Date: Tue, 21 Jul 2026 13:53:38 -0700 Subject: [PATCH 1/2] Use config parameter descriptions in GraphQL stored procedure args --- .../GraphQLStoredProcedureBuilder.cs | 10 ++- .../Sql/StoredProcedureBuilderTests.cs | 70 +++++++++++++++++++ 2 files changed, 77 insertions(+), 3 deletions(-) diff --git a/src/Service.GraphQLBuilder/GraphQLStoredProcedureBuilder.cs b/src/Service.GraphQLBuilder/GraphQLStoredProcedureBuilder.cs index ad3786fd36..cb1799e248 100644 --- a/src/Service.GraphQLBuilder/GraphQLStoredProcedureBuilder.cs +++ b/src/Service.GraphQLBuilder/GraphQLStoredProcedureBuilder.cs @@ -83,13 +83,17 @@ public static FieldDefinitionNode GenerateStoredProcedureSchema( parameterTypeNode = new NonNullTypeNode((INullableTypeNode)parameterTypeNode); } + string parameterDescription = !string.IsNullOrWhiteSpace(paramMetadata?.Description) + ? paramMetadata.Description + : !string.IsNullOrWhiteSpace(definition.Description) + ? definition.Description + : $"parameters for {name.Value} stored-procedure"; + inputValues.Add( new( location: null, name: new(param), - description: definition.Description != null - ? new StringValueNode(definition.Description) - : new StringValueNode($"parameters for {name.Value} stored-procedure"), + description: new StringValueNode(parameterDescription), type: parameterTypeNode, defaultValue: defaultValueNode, directives: new List()) diff --git a/src/Service.Tests/GraphQLBuilder/Sql/StoredProcedureBuilderTests.cs b/src/Service.Tests/GraphQLBuilder/Sql/StoredProcedureBuilderTests.cs index 8530a3d6b2..5f2a60cb5a 100644 --- a/src/Service.Tests/GraphQLBuilder/Sql/StoredProcedureBuilderTests.cs +++ b/src/Service.Tests/GraphQLBuilder/Sql/StoredProcedureBuilderTests.cs @@ -355,6 +355,76 @@ public void StoredProcedure_RequiredWithDefault_KeepsDefaultValue() Assert.AreEqual("Demo Title", ((StringValueNode)arg.DefaultValue!).Value); } + [TestMethod] + public void StoredProcedure_ParameterDescription_UsesConfigDescription() + { + const string parameterName = "title"; + const string configDescription = "Title from runtime config"; + const string dbDescription = "Title from database metadata"; + + DatabaseObject spDbObj = new DatabaseStoredProcedure(schemaName: "dbo", tableName: "spParamDesc") + { + SourceType = EntitySourceType.StoredProcedure, + StoredProcedureDefinition = new() + { + Parameters = new() + { + { parameterName, new() { SystemType = typeof(string), Description = dbDescription } } + } + } + }; + spDbObj.SourceDefinition.Columns.TryAdd("col1", new() { SystemType = typeof(string) }); + + List configParameters = new() + { + new ParameterMetadata + { + Name = parameterName, + Description = configDescription + } + }; + + FieldDefinitionNode field = BuildSchemaAndGetExecuteField( + spDbObj: spDbObj, + configParameters: configParameters, + graphQLTypeName: "SpParamDescType", + entityName: "SpParamDesc"); + + InputValueDefinitionNode arg = field.Arguments.First(a => a.Name.Value == parameterName); + Assert.IsNotNull(arg.Description); + Assert.AreEqual(configDescription, arg.Description!.Value); + } + + [TestMethod] + public void StoredProcedure_ParameterDescription_FallsBackToDatabaseDescription() + { + const string parameterName = "title"; + const string dbDescription = "Title from database metadata"; + + DatabaseObject spDbObj = new DatabaseStoredProcedure(schemaName: "dbo", tableName: "spParamDescFallback") + { + SourceType = EntitySourceType.StoredProcedure, + StoredProcedureDefinition = new() + { + Parameters = new() + { + { parameterName, new() { SystemType = typeof(string), Description = dbDescription } } + } + } + }; + spDbObj.SourceDefinition.Columns.TryAdd("col1", new() { SystemType = typeof(string) }); + + FieldDefinitionNode field = BuildSchemaAndGetExecuteField( + spDbObj: spDbObj, + configParameters: new List(), + graphQLTypeName: "SpParamDescFallbackType", + entityName: "SpParamDescFallback"); + + InputValueDefinitionNode arg = field.Arguments.First(a => a.Name.Value == parameterName); + Assert.IsNotNull(arg.Description); + Assert.AreEqual(dbDescription, arg.Description!.Value); + } + /// /// Helper that builds a query schema for a stored-procedure entity and returns /// the generated execute* field so individual tests can assert on its argument From cc39f40411edf8784fed99a58b98914bf9720870 Mon Sep 17 00:00:00 2001 From: Anusha Kolan Date: Tue, 21 Jul 2026 14:19:49 -0700 Subject: [PATCH 2/2] Added additional tests Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../Sql/StoredProcedureBuilderTests.cs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/Service.Tests/GraphQLBuilder/Sql/StoredProcedureBuilderTests.cs b/src/Service.Tests/GraphQLBuilder/Sql/StoredProcedureBuilderTests.cs index 5f2a60cb5a..1220fcfc9b 100644 --- a/src/Service.Tests/GraphQLBuilder/Sql/StoredProcedureBuilderTests.cs +++ b/src/Service.Tests/GraphQLBuilder/Sql/StoredProcedureBuilderTests.cs @@ -425,6 +425,34 @@ public void StoredProcedure_ParameterDescription_FallsBackToDatabaseDescription( Assert.AreEqual(dbDescription, arg.Description!.Value); } + [TestMethod] + public void StoredProcedure_ParameterDescription_FallsBackToDefaultText() + { + const string parameterName = "title"; + const string graphQLTypeName = "SpParamDescDefaultTextType"; + const string entityName = "SpParamDescDefaultText"; + + DatabaseObject spDbObj = new DatabaseStoredProcedure(schemaName: "dbo", tableName: "spParamDescDefaultText") + { + SourceType = EntitySourceType.StoredProcedure, + StoredProcedureDefinition = new() + { + Parameters = new() { { parameterName, new() { SystemType = typeof(string) } } } + } + }; + spDbObj.SourceDefinition.Columns.TryAdd("col1", new() { SystemType = typeof(string) }); + + FieldDefinitionNode field = BuildSchemaAndGetExecuteField( + spDbObj: spDbObj, + configParameters: new List(), + graphQLTypeName: graphQLTypeName, + entityName: entityName); + + InputValueDefinitionNode arg = field.Arguments.First(a => a.Name.Value == parameterName); + Assert.IsNotNull(arg.Description); + Assert.AreEqual($"parameters for {graphQLTypeName} stored-procedure", arg.Description!.Value); + } + /// /// Helper that builds a query schema for a stored-procedure entity and returns /// the generated execute* field so individual tests can assert on its argument