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 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]); } }
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_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_DoesNotCreateCollection_IfNotIsTopLevelObject(string prefix) { // Arrange var binder = new ArrayModelBinder <string>( new SimpleTypeModelBinder(typeof(string), NullLoggerFactory.Instance), NullLoggerFactory.Instance); 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_CreatesEmptyCollection_IfIsTopLevelObject() { // Arrange var binder = new ArrayModelBinder <string>( new SimpleTypeModelBinder(typeof(string), NullLoggerFactory.Instance), NullLoggerFactory.Instance); 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_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 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 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_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>(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); }