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

Commit a33aa3e

Browse files
author
NTaylorMullen
committed
Addressed code review comments.
1 parent 9c82004 commit a33aa3e

File tree

2 files changed

+95
-40
lines changed

2 files changed

+95
-40
lines changed

src/Microsoft.AspNet.Mvc.TagHelpers/ValidationMessageTagHelper.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,22 @@ public override void Process(TagHelperContext context, TagHelperOutput output)
3333
{
3434
var tagBuilder = Generator.GenerateValidationMessage(ViewContext,
3535
For.Name,
36-
message: output.Content,
37-
tag: output.TagName,
36+
message: null,
37+
tag: null,
3838
htmlAttributes: null);
3939

40-
output.Merge(tagBuilder);
40+
if (tagBuilder != null)
41+
{
42+
output.MergeAttributes(tagBuilder);
43+
44+
// We check for whitespace so detect scenarios such as:
45+
// <span validation-for="Name">
46+
// </span>
47+
if (string.IsNullOrWhiteSpace(output.Content))
48+
{
49+
output.Content = tagBuilder.InnerHtml;
50+
}
51+
}
4152
}
4253
}
4354
}

test/Microsoft.AspNet.Mvc.TagHelpers.Test/ValidationMessageTagHelperTest.cs

Lines changed: 81 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
using System.Collections.Generic;
55
using System.IO;
66
using System.Reflection;
7+
using System.Threading.Tasks;
78
using Microsoft.AspNet.Http;
89
using Microsoft.AspNet.Mvc.ModelBinding;
10+
using Microsoft.AspNet.Mvc.Razor;
911
using Microsoft.AspNet.Mvc.Rendering;
1012
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
1113
using Microsoft.AspNet.Routing;
@@ -17,50 +19,93 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
1719
public class ValidationMessageTagHelperTest
1820
{
1921
[Fact]
20-
public void Process_CallsIntoGenerateValidationMessageWithExpectedParameters()
22+
public async Task ProcessAsync_GeneratesExpectedOutput()
23+
{
24+
// Arrange
25+
var metadataProvider = new DataAnnotationsModelMetadataProvider();
26+
var modelExpression = CreateModelExpression("Name");
27+
var validationMessageTagHelper = new ValidationMessageTagHelper
28+
{
29+
For = modelExpression
30+
};
31+
32+
var tagHelperContext = new TagHelperContext(
33+
allAttributes: new Dictionary<string, object>
34+
{
35+
{ "id", "myvalidationmessage" },
36+
{ "for", modelExpression },
37+
});
38+
var output = new TagHelperOutput(
39+
"original tag name",
40+
attributes: new Dictionary<string, string>
41+
{
42+
{ "id", "myvalidationmessage" }
43+
},
44+
content: "Something");
45+
var htmlGenerator = new TestableHtmlGenerator(metadataProvider);
46+
var viewContext = TestableHtmlGenerator.GetViewContext(model: null,
47+
htmlGenerator: htmlGenerator,
48+
metadataProvider: metadataProvider);
49+
50+
var activator = new DefaultTagHelperActivator();
51+
activator.Activate(validationMessageTagHelper, viewContext);
52+
53+
// Act
54+
await validationMessageTagHelper.ProcessAsync(tagHelperContext, output);
55+
56+
// Assert
57+
Assert.Equal(4, output.Attributes.Count);
58+
var attribute = Assert.Single(output.Attributes, kvp => kvp.Key.Equals("id"));
59+
Assert.Equal("myvalidationmessage", attribute.Value);
60+
attribute = Assert.Single(output.Attributes, kvp => kvp.Key.Equals("class"));
61+
Assert.Equal("field-validation-valid", attribute.Value);
62+
attribute = Assert.Single(output.Attributes, kvp => kvp.Key.Equals("data-valmsg-for"));
63+
Assert.Equal("Name", attribute.Value);
64+
attribute = Assert.Single(output.Attributes, kvp => kvp.Key.Equals("data-valmsg-replace"));
65+
Assert.Equal("true", attribute.Value);
66+
Assert.Equal("Something", output.Content);
67+
Assert.Equal("original tag name", output.TagName);
68+
}
69+
70+
[Fact]
71+
public async Task ProcessAsync_CallsIntoGenerateValidationMessageWithExpectedParameters()
2172
{
2273
// Arrange
2374
var validationMessageTagHelper = new ValidationMessageTagHelper
2475
{
2576
For = CreateModelExpression("Hello")
2677
};
27-
var called = false;
2878
var output = new TagHelperOutput(
2979
"span",
3080
attributes: new Dictionary<string, string>(),
3181
content: "Content of validation message");
32-
3382
var expectedViewContext = CreateViewContext();
3483
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"));
84+
var setup = generator.Setup(mock =>
85+
mock.GenerateValidationMessage(expectedViewContext,
86+
"Hello",
87+
null,
88+
null,
89+
null));
90+
setup.Returns(new TagBuilder("span"));
91+
setup.Verifiable();
5392

5493
SetViewContextAndGenerator(validationMessageTagHelper, expectedViewContext, generator.Object);
5594

5695
// Act & Assert
57-
validationMessageTagHelper.Process(context: null, output: output);
96+
await validationMessageTagHelper.ProcessAsync(context: null, output: output);
5897

59-
Assert.True(called);
98+
generator.Verify();
99+
Assert.Equal("span", output.TagName);
100+
Assert.Empty(output.Attributes);
101+
Assert.Equal("Content of validation message", output.Content);
60102
}
61103

62-
[Fact]
63-
public void Process_MergesTagBuilderFromGenerateValidationMessage()
104+
[Theory]
105+
[InlineData("Content of validation message", "Content of validation message")]
106+
[InlineData("\r\n \r\n", "New HTML")]
107+
public async Task ProcessAsync_MergesTagBuilderFromGenerateValidationMessage(
108+
string outputContent, string expectedOutputContent)
64109
{
65110
// Arrange
66111
var validationMessageTagHelper = new ValidationMessageTagHelper
@@ -70,58 +115,57 @@ public void Process_MergesTagBuilderFromGenerateValidationMessage()
70115
var output = new TagHelperOutput(
71116
"span",
72117
attributes: new Dictionary<string, string>(),
73-
content: "Content of validation message");
118+
content: outputContent);
74119
var tagBuilder = new TagBuilder("span2")
75120
{
76121
InnerHtml = "New HTML"
77122
};
78-
79123
tagBuilder.Attributes.Add("data-foo", "bar");
80124
tagBuilder.Attributes.Add("data-hello", "world");
81125

82126
var expectedViewContext = CreateViewContext();
83127
var generator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
84-
generator.Setup(mock =>
128+
var setup = generator.Setup(mock =>
85129
mock.GenerateValidationMessage(It.IsAny<ViewContext>(),
86130
It.IsAny<string>(),
87131
It.IsAny<string>(),
88132
It.IsAny<string>(),
89-
It.IsAny<object>()))
90-
.Returns(tagBuilder);
133+
It.IsAny<object>()));
134+
setup.Returns(tagBuilder);
91135

