Skip to content

Commit

Permalink
Fix generating XML doc comments for query parameters in gRPC JSON tra…
Browse files Browse the repository at this point in the history
…nscoding (dotnet#55482)
  • Loading branch information
JamesNK authored May 3, 2024
1 parent 2bcfbd7 commit ed90662
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -146,12 +146,18 @@ private static ApiDescription CreateApiDescription(RouteEndpoint routeEndpoint,
var queryParameters = ServiceDescriptorHelpers.ResolveQueryParameterDescriptors(routeParameters, methodDescriptor, bodyDescriptor?.Descriptor, bodyDescriptor?.FieldDescriptor);
foreach (var queryDescription in queryParameters)
{
var fieldType = MessageDescriptorHelpers.ResolveFieldType(queryDescription.Value);
var field = queryDescription.Value;
var propertyInfo = field.ContainingType.ClrType.GetProperty(field.PropertyName);

// If from a property, create model as property to get its XML comments.
var identity = propertyInfo != null
? ModelMetadataIdentity.ForProperty(propertyInfo, MessageDescriptorHelpers.ResolveFieldType(field), field.ContainingType.ClrType)
: ModelMetadataIdentity.ForType(MessageDescriptorHelpers.ResolveFieldType(field));

apiDescription.ParameterDescriptions.Add(new ApiParameterDescription
{
Name = queryDescription.Key,
ModelMetadata = new GrpcModelMetadata(ModelMetadataIdentity.ForType(fieldType)),
ModelMetadata = new GrpcModelMetadata(identity),
Source = BindingSource.Query,
DefaultValue = string.Empty
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@ service XmlDoc {
delete: "/v1/greeter/{name}"
};
}
// QueryGet!
rpc QueryGet (StringRequestWithDetail) returns (StringReply) {
option (google.api.http) = {
get: "/v1/greeter/query/{name}"
};
}
}

// StringRequest!
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,29 @@ public void RequestDescription_Nested_ProtoFieldDocs()
Assert.Equal("Detail field!", path.Operations[OperationType.Post].RequestBody.Description);
}

[Fact]
public void Parameters_QueryParameters_ProtoFieldDocs()
{
// Arrange & Act
var swagger = OpenApiTestHelpers.GetOpenApiDocument<XmlDocService>(_testOutputHelper);

// Assert
var path = swagger.Paths["/v1/greeter/query/{name}"];
Assert.Collection(path.Operations[OperationType.Get].Parameters,
p =>
{
Assert.Equal(ParameterLocation.Path, p.In);
Assert.Equal("name", p.Name);
Assert.Equal("Name field!", p.Description);
},
p =>
{
Assert.Equal(ParameterLocation.Query, p.In);
Assert.Equal("detail.age", p.Name);
Assert.Equal("Age field!", p.Description);
});
}

[Fact]
public void Message_UseProtoDocs()
{
Expand Down

0 comments on commit ed90662

Please sign in to comment.