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..1220fcfc9b 100644 --- a/src/Service.Tests/GraphQLBuilder/Sql/StoredProcedureBuilderTests.cs +++ b/src/Service.Tests/GraphQLBuilder/Sql/StoredProcedureBuilderTests.cs @@ -355,6 +355,104 @@ 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); + } + + [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