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

634 lines
27 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Collections.Generic;
using System.Linq;
using Moq;
using Xunit;
using Assert = Microsoft.TestCommon.AssertEx;
namespace System.Web.Mvc.Test
{
public class ViewEngineCollectionTest
{
[Fact]
public void ListWrappingConstructor()
{
// Arrange
List<IViewEngine> list = new List<IViewEngine>() { new Mock<IViewEngine>().Object, new Mock<IViewEngine>().Object };
// Act
ViewEngineCollection collection = new ViewEngineCollection(list);
// Assert
Assert.Equal(2, collection.Count);
Assert.Same(list[0], collection[0]);
Assert.Same(list[1], collection[1]);
}
[Fact]
public void ListWrappingConstructorThrowsIfListIsNull()
{
// Act & Assert
Assert.ThrowsArgumentNull(
delegate { new ViewEngineCollection((IList<IViewEngine>)null); },
"list");
}
[Fact]
public void DefaultConstructor()
{
// Act
ViewEngineCollection collection = new ViewEngineCollection();
// Assert
Assert.Empty(collection);
}
[Fact]
public void AddNullViewEngineThrows()
{
// Arrange
ViewEngineCollection collection = new ViewEngineCollection();
// Act & Assert
Assert.ThrowsArgumentNull(
delegate { collection.Add(null); },
"item");
}
[Fact]
public void SetNullViewEngineThrows()
{
// Arrange
ViewEngineCollection collection = new ViewEngineCollection();
collection.Add(new Mock<IViewEngine>().Object);
// Act & Assert
Assert.ThrowsArgumentNull(
delegate { collection[0] = null; },
"item");
}
[Fact]
public void FindPartialViewAggregatesAllSearchedLocationsIfAllEnginesFail()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
ViewEngineCollection viewEngineCollection = new ViewEngineCollection();
Mock<IViewEngine> engine1 = new Mock<IViewEngine>();
ViewEngineResult engine1Result = new ViewEngineResult(new[] { "location1", "location2" });
engine1.Setup(e => e.FindPartialView(context, "partial", It.IsAny<bool>())).Returns(engine1Result);
Mock<IViewEngine> engine2 = new Mock<IViewEngine>();
ViewEngineResult engine2Result = new ViewEngineResult(new[] { "location3", "location4" });
engine2.Setup(e => e.FindPartialView(context, "partial", It.IsAny<bool>())).Returns(engine2Result);
viewEngineCollection.Add(engine1.Object);
viewEngineCollection.Add(engine2.Object);
// Act
ViewEngineResult result = viewEngineCollection.FindPartialView(context, "partial");
// Assert
Assert.Null(result.View);
Assert.Equal(4, result.SearchedLocations.Count());
Assert.True(result.SearchedLocations.Contains("location1"));
Assert.True(result.SearchedLocations.Contains("location2"));
Assert.True(result.SearchedLocations.Contains("location3"));
Assert.True(result.SearchedLocations.Contains("location4"));
}
[Fact]
public void FindPartialViewFailureWithOneEngine()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
ViewEngineCollection collection = new ViewEngineCollection();
Mock<IViewEngine> engine = new Mock<IViewEngine>();
ViewEngineResult engineResult = new ViewEngineResult(new[] { "location1", "location2" });
engine.Setup(e => e.FindPartialView(context, "partial", It.IsAny<bool>())).Returns(engineResult);
collection.Add(engine.Object);
// Act
ViewEngineResult result = collection.FindPartialView(context, "partial");
// Assert
Assert.Null(result.View);
Assert.Equal(2, result.SearchedLocations.Count());
Assert.True(result.SearchedLocations.Contains("location1"));
Assert.True(result.SearchedLocations.Contains("location2"));
}
[Fact]
public void FindPartialViewLooksAtCacheFirst()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
Mock<IViewEngine> engine = new Mock<IViewEngine>();
ViewEngineResult engineResult = new ViewEngineResult(new Mock<IView>().Object, engine.Object);
engine.Setup(e => e.FindPartialView(context, "partial", true)).Returns(engineResult);
ViewEngineCollection collection = new ViewEngineCollection()
{
engine.Object,
};
// Act
ViewEngineResult result = collection.FindPartialView(context, "partial");
// Assert
Assert.Same(engineResult, result);
engine.Verify(e => e.FindPartialView(context, "partial", true), Times.Once());
engine.Verify(e => e.FindPartialView(context, "partial", false), Times.Never());
}
[Fact]
public void FindPartialViewLooksAtLocatorIfCacheEmpty()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
Mock<IViewEngine> engine = new Mock<IViewEngine>();
ViewEngineResult engineResult = new ViewEngineResult(new Mock<IView>().Object, engine.Object);
engine.Setup(e => e.FindPartialView(context, "partial", true)).Returns(new ViewEngineResult(new[] { "path" }));
engine.Setup(e => e.FindPartialView(context, "partial", false)).Returns(engineResult);
ViewEngineCollection collection = new ViewEngineCollection()
{
engine.Object,
};
// Act
ViewEngineResult result = collection.FindPartialView(context, "partial");
// Assert
Assert.Same(engineResult, result);
engine.Verify(e => e.FindPartialView(context, "partial", true), Times.Once());
engine.Verify(e => e.FindPartialView(context, "partial", false), Times.Once());
}
[Fact]
public void FindPartialViewIgnoresSearchLocationsFromCache()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
Mock<IViewEngine> engine = new Mock<IViewEngine>();
engine.Setup(e => e.FindPartialView(context, "partial", true)).Returns(new ViewEngineResult(new[] { "cachePath" }));
engine.Setup(e => e.FindPartialView(context, "partial", false)).Returns(new ViewEngineResult(new[] { "locatorPath" }));
ViewEngineCollection collection = new ViewEngineCollection()
{
engine.Object,
};
// Act
ViewEngineResult result = collection.FindPartialView(context, "partial");
// Assert
string searchedLocation = Assert.Single(result.SearchedLocations);
Assert.Equal("locatorPath", searchedLocation);
engine.Verify(e => e.FindPartialView(context, "partial", true), Times.Once());
engine.Verify(e => e.FindPartialView(context, "partial", false), Times.Once());
}
[Fact]
public void FindPartialViewIteratesThroughCollectionUntilFindsSuccessfulEngine()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
ViewEngineCollection collection = new ViewEngineCollection();
Mock<IViewEngine> engine1 = new Mock<IViewEngine>();
ViewEngineResult engine1Result = new ViewEngineResult(new[] { "location1", "location2" });
engine1.Setup(e => e.FindPartialView(context, "partial", It.IsAny<bool>())).Returns(engine1Result);
Mock<IViewEngine> engine2 = new Mock<IViewEngine>();
ViewEngineResult engine2Result = new ViewEngineResult(new Mock<IView>().Object, engine2.Object);
engine2.Setup(e => e.FindPartialView(context, "partial", It.IsAny<bool>())).Returns(engine2Result);
collection.Add(engine1.Object);
collection.Add(engine2.Object);
// Act
ViewEngineResult result = collection.FindPartialView(context, "partial");
// Assert
Assert.Same(engine2Result, result);
}
[Fact]
public void FindPartialViewRemovesDuplicateSearchedLocationsFromMultipleEngines()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
Mock<IViewEngine> engine1 = new Mock<IViewEngine>();
ViewEngineResult engine1Result = new ViewEngineResult(new[] { "repeatLocation", "location1" });
engine1.Setup(e => e.FindPartialView(context, "partial", It.IsAny<bool>())).Returns(engine1Result);
Mock<IViewEngine> engine2 = new Mock<IViewEngine>();
ViewEngineResult engine2Result = new ViewEngineResult(new[] { "location2", "repeatLocation" });
engine2.Setup(e => e.FindPartialView(context, "partial", It.IsAny<bool>())).Returns(engine2Result);
ViewEngineCollection viewEngineCollection = new ViewEngineCollection()
{
engine1.Object,
engine2.Object,
};
// Act
ViewEngineResult result = viewEngineCollection.FindPartialView(context, "partial");
// Assert
var expectedLocations = new[] { "repeatLocation", "location1", "location2" };
Assert.Null(result.View);
Assert.Equal(expectedLocations, result.SearchedLocations.ToArray());
}
[Fact]
public void FindPartialViewReturnsNoViewAndEmptySearchedLocationsIfCollectionEmpty()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
ViewEngineCollection collection = new ViewEngineCollection();
// Act
ViewEngineResult result = collection.FindPartialView(context, "partial");
// Assert
Assert.Null(result.View);
Assert.Empty(result.SearchedLocations);
}
[Fact]
public void FindPartialViewReturnsValueFromFirstSuccessfulEngine()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
ViewEngineCollection collection = new ViewEngineCollection();
Mock<IViewEngine> engine1 = new Mock<IViewEngine>();
ViewEngineResult engine1Result = new ViewEngineResult(new Mock<IView>().Object, engine1.Object);
engine1.Setup(e => e.FindPartialView(context, "partial", It.IsAny<bool>())).Returns(engine1Result);
Mock<IViewEngine> engine2 = new Mock<IViewEngine>();
ViewEngineResult engine2Result = new ViewEngineResult(new Mock<IView>().Object, engine2.Object);
engine2.Setup(e => e.FindPartialView(context, "partial", It.IsAny<bool>())).Returns(engine2Result);
collection.Add(engine1.Object);
collection.Add(engine2.Object);
// Act
ViewEngineResult result = collection.FindPartialView(context, "partial");
// Assert
Assert.Same(engine1Result, result);
}
[Fact]
public void FindPartialViewSuccessWithOneEngine()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
ViewEngineCollection collection = new ViewEngineCollection();
Mock<IViewEngine> engine = new Mock<IViewEngine>();
ViewEngineResult engineResult = new ViewEngineResult(new Mock<IView>().Object, engine.Object);
engine.Setup(e => e.FindPartialView(context, "partial", It.IsAny<bool>())).Returns(engineResult);
collection.Add(engine.Object);
// Act
ViewEngineResult result = collection.FindPartialView(context, "partial");
// Assert
Assert.Same(engineResult, result);
}
[Fact]
public void FindPartialViewThrowsIfPartialViewNameIsEmpty()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
ViewEngineCollection collection = new ViewEngineCollection();
// Act & Assert
Assert.ThrowsArgumentNullOrEmpty(
() => collection.FindPartialView(context, ""),
"partialViewName");
}
[Fact]
public void FindPartialViewThrowsIfPartialViewNameIsNull()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
ViewEngineCollection collection = new ViewEngineCollection();
// Act & Assert
Assert.ThrowsArgumentNullOrEmpty(
() => collection.FindPartialView(context, null),
"partialViewName");
}
[Fact]
public void FindPartialViewThrowsIfControllerContextIsNull()
{
// Arrange
ViewEngineCollection collection = new ViewEngineCollection();
// Act & Assert
Assert.ThrowsArgumentNull(
() => collection.FindPartialView(null, "partial"),
"controllerContext");
}
[Fact]
public void FindViewAggregatesAllSearchedLocationsIfAllEnginesFail()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
ViewEngineCollection collection = new ViewEngineCollection();
Mock<IViewEngine> engine1 = new Mock<IViewEngine>();
ViewEngineResult engine1Result = new ViewEngineResult(new[] { "location1", "location2" });
engine1.Setup(e => e.FindView(context, "view", "master", It.IsAny<bool>())).Returns(engine1Result);
Mock<IViewEngine> engine2 = new Mock<IViewEngine>();
ViewEngineResult engine2Result = new ViewEngineResult(new[] { "location3", "location4" });
engine2.Setup(e => e.FindView(context, "view", "master", It.IsAny<bool>())).Returns(engine2Result);
collection.Add(engine1.Object);
collection.Add(engine2.Object);
// Act
ViewEngineResult result = collection.FindView(context, "view", "master");
// Assert
Assert.Null(result.View);
Assert.Equal(4, result.SearchedLocations.Count());
Assert.True(result.SearchedLocations.Contains("location1"));
Assert.True(result.SearchedLocations.Contains("location2"));
Assert.True(result.SearchedLocations.Contains("location3"));
Assert.True(result.SearchedLocations.Contains("location4"));
}
[Fact]
public void FindViewFailureWithOneEngine()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
ViewEngineCollection collection = new ViewEngineCollection();
Mock<IViewEngine> engine = new Mock<IViewEngine>();
ViewEngineResult engineResult = new ViewEngineResult(new[] { "location1", "location2" });
engine.Setup(e => e.FindView(context, "view", "master", It.IsAny<bool>())).Returns(engineResult);
collection.Add(engine.Object);
// Act
ViewEngineResult result = collection.FindView(context, "view", "master");
// Assert
Assert.Null(result.View);
Assert.Equal(2, result.SearchedLocations.Count());
Assert.True(result.SearchedLocations.Contains("location1"));
Assert.True(result.SearchedLocations.Contains("location2"));
}
[Fact]
public void FindViewLooksAtCacheFirst()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
Mock<IViewEngine> engine = new Mock<IViewEngine>();
ViewEngineResult engineResult = new ViewEngineResult(new Mock<IView>().Object, engine.Object);
engine.Setup(e => e.FindView(context, "view", "master", true)).Returns(engineResult);
ViewEngineCollection collection = new ViewEngineCollection()
{
engine.Object,
};
// Act
ViewEngineResult result = collection.FindView(context, "view", "master");
// Assert
Assert.Same(engineResult, result);
engine.Verify(e => e.FindView(context, "view", "master", true), Times.Once());
engine.Verify(e => e.FindView(context, "view", "master", false), Times.Never());
}
[Fact]
public void FindViewLooksAtLocatorIfCacheEmpty()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
Mock<IViewEngine> engine = new Mock<IViewEngine>();
ViewEngineResult engineResult = new ViewEngineResult(new Mock<IView>().Object, engine.Object);
engine.Setup(e => e.FindView(context, "view", "master", true)).Returns(new ViewEngineResult(new[] { "path" }));
engine.Setup(e => e.FindView(context, "view", "master", false)).Returns(engineResult);
ViewEngineCollection collection = new ViewEngineCollection()
{
engine.Object,
};
// Act
ViewEngineResult result = collection.FindView(context, "view", "master");
// Assert
Assert.Same(engineResult, result);
engine.Verify(e => e.FindView(context, "view", "master", true), Times.Once());
engine.Verify(e => e.FindView(context, "view", "master", false), Times.Once());
}
[Fact]
public void FindViewIgnoresSearchLocationsFromCache()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
Mock<IViewEngine> engine = new Mock<IViewEngine>();
engine.Setup(e => e.FindView(context, "view", "master", true)).Returns(new ViewEngineResult(new[] { "cachePath" }));
engine.Setup(e => e.FindView(context, "view", "master", false)).Returns(new ViewEngineResult(new[] { "locatorPath" }));
ViewEngineCollection collection = new ViewEngineCollection()
{
engine.Object,
};
// Act
ViewEngineResult result = collection.FindView(context, "view", "master");
// Assert
string searchedLocation = Assert.Single(result.SearchedLocations);
Assert.Equal("locatorPath", searchedLocation);
engine.Verify(e => e.FindView(context, "view", "master", true), Times.Once());
engine.Verify(e => e.FindView(context, "view", "master", false), Times.Once());
}
[Fact]
public void FindViewIteratesThroughCollectionUntilFindsSuccessfulEngine()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
ViewEngineCollection collection = new ViewEngineCollection();
Mock<IViewEngine> engine1 = new Mock<IViewEngine>();
ViewEngineResult engine1Result = new ViewEngineResult(new[] { "location1", "location2" });
engine1.Setup(e => e.FindView(context, "view", "master", It.IsAny<bool>())).Returns(engine1Result);
Mock<IViewEngine> engine2 = new Mock<IViewEngine>();
ViewEngineResult engine2Result = new ViewEngineResult(new Mock<IView>().Object, engine2.Object);
engine2.Setup(e => e.FindView(context, "view", "master", It.IsAny<bool>())).Returns(engine2Result);
collection.Add(engine1.Object);
collection.Add(engine2.Object);
// Act
ViewEngineResult result = collection.FindView(context, "view", "master");
// Assert
Assert.Same(engine2Result, result);
}
[Fact]
public void FindViewRemovesDuplicateSearchedLocationsFromMultipleEngines()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
Mock<IViewEngine> engine1 = new Mock<IViewEngine>();
ViewEngineResult engine1Result = new ViewEngineResult(new[] { "repeatLocation", "location1" });
engine1.Setup(e => e.FindView(context, "view", "master", It.IsAny<bool>())).Returns(engine1Result);
Mock<IViewEngine> engine2 = new Mock<IViewEngine>();
ViewEngineResult engine2Result = new ViewEngineResult(new[] { "location2", "repeatLocation" });
engine2.Setup(e => e.FindView(context, "view", "master", It.IsAny<bool>())).Returns(engine2Result);
ViewEngineCollection collection = new ViewEngineCollection()
{
engine1.Object,
engine2.Object,
};
// Act
ViewEngineResult result = collection.FindView(context, "view", "master");
// Assert
Assert.Null(result.View);
var expectedLocations = new[] { "repeatLocation", "location1", "location2" };
Assert.Equal(expectedLocations, result.SearchedLocations.ToArray());
}
[Fact]
public void FindViewReturnsNoViewAndEmptySearchedLocationsIfCollectionEmpty()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
ViewEngineCollection collection = new ViewEngineCollection();
// Act
ViewEngineResult result = collection.FindView(context, "view", null);
// Assert
Assert.Null(result.View);
Assert.Empty(result.SearchedLocations);
}
[Fact]
public void FindViewReturnsValueFromFirstSuccessfulEngine()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
ViewEngineCollection collection = new ViewEngineCollection();
Mock<IViewEngine> engine1 = new Mock<IViewEngine>();
ViewEngineResult engine1Result = new ViewEngineResult(new Mock<IView>().Object, engine1.Object);
engine1.Setup(e => e.FindView(context, "view", "master", It.IsAny<bool>())).Returns(engine1Result);
Mock<IViewEngine> engine2 = new Mock<IViewEngine>();
ViewEngineResult engine2Result = new ViewEngineResult(new Mock<IView>().Object, engine2.Object);
engine2.Setup(e => e.FindView(context, "view", "master", It.IsAny<bool>())).Returns(engine2Result);
collection.Add(engine1.Object);
collection.Add(engine2.Object);
// Act
ViewEngineResult result = collection.FindView(context, "view", "master");
// Assert
Assert.Same(engine1Result, result);
}
[Fact]
public void FindViewSuccessWithOneEngine()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
ViewEngineCollection collection = new ViewEngineCollection();
Mock<IViewEngine> engine = new Mock<IViewEngine>();
ViewEngineResult engineResult = new ViewEngineResult(new Mock<IView>().Object, engine.Object);
engine.Setup(e => e.FindView(context, "view", "master", It.IsAny<bool>())).Returns(engineResult);
collection.Add(engine.Object);
// Act
ViewEngineResult result = collection.FindView(context, "view", "master");
// Assert
Assert.Same(engineResult, result);
}
[Fact]
public void FindViewThrowsIfControllerContextIsNull()
{
// Arrange
ViewEngineCollection collection = new ViewEngineCollection();
// Act & Assert
Assert.ThrowsArgumentNull(
() => collection.FindView(null, "view", null),
"controllerContext"
);
}
[Fact]
public void FindViewThrowsIfViewNameIsEmpty()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
ViewEngineCollection collection = new ViewEngineCollection();
// Act & Assert
Assert.ThrowsArgumentNullOrEmpty(
() => collection.FindView(context, "", null),
"viewName"
);
}
[Fact]
public void FindViewThrowsIfViewNameIsNull()
{
// Arrange
ControllerContext context = new Mock<ControllerContext>().Object;
ViewEngineCollection collection = new ViewEngineCollection();
// Act & Assert
Assert.ThrowsArgumentNullOrEmpty(
() => collection.FindView(context, null, null),
"viewName"
);
}
[Fact]
public void FindViewDelegatesToResolver()
{
// Arrange
Mock<IView> view = new Mock<IView>();
ControllerContext context = new ControllerContext();
Mock<IViewEngine> locatedEngine = new Mock<IViewEngine>();
ViewEngineResult engineResult = new ViewEngineResult(view.Object, locatedEngine.Object);
locatedEngine.Setup(e => e.FindView(context, "ViewName", "MasterName", true))
.Returns(engineResult);
Mock<IViewEngine> secondEngine = new Mock<IViewEngine>();
Resolver<IEnumerable<IViewEngine>> resolver = new Resolver<IEnumerable<IViewEngine>> { Current = new IViewEngine[] { locatedEngine.Object, secondEngine.Object } };
ViewEngineCollection engines = new ViewEngineCollection(resolver);
// Act
ViewEngineResult result = engines.FindView(context, "ViewName", "MasterName");
// Assert
Assert.Same(engineResult, result);
secondEngine.Verify(e => e.FindView(context, "ViewName", "MasterName", It.IsAny<bool>()), Times.Never());
}
[Fact]
public void FindPartialViewDelegatesToResolver()
{
// Arrange
Mock<IView> view = new Mock<IView>();
ControllerContext context = new ControllerContext();
Mock<IViewEngine> locatedEngine = new Mock<IViewEngine>();
ViewEngineResult engineResult = new ViewEngineResult(view.Object, locatedEngine.Object);
locatedEngine.Setup(e => e.FindPartialView(context, "ViewName", true))
.Returns(engineResult);
Mock<IViewEngine> secondEngine = new Mock<IViewEngine>();
Resolver<IEnumerable<IViewEngine>> resolver = new Resolver<IEnumerable<IViewEngine>> { Current = new IViewEngine[] { locatedEngine.Object, secondEngine.Object } };
ViewEngineCollection engines = new ViewEngineCollection(resolver);
// Act
ViewEngineResult result = engines.FindPartialView(context, "ViewName");
// Assert
Assert.Same(engineResult, result);
secondEngine.Verify(e => e.FindPartialView(context, "ViewName", It.IsAny<bool>()), Times.Never());
}
}
}