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 testContext = ModelBindingTestHelper.GetTestContext(); var modelState = testContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, testContext); // Assert Assert.False(modelBindingResult.IsModelSet); // ModelState (not set unless inner binder sets it) 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) ?? default(ModelBindingResult); // 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 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 testContext = ModelBindingTestHelper.GetTestContext(request => { request.QueryString = new QueryString("?index=10"); }); var modelState = testContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, testContext); // 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 BindProperty_WithData_WithEmptyPrefix_GetsBound() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "Parameter1", BindingInfo = new BindingInfo(), ParameterType = typeof(Person) }; var testContext = ModelBindingTestHelper.GetTestContext(); var modelState = testContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, testContext); // 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 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 = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext) ?? default(ModelBindingResult); // Assert // ModelBindingResult Assert.False(modelBindingResult.IsModelSet); // 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 testContext = ModelBindingTestHelper.GetTestContext( request => { request.Body = new MemoryStream(Encoding.UTF8.GetBytes(input)); request.ContentType = "application/json;charset=utf-8"; }); var modelState = testContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, testContext); // Assert Assert.True(modelBindingResult.IsModelSet); var boundPerson = Assert.IsType<ProductViewModel>(modelBindingResult.Model); Assert.True(modelState.IsValid); Assert.NotNull(boundPerson); }
public async Task BindParameter_WithTypeProperty_IsNotBound() { // Arrange var options = new MvcOptions(); var setup = new MvcCoreMvcOptionsSetup(new TestHttpRequestStreamReaderFactory()); // Adding a custom model binder for Type to ensure it doesn't get called options.ModelBinderProviders.Insert(0, new TypeModelBinderProvider()); setup.Configure(options); var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(options); var parameter = new ParameterDescriptor() { Name = "Parameter1", BindingInfo = new BindingInfo(), ParameterType = typeof(TypesBundle), }; var testContext = ModelBindingTestHelper.GetTestContext(request => { request.Form = new FormCollection(new Dictionary<string, StringValues> { { "name", new[] { "Fred" } }, { "type", new[] { "SomeType" } }, { "typeArray", new[] { "SomeType1", "SomeType2" } }, { "typeList", new[] { "SomeType1", "SomeType2" } }, { "typeDictionary", new[] { "parameter[0].Key=key", "parameter[0].Value=value" } }, { "methodInfo", new[] { "value" } }, { "func", new[] { "value" } }, }); }); var modelState = testContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, testContext); // Assert // ModelBindingResult Assert.True(modelBindingResult.IsModelSet); // Model var boundPerson = Assert.IsType<TypesBundle>(modelBindingResult.Model); Assert.NotNull(boundPerson); Assert.Equal("Fred", boundPerson.Name); // ModelState // The TypeModelBinder should not be called Assert.True(modelState.IsValid); }
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 = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext) ?? default(ModelBindingResult); // 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 testContext = ModelBindingTestHelper.GetTestContext( request => { request.QueryString = QueryString.Create("Address.Zip", "12345"); UpdateRequest(request, data, "Address.File"); }); var modelState = testContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, testContext); // 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.Valid, 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 testContext = ModelBindingTestHelper.GetTestContext(request => { request.QueryString = QueryString.Create("CustomParameter.Address.Zip", "1"); }); var modelState = testContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, testContext); // 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 ArrayModelBinder_BindsArrayOfSimpleType_WithExplicitPrefix_Success() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "parameter", BindingInfo = new BindingInfo() { BinderModelName = "prefix", }, ParameterType = typeof(int[]) }; var testContext = ModelBindingTestHelper.GetTestContext(request => { request.QueryString = new QueryString("?prefix[0]=10&prefix[1]=11"); }); var modelState = testContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, testContext); // 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 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) ?? default(ModelBindingResult); // 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 BindPropertyFromHeader_WithPrefix_GetsBound() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "Parameter1", BindingInfo = new BindingInfo() { BinderModelName = "prefix", }, ParameterType = typeof(Person) }; var testContext = ModelBindingTestHelper.GetTestContext( request => request.Headers.Add("Header", new[] { "someValue" })); var modelState = testContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, testContext); // 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 = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext) ?? default(ModelBindingResult); // 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(1, 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); }
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 testContext = ModelBindingTestHelper.GetTestContext(); var modelState = testContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, testContext); // 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 ModelMetadataType_ValidArray_NoModelStateErrors() { // Arrange var input = "[" + "{ \"Name\": \"MVC\", \"Contact\":\"4258959019\", \"Category\":\"Technology\"," + "\"CompanyName\":\"Microsoft\", \"Country\":\"USA\",\"Price\": 21, " + "\"ProductDetails\": {\"Detail1\": \"d1\", \"Detail2\": \"d2\", \"Detail3\": \"d3\"}}," + "{ \"Name\": \"MVC too\", \"Contact\":\"4258959020\", \"Category\":\"Technology\"," + "\"CompanyName\":\"Microsoft\", \"Country\":\"USA\",\"Price\": 22, " + "\"ProductDetails\": {\"Detail1\": \"d2\", \"Detail2\": \"d3\", \"Detail3\": \"d4\"}}" + "]"; var argumentBinding = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor { Name = "Parameter1", ParameterType = typeof(IEnumerable<ProductViewModel>), BindingInfo = new BindingInfo { BindingSource = BindingSource.Body, }, }; var testContext = ModelBindingTestHelper.GetTestContext(request => { request.Body = new MemoryStream(Encoding.UTF8.GetBytes(input)); request.ContentType = "application/json;charset=utf-8"; }); var modelState = testContext.ModelState; // Act var result = await argumentBinding.BindModelAsync(parameter, testContext); // Assert Assert.True(modelState.IsValid); Assert.True(result.IsModelSet); var products = Assert.IsAssignableFrom<IEnumerable<ProductViewModel>>(result.Model); Assert.Equal(2, products.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) ?? default(ModelBindingResult); // 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.Empty(modelState.Keys); }
public async Task BindParameterFromService_WithData_GetsBound() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "Parameter1", BindingInfo = new BindingInfo() { BinderModelName = "CustomParameter", BindingSource = BindingSource.Services }, // Using a service type already in defaults. ParameterType = typeof(JsonOutputFormatter) }; var testContext = ModelBindingTestHelper.GetTestContext(); var modelState = testContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, testContext); // 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.Keys); }
public async Task MutableObjectModelBinder_BindsListProperty_NoData() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "parameter", ParameterType = typeof(Order6) }; // Need to have a key here so that the MutableObjectModelBinder will recurse to bind elements. var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request => { request.QueryString = new QueryString("?"); }); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext) ?? default(ModelBindingResult); // Assert Assert.True(modelBindingResult.IsModelSet); var model = Assert.IsType<Order6>(modelBindingResult.Model); Assert.Null(model.Name); Assert.Null(model.ProductIds); Assert.Equal(0, modelState.Count); Assert.Equal(0, modelState.ErrorCount); Assert.True(modelState.IsValid); }
public async Task BindCollectionProperty_WithData_IsBound() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor { Name = "Parameter1", BindingInfo = new BindingInfo(), ParameterType = typeof(ListContainer1), }; var data = "some data"; var testContext = ModelBindingTestHelper.GetTestContext( request => UpdateRequest(request, data, "files")); var modelState = testContext.ModelState; // Act var result = await argumentBinder.BindModelAsync(parameter, testContext); // Assert Assert.True(result.IsModelSet); // Model var boundContainer = Assert.IsType<ListContainer1>(result.Model); Assert.NotNull(boundContainer); Assert.NotNull(boundContainer.ListProperty); var file = Assert.Single(boundContainer.ListProperty); Assert.Equal("form-data; name=files; filename=text.txt", file.ContentDisposition); using (var reader = new StreamReader(file.OpenReadStream())) { Assert.Equal(data, reader.ReadToEnd()); } // ModelState Assert.True(modelState.IsValid); var kvp = Assert.Single(modelState); Assert.Equal("files", kvp.Key); var modelStateEntry = kvp.Value; Assert.NotNull(modelStateEntry); Assert.Empty(modelStateEntry.Errors); Assert.Equal(ModelValidationState.Valid, modelStateEntry.ValidationState); Assert.Null(modelStateEntry.AttemptedValue); Assert.Null(modelStateEntry.RawValue); }
public async Task MutableObjectModelBinder_WithRequiredCollectionProperty_WithData_EmptyPrefix_GetsBound() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "parameter", ParameterType = typeof(Order13), }; // No Data var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request => { request.QueryString = new QueryString("?OrderIds[0]=123"); }); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext) ?? default(ModelBindingResult); // Assert Assert.True(modelBindingResult.IsModelSet); var model = Assert.IsType<Order13>(modelBindingResult.Model); Assert.Equal(new[] { 123 }, model.OrderIds.ToArray()); Assert.Equal(1, modelState.Count); Assert.Equal(0, modelState.ErrorCount); Assert.True(modelState.IsValid); var entry = Assert.Single(modelState, e => e.Key == "OrderIds[0]").Value; Assert.Equal("123", entry.RawValue); Assert.Equal("123", entry.AttemptedValue); }
public async Task BindParameter_NoData_DoesNotGetBound() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "Parameter1", BindingInfo = new BindingInfo() { BinderModelName = "CustomParameter", }, ParameterType = typeof(IFormFile) }; // No data is passed. var testContext = ModelBindingTestHelper.GetTestContext( request => UpdateRequest(request, data: null, name: null)); var modelState = testContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, testContext); // Assert Assert.False(modelBindingResult.IsModelSet); // ModelState Assert.True(modelState.IsValid); Assert.Empty(modelState.Keys); }
public async Task BindParameter_WithData_GetsBound() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor { Name = "Parameter1", BindingInfo = new BindingInfo { // Setting a custom parameter prevents it from falling back to an empty prefix. BinderModelName = "CustomParameter", }, ParameterType = typeof(IFormFile) }; var data = "Some Data Is Better Than No Data."; var testContext = ModelBindingTestHelper.GetTestContext( request => { UpdateRequest(request, data, "CustomParameter"); }); var modelState = testContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, testContext); // Assert // ModelBindingResult Assert.True(modelBindingResult.IsModelSet); // Model var file = Assert.IsType<FormFile>(modelBindingResult.Model); Assert.NotNull(file); Assert.Equal("form-data; name=CustomParameter; filename=text.txt", file.ContentDisposition); var reader = new StreamReader(file.OpenReadStream()); Assert.Equal(data, reader.ReadToEnd()); // 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.Null(entry.Value.AttemptedValue); Assert.Null(entry.Value.RawValue); }
public async Task BindCollectionProperty_NoData_IsNotBound() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor { Name = "Parameter1", BindingInfo = new BindingInfo(), ParameterType = typeof(ListContainer1), }; var testContext = ModelBindingTestHelper.GetTestContext( request => UpdateRequest(request, data: null, name: null)); var modelState = testContext.ModelState; // Act var result = await argumentBinder.BindModelAsync(parameter, testContext); // Assert Assert.True(result.IsModelSet); // Model (bound to an empty collection) var boundContainer = Assert.IsType<ListContainer1>(result.Model); Assert.NotNull(boundContainer); Assert.Null(boundContainer.ListProperty); // ModelState Assert.True(modelState.IsValid); Assert.Empty(modelState); }
public async Task BindParameter_NoData_BindsWithEmptyCollection() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor { Name = "Parameter1", BindingInfo = new BindingInfo { BinderModelName = "CustomParameter", }, ParameterType = typeof(IFormCollection) }; // No data is passed. var testContext = ModelBindingTestHelper.GetTestContext(); var modelState = testContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, testContext); // Assert // ModelBindingResult var collection = Assert.IsAssignableFrom<IFormCollection>(modelBindingResult.Model); // ModelState Assert.True(modelState.IsValid); Assert.Empty(modelState); // FormCollection Assert.Empty(collection); Assert.Empty(collection.Files); Assert.Empty(collection.Keys); }
public async Task MutableObjectModelBinder_BindsDictionaryProperty_WithPrefix_Success() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "parameter", ParameterType = typeof(Order7) }; // 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.Name=bill¶meter.ProductIds[0].Key=key0¶meter.ProductIds[0].Value=10"); }); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext) ?? default(ModelBindingResult); // Assert Assert.True(modelBindingResult.IsModelSet); var model = Assert.IsType<Order7>(modelBindingResult.Model); Assert.Equal("bill", model.Name); Assert.Equal(new Dictionary<string, int>() { { "key0", 10 } }, model.ProductIds); Assert.Equal(3, modelState.Count); Assert.Equal(0, modelState.ErrorCount); Assert.True(modelState.IsValid); var entry = Assert.Single(modelState, e => e.Key == "parameter.Name").Value; Assert.Equal("bill", entry.AttemptedValue); Assert.Equal("bill", entry.RawValue); entry = Assert.Single(modelState, e => e.Key == "parameter.ProductIds[0].Key").Value; Assert.Equal("key0", entry.AttemptedValue); Assert.Equal("key0", entry.RawValue); entry = Assert.Single(modelState, e => e.Key == "parameter.ProductIds[0].Value").Value; Assert.Equal("10", entry.AttemptedValue); Assert.Equal("10", entry.RawValue); }
public static ParameterDescriptorDebugObject GetDebugObject(this ParameterDescriptor parameterDescriptor) => new ParameterDescriptorDebugObject(parameterDescriptor);
public async Task MutableObjectModelBinder_BindsNestedPOCO_WithFormFileModelBinder_WithPrefix_NoData() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "parameter", ParameterType = typeof(Order4) }; // Need to have a key here so that the MutableObjectModelBinder will recurse to bind elements. var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request => { request.QueryString = new QueryString("?"); SetFormFileBodyContent(request, "Hello, World!", "parameter.Customer.Documents"); }); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext) ?? default(ModelBindingResult); // Assert Assert.True(modelBindingResult.IsModelSet); var model = Assert.IsType<Order4>(modelBindingResult.Model); Assert.Null(model.Customer); Assert.Equal(0, modelState.Count); Assert.Equal(0, modelState.ErrorCount); Assert.True(modelState.IsValid); }
public async Task MutableObjectModelBinder_BindsNestedPOCO_WithFormFileModelBinder_WithPrefix_NoBodyData() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "parameter", ParameterType = typeof(Order4) }; // 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"); // Deliberately leaving out any form data. }); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext) ?? default(ModelBindingResult); // Assert Assert.True(modelBindingResult.IsModelSet); var model = Assert.IsType<Order4>(modelBindingResult.Model); Assert.NotNull(model.Customer); Assert.Equal("bill", model.Customer.Name); Assert.Null(model.Customer.Documents); Assert.Equal(0, modelState.ErrorCount); Assert.True(modelState.IsValid); var kvp = Assert.Single(modelState); Assert.Equal("parameter.Customer.Name", kvp.Key); var entry = kvp.Value; Assert.Equal("bill", entry.AttemptedValue); Assert.Equal("bill", entry.RawValue); }
public async Task MutableObjectModelBinder_BindsNestedPOCO_WithFormFileModelBinder_WithEmptyPrefix_Success() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "parameter", ParameterType = typeof(Order4) }; // Need to have a key here so that the MutableObjectModelBinder will recurse to bind elements. var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request => { request.QueryString = new QueryString("?Customer.Name=bill"); SetFormFileBodyContent(request, "Hello, World!", "Customer.Documents"); }); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext) ?? default(ModelBindingResult); // Assert Assert.True(modelBindingResult.IsModelSet); var model = Assert.IsType<Order4>(modelBindingResult.Model); Assert.NotNull(model.Customer); Assert.Equal("bill", model.Customer.Name); Assert.Single(model.Customer.Documents); Assert.Equal(2, modelState.Count); Assert.Equal(0, modelState.ErrorCount); Assert.True(modelState.IsValid); var entry = Assert.Single(modelState, e => e.Key == "Customer.Name").Value; Assert.Equal("bill", entry.AttemptedValue); Assert.Equal("bill", entry.RawValue); entry = Assert.Single(modelState, e => e.Key == "Customer.Documents").Value; Assert.Null(entry.AttemptedValue); // FormFile entries don't include the model. Assert.Null(entry.RawValue); }
public async Task MutableObjectModelBinder_BindsPOCO_TypeConvertedPropertyNonConvertableValue_GetsError() { // Arrange var argumentBinder = ModelBindingTestHelper.GetArgumentBinder(); var parameter = new ParameterDescriptor() { Name = "parameter", ParameterType = typeof(Order14) }; // 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.ProductId="); }); var modelState = operationContext.ActionContext.ModelState; // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, operationContext) ?? default(ModelBindingResult); // Assert Assert.True(modelBindingResult.IsModelSet); var model = Assert.IsType<Order14>(modelBindingResult.Model); Assert.NotNull(model); Assert.Equal(0, model.ProductId); Assert.Equal(1, modelState.Count); Assert.Equal(1, modelState.ErrorCount); Assert.False(modelState.IsValid); var entry = Assert.Single(modelState, e => e.Key == "parameter.ProductId").Value; Assert.Equal(string.Empty, entry.AttemptedValue); Assert.Equal(string.Empty, entry.RawValue); var error = Assert.Single(entry.Errors); Assert.Equal("The value '' is invalid.", error.ErrorMessage); Assert.Null(error.Exception); }