using System.Text; using Microsoft.AspNetCore.Http; using Moq; using Newtonsoft.Json; namespace AMWD.Common.AspNetCore.Tests.Extensions { [TestClass] public class SessionExtensionsTest { private Mock _sessionMock; private string _sessionKey; private byte[] _sessionValue; private TestModel _model; internal class TestModel { public string ValueA { get; set; } public string ValueB { get; set; } } [TestInitialize] public void InitializeTests() { _sessionKey = null; _sessionValue = null; _model = new TestModel { ValueA = "A", ValueB = "B" }; } [TestMethod] public void ShouldCheckKeyExists() { // arrange _sessionKey = "exists"; var session = GetSession(); // act bool result1 = session.HasKey("exists"); bool result2 = session.HasKey("somewhere"); // assert Assert.IsTrue(result1); Assert.IsFalse(result2); } [TestMethod] public void ShouldGetValue() { // arrange _sessionKey = "test"; _sessionValue = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(_model)); var session = GetSession(); // act var result = session.GetValue(_sessionKey); // assert Assert.IsNotNull(result); Assert.AreEqual(_model.ValueA, result.ValueA); Assert.AreEqual(_model.ValueB, result.ValueB); } [TestMethod] public void ShouldGetNull() { // arrange _sessionKey = "foo"; _sessionValue = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(_model)); var session = GetSession(); // act var result = session.GetValue("bar"); // assert Assert.IsNull(result); } [TestMethod] public void ShouldGetValueWithFallback() { // arrange _sessionKey = "test"; _sessionValue = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(_model)); var session = GetSession(); // act var result = session.GetValue(_sessionKey, new TestModel()); // assert Assert.IsNotNull(result); Assert.AreEqual(_model.ValueA, result.ValueA); Assert.AreEqual(_model.ValueB, result.ValueB); } [TestMethod] public void ShouldGetFallback() { // arrange _sessionKey = "foo"; _sessionValue = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(_model)); var session = GetSession(); // act var result = session.GetValue("bar", new TestModel()); // assert Assert.IsNotNull(result); Assert.AreEqual(null, result.ValueA); Assert.AreEqual(null, result.ValueB); } [TestMethod] public void ShouldSetValue() { // arrange string key = "foobar"; var session = GetSession(); // act session.SetValue(key, _model); // arrange Assert.AreEqual(key, _sessionKey); Assert.AreEqual(JsonConvert.SerializeObject(_model), Encoding.UTF8.GetString(_sessionValue)); } private ISession GetSession() { string[] keys = [_sessionKey]; _sessionMock = new Mock(); _sessionMock .Setup(s => s.TryGetValue(It.IsAny(), out _sessionValue)) .Returns((key, value) => _sessionKey == key); _sessionMock .Setup(s => s.Set(It.IsAny(), It.IsAny())) .Callback((key, value) => { _sessionKey = key; _sessionValue = value; }); _sessionMock .Setup(s => s.Keys) .Returns(keys); return _sessionMock.Object; } } }