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

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());
}
}
}