// Copyright (c) .NET Foundation. 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.Collections.Generic; using Microsoft.AspNetCore.Http; using Xunit; namespace Microsoft.AspNetCore.Mvc.ViewFeatures { public class TempDataDictionaryTest { [Fact] public void ThrowscdException_OnSettingValue_AndWhenSessionIsNotEnabled() { // Arrange var tempData = new TempDataDictionary(new DefaultHttpContext(), new SessionStateTempDataProvider()); // Act & Assert Assert.Throws(() => { tempData["key1"] = "value1"; }); } [Fact] public void Keep_DoesNotThrowException_WhenDataIsNotLoaded() { // Arrange var tempData = new TempDataDictionary(new DefaultHttpContext(), new SessionStateTempDataProvider()); // Act & Assert tempData.Keep(); } [Fact] public void TempData_Load_CreatesEmptyDictionaryIfProviderReturnsNull() { // Arrange var tempData = new TempDataDictionary(new DefaultHttpContext(), new NullTempDataProvider()); // Act tempData.Load(); // Assert Assert.Empty(tempData); } [Fact] public void TempData_Save_RemovesKeysThatWereRead() { // Arrange var tempData = new TempDataDictionary(new DefaultHttpContext(), new NullTempDataProvider()); tempData["Foo"] = "Foo"; tempData["Bar"] = "Bar"; // Act var value = tempData["Foo"]; tempData.Save(); // Assert Assert.False(tempData.ContainsKey("Foo")); Assert.True(tempData.ContainsKey("Bar")); } [Fact] public void TempData_EnumeratingDictionary_MarksKeysForDeletion() { // Arrange var tempData = new TempDataDictionary(new DefaultHttpContext(), new NullTempDataProvider()); tempData["Foo"] = "Foo"; tempData["Bar"] = "Bar"; // Act var enumerator = tempData.GetEnumerator(); while (enumerator.MoveNext()) { var value = enumerator.Current; } tempData.Save(); // Assert Assert.False(tempData.ContainsKey("Foo")); Assert.False(tempData.ContainsKey("Bar")); } [Fact] public void TempData_TryGetValue_MarksKeyForDeletion() { var tempData = new TempDataDictionary(new DefaultHttpContext(), new NullTempDataProvider()); object value; tempData["Foo"] = "Foo"; // Act tempData.TryGetValue("Foo", out value); tempData.Save(); // Assert Assert.False(tempData.ContainsKey("Foo")); } [Fact] public void TempData_Keep_RetainsAllKeysWhenSavingDictionary() { // Arrange var tempData = new TempDataDictionary(new DefaultHttpContext(), new NullTempDataProvider()); tempData["Foo"] = "Foo"; tempData["Bar"] = "Bar"; // Act tempData.Keep(); tempData.Save(); // Assert Assert.True(tempData.ContainsKey("Foo")); Assert.True(tempData.ContainsKey("Bar")); } [Fact] public void TempData_Keep_RetainsSpecificKeysWhenSavingDictionary() { // Arrange var tempData = new TempDataDictionary(new DefaultHttpContext(), new NullTempDataProvider()); tempData["Foo"] = "Foo"; tempData["Bar"] = "Bar"; // Act var foo = tempData["Foo"]; var bar = tempData["Bar"]; tempData.Keep("Foo"); tempData.Save(); // Assert Assert.True(tempData.ContainsKey("Foo")); Assert.False(tempData.ContainsKey("Bar")); } [Fact] public void TempData_Peek_DoesNotMarkKeyForDeletion() { // Arrange var tempData = new TempDataDictionary(new DefaultHttpContext(), new NullTempDataProvider()); tempData["Bar"] = "barValue"; // Act var value = tempData.Peek("bar"); tempData.Save(); // Assert Assert.Equal("barValue", value); Assert.True(tempData.ContainsKey("Bar")); } [Fact] public void TempData_CompareIsOrdinalIgnoreCase() { // Arrange var tempData = new TempDataDictionary(new DefaultHttpContext(), new NullTempDataProvider()); var item = new object(); // Act tempData["Foo"] = item; var value = tempData["FOO"]; // Assert Assert.Same(item, value); } [Fact] public void TempData_LoadAndSaveAreCaseInsensitive() { // Arrange var data = new Dictionary(); data["Foo"] = "Foo"; data["Bar"] = "Bar"; var provider = new TestTempDataProvider(data); var tempData = new TempDataDictionary(new DefaultHttpContext(), provider); // Act tempData.Load(); var value = tempData["FOO"]; tempData.Save(); // Assert Assert.False(tempData.ContainsKey("foo")); Assert.True(tempData.ContainsKey("bar")); } [Fact] public void TempData_RemovalOfKeysAreCaseInsensitive() { var tempData = new TempDataDictionary(new DefaultHttpContext(), new NullTempDataProvider()); object fooValue; tempData["Foo"] = "Foo"; tempData["Bar"] = "Bar"; // Act tempData.TryGetValue("foo", out fooValue); var barValue = tempData["bar"]; tempData.Save(); // Assert Assert.False(tempData.ContainsKey("Foo")); Assert.False(tempData.ContainsKey("Boo")); } private class NullTempDataProvider : ITempDataProvider { public IDictionary LoadTempData(HttpContext context) { return null; } public void SaveTempData(HttpContext context, IDictionary values) { } } private class TestTempDataProvider : ITempDataProvider { private IDictionary _data; public TestTempDataProvider(IDictionary data) { _data = data; } public IDictionary LoadTempData(HttpContext context) { return _data; } public void SaveTempData(HttpContext context, IDictionary values) { } } } }