added few taghelper functional tests
This commit is contained in:
parent
50d9beae17
commit
04c37a8d51
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 'System.String' to type 'System.Int32' 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 'System.String' to type 'System.Int32' 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>
|
||||
|
||||
|
|
@ -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>
|
||||
|
||||
|
|
@ -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>
|
||||
|
||||
|
|
@ -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>
|
||||
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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; }
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
||||
|
|
@ -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>
|
||||
|
||||
|
|
@ -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": {
|
||||
|
|
|
|||
Loading…
Reference in New Issue