added few taghelper functional tests

This commit is contained in:
Ajay Bhargav Baaskaran 2014-12-11 13:43:32 -08:00
parent 50d9beae17
commit 04c37a8d51
10 changed files with 560 additions and 1 deletions

View File

@ -2,7 +2,9 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Reflection;
using System.Threading.Tasks;
@ -72,5 +74,79 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests
// Assert
Assert.Equal(expected, result.Trim());
}
[Fact]
public async Task ViewsWithModelMetadataAttributes_CanRenderForm()
{
// Arrange
var server = TestServer.Create(_provider, _app);
var client = server.CreateClient();
var expectedContent = await _resourcesAssembly.ReadResourceAsStringAsync(
"compiler/resources/TagHelpersWebSite.Employee.Create.html");
// Act
var response = await client.GetAsync("http://localhost/Employee/Create");
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var responseContent = await response.Content.ReadAsStringAsync();
Assert.Equal(expectedContent, responseContent);
}
[Fact]
public async Task ViewsWithModelMetadataAttributes_CanRenderPostedValue()
{
// Arrange
var server = TestServer.Create(_provider, _app);
var client = server.CreateClient();
var expectedContent = await _resourcesAssembly.ReadResourceAsStringAsync(
"compiler/resources/TagHelpersWebSite.Employee.Details.AfterCreate.html");
var validPostValues = new Dictionary<string, string>
{
{ "FullName", "Boo" },
{ "Gender", "M" },
{ "Age", "22" },
{ "EmployeeId", "0" },
{ "JoinDate", "2014-12-01" },
{ "Email", "a@b.com" },
};
var postContent = new FormUrlEncodedContent(validPostValues);
// Act
var response = await client.PostAsync("http://localhost/Employee/Create", postContent);
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var responseContent = await response.Content.ReadAsStringAsync();
Assert.Equal(expectedContent, responseContent);
}
[Fact]
public async Task ViewsWithModelMetadataAttributes_CanHandleInvalidData()
{
// Arrange
var server = TestServer.Create(_provider, _app);
var client = server.CreateClient();
var expectedContent = await _resourcesAssembly.ReadResourceAsStringAsync(
"compiler/resources/TagHelpersWebSite.Employee.Create.Invalid.html");
var validPostValues = new Dictionary<string, string>
{
{ "FullName", "Boo" },
{ "Gender", "M" },
{ "Age", "1000" },
{ "EmployeeId", "0" },
{ "Email", "a@b.com" },
{ "Salary", "z" },
};
var postContent = new FormUrlEncodedContent(validPostValues);
// Act
var response = await client.PostAsync("http://localhost/Employee/Create", postContent);
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var responseContent = await response.Content.ReadAsStringAsync();
Assert.Equal(expectedContent, responseContent);
}
}
}

View File

@ -0,0 +1,83 @@
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Create</title>
</head>
<body>
<form action="/Employee/Create" method="post">
<div class="form-horizontal">
<h4>Employee</h4>
<hr />
<div class="text-danger validation-summary-errors" data-valmsg-summary="true">
<ul><li>The field Age must be between 10 and 100.</li>
<li>The parameter conversion from type &#39;System.String&#39; to type &#39;System.Int32&#39; failed. See the inner exception for more information.</li>
<li>The JoinDate field is required.</li>
</ul></div>
<div class="form-group">
<label class="control-label col-md-2" for="Age">Age</label>
<div class="col-md-10">
<input class="form-control input-validation-error" type="number" data-val="true" data-val-range="The field Age must be between 10 and 100." data-val-range-max="100" data-val-range-min="10" id="Age" name="Age" value="1000" />
<span class="field-validation-error" data-valmsg-for="Age" data-valmsg-replace="true">The field Age must be between 10 and 100.</span>
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2" for="Email">Email</label>
<div class="col-md-10">
<input class="form-control" type="email" id="Email" name="Email" value="a@b.com" />
<span class="field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span>
</div>
</div>
<input type="hidden" Value="0" id="EmployeeId" name="EmployeeId" />
<div class="form-group">
<label class="control-label col-md-2" for="FullName">Full Name</label>
<div class="col-md-10">
<input class="form-control" type="text" id="FullName" name="FullName" value="Boo" />
<span class="field-validation-valid" data-valmsg-for="FullName" data-valmsg-replace="true"></span>
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2" for="Gender">Gender</label>
<div class="col-md-10">
<input type="radio" Value="M" checked="checked" id="Gender" name="Gender" /> Male
<input type="radio" Value="F" id="Gender" name="Gender" /> Female
<span class="field-validation-valid" data-valmsg-for="Gender" data-valmsg-replace="true"></span>
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2" for="JoinDate">JoinDate</label>
<div class="col-md-10">
<input class="form-control input-validation-error" type="date" data-val="true" data-val-required="The JoinDate field is required." id="JoinDate" name="JoinDate" value="1/1/0001 12:00:00 AM +00:00" />
<span class="field-validation-error" data-valmsg-for="JoinDate" data-valmsg-replace="true">The JoinDate field is required.</span>
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2" for="Salary">Salary</label>
<div class="col-md-10">
<input class="form-control input-validation-error" type="number" id="Salary" name="Salary" value="z" />
<span class="field-validation-error" data-valmsg-for="Salary" data-valmsg-replace="true">The parameter conversion from type &#39;System.String&#39; to type &#39;System.Int32&#39; failed. See the inner exception for more information.</span>
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input class="btn btn-default" type="submit" Value="Create"></input>
</div>
</div>
</div>
</form>
<div>
<a href="/Employee">Back to List</a>
</div>
</body>
</html>

