Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

169 lines
7.1 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Collections.Generic;
using Moq;
using Xunit;
using Assert = Microsoft.TestCommon.AssertEx;
namespace System.Web.Mvc.Test
{
public class SessionStateTempDataProviderTest
{
[Fact]
public void Load_NullSession_ReturnsEmptyDictionary()
{
// Arrange
SessionStateTempDataProvider testProvider = new SessionStateTempDataProvider();
// Act
IDictionary<string, object> tempDataDictionary = testProvider.LoadTempData(GetControllerContext());
// Assert
Assert.Empty(tempDataDictionary);
}
[Fact]
public void Load_NonNullSession_NoSessionData_ReturnsEmptyDictionary()
{
// Arrange
SessionStateTempDataProvider testProvider = new SessionStateTempDataProvider();
Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
Mock<HttpSessionStateBase> mockSessionStateBase = new Mock<HttpSessionStateBase>();
mockControllerContext.Setup(c => c.HttpContext.Session).Returns(mockSessionStateBase.Object);
// Act
IDictionary<string, object> result = testProvider.LoadTempData(mockControllerContext.Object);
// Assert
Assert.Empty(result);
}
[Fact]
public void Load_NonNullSession_IncorrectSessionDataType_ReturnsEmptyDictionary()
{
// Arrange
SessionStateTempDataProvider testProvider = new SessionStateTempDataProvider();
Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
Mock<HttpSessionStateBase> mockSessionStateBase = new Mock<HttpSessionStateBase>();
mockControllerContext.Setup(c => c.HttpContext.Session).Returns(mockSessionStateBase.Object);
mockSessionStateBase.Setup(ssb => ssb[SessionStateTempDataProvider.TempDataSessionStateKey]).Returns(42);
// Act
IDictionary<string, object> result = testProvider.LoadTempData(mockControllerContext.Object);
// Assert
Assert.Empty(result);
}
[Fact]
public void Load_NonNullSession_CorrectSessionDataType_ReturnsSessionData()
{
// Arrange
SessionStateTempDataProvider testProvider = new SessionStateTempDataProvider();
Dictionary<string, object> tempData = new Dictionary<string, object> { { "foo", "bar" } };
Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
Mock<HttpSessionStateBase> mockSessionStateBase = new Mock<HttpSessionStateBase>();
mockControllerContext.Setup(c => c.HttpContext.Session).Returns(mockSessionStateBase.Object);
mockSessionStateBase.Setup(ssb => ssb[SessionStateTempDataProvider.TempDataSessionStateKey]).Returns(tempData);
// Act
var result = testProvider.LoadTempData(mockControllerContext.Object);
// Assert
Assert.Same(tempData, result);
}
[Fact]
public void Save_NullSession_NullDictionary_DoesNotThrow()
{
// Arrange
SessionStateTempDataProvider testProvider = new SessionStateTempDataProvider();
// Act
testProvider.SaveTempData(GetControllerContext(), null);
}
[Fact]
public void Save_NullSession_EmptyDictionary_DoesNotThrow()
{
// Arrange
SessionStateTempDataProvider testProvider = new SessionStateTempDataProvider();
// Act
testProvider.SaveTempData(GetControllerContext(), new Dictionary<string, object>());
}
[Fact]
public void Save_NullSession_NonEmptyDictionary_Throws()
{
// Arrange
SessionStateTempDataProvider testProvider = new SessionStateTempDataProvider();
// Act & Assert
Assert.Throws<InvalidOperationException>(
delegate { testProvider.SaveTempData(GetControllerContext(), new Dictionary<string, object> { { "foo", "bar" } }); },
"The SessionStateTempDataProvider class requires session state to be enabled.");
}
[Fact]
public void Save_NonNullSession_TempDataIsDirty_AssignsTempDataDictionaryIntoSession()
{
// Arrange
SessionStateTempDataProvider testProvider = new SessionStateTempDataProvider();
Dictionary<string, object> tempData = new Dictionary<string, object> { { "foo", "bar" } };
Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
Mock<HttpSessionStateBase> mockSessionStateBase = new Mock<HttpSessionStateBase>();
mockControllerContext.Setup(c => c.HttpContext.Session).Returns(mockSessionStateBase.Object);
mockSessionStateBase.SetupSet(ssb => ssb[SessionStateTempDataProvider.TempDataSessionStateKey] = tempData);
// Act
testProvider.SaveTempData(mockControllerContext.Object, tempData);
// Assert
mockSessionStateBase.VerifyAll();
}
[Fact]
public void Save_NonNullSession_TempDataIsNotDirty_KeyDoesNotExistInSession_SessionRemainsUntouched()
{
// Arrange
SessionStateTempDataProvider testProvider = new SessionStateTempDataProvider();
Dictionary<string, object> tempData = new Dictionary<string, object>();
Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>(MockBehavior.Strict);
mockControllerContext.Setup(o => o.HttpContext.Session[SessionStateTempDataProvider.TempDataSessionStateKey]).Returns(null);
// Act
testProvider.SaveTempData(mockControllerContext.Object, tempData);
// Assert
mockControllerContext.Verify();
}
[Fact]
public void Save_NonNullSession_TempDataIsNotDirty_KeyExistsInSession_KeyRemovedFromSession()
{
// Arrange
SessionStateTempDataProvider testProvider = new SessionStateTempDataProvider();
Dictionary<string, object> tempData = new Dictionary<string, object>();
Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>(MockBehavior.Strict);
mockControllerContext.Setup(o => o.HttpContext.Session[SessionStateTempDataProvider.TempDataSessionStateKey]).Returns(new object());
mockControllerContext.Setup(o => o.HttpContext.Session.Remove(SessionStateTempDataProvider.TempDataSessionStateKey)).Verifiable();
// Act
testProvider.SaveTempData(mockControllerContext.Object, tempData);
// Assert
mockControllerContext.Verify();
}
private static ControllerContext GetControllerContext()
{
Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
mockControllerContext.Setup(c => c.HttpContext.Session).Returns((HttpSessionStateBase)null);
return mockControllerContext.Object;
}
}
}