192 lines
7.3 KiB
C#
192 lines
7.3 KiB
C#
|
// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
|
|||
|
|
|||
|
using System.IO;
|
|||
|
using System.Text;
|
|||
|
using System.Web.WebPages.Instrumentation;
|
|||
|
using Moq;
|
|||
|
using Xunit;
|
|||
|
|
|||
|
namespace System.Web.WebPages.Test
|
|||
|
{
|
|||
|
public class WebPageExecutingBaseTest
|
|||
|
{
|
|||
|
[Fact]
|
|||
|
public void NormalizeLayoutPageUsesVirtualPathFactoryManagerToDetermineIfLayoutFileExists()
|
|||
|
{
|
|||
|
// Arrange
|
|||
|
var layoutPagePath = "~/sitelayout.cshtml";
|
|||
|
var layoutPage = Utils.CreatePage(null, layoutPagePath);
|
|||
|
var page = Utils.CreatePage(null);
|
|||
|
var objectFactory = new Mock<IVirtualPathFactory>();
|
|||
|
objectFactory.Setup(c => c.Exists(It.Is<string>(p => p.Equals(layoutPagePath)))).Returns(true).Verifiable();
|
|||
|
page.VirtualPathFactory = objectFactory.Object;
|
|||
|
|
|||
|
// Act
|
|||
|
var path = page.NormalizeLayoutPagePath(layoutPage.VirtualPath);
|
|||
|
|
|||
|
// Assert
|
|||
|
objectFactory.Verify();
|
|||
|
Assert.Equal(path, layoutPage.VirtualPath);
|
|||
|
}
|
|||
|
|
|||
|
[Fact]
|
|||
|
public void NormalizeLayoutPageAcceptsRelativePathsToLayoutPage()
|
|||
|
{
|
|||
|
// Arrange
|
|||
|
var page = Utils.CreatePage(null, "~/dir/default.cshtml");
|
|||
|
var layoutPage = Utils.CreatePage(null, "~/layouts/sitelayout.cshtml");
|
|||
|
var objectFactory = new HashVirtualPathFactory(page, layoutPage);
|
|||
|
page.VirtualPathFactory = objectFactory;
|
|||
|
|
|||
|
// Act
|
|||
|
var path = page.NormalizeLayoutPagePath(@"../layouts/sitelayout.cshtml");
|
|||
|
|
|||
|
// Assert
|
|||
|
Assert.Equal(path, layoutPage.VirtualPath);
|
|||
|
}
|
|||
|
|
|||
|
[Fact]
|
|||
|
public void BeginContextSilentlyFailsIfInstrumentationIsNotAvailable()
|
|||
|
{
|
|||
|
// Arrange
|
|||
|
bool called = false;
|
|||
|
|
|||
|
var pageMock = new Mock<WebPageExecutingBase>() { CallBase = true };
|
|||
|
pageMock.Setup(p => p.Context).Returns(new Mock<HttpContextBase>().Object);
|
|||
|
pageMock.Object.InstrumentationService.IsAvailable = false;
|
|||
|
pageMock.Object.InstrumentationService.ExtractInstrumentationService = c =>
|
|||
|
{
|
|||
|
called = true;
|
|||
|
return null;
|
|||
|
};
|
|||
|
|
|||
|
// Act
|
|||
|
pageMock.Object.BeginContext("~/dir/default.cshtml", 0, 1, true);
|
|||
|
|
|||
|
// Assert
|
|||
|
Assert.False(called);
|
|||
|
}
|
|||
|
|
|||
|
[Fact]
|
|||
|
public void EndContextSilentlyFailsIfInstrumentationIsNotAvailable()
|
|||
|
{
|
|||
|
// Arrange
|
|||
|
bool called = false;
|
|||
|
|
|||
|
var pageMock = new Mock<WebPageExecutingBase>() { CallBase = true };
|
|||
|
pageMock.Setup(p => p.Context).Returns(new Mock<HttpContextBase>().Object);
|
|||
|
pageMock.Object.InstrumentationService.IsAvailable = false;
|
|||
|
pageMock.Object.InstrumentationService.ExtractInstrumentationService = c =>
|
|||
|
{
|
|||
|
called = true;
|
|||
|
return null;
|
|||
|
};
|
|||
|
|
|||
|
// Act
|
|||
|
pageMock.Object.EndContext("~/dir/default.cshtml", 0, 1, true);
|
|||
|
|
|||
|
// Assert
|
|||
|
Assert.False(called);
|
|||
|
}
|
|||
|
|
|||
|
[Fact]
|
|||
|
public void WriteAttributeToWritesAttributeNormallyIfNoValuesSpecified()
|
|||
|
{
|
|||
|
WriteAttributeTest(
|
|||
|
name: "alt",
|
|||
|
prefix: new PositionTagged<string>(" alt=\"", 42),
|
|||
|
suffix: new PositionTagged<string>("\"", 24),
|
|||
|
expected: " alt=\"\"");
|
|||
|
}
|
|||
|
|
|||
|
[Fact]
|
|||
|
public void WriteAttributeToWritesNothingIfSingleNullValueProvided()
|
|||
|
{
|
|||
|
WriteAttributeTest(
|
|||
|
name: "alt",
|
|||
|
prefix: new PositionTagged<string>(" alt=\"", 42),
|
|||
|
suffix: new PositionTagged<string>("\"", 24),
|
|||
|
values: new[] {
|
|||
|
new AttributeValue(new PositionTagged<string>(String.Empty, 142), new PositionTagged<object>(null, 124), literal: true)
|
|||
|
},
|
|||
|
expected: "");
|
|||
|
}
|
|||
|
|
|||
|
[Fact]
|
|||
|
public void WriteAttributeToWritesNothingIfSingleFalseValueProvided()
|
|||
|
{
|
|||
|
WriteAttributeTest(
|
|||
|
name: "alt",
|
|||
|
prefix: new PositionTagged<string>(" alt=\"", 42),
|
|||
|
suffix: new PositionTagged<string>("\"", 24),
|
|||
|
values: new[] {
|
|||
|
new AttributeValue(new PositionTagged<string>(String.Empty, 142), new PositionTagged<object>(false, 124), literal: true)
|
|||
|
},
|
|||
|
expected: "");
|
|||
|
}
|
|||
|
|
|||
|
[Fact]
|
|||
|
public void WriteAttributeToWritesGlobalPrefixIfSingleValueProvided()
|
|||
|
{
|
|||
|
WriteAttributeTest(
|
|||
|
name: "alt",
|
|||
|
prefix: new PositionTagged<string>(" alt=\"", 42),
|
|||
|
suffix: new PositionTagged<string>("\"", 24),
|
|||
|
values: new[] {
|
|||
|
new AttributeValue(new PositionTagged<string>(" ", 142), new PositionTagged<object>("foo", 124), literal: true)
|
|||
|
},
|
|||
|
expected: " alt=\"foo\"");
|
|||
|
}
|
|||
|
|
|||
|
[Fact]
|
|||
|
public void WriteAttributeToWritesLocalPrefixForSecondValueProvided()
|
|||
|
{
|
|||
|
WriteAttributeTest(
|
|||
|
name: "alt",
|
|||
|
prefix: new PositionTagged<string>(" alt=\"", 42),
|
|||
|
suffix: new PositionTagged<string>("\"", 24),
|
|||
|
values: new[] {
|
|||
|
new AttributeValue(new PositionTagged<string>(" ", 142), new PositionTagged<object>("foo", 124), literal: true),
|
|||
|
new AttributeValue(new PositionTagged<string>("glorb", 142), new PositionTagged<object>("bar", 124), literal: true)
|
|||
|
},
|
|||
|
expected: " alt=\"fooglorbbar\"");
|
|||
|
}
|
|||
|
|
|||
|
[Fact]
|
|||
|
public void WriteAttributeToWritesGlobalPrefixOnlyIfSecondValueIsFirstNonNullOrFalse()
|
|||
|
{
|
|||
|
WriteAttributeTest(
|
|||
|
name: "alt",
|
|||
|
prefix: new PositionTagged<string>(" alt=\"", 42),
|
|||
|
suffix: new PositionTagged<string>("\"", 24),
|
|||
|
values: new[] {
|
|||
|
new AttributeValue(new PositionTagged<string>(" ", 142), new PositionTagged<object>(null, 124), literal: true),
|
|||
|
new AttributeValue(new PositionTagged<string>("glorb", 142), new PositionTagged<object>("bar", 124), literal: true)
|
|||
|
},
|
|||
|
expected: " alt=\"bar\"");
|
|||
|
}
|
|||
|
|
|||
|
private void WriteAttributeTest(string name, PositionTagged<string> prefix, PositionTagged<string> suffix, string expected)
|
|||
|
{
|
|||
|
WriteAttributeTest(name, prefix, suffix, new AttributeValue[0], expected);
|
|||
|
}
|
|||
|
|
|||
|
private void WriteAttributeTest(string name, PositionTagged<string> prefix, PositionTagged<string> suffix, AttributeValue[] values, string expected)
|
|||
|
{
|
|||
|
// Arrange
|
|||
|
var pageMock = new Mock<WebPageExecutingBase>() { CallBase = true };
|
|||
|
pageMock.Setup(p => p.Context).Returns(new Mock<HttpContextBase>().Object);
|
|||
|
pageMock.Object.InstrumentationService.IsAvailable = false;
|
|||
|
|
|||
|
StringBuilder written = new StringBuilder();
|
|||
|
StringWriter writer = new StringWriter(written);
|
|||
|
|
|||
|
// Act
|
|||
|
pageMock.Object.WriteAttributeTo(writer, name, prefix, suffix, values);
|
|||
|
|
|||
|
// Assert
|
|||
|
Assert.Equal(expected, written.ToString());
|
|||
|
}
|
|||
|
}
|
|||
|
}
|