92136
SetViewContextAndGenerator(validationMessageTagHelper, expectedViewContext, generator.Object);
93137

94138
// Act
95-
validationMessageTagHelper.Process(context: null, output: output);
139+
await validationMessageTagHelper.ProcessAsync(context: null, output: output);
96140

97141
// Assert
98-
Assert.Equal(output.TagName, "span2");
142+
Assert.Equal(output.TagName, "span");
99143
Assert.Equal(2, output.Attributes.Count);
100144
var attribute = Assert.Single(output.Attributes, kvp => kvp.Key.Equals("data-foo"));
101145
Assert.Equal("bar", attribute.Value);
102146
attribute = Assert.Single(output.Attributes, kvp => kvp.Key.Equals("data-hello"));
103147
Assert.Equal("world", attribute.Value);
104-
Assert.Equal("New HTML", output.Content);
148+
Assert.Equal(expectedOutputContent, output.Content);
105149
}
106150

107151
[Fact]
108-
public void Process_DoesNothingIfNullFor()
152+
public async Task ProcessAsync_DoesNothingIfNullFor()
109153
{
110154
// Arrange
111155
var validationMessageTagHelper = new ValidationMessageTagHelper();
112156
var output = new TagHelperOutput(
113157
"span",
114158
attributes: new Dictionary<string, string>(),
115159
content: "Content of validation message");
116-
117160
var expectedViewContext = CreateViewContext();
118161
var generator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
119162

120163
SetViewContextAndGenerator(validationMessageTagHelper, expectedViewContext, generator.Object);
121164

122-
// Act & Assert
123-
validationMessageTagHelper.Process(context: null, output: output);
165+
// Act
166+
await validationMessageTagHelper.ProcessAsync(context: null, output: output);
124167

168+
// Assert
125169
Assert.Equal("span", output.TagName);
126170
Assert.Empty(output.Attributes);
127171
Assert.Equal("Content of validation message", output.Content);

0 commit comments

Comments
 (0)