forked from aspnet/AspNetWebStack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathModelBinderAttributeTest.cs
More file actions
177 lines (146 loc) · 6.77 KB
/
Copy pathModelBinderAttributeTest.cs
File metadata and controls
177 lines (146 loc) · 6.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections.Generic;
using System.Web.Http.Controllers;
using System.Web.Http.Dependencies;
using System.Web.Http.ValueProviders;
using Microsoft.TestCommon;
using Moq;
namespace System.Web.Http.ModelBinding
{
public class ModelBinderAttributeTest
{
[Fact]
public void Empty_BinderType()
{
HttpConfiguration config = new HttpConfiguration();
config.Services.Replace(typeof(ModelBinderProvider), new CustomModelBinderProvider());
ModelBinderAttribute attr = new ModelBinderAttribute();
ModelBinderProvider provider = attr.GetModelBinderProvider(config);
Assert.IsType<CustomModelBinderProvider>(provider);
}
[Fact]
public void Illegal_BinderType()
{
// Given an illegal type.
// Constructor shouldn't throw. But trying to instantiate the model binder provider will throw.
HttpConfiguration config = new HttpConfiguration();
ModelBinderAttribute attr = new ModelBinderAttribute(typeof(object));
Assert.Equal(typeof(object), attr.BinderType); // can still lookup illegal type
Assert.Throws<InvalidOperationException>(
() => attr.GetModelBinderProvider(config)
);
}
[Fact]
public void BinderType_Provided()
{
HttpConfiguration config = new HttpConfiguration();
ModelBinderAttribute attr = new ModelBinderAttribute(typeof(CustomModelBinderProvider));
ModelBinderProvider provider = attr.GetModelBinderProvider(config);
Assert.IsType<CustomModelBinderProvider>(provider);
}
[Fact]
public void BinderType_From_DependencyResolver()
{
// To test dependency resolver, the registered type and actual type should be different.
HttpConfiguration config = new HttpConfiguration();
var mockDependencyResolver = new Mock<IDependencyResolver>();
mockDependencyResolver.Setup(r => r.GetService(typeof(CustomModelBinderProvider)))
.Returns(new SecondCustomModelBinderProvider());
config.DependencyResolver = mockDependencyResolver.Object;
ModelBinderAttribute attr = new ModelBinderAttribute(typeof(CustomModelBinderProvider));
ModelBinderProvider provider = attr.GetModelBinderProvider(config);
Assert.IsType<SecondCustomModelBinderProvider>(provider);
}
[Fact]
public void BinderType_From_DependencyResolver_ReleasedWhenConfigIsDisposed()
{
// Arrange
HttpConfiguration config = new HttpConfiguration();
var mockDependencyResolver = new Mock<IDependencyResolver>();
SecondCustomModelBinderProvider provider = new SecondCustomModelBinderProvider();
mockDependencyResolver.Setup(r => r.GetService(typeof(CustomModelBinderProvider))).Returns(provider);
config.DependencyResolver = mockDependencyResolver.Object;
ModelBinderAttribute attr = new ModelBinderAttribute(typeof(CustomModelBinderProvider));
attr.GetModelBinderProvider(config);
// Act
config.Dispose();
// Assert
mockDependencyResolver.Verify(dr => dr.Dispose(), Times.Once());
}
[Fact]
public void Set_ModelBinder_And_ValueProviders()
{
HttpConfiguration config = new HttpConfiguration();
ModelBinderAttribute attr = new ValueProviderAttribute(typeof(CustomValueProviderFactory)) { BinderType = typeof(CustomModelBinderProvider) };
IEnumerable<ValueProviderFactory> vpfs = attr.GetValueProviderFactories(config);
Assert.IsType<CustomModelBinderProvider>(attr.GetModelBinderProvider(config));
object valueProviderFactory = Assert.Single(vpfs);
Assert.IsType<CustomValueProviderFactory>(valueProviderFactory);
}
[Fact]
public void Get_ModelBinder_From_Empty_Attribute()
{
HttpConfiguration config = new HttpConfiguration();
config.Services.Replace(typeof(ModelBinderProvider), new CustomModelBinderProvider());
// binder = null, so pulls default from config. But attribute still has value by specifying the value providers.
ModelBinderAttribute attr = new ValueProviderAttribute(typeof(CustomValueProviderFactory));
// Act
IModelBinder binder = attr.GetModelBinder(config, null);
// Assert
Assert.Null(attr.BinderType); // using the default
Assert.NotNull(binder);
Assert.IsType<CustomModelBinder>(binder);
}
[Fact]
public void Get_ModelBinder_From_Binder()
{
HttpConfiguration config = new HttpConfiguration();
ModelBinderAttribute attr = new ModelBinderAttribute { BinderType = typeof(CustomModelBinder) };
// Act
IModelBinder binder = attr.GetModelBinder(config, null);
// Assert
Assert.NotNull(binder);
Assert.IsType<CustomModelBinder>(binder);
}
[Fact]
public void Get_ModelBinder_From_BinderProvider()
{
HttpConfiguration config = new HttpConfiguration();
ModelBinderAttribute attr = new ModelBinderAttribute { BinderType = typeof(CustomModelBinderProvider) };
// Act
IModelBinder binder = attr.GetModelBinder(config, null);
// Assert
Assert.NotNull(binder);
Assert.IsType<CustomModelBinder>(binder);
}
private class CustomModelBinderProvider : ModelBinderProvider
{
public override IModelBinder GetBinder(HttpConfiguration config, Type modelType)
{
return new CustomModelBinder();
}
}
private class CustomModelBinder : IModelBinder
{
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
return true;
}
}
private class SecondCustomModelBinderProvider : ModelBinderProvider
{
public override IModelBinder GetBinder(HttpConfiguration config, Type modelType)
{
throw new NotImplementedException();
}
}
private class CustomValueProviderFactory : ValueProviderFactory
{
public override IValueProvider GetValueProvider(HttpActionContext actionContext)
{
throw new NotImplementedException();
}
}
}
}