public async Task BindModelAsync_ValueProviderContainPrefix_Succeeds() { // Arrange var valueProvider = new SimpleValueProvider { { "someName[0]", "42" }, { "someName[1]", "84" }, }; var bindingContext = GetBindingContext(valueProvider); var metadataProvider = new TestModelMetadataProvider(); bindingContext.ModelMetadata = metadataProvider.GetMetadataForProperty( typeof(ModelWithIntArrayProperty), nameof(ModelWithIntArrayProperty.ArrayProperty)); var binder = new ArrayModelBinder<int>(new SimpleTypeModelBinder(typeof(int))); // Act await binder.BindModelAsync(bindingContext); // Assert Assert.True(bindingContext.Result.IsModelSet); var array = Assert.IsType<int[]>(bindingContext.Result.Model); Assert.Equal(new[] { 42, 84 }, array); }
public void BindModel() { // Arrange Mock<IModelBinder> mockIntBinder = new Mock<IModelBinder>(); HttpActionContext context = ContextUtil.CreateActionContext(); context.ControllerContext.Configuration.Services.Replace(typeof(ModelBinderProvider), new SimpleModelBinderProvider(typeof(int), mockIntBinder.Object)); ModelBindingContext bindingContext = new ModelBindingContext { ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(null, typeof(int[])), ModelName = "someName", ValueProvider = new SimpleHttpValueProvider { { "someName[0]", "42" }, { "someName[1]", "84" } } }; mockIntBinder .Setup(o => o.BindModel(context, It.IsAny<ModelBindingContext>())) .Returns((HttpActionContext ec, ModelBindingContext mbc) => { mbc.Model = mbc.ValueProvider.GetValue(mbc.ModelName).ConvertTo(mbc.ModelType); return true; }); // Act bool retVal = new ArrayModelBinder<int>().BindModel(context, bindingContext); // Assert Assert.True(retVal); int[] array = bindingContext.Model as int[]; Assert.Equal(new[] { 42, 84 }, array); }
public async Task ArrayModelBinder_DoesNotCreateCollection_IfIsTopLevelObjectAndIsFirstChanceBinding() { // Arrange var binder = new ArrayModelBinder <string>(); var context = CreateContext(); context.IsFirstChanceBinding = true; context.IsTopLevelObject = true; // Explicit prefix and empty model name both ignored. context.BinderModelName = "prefix"; context.ModelName = string.Empty; var metadataProvider = context.OperationBindingContext.MetadataProvider; context.ModelMetadata = metadataProvider.GetMetadataForType(typeof(string[])); context.ValueProvider = new TestValueProvider(new Dictionary <string, object>()); // Act var result = await binder.BindModelAsync(context); // Assert Assert.Null(result); }
public void BindModel() { // Arrange ControllerContext controllerContext = new ControllerContext(); ExtensibleModelBindingContext bindingContext = new ExtensibleModelBindingContext() { ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(null, typeof(int[])), ModelName = "someName", ModelBinderProviders = new ModelBinderProviderCollection(), ValueProvider = new SimpleValueProvider() { { "someName[0]", "42" }, { "someName[1]", "84" } } }; Mock<IExtensibleModelBinder> mockIntBinder = new Mock<IExtensibleModelBinder>(); mockIntBinder .Expect(o => o.BindModel(controllerContext, It.IsAny<ExtensibleModelBindingContext>())) .Returns( delegate(ControllerContext cc, ExtensibleModelBindingContext mbc) { mbc.Model = mbc.ValueProvider.GetValue(mbc.ModelName).ConvertTo(mbc.ModelType); return true; }); bindingContext.ModelBinderProviders.RegisterBinderForType(typeof(int), mockIntBinder.Object, false /* suppressPrefixCheck */); // Act bool retVal = new ArrayModelBinder<int>().BindModel(controllerContext, bindingContext); // Assert Assert.IsTrue(retVal); int[] array = bindingContext.Model as int[]; CollectionAssert.AreEqual(new int[] { 42, 84 }, array); }
public async Task ArrayModelBinder_DoesNotCreateCollection_IfNotIsTopLevelObject( string prefix, bool allowValidatingTopLevelNodes, bool isBindingRequired) { // Arrange var binder = new ArrayModelBinder <string>( new SimpleTypeModelBinder(typeof(string), NullLoggerFactory.Instance), NullLoggerFactory.Instance, allowValidatingTopLevelNodes); var bindingContext = CreateContext(); bindingContext.ModelName = ModelNames.CreatePropertyModelName(prefix, "ArrayProperty"); var metadataProvider = new TestModelMetadataProvider(); metadataProvider .ForProperty(typeof(ModelWithArrayProperty), nameof(ModelWithArrayProperty.ArrayProperty)) .BindingDetails(b => b.IsBindingRequired = isBindingRequired); bindingContext.ModelMetadata = metadataProvider.GetMetadataForProperty( typeof(ModelWithArrayProperty), nameof(ModelWithArrayProperty.ArrayProperty)); bindingContext.ValueProvider = new TestValueProvider(new Dictionary <string, object>()); // Act await binder.BindModelAsync(bindingContext); // Assert Assert.False(bindingContext.Result.IsModelSet); Assert.Equal(0, bindingContext.ModelState.ErrorCount); }
public async Task ArrayModelBinder_CreatesEmptyCollection_ForTopLevelModel_OnFallback() { // Arrange var binder = new ArrayModelBinder<string>(); var context = CreateContext(); context.ModelName = string.Empty; var metadataProvider = context.OperationBindingContext.MetadataProvider; context.ModelMetadata = metadataProvider.GetMetadataForType(typeof(string[])); context.ValueProvider = new TestValueProvider(new Dictionary<string, object>()); // Act var result = await binder.BindModelAsync(context); // Assert Assert.NotNull(result); Assert.Empty(Assert.IsType<string[]>(result.Model)); Assert.Equal(string.Empty, result.Key); Assert.True(result.IsModelSet); Assert.Same(result.ValidationNode.Model, result.Model); Assert.Same(result.ValidationNode.Key, result.Key); Assert.Same(result.ValidationNode.ModelMetadata, context.ModelMetadata); }
public async Task BindModelAsync_ValueProviderContainPrefix_Succeeds() { // Arrange var valueProvider = new SimpleValueProvider { { "someName[0]", "42" }, { "someName[1]", "84" }, }; var bindingContext = GetBindingContext(valueProvider); var metadataProvider = new TestModelMetadataProvider(); bindingContext.ModelMetadata = metadataProvider.GetMetadataForProperty( typeof(ModelWithIntArrayProperty), nameof(ModelWithIntArrayProperty.ArrayProperty)); var binder = new ArrayModelBinder <int>( new SimpleTypeModelBinder(typeof(int), NullLoggerFactory.Instance), NullLoggerFactory.Instance); // Act await binder.BindModelAsync(bindingContext); // Assert Assert.True(bindingContext.Result.IsModelSet); var array = Assert.IsType <int[]>(bindingContext.Result.Model); Assert.Equal(new[] { 42, 84 }, array); }
public async Task ArrayModelBinder_CreatesEmptyCollection_ForTopLevelModel_WithExplicitPrefix() { // Arrange var binder = new ArrayModelBinder <string>(); var context = CreateContext(); context.ModelName = "prefix"; context.BinderModelName = "prefix"; var metadataProvider = context.OperationBindingContext.MetadataProvider; context.ModelMetadata = metadataProvider.GetMetadataForType(typeof(string[])); context.ValueProvider = new TestValueProvider(new Dictionary <string, object>()); // Act var result = await binder.BindModelAsync(context); // Assert Assert.NotNull(result); Assert.Empty(Assert.IsType <string[]>(result.Model)); Assert.Equal("prefix", result.Key); Assert.True(result.IsModelSet); Assert.Same(result.ValidationNode.Model, result.Model); Assert.Same(result.ValidationNode.Key, result.Key); Assert.Same(result.ValidationNode.ModelMetadata, context.ModelMetadata); }
public void Bind_ViewModelArray_Index() { var provider = new ValueProvider { Parameters = { new Parameter("user[1].FirstName", "jonas"), new Parameter("user[0].FirstName", "Arne"), new Parameter("user[0].Age", "32"), new Parameter("user[1].Age", "23") } }; var mapper = new ModelMapper(); mapper.Clear(); mapper.AddBinder(new PrimitiveModelBinder()); mapper.AddBinder(new ClassBinder()); var context = new ModelBinderContext(typeof(UserViewModel[]), "user", "", provider) { RootBinder = mapper }; var binder = new ArrayModelBinder(); var actual = (UserViewModel[])binder.Bind(context); Assert.NotNull(actual); Assert.Equal("jonas", actual[1].FirstName); Assert.Equal("Arne", actual[0].FirstName); Assert.Equal(23, actual[1].Age); Assert.Equal(32, actual[0].Age); }
public async Task ArrayModelBinder_CreatesEmptyCollection_IfIsTopLevelObject() { // Arrange var binder = new ArrayModelBinder<string>(new SimpleTypeModelBinder()); var context = CreateContext(); context.IsTopLevelObject = true; // Lack of prefix and non-empty model name both ignored. context.ModelName = "modelName"; var metadataProvider = context.OperationBindingContext.MetadataProvider; context.ModelMetadata = metadataProvider.GetMetadataForType(typeof(string[])); context.ValueProvider = new TestValueProvider(new Dictionary<string, object>()); // Act var result = await binder.BindModelResultAsync(context); // Assert Assert.NotEqual(default(ModelBindingResult), result); Assert.Empty(Assert.IsType<string[]>(result.Model)); Assert.Equal("modelName", result.Key); Assert.True(result.IsModelSet); }
public void Bind_ViewModelArray_Gap() { var provider = new ValueProvider { Parameters = { new Parameter("user[1].FirstName", "jonas"), new Parameter("user[3].FirstName", "Arne"), new Parameter("user[0].Age", "32"), new Parameter("user[1].Age", "23") } }; var mapper = new ModelMapper(); mapper.Clear(); mapper.AddBinder(new PrimitiveModelBinder()); mapper.AddBinder(new ClassBinder()); var context = new ModelBinderContext(typeof(UserViewModel[]), "user", "", provider) { RootBinder = mapper }; var binder = new ArrayModelBinder(); Assert.Throws <ModelBindingException>(() => binder.Bind(context)); }
public async Task BindModelAsync_ModelMetadataNotReadOnly_ModelNonNull_FailsSilently(int[] model) { // Arrange var arrayLength = model.Length; var valueProvider = new SimpleValueProvider { { "someName[0]", "42" }, { "someName[1]", "84" }, }; var bindingContext = GetBindingContext(valueProvider, isReadOnly: false); var modelState = bindingContext.ModelState; bindingContext.Model = model; var binder = new ArrayModelBinder <int>(); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.NotEqual(ModelBindingResult.NoResult, result); Assert.True(result.IsModelSet); Assert.Same(model, result.Model); Assert.True(modelState.IsValid); for (var i = 0; i < arrayLength; i++) { // Array should be unchanged. Assert.Equal(357, model[i]); } }
public async Task ArrayModelBinder_CreatesEmptyCollection_IfIsTopLevelObject() { // Arrange var binder = new ArrayModelBinder <string>(); var context = CreateContext(); context.IsTopLevelObject = true; // Lack of prefix and non-empty model name both ignored. context.ModelName = "modelName"; var metadataProvider = context.OperationBindingContext.MetadataProvider; context.ModelMetadata = metadataProvider.GetMetadataForType(typeof(string[])); context.ValueProvider = new TestValueProvider(new Dictionary <string, object>()); // Act var result = await binder.BindModelAsync(context); // Assert Assert.NotEqual(ModelBindingResult.NoResult, result); Assert.Empty(Assert.IsType <string[]>(result.Model)); Assert.Equal("modelName", result.Key); Assert.True(result.IsModelSet); }
public void CanBind_IntArray() { var context = Substitute.For <IModelBinderContext>(); context.ModelType.Returns(typeof(int[])); var binder = new ArrayModelBinder(); Assert.True(binder.CanBind(context)); }
public void CanBind_List() { var context = Substitute.For <IModelBinderContext>(); context.ModelType.Returns(typeof(IEnumerable <int>)); var binder = new ArrayModelBinder(); Assert.False(binder.CanBind(context)); }
public void CanBind_Primitive() { var context = Substitute.For <IModelBinderContext>(); context.ModelType.Returns(typeof(int)); var binder = new ArrayModelBinder(); Assert.False(binder.CanBind(context)); }
public async Task GetBinder_ValueProviderDoesNotContainPrefix_ReturnsNull() { // Arrange ModelBindingContext bindingContext = GetBindingContext(new SimpleHttpValueProvider()); var binder = new ArrayModelBinder <int>(); // Act var bound = await binder.BindModelAsync(bindingContext); // Assert Assert.False(bound); }
public async Task GetBinder_ValueProviderDoesNotContainPrefix_ReturnsNull() { // Arrange ModelBindingContext bindingContext = GetBindingContext(new SimpleHttpValueProvider()); var binder = new ArrayModelBinder<int>(); // Act var bound = await binder.BindModelAsync(bindingContext); // Assert Assert.False(bound); }
public void Bind_IntArray_Gap() { var provider = new ValueProvider() { Parameters = { new Parameter("ages[2]", "3"), new Parameter("ages[0]", "20") } }; var context = new ModelBinderContext(typeof(int[]), "ages", "", provider); context.RootBinder = new PrimitiveModelBinder(); var binder = new ArrayModelBinder(); Assert.Throws <ModelBindingException>(() => binder.Bind(context)); }
public void BindModel() { // Arrange ControllerContext controllerContext = new ControllerContext(); ExtensibleModelBindingContext bindingContext = new ExtensibleModelBindingContext { ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType( null, typeof(int[]) ), ModelName = "someName", ModelBinderProviders = new ModelBinderProviderCollection(), ValueProvider = new SimpleValueProvider { { "someName[0]", "42" }, { "someName[1]", "84" } } }; Mock <IExtensibleModelBinder> mockIntBinder = new Mock <IExtensibleModelBinder>(); mockIntBinder .Setup( o => o.BindModel(controllerContext, It.IsAny <ExtensibleModelBindingContext>()) ) .Returns( delegate(ControllerContext cc, ExtensibleModelBindingContext mbc) { mbc.Model = mbc.ValueProvider .GetValue(mbc.ModelName) .ConvertTo(mbc.ModelType); return(true); } ); bindingContext.ModelBinderProviders.RegisterBinderForType( typeof(int), mockIntBinder.Object, false /* suppressPrefixCheck */ ); // Act bool retVal = new ArrayModelBinder <int>().BindModel(controllerContext, bindingContext); // Assert Assert.True(retVal); int[] array = bindingContext.Model as int[]; Assert.Equal(new[] { 42, 84 }, array); }
public void Bind_IntArray_NoIndex() { var provider = new ValueProvider() { Parameters = { new Parameter("ages[]", "3", "20") } }; var context = new ModelBinderContext(typeof(int[]), "ages", "", provider); var binder = new ArrayModelBinder(); var actual = (int[])binder.Bind(context); Assert.NotNull(actual); Assert.Equal(3, actual[0]); Assert.Equal(20, actual[1]); }
public async Task GetBinder_ModelMetadataReturnsReadOnly_ReturnsNull() { // Arrange var valueProvider = new SimpleHttpValueProvider { { "foo[0]", "42" }, }; var bindingContext = GetBindingContext(valueProvider, isReadOnly: true); var binder = new ArrayModelBinder <int>(); // Act var bound = await binder.BindModelAsync(bindingContext); // Assert Assert.Null(bound); }
public async Task GetBinder_ModelMetadataReturnsReadOnly_ReturnsNull() { // Arrange var valueProvider = new SimpleHttpValueProvider { { "foo[0]", "42" }, }; var bindingContext = GetBindingContext(valueProvider, isReadOnly: true); var binder = new ArrayModelBinder<int>(); // Act var bound = await binder.BindModelAsync(bindingContext); // Assert Assert.Null(bound); }
public async Task ArrayModelBinder_DoesNotCreateCollection_ForTopLevelModel_OnFirstPass() { // Arrange var binder = new ArrayModelBinder<string>(); var context = CreateContext(); context.ModelName = "param"; var metadataProvider = context.OperationBindingContext.MetadataProvider; context.ModelMetadata = metadataProvider.GetMetadataForType(typeof(string[])); context.ValueProvider = new TestValueProvider(new Dictionary<string, object>()); // Act var result = await binder.BindModelAsync(context); // Assert Assert.Null(result); }
public async Task BindModelAsync_ModelMetadataReadOnly_ReturnsNull(int[] model) { // Arrange var valueProvider = new SimpleValueProvider { { "someName[0]", "42" }, { "someName[1]", "84" }, }; var bindingContext = GetBindingContext(valueProvider, isReadOnly: true); bindingContext.Model = model; var binder = new ArrayModelBinder <int>(); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.Equal(ModelBindingResult.NoResult, result); }
public async Task BindModel() { // Arrange var valueProvider = new SimpleHttpValueProvider { { "someName[0]", "42" }, { "someName[1]", "84" } }; ModelBindingContext bindingContext = GetBindingContext(valueProvider); var binder = new ArrayModelBinder <int>(); // Act var retVal = await binder.BindModelAsync(bindingContext); // Assert Assert.True(retVal); int[] array = bindingContext.Model as int[]; Assert.Equal(new[] { 42, 84 }, array); }
public async Task BindModel() { // Arrange var valueProvider = new SimpleHttpValueProvider { { "someName[0]", "42" }, { "someName[1]", "84" } }; ModelBindingContext bindingContext = GetBindingContext(valueProvider); var binder = new ArrayModelBinder<int>(); // Act var retVal = await binder.BindModelAsync(bindingContext); // Assert Assert.True(retVal); int[] array = bindingContext.Model as int[]; Assert.Equal(new[] { 42, 84 }, array); }
public async Task ArrayModelBinder_DoesNotCreateCollection_ForTopLevelModel_OnFirstPass() { // Arrange var binder = new ArrayModelBinder <string>(); var context = CreateContext(); context.ModelName = "param"; var metadataProvider = context.OperationBindingContext.MetadataProvider; context.ModelMetadata = metadataProvider.GetMetadataForType(typeof(string[])); context.ValueProvider = new TestValueProvider(new Dictionary <string, object>()); // Act var result = await binder.BindModelAsync(context); // Assert Assert.Null(result); }
public async Task BindModelAsync_ValueProviderContainPrefix_Succeeds() { // Arrange var valueProvider = new SimpleValueProvider { { "someName[0]", "42" }, { "someName[1]", "84" }, }; var bindingContext = GetBindingContext(valueProvider); var modelState = bindingContext.ModelState; var binder = new ArrayModelBinder<int>(new SimpleTypeModelBinder()); // Act var result = await binder.BindModelResultAsync(bindingContext); // Assert Assert.NotEqual(default(ModelBindingResult), result); var array = Assert.IsType<int[]>(result.Model); Assert.Equal(new[] { 42, 84 }, array); }
public async Task ArrayModelBinder_DoesNotCreateCollection_IfNotIsTopLevelObject(string prefix) { // Arrange var binder = new ArrayModelBinder<string>(new SimpleTypeModelBinder(typeof(string))); var bindingContext = CreateContext(); bindingContext.ModelName = ModelNames.CreatePropertyModelName(prefix, "ArrayProperty"); var metadataProvider = new TestModelMetadataProvider(); bindingContext.ModelMetadata = metadataProvider.GetMetadataForProperty( typeof(ModelWithArrayProperty), nameof(ModelWithArrayProperty.ArrayProperty)); bindingContext.ValueProvider = new TestValueProvider(new Dictionary<string, object>()); // Act await binder.BindModelAsync(bindingContext); // Assert Assert.False(bindingContext.Result.IsModelSet); }
public async Task ArrayModelBinder_DoesNotCreateCollection_IfNotIsTopLevelObject(string prefix) { // Arrange var binder = new ArrayModelBinder<string>(new SimpleTypeModelBinder()); var context = CreateContext(); context.ModelName = ModelNames.CreatePropertyModelName(prefix, "ArrayProperty"); var metadataProvider = context.OperationBindingContext.MetadataProvider; context.ModelMetadata = metadataProvider.GetMetadataForProperty( typeof(ModelWithArrayProperty), nameof(ModelWithArrayProperty.ArrayProperty)); context.ValueProvider = new TestValueProvider(new Dictionary<string, object>()); // Act var result = await binder.BindModelResultAsync(context); // Assert Assert.Equal(default(ModelBindingResult), result); }
public async Task BindModelAsync_ModelMetadataNotReadOnly_ModelNonNull_FailsSilently(int[] model) { // Arrange var arrayLength = model.Length; var valueProvider = new SimpleValueProvider { { "someName[0]", "42" }, { "someName[1]", "84" }, }; var bindingContext = GetBindingContext(valueProvider); bindingContext.Model = model; var metadataProvider = new TestModelMetadataProvider(); metadataProvider.ForProperty( typeof(ModelWithIntArrayProperty), nameof(ModelWithIntArrayProperty.ArrayProperty)).BindingDetails(bd => bd.IsReadOnly = false); bindingContext.ModelMetadata = metadataProvider.GetMetadataForProperty( typeof(ModelWithIntArrayProperty), nameof(ModelWithIntArrayProperty.ArrayProperty)); var binder = new ArrayModelBinder <int>( new SimpleTypeModelBinder(typeof(int), NullLoggerFactory.Instance), NullLoggerFactory.Instance); // Act await binder.BindModelAsync(bindingContext); // Assert Assert.True(bindingContext.Result.IsModelSet); Assert.Same(model, bindingContext.Result.Model); for (var i = 0; i < arrayLength; i++) { // Array should be unchanged. Assert.Equal(357, model[i]); } }
public async Task ArrayModelBinder_CreatesEmptyCollectionAndAddsError_IfIsTopLevelObject() { // Arrange var binder = new ArrayModelBinder <string>( new SimpleTypeModelBinder(typeof(string), NullLoggerFactory.Instance), NullLoggerFactory.Instance, allowValidatingTopLevelNodes: true); var bindingContext = CreateContext(); bindingContext.IsTopLevelObject = true; bindingContext.FieldName = "fieldName"; bindingContext.ModelName = "modelName"; var metadataProvider = new TestModelMetadataProvider(); var parameter = typeof(ArrayModelBinderTest) .GetMethod(nameof(ActionWithArrayParameter), BindingFlags.Instance | BindingFlags.NonPublic) .GetParameters()[0]; metadataProvider .ForParameter(parameter) .BindingDetails(b => b.IsBindingRequired = true); bindingContext.ModelMetadata = metadataProvider.GetMetadataForParameter(parameter); bindingContext.ValueProvider = new TestValueProvider(new Dictionary <string, object>()); // Act await binder.BindModelAsync(bindingContext); // Assert Assert.Empty(Assert.IsType <string[]>(bindingContext.Result.Model)); Assert.True(bindingContext.Result.IsModelSet); var keyValuePair = Assert.Single(bindingContext.ModelState); Assert.Equal("modelName", keyValuePair.Key); var error = Assert.Single(keyValuePair.Value.Errors); Assert.Equal("A value for the 'fieldName' parameter or property was not provided.", error.ErrorMessage); }
public async Task ArrayModelBinder_CreatesEmptyCollection_IfIsTopLevelObject( bool allowValidatingTopLevelNodes, bool isBindingRequired) { // Arrange var expectedErrorCount = isBindingRequired ? 1 : 0; var binder = new ArrayModelBinder <string>( new SimpleTypeModelBinder(typeof(string), NullLoggerFactory.Instance), NullLoggerFactory.Instance, allowValidatingTopLevelNodes); var bindingContext = CreateContext(); bindingContext.IsTopLevelObject = true; // Lack of prefix and non-empty model name both ignored. bindingContext.ModelName = "modelName"; var metadataProvider = new TestModelMetadataProvider(); var parameter = typeof(ArrayModelBinderTest) .GetMethod(nameof(ActionWithArrayParameter), BindingFlags.Instance | BindingFlags.NonPublic) .GetParameters()[0]; metadataProvider .ForParameter(parameter) .BindingDetails(b => b.IsBindingRequired = isBindingRequired); bindingContext.ModelMetadata = metadataProvider.GetMetadataForParameter(parameter); bindingContext.ValueProvider = new TestValueProvider(new Dictionary <string, object>()); // Act await binder.BindModelAsync(bindingContext); // Assert Assert.Empty(Assert.IsType <string[]>(bindingContext.Result.Model)); Assert.True(bindingContext.Result.IsModelSet); Assert.Equal(expectedErrorCount, bindingContext.ModelState.ErrorCount); }
public async Task ArrayModelBinder_DoesNotCreateCollection_IfNotIsTopLevelObject(string prefix) { // Arrange var binder = new ArrayModelBinder <string>(); var context = CreateContext(); context.ModelName = ModelNames.CreatePropertyModelName(prefix, "ArrayProperty"); var metadataProvider = context.OperationBindingContext.MetadataProvider; context.ModelMetadata = metadataProvider.GetMetadataForProperty( typeof(ModelWithArrayProperty), nameof(ModelWithArrayProperty.ArrayProperty)); context.ValueProvider = new TestValueProvider(new Dictionary <string, object>()); // Act var result = await binder.BindModelAsync(context); // Assert Assert.Equal(ModelBindingResult.NoResult, result); }
public async Task BindModelAsync_ValueProviderContainPrefix_Succeeds() { // Arrange var valueProvider = new SimpleValueProvider { { "someName[0]", "42" }, { "someName[1]", "84" }, }; var bindingContext = GetBindingContext(valueProvider); var modelState = bindingContext.ModelState; var binder = new ArrayModelBinder <int>(); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.NotEqual(ModelBindingResult.NoResult, result); var array = Assert.IsType <int[]>(result.Model); Assert.Equal(new[] { 42, 84 }, array); Assert.True(modelState.IsValid); }
public async Task ArrayModelBinder_CreatesEmptyCollection_IfIsTopLevelObject() { // Arrange var binder = new ArrayModelBinder<string>(new SimpleTypeModelBinder(typeof(string))); var bindingContext = CreateContext(); bindingContext.IsTopLevelObject = true; // Lack of prefix and non-empty model name both ignored. bindingContext.ModelName = "modelName"; var metadataProvider = new TestModelMetadataProvider(); bindingContext.ModelMetadata = metadataProvider.GetMetadataForType(typeof(string[])); bindingContext.ValueProvider = new TestValueProvider(new Dictionary<string, object>()); // Act await binder.BindModelAsync(bindingContext); // Assert Assert.Empty(Assert.IsType<string[]>(bindingContext.Result.Model)); Assert.True(bindingContext.Result.IsModelSet); }
public async Task ArrayModelBinder_DoesNotCreateCollection_IfIsTopLevelObjectAndIsFirstChanceBinding() { // Arrange var binder = new ArrayModelBinder<string>(); var context = CreateContext(); context.IsFirstChanceBinding = true; context.IsTopLevelObject = true; // Explicit prefix and empty model name both ignored. context.BinderModelName = "prefix"; context.ModelName = string.Empty; var metadataProvider = context.OperationBindingContext.MetadataProvider; context.ModelMetadata = metadataProvider.GetMetadataForType(typeof(string[])); context.ValueProvider = new TestValueProvider(new Dictionary<string, object>()); // Act var result = await binder.BindModelAsync(context); // Assert Assert.Null(result); }
public async Task BindModelAsync_ModelMetadataReadOnly_ReturnsNull(int[] model) { // Arrange var valueProvider = new SimpleHttpValueProvider { { "someName[0]", "42" }, { "someName[1]", "84" }, }; var bindingContext = GetBindingContext(valueProvider, isReadOnly: true); bindingContext.Model = model; var binder = new ArrayModelBinder<int>(); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.Null(result); }
public async Task BindModelAsync_ModelMetadataNotReadOnly_ModelNonNull_FailsSilently(int[] model) { // Arrange var arrayLength = model.Length; var valueProvider = new SimpleValueProvider { { "someName[0]", "42" }, { "someName[1]", "84" }, }; var bindingContext = GetBindingContext(valueProvider); bindingContext.Model = model; var metadataProvider = new TestModelMetadataProvider(); metadataProvider.ForProperty( typeof(ModelWithIntArrayProperty), nameof(ModelWithIntArrayProperty.ArrayProperty)).BindingDetails(bd => bd.IsReadOnly = false); bindingContext.ModelMetadata = metadataProvider.GetMetadataForProperty( typeof(ModelWithIntArrayProperty), nameof(ModelWithIntArrayProperty.ArrayProperty)); var binder = new ArrayModelBinder<int>(new SimpleTypeModelBinder(typeof(int))); // Act await binder.BindModelAsync(bindingContext); // Assert Assert.True(bindingContext.Result.IsModelSet); Assert.Same(model, bindingContext.Result.Model); for (var i = 0; i < arrayLength; i++) { // Array should be unchanged. Assert.Equal(357, model[i]); } }
public async Task BindModelAsync_ModelMetadataNotReadOnly_ModelNonNull_FailsSilently(int[] model) { // Arrange var arrayLength = model.Length; var valueProvider = new SimpleValueProvider { { "someName[0]", "42" }, { "someName[1]", "84" }, }; var bindingContext = GetBindingContext(valueProvider, isReadOnly: false); var modelState = bindingContext.ModelState; bindingContext.Model = model; var binder = new ArrayModelBinder<int>(new SimpleTypeModelBinder()); // Act var result = await binder.BindModelResultAsync(bindingContext); // Assert Assert.NotEqual(default(ModelBindingResult), result); Assert.True(result.IsModelSet); Assert.Same(model, result.Model); for (var i = 0; i < arrayLength; i++) { // Array should be unchanged. Assert.Equal(357, model[i]); } }