Skip to content
This repository was archived by the owner on Dec 14, 2018. It is now read-only.

Commit af0ac42

Browse files
author
N. Taylor Mullen
committed
Add ValidationMessageTagHelper tests.
1 parent 7470fe9 commit af0ac42

File tree

1 file changed

+169
-0
lines changed

1 file changed

+169
-0
lines changed
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System.Collections.Generic;
5+
using System.IO;
6+
using System.Reflection;
7+
using Microsoft.AspNet.Http;
8+
using Microsoft.AspNet.Mvc.ModelBinding;
9+
using Microsoft.AspNet.Mvc.Rendering;
10+
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
11+
using Microsoft.AspNet.Routing;
12+
using Moq;
13+
using Xunit;
14+
15+
namespace Microsoft.AspNet.Mvc.TagHelpers
16+
{
17+
public class ValidationMessageTagHelperTest
18+
{
19+
[Fact]
20+
public void Process_CallsIntoGenerateValidationMessageWithExpectedParameters()
21+
{
22+
// Arrange
23+
var validationMessageTagHelper = new ValidationMessageTagHelper
24+
{
25+
For = CreateModelExpression("Hello")
26+
};
27+
var called = false;
28+
var output = new TagHelperOutput(
29+
"span",
30+
attributes: new Dictionary<string, string>(),
31+
content: "Content of validation message");
32+
33+
var expectedViewContext = CreateViewContext();
34+
var generator = new Mock<IHtmlGenerator>();
35+
generator.Setup(mock =>
36+
mock.GenerateValidationMessage(It.IsAny<ViewContext>(),
37+
It.IsAny<string>(),
38+
It.IsAny<string>(),
39+
It.IsAny<string>(),
40+
It.IsAny<object>()))
41+
.Callback<ViewContext, string, string, string, object>(
42+
(viewContext, name, message, tag, htmlAttributes) =>
43+
{
44+
called = true;
45+
46+
Assert.Same(expectedViewContext, viewContext);
47+
Assert.Equal("Hello", name);
48+
Assert.Equal("Content of validation message", message);
49+
Assert.Equal("span", tag);
50+
Assert.Null(htmlAttributes);
51+
})
52+
.Returns(new TagBuilder("span"));
53+
54+
SetViewContextAndGenerator(validationMessageTagHelper, expectedViewContext, generator.Object);
55+
56+
// Act & Assert
57+
validationMessageTagHelper.Process(context: null, output: output);
58+
59+
Assert.True(called);
60+
}
61+
62+
[Fact]
63+
public void Process_MergesTagBuilderFromGenerateValidationMessage()
64+
{
65+
// Arrange
66+
var validationMessageTagHelper = new ValidationMessageTagHelper
67+
{
68+
For = CreateModelExpression("Hello")
69+
};
70+
var output = new TagHelperOutput(
71+
"span",
72+
attributes: new Dictionary<string, string>(),
73+
content: "Content of validation message");
74+
var tagBuilder = new TagBuilder("span2")
75+
{
76+
InnerHtml = "New HTML"
77+
};
78+
79+
tagBuilder.Attributes.Add("data-foo", "bar");
80+
tagBuilder.Attributes.Add("data-hello", "world");
81+
82+
var expectedViewContext = CreateViewContext();
83+
var generator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
84+
generator.Setup(mock =>
85+
mock.GenerateValidationMessage(It.IsAny<ViewContext>(),
86+
It.IsAny<string>(),
87+
It.IsAny<string>(),
88+
It.IsAny<string>(),
89+
It.IsAny<object>()))
90+
.Returns(tagBuilder);
91+
92+
SetViewContextAndGenerator(validationMessageTagHelper, expectedViewContext, generator.Object);
93+
94+
// Act
95+
validationMessageTagHelper.Process(context: null, output: output);
96+
97+
// Assert
98+
Assert.Equal(output.TagName, "span2");
99+
Assert.Equal(2, output.Attributes.Count);
100+
var attribute = Assert.Single(output.Attributes, kvp => kvp.Key.Equals("data-foo"));
101+
Assert.Equal("bar", attribute.Value);
102+
attribute = Assert.Single(output.Attributes, kvp => kvp.Key.Equals("data-hello"));
103+
Assert.Equal("world", attribute.Value);
104+
Assert.Equal("New HTML", output.Content);
105+
}
106+
107+
[Fact]
108+
public void Process_DoesNothingIfNullFor()
109+
{
110+
// Arrange
111+
var validationMessageTagHelper = new ValidationMessageTagHelper();
112+
var output = new TagHelperOutput(
113+
"span",
114+
attributes: new Dictionary<string, string>(),
115+
content: "Content of validation message");
116+
117+
var expectedViewContext = CreateViewContext();
118+
var generator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
119+
120+
SetViewContextAndGenerator(validationMessageTagHelper, expectedViewContext, generator.Object);
121+
122+
// Act & Assert
123+
validationMessageTagHelper.Process(context: null, output: output);
124+
125+
Assert.Equal("span", output.TagName);
126+
Assert.Empty(output.Attributes);
127+
Assert.Equal("Content of validation message", output.Content);
128+
}
129+
130+
private static ModelExpression CreateModelExpression(string name)
131+
{
132+
return new ModelExpression(
133+
name,
134+
new ModelMetadata(
135+
new Mock<IModelMetadataProvider>().Object,
136+
containerType: null,
137+
modelAccessor: null,
138+
modelType: typeof(object),
139+
propertyName: string.Empty));
140+
}
141+
142+
private static ViewContext CreateViewContext()
143+
{
144+
var actionContext = new ActionContext(
145+
new Mock<HttpContext>().Object,
146+
new RouteData(),
147+
new ActionDescriptor());
148+
149+
return new ViewContext(
150+
actionContext,
151+
Mock.Of<IView>(),
152+
new ViewDataDictionary(
153+
new DataAnnotationsModelMetadataProvider()),
154+
new StringWriter());
155+
}
156+
157+
private static void SetViewContextAndGenerator(ITagHelper tagHelper,
158+
ViewContext viewContext,
159+
IHtmlGenerator generator)
160+
{
161+
var tagHelperType = tagHelper.GetType();
162+
163+
tagHelperType.GetProperty("ViewContext", BindingFlags.NonPublic | BindingFlags.Instance)
164+
.SetValue(tagHelper, viewContext);
165+
tagHelperType.GetProperty("Generator", BindingFlags.NonPublic | BindingFlags.Instance)
166+
.SetValue(tagHelper, generator);
167+
}
168+
}
169+
}

0 commit comments

Comments
 (0)