Skip to content

Commit

Permalink
Fix issue OData#1216, parameter read should not throw exception if mi…
Browse files Browse the repository at this point in the history
…ssing optional parameter
  • Loading branch information
xuzhg committed Aug 2, 2018
1 parent ed68ebd commit f54adfa
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 4 deletions.
9 changes: 7 additions & 2 deletions src/Microsoft.OData.Core/ODataParameterReaderCore.cs
Expand Up @@ -280,9 +280,14 @@ protected internal void EnterScope(ODataParameterReaderState state, string name,
// Note that the binding parameter will be specified on the Uri rather than the payload, skip the binding parameter.
foreach (IEdmOperationParameter parameter in this.Operation.Parameters.Skip(this.Operation.IsBound ? 1 : 0))
{
if (!this.parametersRead.Contains(parameter.Name) && !this.inputContext.EdmTypeResolver.GetParameterType(parameter).IsNullable)
bool isOptionalPameter = parameter is IEdmOptionalParameter;
if (!isOptionalPameter)
{
missingParameters.Add(parameter.Name);
// only check the non-optional parameter
if (!this.parametersRead.Contains(parameter.Name) && !this.inputContext.EdmTypeResolver.GetParameterType(parameter).IsNullable)
{
missingParameters.Add(parameter.Name);
}
}
}

Expand Down
Expand Up @@ -4,8 +4,6 @@
// </copyright>
//---------------------------------------------------------------------

using Microsoft.OData.Edm.Vocabularies;

namespace Microsoft.OData.Edm
{
/// <summary>
Expand Down
Expand Up @@ -58,6 +58,51 @@ public void ParameterReaderShouldReadSinglePrimitiveValue()
result.Values.Should().OnlyContain(keyValuePair => keyValuePair.Key.Equals("days") && keyValuePair.Value.Equals(4));
}

[Fact]
public void ParameterReaderShouldNotThrowIfMissingNullableNonOptionalParameter()
{
this.action.AddParameter("days", EdmCoreModel.Instance.GetInt32(true));
const string payload = "{ }";

var result = this.RunParameterReaderTest(payload);
result.Values.Should().BeEmpty();
}

[Fact]
public void ParameterReaderShouldThrowIfMissingNonNullableNonOptionalParameter()
{
this.action.AddParameter("days", EdmCoreModel.Instance.GetInt32(false));
const string payload = "{ }";

Action test = () => this.RunParameterReaderTest(payload);
test.ShouldThrow<ODataException>().WithMessage(Strings.ODataParameterReaderCore_ParametersMissingInPayload("ActionImport", "days"));
}

[Fact]
public void ParameterReaderShouldReadOptionalParameter()
{
this.action.AddParameter("days", EdmCoreModel.Instance.GetInt32(false));
this.action.AddOptionalParameter("optionalDays", EdmCoreModel.Instance.GetInt32(false));
const string payload = "{\"days\":4, \"optionalDays\":8 }";

var result = this.RunParameterReaderTest(payload);

result.Values.Should().HaveCount(2);
result.Values.Should().Contain(keyValuePair => keyValuePair.Key.Equals("days") && keyValuePair.Value.Equals(4));
result.Values.Should().Contain(keyValuePair => keyValuePair.Key.Equals("optionalDays") && keyValuePair.Value.Equals(8));
}

[Fact]
public void ParameterReaderShouldNotThrowIfMissingOptionalParameter()
{
this.action.AddParameter("days", EdmCoreModel.Instance.GetInt32(false));
this.action.AddOptionalParameter("optionalDays", EdmCoreModel.Instance.GetInt32(false));
const string payload = "{\"days\":4 }";

var result = this.RunParameterReaderTest(payload);
result.Values.Should().OnlyContain(keyValuePair => keyValuePair.Key.Equals("days") && keyValuePair.Value.Equals(4));
}

[Fact]
public void ParameterReaderShouldReadTwoPrimitiveValue()
{
Expand Down

0 comments on commit f54adfa

Please sign in to comment.