public async Task BindModel_ReturnsWithIsModelSetFalse_WhenValueNotFound() { // Arrange var valueProvider = new SimpleValueProvider() { { "someName", "" } }; var bindingContext = GetBindingContext(valueProvider, typeof(byte[])); var binder = new ByteArrayModelBinder(); // Act var binderResult = await binder.BindModelAsync(bindingContext); // Assert Assert.NotNull(binderResult); Assert.False(binderResult.IsModelSet); Assert.Equal("foo", binderResult.Key); Assert.Null(binderResult.Model); Assert.Empty(bindingContext.ModelState); // No submitted data for "foo". }
public async Task BindModel_DoesNotAddAValidationNode_IfModelIsNotSet() { // Arrange var valueProvider = new SimpleValueProvider(); var mockBinder = new Mock <IModelBinder>(); mockBinder .Setup(o => o.BindModelAsync(It.IsAny <ModelBindingContext>())) .Returns((ModelBindingContext context) => { return(ModelBindingResult.FailedAsync("someName")); }); var binder = CreateCompositeBinder(mockBinder.Object); var bindingContext = CreateBindingContext(binder, valueProvider, typeof(SimplePropertiesModel)); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.Equal(ModelBindingResult.NoResult, result); }
public async Task BindModel_WithDefaultBinders_BindsSimpleType() { // Arrange var binder = CreateBinderWithDefaults(); var valueProvider = new SimpleValueProvider { { "firstName", "firstName-value" }, { "lastName", "lastName-value" } }; var bindingContext = CreateBindingContext(binder, valueProvider, typeof(SimplePropertiesModel)); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.NotEqual(ModelBindingResult.NoResult, result); var model = Assert.IsType <SimplePropertiesModel>(result.Model); Assert.Equal("firstName-value", model.FirstName); Assert.Equal("lastName-value", model.LastName); }
public async Task BindModel_SimpleCollection_Succeeds(bool isReadOnly) { // Arrange var valueProvider = new SimpleValueProvider { { "someName", new[] { "42", "100", "200" } } }; var bindingContext = GetModelBindingContext(valueProvider, isReadOnly); var modelState = bindingContext.ModelState; var binder = new CollectionModelBinder <int>(); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.NotEqual(ModelBindingResult.NoResult, result); Assert.True(result.IsModelSet); var list = Assert.IsAssignableFrom <IList <int> >(result.Model); Assert.Equal(new[] { 42, 100, 200 }, list.ToArray()); }
public async Task BindModel_WithDefaultBinders_BindsComplexType() { // Arrange var binder = CreateBinderWithDefaults(); var valueProvider = new SimpleValueProvider { { "firstName", "firstName-value" }, { "lastName", "lastName-value" }, { "friends[0].firstName", "first-friend" }, { "friends[0].age", "40" }, { "friends[0].friends[0].firstname", "nested friend" }, { "friends[1].firstName", "some other" }, { "friends[1].lastName", "name" }, { "resume", "4+mFeTp3tPF=" } }; var bindingContext = CreateBindingContext(binder, valueProvider, typeof(Person)); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.NotEqual(ModelBindingResult.NoResult, result); var model = Assert.IsType <Person>(result.Model); Assert.Equal("firstName-value", model.FirstName); Assert.Equal("lastName-value", model.LastName); Assert.Equal(2, model.Friends.Count); Assert.Equal("first-friend", model.Friends[0].FirstName); Assert.Equal(40, model.Friends[0].Age); var nestedFriend = Assert.Single(model.Friends[0].Friends); Assert.Equal("nested friend", nestedFriend.FirstName); Assert.Equal("some other", model.Friends[1].FirstName); Assert.Equal("name", model.Friends[1].LastName); Assert.Equal(new byte[] { 227, 233, 133, 121, 58, 119, 180, 241 }, model.Resume); }
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 BindModel_MissingKeyAndMissingValue_DoNotAddModelStateError() { // Arrange var valueProvider = new SimpleValueProvider(); // Create int binder to create the value but not the key. var bindingContext = GetBindingContext(valueProvider); var mockBinder = new Mock <IModelBinder>(); mockBinder.Setup(o => o.BindModelAsync(It.IsAny <ModelBindingContext>())) .Returns(ModelBindingResult.NoResultAsync); bindingContext.OperationBindingContext.ModelBinder = mockBinder.Object; var binder = new KeyValuePairModelBinder <int, string>(); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.Equal(ModelBindingResult.NoResult, result); Assert.True(bindingContext.ModelState.IsValid); Assert.Equal(0, bindingContext.ModelState.ErrorCount); }
public async Task BindModel_MissingValue_ReturnsResult_AndAddsModelValidationError() { // Arrange var valueProvider = new SimpleValueProvider(); // Create int binder to create the value but not the key. var bindingContext = GetBindingContext(valueProvider, CreateIntBinder()); var binder = new KeyValuePairModelBinder <int, string>(); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.Null(result.Model); Assert.False(bindingContext.ModelState.IsValid); Assert.Equal("someName", bindingContext.ModelName); var state = bindingContext.ModelState["someName.Value"]; Assert.NotNull(state); var error = Assert.Single(state.Errors); Assert.Equal("A value is required.", error.ErrorMessage); }
public async Task BindModelAddsModelErrorsOnInvalidCharacters() { // Arrange var expected = "The value '\"Fys1\"' is not valid for foo."; var valueProvider = new SimpleValueProvider() { { "foo", "\"Fys1\"" } }; var bindingContext = GetBindingContext(valueProvider, typeof(byte[])); var binder = new ByteArrayModelBinder(); // Act var binderResult = await binder.BindModelAsync(bindingContext); // Assert Assert.NotNull(binderResult); Assert.False(bindingContext.ModelState.IsValid); var error = Assert.Single(bindingContext.ModelState["foo"].Errors); Assert.Equal(expected, error.ErrorMessage); }
public async Task BindModelAsync_SimpleCollectionWithNullValue_Succeeds() { // Arrange var binder = new CollectionModelBinder <int>(); var valueProvider = new SimpleValueProvider { { "someName", null }, }; var bindingContext = GetModelBindingContext(valueProvider, isReadOnly: false); var modelState = bindingContext.ModelState; // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.NotEqual(ModelBindingResult.NoResult, result); Assert.True(result.IsModelSet); Assert.NotNull(result.Model); var model = Assert.IsType <List <int> >(result.Model); Assert.Empty(model); }
public async Task BindModel_UsesTheValidationNodeOnModelBindingResult_IfPresent() { // Arrange var valueProvider = new SimpleValueProvider(); var mockBinder = new Mock <IModelBinder>(); mockBinder .Setup(o => o.BindModelAsync(It.IsAny <ModelBindingContext>())) .Returns((ModelBindingContext context) => { return(ModelBindingResult.SuccessAsync("someName", 42)); }); var binder = CreateCompositeBinder(mockBinder.Object); var bindingContext = CreateBindingContext(binder, valueProvider, typeof(SimplePropertiesModel)); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.NotEqual(ModelBindingResult.NoResult, result); Assert.True(result.IsModelSet); }
public async Task BindComplexCollectionFromIndexes_FiniteIndexes() { // Arrange var valueProvider = new SimpleValueProvider { { "someName[foo]", "42" }, { "someName[baz]", "200" } }; var bindingContext = GetModelBindingContext(valueProvider); var binder = new CollectionModelBinder <int>(); // Act var collectionResult = await binder.BindComplexCollectionFromIndexes( bindingContext, new[] { "foo", "bar", "baz" }); // Assert Assert.Equal(new[] { 42, 0, 200 }, collectionResult.Model.ToArray()); // This requires a non-default IValidationStrategy var strategy = Assert.IsType <ExplicitIndexCollectionValidationStrategy>(collectionResult.ValidationStrategy); Assert.Equal(new[] { "foo", "bar", "baz" }, strategy.ElementKeys); }