View File

@ -0,0 +1,81 @@
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Create</title>
</head>
<body>
<form action="/Employee/Create" method="post">
<div class="form-horizontal">
<h4>Employee</h4>
<hr />
<div class="text-danger validation-summary-valid" data-valmsg-summary="true">
<ul><li style="display:none"></li>
</ul></div>
<div class="form-group">
<label class="control-label col-md-2" for="Age">Age</label>
<div class="col-md-10">
<input class="form-control" type="number" data-val="true" data-val-range="The field Age must be between 10 and 100." data-val-range-max="100" data-val-range-min="10" id="Age" name="Age" value="" />
<span class="field-validation-valid" data-valmsg-for="Age" data-valmsg-replace="true"></span>
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2" for="Email">Email</label>
<div class="col-md-10">
<input class="form-control" type="email" id="Email" name="Email" value="" />
<span class="field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span>
</div>
</div>
<input type="hidden" Value="0" id="EmployeeId" name="EmployeeId" />
<div class="form-group">
<label class="control-label col-md-2" for="FullName">Full Name</label>
<div class="col-md-10">
<input class="form-control" type="text" id="FullName" name="FullName" value="" />
<span class="field-validation-valid" data-valmsg-for="FullName" data-valmsg-replace="true"></span>
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2" for="Gender">Gender</label>
<div class="col-md-10">
<input type="radio" Value="M" id="Gender" name="Gender" /> Male
<input type="radio" Value="F" id="Gender" name="Gender" /> Female
<span class="field-validation-valid" data-valmsg-for="Gender" data-valmsg-replace="true"></span>
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2" for="JoinDate">JoinDate</label>
<div class="col-md-10">
<input class="form-control" type="date" data-val="true" data-val-required="The JoinDate field is required." id="JoinDate" name="JoinDate" value="" />
<span class="field-validation-valid" data-valmsg-for="JoinDate" data-valmsg-replace="true"></span>
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2" for="Salary">Salary</label>
<div class="col-md-10">
<input class="form-control" type="number" id="Salary" name="Salary" value="" />
<span class="field-validation-valid" data-valmsg-for="Salary" data-valmsg-replace="true"></span>
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input class="btn btn-default" type="submit" Value="Create"></input>
</div>
</div>
</div>
</form>
<div>
<a href="/Employee">Back to List</a>
</div>
</body>
</html>

View File

@ -0,0 +1,61 @@
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Details</title>
</head>
<body>
<div>
<h4>Employee</h4>
<hr />
<dl class="dl-horizontal">
<dt>
Age
</dt>
<dd>
22
</dd>
<dt>
Email
</dt>
<dd>
<a href="mailto:a@b.com">a@b.com</a>
</dd>
<dt>
Full Name
</dt>
<dd>
Boo
</dd>
<dt>
Gender
</dt>
<dd>
M
</dd>
<dt>
JoinDate
</dt>
<dd>
12/1/2014
</dd>
<dt>
Salary
</dt>
<dd>
Not specified
</dd>
</dl>
</div>
<p>
<a href="/Employee">Back to List</a>
</p>
</body>
</html>

View File

@ -0,0 +1,42 @@

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<p>
<a href="/Employee/Create">Create New</a>
</p>
<table class="table">
<tr>
<th>
Age
</th>
<th>
Email
</th>
<th>
Full Name
</th>
<th>
Gender
</th>
<th>
JoinDate
</th>
<th>
Salary
</th>
<th></th>
</tr>
</table>
</body>
</html>

View File

