Integration tests for
Collection Model Binder -> MutableObject(POCO) Model Binder – With-Data/Fallback-to-empty-prefix/Without-Data
This commit is contained in:
parent
e79cd72f3e
commit
502b832d17
|
|
@ -168,5 +168,171 @@ namespace Microsoft.AspNet.Mvc.IntegrationTests
|
|||
Assert.Equal(0, modelState.ErrorCount);
|
||||
Assert.True(modelState.IsValid);
|
||||
}
|
||||
|
||||
private class Person
|
||||
{
|
||||
public string Name { get; set; }
|
||||
}
|
||||
|
||||
[Fact(Skip = "Extra ModelState key because of #2446")]
|
||||
public async Task ArrayModelBinder_BindsArrayOfComplexType_WithPrefix_Success()
|
||||
{
|
||||
// Arrange
|
||||
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||
var parameter = new ParameterDescriptor()
|
||||
{
|
||||
Name = "parameter",
|
||||
ParameterType = typeof(Person[])
|
||||
};
|
||||
|
||||
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||
{
|
||||
request.QueryString = new QueryString("?parameter[0].Name=bill¶meter[1].Name=lang");
|
||||
});
|
||||
|
||||
var modelState = new ModelStateDictionary();
|
||||
|
||||
// Act
|
||||
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(modelBindingResult);
|
||||
Assert.True(modelBindingResult.IsModelSet);
|
||||
|
||||
var model = Assert.IsType<Person[]>(modelBindingResult.Model);
|
||||
Assert.Equal("bill", model[0].Name);
|
||||
Assert.Equal("lang", model[1].Name);
|
||||
|
||||
Assert.Equal(2, modelState.Count); // This fails due to #2446
|
||||
Assert.Equal(0, modelState.ErrorCount);
|
||||
Assert.True(modelState.IsValid);
|
||||
|
||||
var entry = Assert.Single(modelState, kvp => kvp.Key == "parameter[0].Name").Value;
|
||||
Assert.Equal("bill", entry.Value.AttemptedValue);
|
||||
Assert.Equal("bill", entry.Value.RawValue);
|
||||
|
||||
entry = Assert.Single(modelState, kvp => kvp.Key == "parameter[1].Name").Value;
|
||||
Assert.Equal("lang", entry.Value.AttemptedValue);
|
||||
Assert.Equal("lang", entry.Value.RawValue);
|
||||
}
|
||||
|
||||
[Fact(Skip = "Extra ModelState key because of #2446")]
|
||||
public async Task ArrayModelBinder_BindsArrayOfComplexType_WithExplicitPrefix_Success()
|
||||
{
|
||||
// Arrange
|
||||
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||
var parameter = new ParameterDescriptor()
|
||||
{
|
||||
Name = "parameter",
|
||||
BindingInfo = new BindingInfo()
|
||||
{
|
||||
BinderModelName = "prefix",
|
||||
},
|
||||
ParameterType = typeof(Person[])
|
||||
};
|
||||
|
||||
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||
{
|
||||
request.QueryString = new QueryString("?prefix[0].Name=bill&prefix[1]=lang");
|
||||
});
|
||||
|
||||
var modelState = new ModelStateDictionary();
|
||||
|
||||
// Act
|
||||
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(modelBindingResult);
|
||||
Assert.True(modelBindingResult.IsModelSet);
|
||||
|
||||
var model = Assert.IsType<Person[]>(modelBindingResult.Model);
|
||||
Assert.Equal("bill", model[0].Name);
|
||||
Assert.Equal("lang", model[1].Name);
|
||||
|
||||
Assert.Equal(2, modelState.Count); // This fails due to #2446
|
||||
Assert.Equal(0, modelState.ErrorCount);
|
||||
Assert.True(modelState.IsValid);
|
||||
|
||||
var entry = Assert.Single(modelState, kvp => kvp.Key == "prefix[0].Name").Value;
|
||||
Assert.Equal("bill", entry.Value.AttemptedValue);
|
||||
Assert.Equal("bill", entry.Value.RawValue);
|
||||
|
||||
entry = Assert.Single(modelState, kvp => kvp.Key == "prefix[1].Name").Value;
|
||||
Assert.Equal("lang", entry.Value.AttemptedValue);
|
||||
Assert.Equal("lang", entry.Value.RawValue);
|
||||
}
|
||||
|
||||
[Fact(Skip = "Extra ModelState key because of #2446")]
|
||||
public async Task ArrayModelBinder_BindsArrayOfComplexType_EmptyPrefix_Success()
|
||||
{
|
||||
// Arrange
|
||||
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||
var parameter = new ParameterDescriptor()
|
||||
{
|
||||
Name = "parameter",
|
||||
ParameterType = typeof(Person[])
|
||||
};
|
||||
|
||||
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||
{
|
||||
request.QueryString = new QueryString("?[0].Name=bill&[1].Name=lang");
|
||||
});
|
||||
|
||||
var modelState = new ModelStateDictionary();
|
||||
|
||||
// Act
|
||||
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(modelBindingResult);
|
||||
Assert.True(modelBindingResult.IsModelSet);
|
||||
|
||||
var model = Assert.IsType<Person[]>(modelBindingResult.Model);
|
||||
Assert.Equal("bill", model[0].Name);
|
||||
Assert.Equal("lang", model[1].Name);
|
||||
|
||||
Assert.Equal(2, modelState.Count); // This fails due to #2446
|
||||
Assert.Equal(0, modelState.ErrorCount);
|
||||
Assert.True(modelState.IsValid);
|
||||
|
||||
var entry = Assert.Single(modelState, kvp => kvp.Key == "[0].Name").Value;
|
||||
Assert.Equal("bill", entry.Value.AttemptedValue);
|
||||
Assert.Equal("bill", entry.Value.RawValue);
|
||||
|
||||
entry = Assert.Single(modelState, kvp => kvp.Key == "[1].Name").Value;
|
||||
Assert.Equal("lang", entry.Value.AttemptedValue);
|
||||
Assert.Equal("lang", entry.Value.RawValue);
|
||||
}
|
||||
|
||||
[Fact(Skip = "Empty collection should be created by the collection model binder #1579")]
|
||||
public async Task ArrayModelBinder_BindsArrayOfComplexType_NoData()
|
||||
{
|
||||
// Arrange
|
||||
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||
var parameter = new ParameterDescriptor()
|
||||
{
|
||||
Name = "parameter",
|
||||
ParameterType = typeof(Person[])
|
||||
};
|
||||
|
||||
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||
{
|
||||
request.QueryString = new QueryString("?");
|
||||
});
|
||||
|
||||
var modelState = new ModelStateDictionary();
|
||||
|
||||
// Act
|
||||
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(modelBindingResult); // This fails due to #1579
|
||||
Assert.False(modelBindingResult.IsModelSet);
|
||||
Assert.Empty(Assert.IsType<Person[]>(modelBindingResult.Model));
|
||||
|
||||
Assert.Equal(0, modelState.Count);
|
||||
Assert.Equal(0, modelState.ErrorCount);
|
||||
Assert.True(modelState.IsValid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -172,5 +172,171 @@ namespace Microsoft.AspNet.Mvc.IntegrationTests
|
|||
Assert.Equal(0, modelState.ErrorCount);
|
||||
Assert.True(modelState.IsValid);
|
||||
}
|
||||
|
||||
private class Person
|
||||
{
|
||||
public int Id { get; set; }
|
||||
}
|
||||
|
||||
[Fact(Skip = "Extra ModelState key because of #2446")]
|
||||
public async Task CollectionModelBinder_BindsListOfComplexType_WithPrefix_Success()
|
||||
{
|
||||
// Arrange
|
||||
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||
var parameter = new ParameterDescriptor()
|
||||
{
|
||||
Name = "parameter",
|
||||
ParameterType = typeof(List<Person>)
|
||||
};
|
||||
|
||||
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||
{
|
||||
request.QueryString = new QueryString("?parameter[0].Id=10¶meter[1].Id=11");
|
||||
});
|
||||
|
||||
var modelState = new ModelStateDictionary();
|
||||
|
||||
// Act
|
||||
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(modelBindingResult);
|
||||
Assert.True(modelBindingResult.IsModelSet);
|
||||
|
||||
var model = Assert.IsType<List<Person>>(modelBindingResult.Model);
|
||||
Assert.Equal(10, model[0].Id);
|
||||
Assert.Equal(11, model[1].Id);
|
||||
|
||||
Assert.Equal(2, modelState.Count); // This fails due to #2446
|
||||
Assert.Equal(0, modelState.ErrorCount);
|
||||
Assert.True(modelState.IsValid);
|
||||
|
||||
var entry = Assert.Single(modelState, kvp => kvp.Key == "parameter[0].Id").Value;
|
||||
Assert.Equal("10", entry.Value.AttemptedValue);
|
||||
Assert.Equal("10", entry.Value.RawValue);
|
||||
|
||||
entry = Assert.Single(modelState, kvp => kvp.Key == "parameter[1].Id").Value;
|
||||
Assert.Equal("11", entry.Value.AttemptedValue);
|
||||
Assert.Equal("11", entry.Value.RawValue);
|
||||
}
|
||||
|
||||
[Fact(Skip = "Extra ModelState key because of #2446")]
|
||||
public async Task CollectionModelBinder_BindsListOfComplexType_WithExplicitPrefix_Success()
|
||||
{
|
||||
// Arrange
|
||||
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||
var parameter = new ParameterDescriptor()
|
||||
{
|
||||
Name = "parameter",
|
||||
BindingInfo = new BindingInfo()
|
||||
{
|
||||
BinderModelName = "prefix",
|
||||
},
|
||||
ParameterType = typeof(List<Person>)
|
||||
};
|
||||
|
||||
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||
{
|
||||
request.QueryString = new QueryString("?prefix[0].Id=10&prefix[1].Id=11");
|
||||
});
|
||||
|
||||
var modelState = new ModelStateDictionary();
|
||||
|
||||
// Act
|
||||
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(modelBindingResult);
|
||||
Assert.True(modelBindingResult.IsModelSet);
|
||||
|
||||
var model = Assert.IsType<List<Person>>(modelBindingResult.Model);
|
||||
Assert.Equal(10, model[0].Id);
|
||||
Assert.Equal(11, model[1].Id);
|
||||
|
||||
Assert.Equal(2, modelState.Count); // This fails due to #2446
|
||||
Assert.Equal(0, modelState.ErrorCount);
|
||||
Assert.True(modelState.IsValid);
|
||||
|
||||
var entry = Assert.Single(modelState, kvp => kvp.Key == "prefix[0].Id").Value;
|
||||
Assert.Equal("10", entry.Value.AttemptedValue);
|
||||
Assert.Equal("10", entry.Value.RawValue);
|
||||
|
||||
entry = Assert.Single(modelState, kvp => kvp.Key == "prefix[1].Id").Value;
|
||||
Assert.Equal("11", entry.Value.AttemptedValue);
|
||||
Assert.Equal("11", entry.Value.RawValue);
|
||||
}
|
||||
|
||||
[Fact(Skip = "Extra ModelState key because of #2446")]
|
||||
public async Task CollectionModelBinder_BindsCollectionOfComplexType_EmptyPrefix_Success()
|
||||
{
|
||||
// Arrange
|
||||
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||
var parameter = new ParameterDescriptor()
|
||||
{
|
||||
Name = "parameter",
|
||||
ParameterType = typeof(ICollection<int>)
|
||||
};
|
||||
|
||||
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||
{
|
||||
request.QueryString = new QueryString("?[0].Id=10&[1].Id=11");
|
||||
});
|
||||
|
||||
var modelState = new ModelStateDictionary();
|
||||
|
||||
// Act
|
||||
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(modelBindingResult);
|
||||
Assert.True(modelBindingResult.IsModelSet);
|
||||
|
||||
var model = Assert.IsType<List<Person>>(modelBindingResult.Model);
|
||||
Assert.Equal(10, model[0].Id);
|
||||
Assert.Equal(11, model[1].Id);
|
||||
|
||||
Assert.Equal(2, modelState.Count); // This fails due to #2446
|
||||
Assert.Equal(0, modelState.ErrorCount);
|
||||
Assert.True(modelState.IsValid);
|
||||
|
||||
var entry = Assert.Single(modelState, kvp => kvp.Key == "[0].Id").Value;
|
||||
Assert.Equal("10", entry.Value.AttemptedValue);
|
||||
Assert.Equal("10", entry.Value.RawValue);
|
||||
|
||||
entry = Assert.Single(modelState, kvp => kvp.Key == "[1].Id").Value;
|
||||
Assert.Equal("11", entry.Value.AttemptedValue);
|
||||
Assert.Equal("11", entry.Value.RawValue);
|
||||
}
|
||||
|
||||
[Fact(Skip = "Empty collection should be created by the collection model binder #1579")]
|
||||
public async Task CollectionModelBinder_BindsListOfComplexType_NoData()
|
||||
{
|
||||
// Arrange
|
||||
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||
var parameter = new ParameterDescriptor()
|
||||
{
|
||||
Name = "parameter",
|
||||
ParameterType = typeof(List<Person>)
|
||||
};
|
||||
|
||||
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||
{
|
||||
request.QueryString = new QueryString("?");
|
||||
});
|
||||
|
||||
var modelState = new ModelStateDictionary();
|
||||
|
||||
// Act
|
||||
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(modelBindingResult); // This fails due to #1579
|
||||
Assert.False(modelBindingResult.IsModelSet);
|
||||
Assert.Empty(Assert.IsType<List<Person>>(modelBindingResult.Model));
|
||||
|
||||
Assert.Equal(0, modelState.Count);
|
||||
Assert.Equal(0, modelState.ErrorCount);
|
||||
Assert.True(modelState.IsValid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2,6 +2,7 @@
|
|||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNet.Http;
|
||||
using Microsoft.AspNet.Mvc.ModelBinding;
|
||||
|
|
@ -169,5 +170,174 @@ namespace Microsoft.AspNet.Mvc.IntegrationTests
|
|||
Assert.Equal(0, modelState.ErrorCount);
|
||||
Assert.True(modelState.IsValid);
|
||||
}
|
||||
|
||||
private class Person
|
||||
{
|
||||
public int Id { get; set; }
|
||||
}
|
||||
|
||||
[Fact(Skip = "Extra ModelState key because of #2446")]
|
||||
public async Task DictionaryModelBinder_BindsDictionaryOfComplexType_WithPrefix_Success()
|
||||
{
|
||||
// Arrange
|
||||
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||
var parameter = new ParameterDescriptor()
|
||||
{
|
||||
Name = "parameter",
|
||||
ParameterType = typeof(Dictionary<string, Person>)
|
||||
};
|
||||
|
||||
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||
{
|
||||
request.QueryString = new QueryString("?parameter[0].Key=key0¶meter[0].Value.Id=10");
|
||||
});
|
||||
|
||||
var modelState = new ModelStateDictionary();
|
||||
|
||||
// Act
|
||||
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(modelBindingResult);
|
||||
Assert.True(modelBindingResult.IsModelSet);
|
||||
|
||||
var model = Assert.IsType<Dictionary<string, Person>>(modelBindingResult.Model);
|
||||
Assert.Equal(1, model.Count);
|
||||
Assert.Equal("key0", model.Keys.First());
|
||||
Assert.Equal(model.Values, model.Values);
|
||||
|
||||
Assert.Equal(2, modelState.Count); // Fails due to #2446
|
||||
Assert.Equal(0, modelState.ErrorCount);
|
||||
Assert.True(modelState.IsValid);
|
||||
|
||||
var entry = Assert.Single(modelState, kvp => kvp.Key == "parameter[0].Key").Value;
|
||||
Assert.Equal("key0", entry.Value.AttemptedValue);
|
||||
Assert.Equal("key0", entry.Value.RawValue);
|
||||
|
||||
entry = Assert.Single(modelState, kvp => kvp.Key == "parameter[0].Value.Id").Value;
|
||||
Assert.Equal("10", entry.Value.AttemptedValue);
|
||||
Assert.Equal("10", entry.Value.RawValue);
|
||||
}
|
||||
|
||||
[Fact(Skip = "Extra ModelState key because of #2446")]
|
||||
public async Task DictionaryModelBinder_BindsDictionaryOfComplexType_WithExplicitPrefix_Success()
|
||||
{
|
||||
// Arrange
|
||||
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||
var parameter = new ParameterDescriptor()
|
||||
{
|
||||
Name = "parameter",
|
||||
BindingInfo = new BindingInfo()
|
||||
{
|
||||
BinderModelName = "prefix",
|
||||
},
|
||||
ParameterType = typeof(Dictionary<string, Person>)
|
||||
};
|
||||
|
||||
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||
{
|
||||
request.QueryString = new QueryString("?prefix[0].Key=key0&prefix[0].Value.Id=10");
|
||||
});
|
||||
|
||||
var modelState = new ModelStateDictionary();
|
||||
|
||||
// Act
|
||||
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(modelBindingResult);
|
||||
Assert.True(modelBindingResult.IsModelSet);
|
||||
|
||||
var model = Assert.IsType<Dictionary<string, Person>>(modelBindingResult.Model);
|
||||
Assert.Equal(1, model.Count);
|
||||
Assert.Equal("key0", model.Keys.First());
|
||||
Assert.Equal(model.Values, model.Values);
|
||||
|
||||
Assert.Equal(2, modelState.Count); // Fails due to #2446
|
||||
Assert.Equal(0, modelState.ErrorCount);
|
||||
Assert.True(modelState.IsValid);
|
||||
|
||||
var entry = Assert.Single(modelState, kvp => kvp.Key == "prefix[0].Key").Value;
|
||||
Assert.Equal("key0", entry.Value.AttemptedValue);
|
||||
Assert.Equal("key0", entry.Value.RawValue);
|
||||
|
||||
entry = Assert.Single(modelState, kvp => kvp.Key == "prefix[0].Value.Id").Value;
|
||||
Assert.Equal("10", entry.Value.AttemptedValue);
|
||||
Assert.Equal("10", entry.Value.RawValue);
|
||||
}
|
||||
|
||||
[Fact(Skip = "Extra ModelState key because of #2446, IsValue == false because of #2470")]
|
||||
public async Task DictionaryModelBinder_BindsDictionaryOfComplexType_EmptyPrefix_Success()
|
||||
{
|
||||
// Arrange
|
||||
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||
var parameter = new ParameterDescriptor()
|
||||
{
|
||||
Name = "parameter",
|
||||
ParameterType = typeof(Dictionary<string, Person>)
|
||||
};
|
||||
|
||||
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||
{
|
||||
request.QueryString = new QueryString("?[0].Key=key0&[0].Value.Id=10");
|
||||
});
|
||||
|
||||
var modelState = new ModelStateDictionary();
|
||||
|
||||
// Act
|
||||
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(modelBindingResult);
|
||||
Assert.True(modelBindingResult.IsModelSet);
|
||||
|
||||
var model = Assert.IsType<Dictionary<string, Person>>(modelBindingResult.Model);
|
||||
Assert.Equal(1, model.Count);
|
||||
Assert.Equal("key0", model.Keys.First());
|
||||
Assert.Equal(model.Values, model.Values);
|
||||
|
||||
Assert.Equal(2, modelState.Count); // Fails due to #2446
|
||||
Assert.Equal(0, modelState.ErrorCount);
|
||||
Assert.True(modelState.IsValid); // Fails due to #2470
|
||||
|
||||
var entry = Assert.Single(modelState, kvp => kvp.Key == "[0].Key").Value;
|
||||
Assert.Equal("key0", entry.Value.AttemptedValue);
|
||||
Assert.Equal("key0", entry.Value.RawValue);
|
||||
|
||||
entry = Assert.Single(modelState, kvp => kvp.Key == "[0].Value.Id").Value;
|
||||
Assert.Equal("10", entry.Value.AttemptedValue);
|
||||
Assert.Equal("10", entry.Value.RawValue);
|
||||
}
|
||||
|
||||
[Fact(Skip = "Empty collection should be created by the collection model binder #1579")]
|
||||
public async Task DictionaryModelBinder_BindsDictionaryOfComplexType_NoData()
|
||||
{
|
||||
// Arrange
|
||||
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||
var parameter = new ParameterDescriptor()
|
||||
{
|
||||
Name = "parameter",
|
||||
ParameterType = typeof(Dictionary<string, Person>)
|
||||
};
|
||||
|
||||
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||
{
|
||||
request.QueryString = new QueryString("?");
|
||||
});
|
||||
|
||||
var modelState = new ModelStateDictionary();
|
||||
|
||||
// Act
|
||||
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(modelBindingResult); // This fails due to #1579
|
||||
Assert.False(modelBindingResult.IsModelSet);
|
||||
Assert.Empty(Assert.IsType<Dictionary<string, Person>>(modelBindingResult.Model));
|
||||
|
||||
Assert.Equal(0, modelState.Count);
|
||||
Assert.Equal(0, modelState.ErrorCount);
|
||||
Assert.True(modelState.IsValid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -170,5 +170,172 @@ namespace Microsoft.AspNet.Mvc.IntegrationTests
|
|||
Assert.Equal(0, modelState.ErrorCount);
|
||||
Assert.True(modelState.IsValid);
|
||||
}
|
||||
|
||||
private class Person
|
||||
{
|
||||
public int Id { get; set; }
|
||||
}
|
||||
|
||||
[Fact(Skip = "Extra ModelState key because of #2446")]
|
||||
public async Task KeyValuePairModelBinder_BindsKeyValuePairOfComplexType_WithPrefix_Success()
|
||||
{
|
||||
// Arrange
|
||||
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||
var parameter = new ParameterDescriptor()
|
||||
{
|
||||
Name = "parameter",
|
||||
ParameterType = typeof(KeyValuePair<string, Person>)
|
||||
};
|
||||
|
||||
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||
{
|
||||
request.QueryString = new QueryString("?parameter.Key=key0¶meter.Value.Id=10");
|
||||
});
|
||||
|
||||
var modelState = new ModelStateDictionary();
|
||||
|
||||
// Act
|
||||
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(modelBindingResult);
|
||||
Assert.True(modelBindingResult.IsModelSet);
|
||||
|
||||
var model = Assert.IsType<KeyValuePair<string, Person>>(modelBindingResult.Model);
|
||||
Assert.Equal("key0", model.Key);
|
||||
Assert.Equal(10, model.Value.Id);
|
||||
|
||||
Assert.Equal(2, modelState.Count); // This fails due to #2446
|
||||
Assert.Equal(0, modelState.ErrorCount);
|
||||
Assert.True(modelState.IsValid);
|
||||
|
||||
var entry = Assert.Single(modelState, kvp => kvp.Key == "parameter.Key").Value;
|
||||
Assert.Equal("key0", entry.Value.AttemptedValue);
|
||||
Assert.Equal("key0", entry.Value.RawValue);
|
||||
|
||||
entry = Assert.Single(modelState, kvp => kvp.Key == "parameter.Value.Id").Value;
|
||||
Assert.Equal("10", entry.Value.AttemptedValue);
|
||||
Assert.Same(model.Value, entry.Value.RawValue);
|
||||
}
|
||||
|
||||
[Fact(Skip = "Extra ModelState key because of #2446")]
|
||||
public async Task KeyValuePairModelBinder_BindsKeyValuePairOfComplexType_WithExplicitPrefix_Success()
|
||||
{
|
||||
// Arrange
|
||||
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||
var parameter = new ParameterDescriptor()
|
||||
{
|
||||
Name = "parameter",
|
||||
BindingInfo = new BindingInfo()
|
||||
{
|
||||
BinderModelName = "prefix",
|
||||
},
|
||||
ParameterType = typeof(KeyValuePair<string, Person>)
|
||||
};
|
||||
|
||||
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||
{
|
||||
request.QueryString = new QueryString("?prefix.Key=key0&prefix.Value.Id=10");
|
||||
});
|
||||
|
||||
var modelState = new ModelStateDictionary();
|
||||
|
||||
// Act
|
||||
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(modelBindingResult);
|
||||
Assert.True(modelBindingResult.IsModelSet);
|
||||
|
||||
var model = Assert.IsType<KeyValuePair<string, Person>>(modelBindingResult.Model);
|
||||
Assert.Equal("key0", model.Key);
|
||||
Assert.Equal(10, model.Value.Id);
|
||||
|
||||
Assert.Equal(2, modelState.Count); // This fails due to #2446
|
||||
Assert.Equal(0, modelState.ErrorCount);
|
||||
Assert.True(modelState.IsValid);
|
||||
|
||||
var entry = Assert.Single(modelState, kvp => kvp.Key == "prefix.Key").Value;
|
||||
Assert.Equal("key0", entry.Value.AttemptedValue);
|
||||
Assert.Equal("key0", entry.Value.RawValue);
|
||||
|
||||
entry = Assert.Single(modelState, kvp => kvp.Key == "prefix.Value.Id").Value;
|
||||
Assert.Equal("10", entry.Value.AttemptedValue);
|
||||
Assert.Equal("10", entry.Value.RawValue);
|
||||
}
|
||||
|
||||
[Fact(Skip = "Extra ModelState key because of #2446")]
|
||||
public async Task KeyValuePairModelBinder_BindsKeyValuePairOfComplexType_EmptyPrefix_Success()
|
||||
{
|
||||
// Arrange
|
||||
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||
var parameter = new ParameterDescriptor()
|
||||
{
|
||||
Name = "parameter",
|
||||
ParameterType = typeof(KeyValuePair<string, Person>)
|
||||
};
|
||||
|
||||
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||
{
|
||||
request.QueryString = new QueryString("?Key=key0&Value.Id=10");
|
||||
});
|
||||
|
||||
var modelState = new ModelStateDictionary();
|
||||
|
||||
// Act
|
||||
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(modelBindingResult);
|
||||
Assert.True(modelBindingResult.IsModelSet);
|
||||
|
||||
var model = Assert.IsType<KeyValuePair<string, Person>>(modelBindingResult.Model);
|
||||
Assert.Equal("key0", model.Key);
|
||||
Assert.Equal(10, model.Value.Id);
|
||||
|
||||
Assert.Equal(2, modelState.Count); // This fails due to #2446
|
||||
Assert.Equal(0, modelState.ErrorCount);
|
||||
Assert.True(modelState.IsValid);
|
||||
|
||||
var entry = Assert.Single(modelState, kvp => kvp.Key == "Key").Value;
|
||||
Assert.Equal("key0", entry.Value.AttemptedValue);
|
||||
Assert.Equal("key0", entry.Value.RawValue);
|
||||
|
||||
entry = Assert.Single(modelState, kvp => kvp.Key == "Value.Id").Value;
|
||||
Assert.Equal("10", entry.Value.AttemptedValue);
|
||||
Assert.Equal("10", entry.Value.RawValue);
|
||||
}
|
||||
|
||||
[Fact(Skip = "Empty collection should be created by the collection model binder #1579")]
|
||||
public async Task KeyValuePairModelBinder_BindsKeyValuePairOfComplexType_NoData()
|
||||
{
|
||||
// Arrange
|
||||
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||
var parameter = new ParameterDescriptor()
|
||||
{
|
||||
Name = "parameter",
|
||||
ParameterType = typeof(KeyValuePair<string, Person>)
|
||||
};
|
||||
|
||||
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||
{
|
||||
request.QueryString = new QueryString("?");
|
||||
});
|
||||
|
||||
var modelState = new ModelStateDictionary();
|
||||
|
||||
// Act
|
||||
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(modelBindingResult); // This fails due to #1579
|
||||
Assert.False(modelBindingResult.IsModelSet);
|
||||
|
||||
Assert.Equal(new KeyValuePair<string, Person>(), modelBindingResult.Model);
|
||||
|
||||
Assert.Equal(0, modelState.Count);
|
||||
Assert.Equal(0, modelState.ErrorCount);
|
||||
Assert.True(modelState.IsValid);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue