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 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 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 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_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 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_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 ArrayModelBinder_CreatesEmptyCollection_IfIsTopLevelObjectAndNotIsFirstChanceBinding() { // 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.NotNull(result); Assert.Empty(Assert.IsType<string[]>(result.Model)); Assert.Equal("modelName", 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_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 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 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 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 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 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 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 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_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 SimpleHttpValueProvider { { "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.NotNull(result); var array = Assert.IsType<int[]>(result.Model); Assert.Equal(new[] { 42, 84 }, array); Assert.True(modelState.IsValid); }
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_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_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_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 SimpleHttpValueProvider { { "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.NotNull(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 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]); } }