@ -0,0 +1,35 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Linq;
using Microsoft.AspNet.Mvc;
using TagHelpersWebSite.Models;
namespace TagHelpersWebSite.Controllers
{
public class EmployeeController : Controller
{
// GET: Employee
public string Index()
{
return "Index Page";
}
// GET: Employee/Create
public IActionResult Create()
{
return View();
}
// POST: Employee/Create
[HttpPost]
public IActionResult Create(Employee employee)
{
if (ModelState.IsValid)
{
return View("Details", employee);
}
return View(employee);
}
}
}

View File

@ -0,0 +1,32 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.ComponentModel.DataAnnotations;
namespace TagHelpersWebSite.Models
{
public class Employee
{
public int EmployeeId { get; set; }
[Display(Name = "Full Name", ShortName = "FN")]
public string FullName { get; set; }
[DisplayFormat(NullDisplayText = "Not specified")]
public string Gender { get; set; }
[Range(10, 100)]
public int Age { get; set; }
[Required]
[DataType(DataType.Date)]
public DateTimeOffset JoinDate { get; set; }
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[DisplayFormat(NullDisplayText = "Not specified")]
public int? Salary { get; set; }
}
}

View File

@ -0,0 +1,85 @@
@model TagHelpersWebSite.Models.Employee
@addtaghelper "Microsoft.AspNet.Mvc.TagHelpers"
@{
Layout = null;
Html.Html5DateRenderingMode = Html5DateRenderingMode.Rfc3339;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Create</title>
</head>
<body>
<form asp-anti-forgery="false" asp-action="Create">
<div class="form-horizontal">
<h4>Employee</h4>
<hr />
<div asp-validation-summary="All" class="text-danger">
</div>
<div class="form-group">
<label asp-for="Age" class="control-label col-md-2" />
<div class="col-md-10">
<input asp-for="Age" class="form-control" />
<span asp-validation-for="Age" />
</div>
</div>
<div class="form-group">
<label asp-for="Email" class="control-label col-md-2" />
<div class="col-md-10">
<input asp-for="Email" class="form-control" />
<span asp-validation-for="Email" />
</div>
</div>
<input type="hidden" asp-for="EmployeeId" value="0" />
<div class="form-group">
<label asp-for="FullName" class="control-label col-md-2" />
<div class="col-md-10">
<input asp-for="FullName" class="form-control" />
<span asp-validation-for="FullName" />
</div>
</div>
<div class="form-group">
<label asp-for="Gender" class="control-label col-md-2" />
<div class="col-md-10">
<input type="radio" asp-for="Gender" value="M" /> Male
<input type="radio" asp-for="Gender" value="F" /> Female
<span asp-validation-for="Gender" />
</div>
</div>
<div class="form-group">
<label asp-for="JoinDate" class="control-label col-md-2" />
<div class="col-md-10">
<input asp-for="JoinDate" class="form-control" />
<span asp-validation-for="JoinDate" />
</div>
</div>
<div class="form-group">
<label asp-for="Salary" class="control-label col-md-2" />
<div class="col-md-10">
<input asp-for="Salary" class="form-control" />
<span asp-validation-for="Salary" />
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
</form>
<div>
<a asp-action="Index">Back to List</a>
</div>
</body>
</html>

View File

@ -0,0 +1,64 @@
@model TagHelpersWebSite.Models.Employee
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Details</title>
</head>
<body>
<div>
<h4>Employee</h4>
<hr />
<dl class="dl-horizontal">
<dt>
@Html.DisplayNameFor(model => model.Age)
</dt>
<dd>
@Html.DisplayFor(model => model.Age)
</dd>
<dt>
@Html.DisplayNameFor(model => model.Email)
</dt>
<dd>
@Html.DisplayFor(model => model.Email)
</dd>
<dt>
@Html.DisplayNameFor(model => model.FullName)
</dt>
<dd>
@Html.DisplayFor(model => model.FullName)
</dd>
<dt>
@Html.DisplayNameFor(model => model.Gender)
</dt>
<dd>
@Html.DisplayFor(model => model.Gender)
</dd>
<dt>
@Html.DisplayNameFor(model => model.JoinDate)
</dt>
<dd>
@Html.DisplayFor(model => model.JoinDate)
</dd>
<dt>
@Html.DisplayNameFor(model => model.Salary)
</dt>
<dd>
@Html.DisplayFor(model => model.Salary)
</dd>
</dl>
</div>
<p>
@Html.ActionLink("Back to List", "Index")
</p>
</body>
</html>

View File

@ -9,7 +9,7 @@
"Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-*",
"Microsoft.AspNet.Mvc.TestConfiguration": "1.0.0",
"Microsoft.AspNet.Server.IIS": "1.0.0-*",
"Microsoft.AspNet.Server.WebListener": "1.0.0-*",
"Microsoft.AspNet.Server.WebListener": "1.0.0-*",
"Microsoft.AspNet.StaticFiles": "1.0.0-*"
},
"frameworks": {