[Fixes #2157] Added additional functional tests for TempData

This commit is contained in:
Ajay Bhargav Baaskaran 2015-03-13 17:11:12 -07:00
parent ab31be20ed
commit 9c1e2f54a5
4 changed files with 144 additions and 0 deletions

View File

@ -43,6 +43,12 @@ namespace Microsoft.AspNet.Mvc
// If we got it from Session, remove it so that no other request gets it
session.Remove(TempDataSessionStateKey);
}
else
{
// Since we call Save() after the response has been sent, we need to initialize an empty session
// so that it is established before the headers are sent.
session[TempDataSessionStateKey] = new byte[] { };
}
return tempDataDictionary;
}

View File

@ -90,6 +90,7 @@ namespace Microsoft.AspNet.Mvc
if (sessionEnabled)
{
httpContext.Setup(h => h.GetFeature<ISessionFeature>()).Returns(Mock.Of<ISessionFeature>());
httpContext.Setup(h => h.Session[It.IsAny<string>()]);
}
return httpContext.Object;
}

View File

@ -18,6 +18,39 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests
private readonly Action<IApplicationBuilder> _app = new TempDataWebSite.Startup().Configure;
private readonly Action<IServiceCollection> _configureServices = new TempDataWebSite.Startup().ConfigureServices;
[Fact]
public async Task TempData_PersistsJustForNextRequest()
{
// Arrange
var server = TestHelper.CreateServer(_app, SiteName, _configureServices);
var client = server.CreateClient();
var nameValueCollection = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("value", "Foo"),
};
var content = new FormUrlEncodedContent(nameValueCollection);
// Act 1
var response = await client.PostAsync("/Home/SetTempData", content);
// Assert 1
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
// Act 2
response = await client.SendAsync(GetRequest("Home/GetTempData", response));
// Assert 2
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var body = await response.Content.ReadAsStringAsync();
Assert.Equal("Foo", body);
// Act 3
response = await client.SendAsync(GetRequest("Home/GetTempData", response));
// Assert 3
Assert.Equal(HttpStatusCode.NoContent, response.StatusCode);
}
[Fact]
public async Task ViewRendersTempData()
{
@ -38,5 +71,85 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests
var body = await response.Content.ReadAsStringAsync();
Assert.Equal("Foo", body);
}
[Fact]
public async Task Redirect_RetainsTempData_EvenIfAccessed()
{
// Arrange
var server = TestHelper.CreateServer(_app, SiteName, _configureServices);
var client = server.CreateClient();
var nameValueCollection = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("value", "Foo"),
};
var content = new FormUrlEncodedContent(nameValueCollection);
// Act 1
var response = await client.PostAsync("/Home/SetTempData", content);
// Assert 1
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
// Act 2
var redirectResponse = await client.SendAsync(GetRequest("/Home/GetTempDataAndRedirect", response));
// Assert 2
Assert.Equal(HttpStatusCode.Redirect, redirectResponse.StatusCode);
// Act 3
response = await client.SendAsync(GetRequest(redirectResponse.Headers.Location.ToString(), response));
// Assert 3
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var body = await response.Content.ReadAsStringAsync();
Assert.Equal("Foo", body);
}
[Fact]
public async Task Peek_RetainsTempData()
{
// Arrange
var server = TestHelper.CreateServer(_app, SiteName, _configureServices);
var client = server.CreateClient();
var nameValueCollection = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("value", "Foo"),
};
var content = new FormUrlEncodedContent(nameValueCollection);
// Act 1
var response = await client.PostAsync("/Home/SetTempData", content);
// Assert 1
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
// Act 2
var peekResponse = await client.SendAsync(GetRequest("/Home/PeekTempData", response));
// Assert 2
Assert.Equal(HttpStatusCode.OK, peekResponse.StatusCode);
var body = await peekResponse.Content.ReadAsStringAsync();
Assert.Equal("Foo", body);
// Act 3
var getResponse = await client.SendAsync(GetRequest("/Home/GetTempData", response));
// Assert 3
Assert.Equal(HttpStatusCode.OK, getResponse.StatusCode);
body = await getResponse.Content.ReadAsStringAsync();
Assert.Equal("Foo", body);
}
private HttpRequestMessage GetRequest(string path, HttpResponseMessage response)
{
var request = new HttpRequestMessage(HttpMethod.Get, path);
IEnumerable<string> values;
if (response.Headers.TryGetValues("Set-Cookie", out values))
{
request.Headers.Add("Cookie", values);
}
return request;
}
}
}

View File

@ -17,5 +17,29 @@ namespace TempDataWebSite.Controllers
TempData["key"] = value;
return View();
}
public IActionResult SetTempData(string value)
{
TempData["key"] = value;
return Content(value);
}
public IActionResult GetTempDataAndRedirect()
{
var value = TempData["key"];
return RedirectToAction("GetTempData");
}
public string GetTempData()
{
var value = TempData["key"];
return value?.ToString();
}
public IActionResult PeekTempData()
{
var peekValue = TempData.Peek("key");
return Content(peekValue.ToString());
}
}
}