public async Task BindParameter_NoData_DoesNotGetBound() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "Parameter1", BindingInfo = new BindingInfo() { BinderModelName = "CustomParameter", }, ParameterType = typeof(byte[]) }; // No data is passed. var operationContext = ModelBindingTestHelper.GetOperationBindingContext(); var modelState = new ModelStateDictionary(); // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext); // Assert // ModelBindingResult Assert.Equal(ModelBindingResult.NoResult, modelBindingResult); // ModelState Assert.True(modelState.IsValid); Assert.Empty(modelState.Keys); }
public async Task ModelMetaDataTypeAttribute_ValidBaseClass_NoModelStateErrors() { // Arrange var input = "{ \"Name\": \"MVC\", \"Contact\":\"4258959019\", \"Category\":\"Technology\"," + "\"CompanyName\":\"Microsoft\", \"Country\":\"USA\",\"Price\": 21, " + "\"ProductDetails\": {\"Detail1\": \"d1\", \"Detail2\": \"d2\", \"Detail3\": \"d3\"}}"; var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "Parameter1", ParameterType = typeof(ProductViewModel), BindingInfo = new BindingInfo() { BindingSource = BindingSource.Body } }; var operationContext = ModelBindingTestHelper.GetOperationBindingContext( request => { request.Body = new MemoryStream(Encoding.UTF8.GetBytes(input)); request.ContentType = "application/json;charset=utf-8"; }); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext); // Assert Assert.True(modelBindingResult.IsModelSet); var boundPerson = Assert.IsType<ProductViewModel>(modelBindingResult.Model); Assert.True(modelState.IsValid); Assert.NotNull(boundPerson); }
public async Task KeyValuePairModelBinder_SimpleTypes_WithNoKey_AddsError() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor { Name = "parameter", ParameterType = typeof(KeyValuePair<string, int>) }; var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request => { request.QueryString = new QueryString("?parameter.Value=10"); }); var modelState = new ModelStateDictionary(); // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext); // Assert Assert.False(modelBindingResult.IsModelSet); Assert.Equal(2, modelState.Count); Assert.False(modelState.IsValid); Assert.Equal(1, modelState.ErrorCount); var entry = Assert.Single(modelState, kvp => kvp.Key == "parameter.Key").Value; var error = Assert.Single(entry.Errors); Assert.Null(error.Exception); Assert.Equal("A value is required.", error.ErrorMessage); entry = Assert.Single(modelState, kvp => kvp.Key == "parameter.Value").Value; Assert.Empty(entry.Errors); Assert.Equal("10", entry.AttemptedValue); Assert.Equal("10", entry.RawValue); }
public async Task BindParameter_WithModelBinderType_NoData() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "Parameter1", BindingInfo = new BindingInfo() { BinderType = typeof(NullModelNotSetModelBinder) }, ParameterType = typeof(string) }; // No data is passed. var operationContext = ModelBindingTestHelper.GetOperationBindingContext(); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext); // Assert Assert.Equal(ModelBindingResult.NoResult, modelBindingResult); // ModelState (not set unless inner binder sets it) Assert.True(modelState.IsValid); Assert.Empty(modelState); }
public async Task BindPropertyFromService_WithData_WithEmptyPrefix_GetsBound() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "Parameter1", BindingInfo = new BindingInfo(), ParameterType = typeof(Person) }; var operationContext = ModelBindingTestHelper.GetOperationBindingContext(); var modelState = new ModelStateDictionary(); // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext); // Assert // ModelBindingResult Assert.True(modelBindingResult.IsModelSet); // Model var boundPerson = Assert.IsType<Person>(modelBindingResult.Model); Assert.NotNull(boundPerson); Assert.NotNull(boundPerson.Address.OutputFormatter); // ModelState Assert.True(modelState.IsValid); // For non user bound models there should be no entry in model state. Assert.Empty(modelState); }
public async Task BindProperty_WithData_WithEmptyPrefix_GetsBound() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "Parameter1", BindingInfo = new BindingInfo(), ParameterType = typeof(Person) }; var operationContext = ModelBindingTestHelper.GetOperationBindingContext(); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext); // Assert // ModelBindingResult Assert.True(modelBindingResult.IsModelSet); // Model var boundPerson = Assert.IsType<Person>(modelBindingResult.Model); Assert.NotNull(boundPerson); Assert.NotNull(boundPerson.Token); // ModelState Assert.True(modelState.IsValid); Assert.Equal(0, modelState.Count); }
public async Task Validation_RequiredAttribute_OnSimpleTypeProperty_WithData() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "parameter", ParameterType = typeof(Order1) }; var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request => { request.QueryString = new QueryString("?parameter.CustomerName=bill"); }); var modelState = new ModelStateDictionary(); // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext); // Assert Assert.True(modelBindingResult.IsModelSet); var model = Assert.IsType<Order1>(modelBindingResult.Model); Assert.Equal("bill", model.CustomerName); Assert.Equal(1, modelState.Count); Assert.Equal(0, modelState.ErrorCount); Assert.True(modelState.IsValid); var entry = Assert.Single(modelState, e => e.Key == "parameter.CustomerName").Value; Assert.Equal("bill", entry.AttemptedValue); Assert.Equal("bill", entry.RawValue); Assert.Empty(entry.Errors); }
public async Task GenericModelBinder_BindsCollection_ElementTypeFromGreedyModelBinder_EmptyPrefix_Success() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "parameter", ParameterType = typeof(List<IFormCollection>) }; // Need to have a key here so that the GenericModelBinder will recurse to bind elements. var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request => { request.QueryString = new QueryString("?index=10"); }); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext); // Assert Assert.True(modelBindingResult.IsModelSet); var model = Assert.IsType<List<IFormCollection>>(modelBindingResult.Model); var formCollection = Assert.Single(model); Assert.NotNull(formCollection); Assert.Equal(0, modelState.ErrorCount); Assert.True(modelState.IsValid); Assert.Empty(modelState); }
public async Task BindParameterFromService_NoPrefix_GetsBound() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor { Name = "ControllerProperty", BindingInfo = new BindingInfo { BindingSource = BindingSource.Services, }, // Use a service type already in defaults. ParameterType = typeof(JsonOutputFormatter), }; var operationContext = ModelBindingTestHelper.GetOperationBindingContext(); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext); // Assert // ModelBindingResult Assert.True(modelBindingResult.IsModelSet); // Model var outputFormatter = Assert.IsType<JsonOutputFormatter>(modelBindingResult.Model); Assert.NotNull(outputFormatter); // ModelState Assert.True(modelState.IsValid); Assert.Empty(modelState); }
public async Task BindProperty_WithData_GetsBound(bool fallBackScenario) { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "Parameter1", BindingInfo = new BindingInfo(), ParameterType = typeof(Person) }; var prefix = fallBackScenario ? string.Empty : "Parameter1"; var queryStringKey = fallBackScenario ? "Token" : prefix + "." + "Token"; // any valid base64 string var expectedValue = new byte[] { 12, 13 }; var value = Convert.ToBase64String(expectedValue); var operationContext = ModelBindingTestHelper.GetOperationBindingContext( request => { request.QueryString = QueryString.Create(queryStringKey, value); }); var modelState = new ModelStateDictionary(); // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext); // Assert // ModelBindingResult Assert.True(modelBindingResult.IsModelSet); // Model var boundPerson = Assert.IsType<Person>(modelBindingResult.Model); Assert.NotNull(boundPerson); Assert.NotNull(boundPerson.Token); Assert.Equal(expectedValue, boundPerson.Token); // ModelState Assert.True(modelState.IsValid); var entry = Assert.Single(modelState); Assert.Equal(queryStringKey, entry.Key); Assert.Empty(entry.Value.Errors); Assert.Equal(ModelValidationState.Valid, entry.Value.ValidationState); Assert.Equal(value, entry.Value.AttemptedValue); Assert.Equal(value, entry.Value.RawValue); }
public async Task BindProperty_WithData_WithEmptyPrefix_GetsBound() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "Parameter1", BindingInfo = new BindingInfo(), ParameterType = typeof(Person) }; var data = "Some Data Is Better Than No Data."; var operationContext = ModelBindingTestHelper.GetOperationBindingContext( request => { request.QueryString = QueryString.Create("Address.Zip", "12345"); UpdateRequest(request, data, "Address.File"); }); var modelState = new ModelStateDictionary(); // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext); // Assert // ModelBindingResult Assert.True(modelBindingResult.IsModelSet); // Model var boundPerson = Assert.IsType<Person>(modelBindingResult.Model); Assert.NotNull(boundPerson.Address); var file = Assert.IsAssignableFrom<IFormFile>(boundPerson.Address.File); Assert.Equal("form-data; name=Address.File; filename=text.txt", file.ContentDisposition); var reader = new StreamReader(boundPerson.Address.File.OpenReadStream()); Assert.Equal(data, reader.ReadToEnd()); // ModelState Assert.True(modelState.IsValid); Assert.Equal(2, modelState.Count); Assert.Single(modelState.Keys, k => k == "Address.Zip"); var key = Assert.Single(modelState.Keys, k => k == "Address.File"); Assert.Null(modelState[key].RawValue); Assert.Empty(modelState[key].Errors); Assert.Equal(ModelValidationState.Skipped, modelState[key].ValidationState); }
public async Task BindProperty_WithData_WithPrefix_GetsBound() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "Parameter1", BindingInfo = new BindingInfo() { BinderModelName = "CustomParameter", }, ParameterType = typeof(Person) }; var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request => { request.QueryString = QueryString.Create("CustomParameter.Address.Zip", "1"); }); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext); // Assert // ModelBindingResult Assert.True(modelBindingResult.IsModelSet); // Model var boundPerson = Assert.IsType<Person>(modelBindingResult.Model); Assert.NotNull(boundPerson); Assert.NotNull(boundPerson.Address); Assert.Equal(1, boundPerson.Address.Zip); // ModelState Assert.True(modelState.IsValid); Assert.Equal(1, modelState.Keys.Count); var key = Assert.Single(modelState.Keys, k => k == "CustomParameter.Address.Zip"); Assert.Equal("1", modelState[key].AttemptedValue); Assert.Equal("1", modelState[key].RawValue); Assert.Empty(modelState[key].Errors); Assert.Equal(ModelValidationState.Valid, modelState[key].ValidationState); }
public async Task ModelMetaDataTypeAttribute_InvalidPropertiesAndSubPropertiesOnBaseClass_HasModelStateErrors() { // Arrange var input = "{ \"Price\": 2, \"ProductDetails\": {\"Detail1\": \"d1\"}}"; var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "Parameter1", BindingInfo = new BindingInfo() { BindingSource = BindingSource.Body }, ParameterType = typeof(ProductViewModel) }; var operationContext = ModelBindingTestHelper.GetOperationBindingContext( request => { request.Body = new MemoryStream(Encoding.UTF8.GetBytes(input)); request.ContentType = "application/json"; }); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext); // Assert Assert.True(modelBindingResult.IsModelSet); var boundPerson = Assert.IsType<ProductViewModel>(modelBindingResult.Model); Assert.NotNull(boundPerson); Assert.False(modelState.IsValid); var modelStateErrors = CreateValidationDictionary(modelState); Assert.Equal("CompanyName cannot be null or empty.", modelStateErrors["CompanyName"]); Assert.Equal("The field Price must be between 20 and 100.", modelStateErrors["Price"]); // Mono issue - https://github.com/aspnet/External/issues/19 Assert.Equal(PlatformNormalizer.NormalizeContent("The Category field is required."), modelStateErrors["Category"]); Assert.Equal(PlatformNormalizer.NormalizeContent("The Contact Us field is required."), modelStateErrors["Contact"]); Assert.Equal( PlatformNormalizer.NormalizeContent("The Detail2 field is required."), modelStateErrors["ProductDetails.Detail2"]); Assert.Equal( PlatformNormalizer.NormalizeContent("The Detail3 field is required."), modelStateErrors["ProductDetails.Detail3"]); }
public async Task BindPropertyFromHeader_WithPrefix_GetsBound() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "Parameter1", BindingInfo = new BindingInfo() { BinderModelName = "prefix", }, ParameterType = typeof(Person) }; // Do not add any headers. var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request => { request.Headers.Add("Header", new[] { "someValue" }); }); var modelState = new ModelStateDictionary(); // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext); // Assert // ModelBindingResult Assert.True(modelBindingResult.IsModelSet); // Model var boundPerson = Assert.IsType<Person>(modelBindingResult.Model); Assert.NotNull(boundPerson); Assert.NotNull(boundPerson.Address); Assert.Equal("someValue", boundPerson.Address.Street); // ModelState Assert.True(modelState.IsValid); var entry = Assert.Single(modelState); Assert.Equal("prefix.Address.Header", entry.Key); Assert.Empty(entry.Value.Errors); Assert.Equal(ModelValidationState.Valid, entry.Value.ValidationState); Assert.Equal("someValue", entry.Value.AttemptedValue); Assert.Equal(new string[] { "someValue" }, entry.Value.RawValue); }
public async Task MutableObjectModelBinder_BindsNestedPOCO_WithBodyModelBinder_WithPrefix_Success() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "parameter", ParameterType = typeof(Order1) }; // Need to have a key here so that the MutableObjectModelBinder will recurse to bind elements. var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request => { request.QueryString = new QueryString("?parameter.Customer.Name=bill"); SetJsonBodyContent(request, AddressBodyContent); }); var modelState = new ModelStateDictionary(); // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext); // Assert Assert.True(modelBindingResult.IsModelSet); var model = Assert.IsType<Order1>(modelBindingResult.Model); Assert.NotNull(model.Customer); Assert.Equal("bill", model.Customer.Name); Assert.NotNull(model.Customer.Address); Assert.Equal(AddressStreetContent, model.Customer.Address.Street); Assert.Equal(2, modelState.Count); Assert.Equal(0, modelState.ErrorCount); Assert.True(modelState.IsValid); var entry = Assert.Single(modelState, e => e.Key == "parameter.Customer.Name").Value; Assert.Equal("bill", entry.AttemptedValue); Assert.Equal("bill", entry.RawValue); entry = Assert.Single(modelState, e => e.Key == "parameter.Customer.Address").Value; Assert.Null(entry.AttemptedValue); // ModelState entries for body don't include original text. Assert.Same(model.Customer.Address, entry.RawValue); }
public async Task ComplexModel_PrefixSelected_ByValueProviderValue_WithFilteredValueProviders() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "parameter", ParameterType = typeof(Person2), BindingInfo = new BindingInfo() { BindingSource = BindingSource.Query, }, }; var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request => { // This will cause selection of the "parameter" prefix. request.QueryString = new QueryString("?parameter="); // This value won't be used, because we select the "parameter" prefix. request.Form = new FormCollection(new Dictionary<string, StringValues>() { { "Name", "Billy" }, }); }); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext); // Assert Assert.True(modelBindingResult.IsModelSet); Assert.Equal("parameter", modelBindingResult.Key); var model = Assert.IsType<Person2>(modelBindingResult.Model); Assert.Null(model.Name); Assert.Equal(0, modelState.Count); Assert.Equal(0, modelState.ErrorCount); Assert.True(modelState.IsValid); }
public async Task ArrayModelBinder_BindsArrayOfSimpleType_WithExplicitPrefix_Success() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "parameter", BindingInfo = new BindingInfo() { BinderModelName = "prefix", }, ParameterType = typeof(int[]) }; var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request => { request.QueryString = new QueryString("?prefix[0]=10&prefix[1]=11"); }); var modelState = new ModelStateDictionary(); // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext); // Assert Assert.True(modelBindingResult.IsModelSet); var model = Assert.IsType<int[]>(modelBindingResult.Model); Assert.Equal(new int[] { 10, 11 }, model); Assert.Equal(2, modelState.Count); Assert.Equal(0, modelState.ErrorCount); Assert.True(modelState.IsValid); var entry = Assert.Single(modelState, kvp => kvp.Key == "prefix[0]").Value; Assert.Equal("10", entry.AttemptedValue); Assert.Equal("10", entry.RawValue); entry = Assert.Single(modelState, kvp => kvp.Key == "prefix[1]").Value; Assert.Equal("11", entry.AttemptedValue); Assert.Equal("11", entry.RawValue); }
public async Task KeyValuePairModelBinder_BindsKeyValuePairOfSimpleType_WithPrefix_Success() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "parameter", ParameterType = typeof(KeyValuePair<string, int>) }; var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request => { request.QueryString = new QueryString("?parameter.Key=key0¶meter.Value=10"); }); var modelState = new ModelStateDictionary(); // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext); // Assert Assert.True(modelBindingResult.IsModelSet); var model = Assert.IsType<KeyValuePair<string, int>>(modelBindingResult.Model); Assert.Equal(new KeyValuePair<string, int>("key0", 10), model); Assert.Equal(2, modelState.Count); Assert.Equal(0, modelState.ErrorCount); Assert.True(modelState.IsValid); var entry = Assert.Single(modelState, kvp => kvp.Key == "parameter.Key").Value; Assert.Equal("key0", entry.AttemptedValue); Assert.Equal("key0", entry.RawValue); entry = Assert.Single(modelState, kvp => kvp.Key == "parameter.Value").Value; Assert.Equal("10", entry.AttemptedValue); Assert.Equal("10", entry.RawValue); }
public async Task BindPropertyFromHeader_NoData_UsesFullPathAsKeyForModelStateErrors() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "Parameter1", BindingInfo = new BindingInfo() { BinderModelName = "CustomParameter", }, ParameterType = typeof(Person) }; // Do not add any headers. var operationContext = ModelBindingTestHelper.GetOperationBindingContext(); var modelState = new ModelStateDictionary(); // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext); // Assert // ModelBindingResult Assert.True(modelBindingResult.IsModelSet); // Model var boundPerson = Assert.IsType<Person>(modelBindingResult.Model); Assert.NotNull(boundPerson); // ModelState Assert.False(modelState.IsValid); var key = Assert.Single(modelState.Keys); Assert.Equal("CustomParameter.Address.Header", key); var error = Assert.Single(modelState[key].Errors); // Mono issue - https://github.com/aspnet/External/issues/19 Assert.Equal(PlatformNormalizer.NormalizeContent("The Street field is required."), error.ErrorMessage); }
public async Task FromBodyAndRequiredOnProperty_EmptyBody_AddsModelStateError() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "Parameter1", BindingInfo = new BindingInfo() { BinderModelName = "CustomParameter", }, ParameterType = typeof(Person) }; var operationContext = ModelBindingTestHelper.GetOperationBindingContext( request => { request.Body = new MemoryStream(Encoding.UTF8.GetBytes(string.Empty)); request.ContentType = "application/json"; }); var modelState = new ModelStateDictionary(); // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext); // Assert Assert.True(modelBindingResult.IsModelSet); var boundPerson = Assert.IsType<Person>(modelBindingResult.Model); Assert.NotNull(boundPerson); var key = Assert.Single(modelState.Keys); Assert.Equal("CustomParameter.Address", key); Assert.False(modelState.IsValid); var error = Assert.Single(modelState[key].Errors); // Mono issue - https://github.com/aspnet/External/issues/19 Assert.Equal(PlatformNormalizer.NormalizeContent("The Address field is required."), error.ErrorMessage); }
public async Task FromBodyOnActionParameter_EmptyBody_BindsToNullValue() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor { Name = "Parameter1", BindingInfo = new BindingInfo { BinderModelName = "CustomParameter", BindingSource = BindingSource.Body }, ParameterType = typeof(Person) }; var operationContext = ModelBindingTestHelper.GetOperationBindingContext( request => { request.Body = new MemoryStream(Encoding.UTF8.GetBytes(string.Empty)); request.ContentType = "application/json"; }); var httpContext = operationContext.HttpContext; var modelState = new ModelStateDictionary(); // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext); // Assert Assert.True(modelBindingResult.IsModelSet); Assert.Null(modelBindingResult.Model); Assert.True(modelState.IsValid); var entry = Assert.Single(modelState); Assert.Empty(entry.Key); Assert.Null(entry.Value.RawValue); }
public async Task BindParameter_WithModelBinderType_NullData_ReturnsNull() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "Parameter1", BindingInfo = new BindingInfo() { BinderType = typeof(NullModelBinder) }, ParameterType = typeof(string) }; // No data is passed. var operationContext = ModelBindingTestHelper.GetOperationBindingContext(); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext); // Assert // ModelBindingResult Assert.True(modelBindingResult.IsModelSet); Assert.Null(modelBindingResult.Model); // ModelState (not set unless inner binder sets it) Assert.True(modelState.IsValid); var entry = modelState[string.Empty]; Assert.Null(entry.AttemptedValue); Assert.Null(entry.RawValue); Assert.Empty(entry.Errors); Assert.Equal(ModelValidationState.Valid, entry.ValidationState); }
public async Task BindParameter_WithData_GetsBound() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "Parameter1", BindingInfo = new BindingInfo() { BinderModelName = "CustomParameter", }, ParameterType = typeof(CancellationToken) }; var operationContext = ModelBindingTestHelper.GetOperationBindingContext(); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext); // Assert // ModelBindingResult Assert.True(modelBindingResult.IsModelSet); // Model var token = Assert.IsType<CancellationToken>(modelBindingResult.Model); Assert.NotNull(token); // ModelState Assert.True(modelState.IsValid); Assert.Equal(0, modelState.Count); }
public async Task BindProperty_WithData_WithPrefix_GetsBound() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "Parameter1", BindingInfo = new BindingInfo() { BinderModelName = "CustomParameter" }, ParameterType = typeof(Person) }; var operationContext = ModelBindingTestHelper.GetOperationBindingContext(); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext); // Assert // ModelBindingResult Assert.Equal("CustomParameter", modelBindingResult.Key); // Model var boundPerson = Assert.IsType<Person>(modelBindingResult.Model); Assert.NotNull(boundPerson.Address); Assert.Equal("SomeStreet", boundPerson.Address.Street); // ModelState Assert.True(modelState.IsValid); Assert.Equal(1, modelState.Keys.Count); var key = Assert.Single(modelState.Keys, k => k == "CustomParameter.Address.Street"); Assert.Equal(ModelValidationState.Valid, modelState[key].ValidationState); Assert.NotNull(modelState[key].RawValue); // Value is set by test model binder, no need to validate it. }
public async Task BindParameter_WithOutModelBinderType() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "Parameter1", BindingInfo = new BindingInfo() { BinderType = typeof(NullResultModelBinder) }, ParameterType = typeof(Person2) }; // No data is passed. var operationContext = ModelBindingTestHelper.GetOperationBindingContext(); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext); // Assert // ModelBindingResult Assert.Equal(ModelBindingResult.NoResult, modelBindingResult); // ModelState Assert.True(modelState.IsValid); Assert.Empty(modelState.Keys); }
public async Task BindParameterFromHeader_WithData_WithPrefix_ModelGetsBound(Type modelType, string value) { // Arrange object expectedValue; object expectedRawValue; if (modelType == typeof(string)) { expectedValue = value; expectedRawValue = new string[] { value }; } else { expectedValue = value.Split(',').Select(v => v.Trim()).ToArray(); expectedRawValue = expectedValue; } var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor { Name = "Parameter1", BindingInfo = new BindingInfo { BinderModelName = "CustomParameter", BindingSource = BindingSource.Header }, ParameterType = modelType }; Action<HttpRequest> action = r => r.Headers.Add("CustomParameter", new[] { value }); var operationContext = ModelBindingTestHelper.GetOperationBindingContext(action); // Do not add any headers. var httpContext = operationContext.HttpContext; var modelState = new ModelStateDictionary(); // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext); // Assert // ModelBindingResult Assert.True(modelBindingResult.IsModelSet); // Model Assert.NotNull(modelBindingResult.Model); Assert.IsType(modelType, modelBindingResult.Model); // ModelState Assert.True(modelState.IsValid); var entry = Assert.Single(modelState); Assert.Equal("CustomParameter", entry.Key); Assert.Empty(entry.Value.Errors); Assert.Equal(ModelValidationState.Valid, entry.Value.ValidationState); Assert.Equal(value, entry.Value.AttemptedValue); Assert.Equal(expectedRawValue, entry.Value.RawValue); }
public async Task GenericModelBinder_BindsCollection_ElementTypeUsesGreedyBindingSource_WithPrefix_NullElement() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "parameter", ParameterType = typeof(Address[]) }; // Need to have a key here so that the GenericModelBinder will recurse to bind elements. var operationContext = ModelBindingTestHelper.GetOperationBindingContext( request => request.QueryString = new QueryString("?parameter.index=0")); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext); // Assert Assert.True(modelBindingResult.IsModelSet); var model = Assert.IsType<Address[]>(modelBindingResult.Model); Assert.Equal(1, model.Length); Assert.Null(model[0]); Assert.Equal(0, modelState.Count); Assert.Equal(0, modelState.ErrorCount); Assert.True(modelState.IsValid); }
public async Task GenericModelBinder_BindsDictionaryOfList_NoData() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "parameter", ParameterType = typeof(Dictionary<string, List<int>>) }; var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request => { request.QueryString = new QueryString("?"); }); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext); // Assert Assert.True(modelBindingResult.IsModelSet); var model = Assert.IsType<Dictionary<string, List<int>>>(modelBindingResult.Model); Assert.NotNull(model); Assert.Empty(model); Assert.Equal(0, modelState.Count); Assert.Equal(0, modelState.ErrorCount); Assert.True(modelState.IsValid); }
public async Task GenericModelBinder_BindsDictionaryOfList_EmptyPrefix_Success() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "parameter", ParameterType = typeof(Dictionary<string, List<int>>) }; var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request => { request.QueryString = new QueryString("?[0].Key=key0&[0].Value[0]=10&[0].Value[1]=11"); }); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext); // Assert Assert.True(modelBindingResult.IsModelSet); var model = Assert.IsType<Dictionary<string, List<int>>>(modelBindingResult.Model); var kvp = Assert.Single(model); Assert.Equal("key0", kvp.Key); Assert.Equal(new List<int>() { 10, 11 }, kvp.Value); Assert.Equal(3, modelState.Count); Assert.Equal(0, modelState.ErrorCount); Assert.True(modelState.IsValid); var entry = Assert.Single(modelState, e => e.Key == "[0].Key").Value; Assert.Equal("key0", entry.AttemptedValue); Assert.Equal("key0", entry.RawValue); entry = Assert.Single(modelState, e => e.Key == "[0].Value[0]").Value; Assert.Equal("10", entry.AttemptedValue); Assert.Equal("10", entry.RawValue); entry = Assert.Single(modelState, e => e.Key == "[0].Value[1]").Value; Assert.Equal("11", entry.AttemptedValue); Assert.Equal("11", entry.RawValue); }
public async Task GenericModelBinder_BindsCollectionOfKeyValuePair_WithPrefix_Success() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "parameter", ParameterType = typeof(ICollection<KeyValuePair<string, int>>) }; var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request => { request.QueryString = new QueryString("?parameter[0].Key=key0¶meter[0].Value=10"); }); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext); // Assert Assert.True(modelBindingResult.IsModelSet); var model = Assert.IsType<List<KeyValuePair<string, int>>>(modelBindingResult.Model); var kvp = Assert.Single(model); Assert.Equal("key0", kvp.Key); Assert.Equal(10, kvp.Value); Assert.Equal(2, modelState.Count); Assert.Equal(0, modelState.ErrorCount); Assert.True(modelState.IsValid); var entry = Assert.Single(modelState, e => e.Key == "parameter[0].Key").Value; Assert.Equal("key0", entry.AttemptedValue); Assert.Equal("key0", entry.RawValue); entry = Assert.Single(modelState, e => e.Key == "parameter[0].Value").Value; Assert.Equal("10", entry.AttemptedValue); Assert.Equal("10", entry.RawValue); }