Skip to content

Commit a850df6

Browse files
authored
Alias optional parameters of OData functions (#272)
* Add parameter aliasing to optional parameters * Update tests
1 parent d637fc0 commit a850df6

File tree

3 files changed

+24
-17
lines changed

3 files changed

+24
-17
lines changed

src/Microsoft.OpenApi.OData.Reader/Edm/ODataOperationSegment.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
using System;
77
using System.Collections.Generic;
8+
using System.Data.Common;
89
using System.Linq;
910
using System.Text;
1011
using Microsoft.OData.Edm;
@@ -145,7 +146,9 @@ private string FunctionName(IEdmFunction function, OpenApiConvertSettings settin
145146
{
146147
string uniqueName = Utils.GetUniqueName(p.Name, parameters);
147148
var quote = p.Type.Definition.ShouldPathParameterBeQuoted(settings) ? "'" : string.Empty;
148-
return p.Name + $"={quote}{{{uniqueName}}}{quote}";
149+
return p is IEdmOptionalParameter
150+
? p.Name + $"={quote}@{uniqueName}{quote}"
151+
: p.Name + $"={quote}{{{uniqueName}}}{quote}";
149152
})));
150153

151154
functionName.Append(")");

src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiParameterGenerator.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ public static IList<OpenApiParameter> CreateParameters(this ODataContext context
8181
}
8282
}
8383

84-
OpenApiParameter parameter;
84+
OpenApiParameter parameter;
85+
bool isOptionalParameter = edmParameter is IEdmOptionalParameter;
8586
if (edmParameter.Type.IsStructured() ||
8687
edmParameter.Type.IsCollection())
8788
{
@@ -121,7 +122,6 @@ public static IList<OpenApiParameter> CreateParameters(this ODataContext context
121122
else
122123
{
123124
// Primitive parameters use the same type mapping as described for primitive properties.
124-
bool isOptionalParameter = edmParameter is IEdmOptionalParameter;
125125
parameter = new OpenApiParameter
126126
{
127127
Name = parameterNameMapping == null ? edmParameter.Name : parameterNameMapping[edmParameter.Name],
@@ -134,7 +134,9 @@ public static IList<OpenApiParameter> CreateParameters(this ODataContext context
134134
if (parameterNameMapping != null)
135135
{
136136
var quote = edmParameter.Type.Definition.ShouldPathParameterBeQuoted(context.Settings) ? "'" : string.Empty;
137-
parameter.Description = $"Usage: {edmParameter.Name}={quote}{{{parameterNameMapping[edmParameter.Name]}}}{quote}";
137+
parameter.Description = isOptionalParameter
138+
? $"Usage: {edmParameter.Name}={quote}@{parameterNameMapping[edmParameter.Name]}{quote}"
139+
: $"Usage: {edmParameter.Name}={quote}{{{parameterNameMapping[edmParameter.Name]}}}{quote}";
138140
}
139141

140142
parameters.Add(parameter);

test/Microsoft.OpenAPI.OData.Reader.Tests/Edm/ODataOperationSegmentTests.cs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
// ------------------------------------------------------------
55

66
using System;
7-
using System.Runtime.CompilerServices;
87
using Microsoft.OData.Edm;
98
using Xunit;
109

@@ -74,17 +73,18 @@ public void GetPathItemNameReturnsCorrectActionLiteral(bool unqualifiedCall, boo
7473
}
7574

7675
[Theory]
77-
[InlineData(true, true, "MyFunction(param={param})")]
78-
[InlineData(true, false, "MyFunction(entity={entity},param={param})")]
79-
[InlineData(false, true, "NS.MyFunction(param={param})")]
80-
[InlineData(false, false, "NS.MyFunction(entity={entity},param={param})")]
76+
[InlineData(true, true, "MyFunction(param={param},param2=@param2)")]
77+
[InlineData(true, false, "MyFunction(entity={entity},param={param},param2=@param2)")]
78+
[InlineData(false, true, "NS.MyFunction(param={param},param2=@param2)")]
79+
[InlineData(false, false, "NS.MyFunction(entity={entity},param={param},param2=@param2)")]
8180
public void GetPathItemNameReturnsCorrectFunctionLiteral(bool unqualifiedCall, bool isBound, string expected)
8281
{
8382
// Arrange & Act
8483
IEdmEntityTypeReference entityTypeReference = new EdmEntityTypeReference(new EdmEntityType("NS", "Entity"), false);
8584
IEdmTypeReference parameterType = EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.Boolean, isNullable: false);
8685
EdmFunction boundFunction = BoundFunction("MyFunction", isBound, entityTypeReference);
8786
boundFunction.AddParameter("param", parameterType);
87+
boundFunction.AddOptionalParameter("param2", parameterType);
8888

8989
var segment = new ODataOperationSegment(boundFunction);
9090
OpenApiConvertSettings settings = new OpenApiConvertSettings
@@ -97,17 +97,18 @@ public void GetPathItemNameReturnsCorrectFunctionLiteral(bool unqualifiedCall, b
9797
}
9898

9999
[Theory]
100-
[InlineData(true, true, "{param}")]
101-
[InlineData(true, false, "NS.MyFunction(param='{param}')")]
102-
[InlineData(false, true, "NS.MyFunction(param='{param}')")]
103-
[InlineData(false, false, "NS.MyFunction(param='{param}')")]
100+
[InlineData(true, true, "{param2}")]
101+
[InlineData(true, false, "NS.MyFunction(param='{param}',param2='@param2')")]
102+
[InlineData(false, true, "NS.MyFunction(param='{param}',param2='@param2')")]
103+
[InlineData(false, false, "NS.MyFunction(param='{param}',param2='@param2')")]
104104
public void GetPathItemNameReturnsCorrectFunctionLiteralForEscapedFunction(bool isEscapedFunction, bool enableEscapeFunctionCall, string expected)
105105
{
106106
// Arrange & Act
107107
IEdmEntityTypeReference entityTypeReference = new EdmEntityTypeReference(new EdmEntityType("NS", "Entity"), false);
108108
IEdmTypeReference parameterType = EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.String, isNullable: false);
109109
EdmFunction boundFunction = BoundFunction("MyFunction", true, entityTypeReference);
110110
boundFunction.AddParameter("param", parameterType);
111+
boundFunction.AddOptionalParameter("param2", parameterType);
111112

112113
var segment = new ODataOperationSegment(boundFunction, isEscapedFunction);
113114
OpenApiConvertSettings settings = new OpenApiConvertSettings
@@ -121,17 +122,18 @@ public void GetPathItemNameReturnsCorrectFunctionLiteralForEscapedFunction(bool
121122
}
122123

123124
[Theory]
124-
[InlineData(true, true, "{param}:")]
125-
[InlineData(true, false, "NS.MyFunction(param='{param}')")]
126-
[InlineData(false, true, "NS.MyFunction(param='{param}')")]
127-
[InlineData(false, false, "NS.MyFunction(param='{param}')")]
125+
[InlineData(true, true, "{param2}:")]
126+
[InlineData(true, false, "NS.MyFunction(param='{param}',param2='@param2')")]
127+
[InlineData(false, true, "NS.MyFunction(param='{param}',param2='@param2')")]
128+
[InlineData(false, false, "NS.MyFunction(param='{param}',param2='@param2')")]
128129
public void GetPathItemNameReturnsCorrectFunctionLiteralForEscapedComposableFunction(bool isEscapedFunction, bool enableEscapeFunctionCall, string expected)
129130
{
130131
// Arrange & Act
131132
IEdmEntityTypeReference entityTypeReference = new EdmEntityTypeReference(new EdmEntityType("NS", "Entity"), false);
132133
IEdmTypeReference parameterType = EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.String, isNullable: false);
133134
EdmFunction boundFunction = BoundFunction("MyFunction", true, entityTypeReference, true);
134135
boundFunction.AddParameter("param", parameterType);
136+
boundFunction.AddOptionalParameter("param2", parameterType);
135137

136138
var segment = new ODataOperationSegment(boundFunction, isEscapedFunction);
137139
OpenApiConvertSettings settings = new OpenApiConvertSettings

0 commit comments

Comments
 (0)