1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247
|
// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.IO;
using System.Web.Routing;
using System.Web.UI;
using Moq;
using Xunit;
using Assert = Microsoft.TestCommon.AssertEx;
namespace System.Web.Mvc.Test
{
public class ViewMasterPageTest
{
[Fact]
public void GetModelFromViewPage()
{
// Arrange
ViewMasterPage vmp = new ViewMasterPage();
ViewPage vp = new ViewPage();
vmp.Page = vp;
object model = new object();
vp.ViewData = new ViewDataDictionary(model);
// Assert
Assert.Equal(model, vmp.Model);
}
[Fact]
public void GetModelFromViewPageStronglyTyped()
{
// Arrange
ViewMasterPage<FooModel> vmp = new ViewMasterPage<FooModel>();
ViewPage vp = new ViewPage();
vmp.Page = vp;
FooModel model = new FooModel();
vp.ViewData = new ViewDataDictionary(model);
// Assert
Assert.Equal(model, vmp.Model);
}
[Fact]
public void GetViewDataFromViewPage()
{
// Arrange
ViewMasterPage vmp = new ViewMasterPage();
ViewPage vp = new ViewPage();
vmp.Page = vp;
vp.ViewData = new ViewDataDictionary { { "a", "123" }, { "b", "456" } };
// Assert
Assert.Equal("123", vmp.ViewData.Eval("a"));
Assert.Equal("456", vmp.ViewData.Eval("b"));
}
[Fact]
public void GetViewItemFromViewPageTViewData()
{
// Arrange
MockViewMasterPageDummyViewData vmp = new MockViewMasterPageDummyViewData();
MockViewPageDummyViewData vp = new MockViewPageDummyViewData();
vmp.Page = vp;
vp.ViewData.Model = new DummyViewData { MyInt = 123, MyString = "abc" };
// Assert
Assert.Equal(123, vmp.ViewData.Model.MyInt);
Assert.Equal("abc", vmp.ViewData.Model.MyString);
}
[Fact]
public void GetWriterFromViewPage()
{
// Arrange
bool triggered = false;
HtmlTextWriter writer = new HtmlTextWriter(TextWriter.Null);
ViewMasterPage vmp = new ViewMasterPage();
MockViewPage vp = new MockViewPage();
vp.RenderCallback = delegate()
{
triggered = true;
Assert.Equal(writer, vmp.Writer);
};
vmp.Page = vp;
// Act & Assert
Assert.Null(vmp.Writer);
vp.RenderControl(writer);
Assert.Null(vmp.Writer);
Assert.True(triggered);
}
[Fact]
public void GetViewDataFromPageThrows()
{
// Arrange
ViewMasterPage vmp = new ViewMasterPage();
vmp.Page = new Page();
// Assert
Assert.Throws<InvalidOperationException>(
delegate { object foo = vmp.ViewData; },
"A ViewMasterPage can be used only with content pages that derive from ViewPage or ViewPage<TModel>.");
}
[Fact]
public void GetViewItemFromWrongGenericViewPageType()
{
// Arrange
MockViewMasterPageDummyViewData vmp = new MockViewMasterPageDummyViewData();
MockViewPageBogusViewData vp = new MockViewPageBogusViewData();
vmp.Page = vp;
vp.ViewData.Model = new SelectListItem();
// Assert
Assert.Throws<InvalidOperationException>(
delegate { object foo = vmp.ViewData.Model; },
"The model item passed into the dictionary is of type 'System.Web.Mvc.SelectListItem', but this dictionary requires a model item of type 'System.Web.Mvc.Test.ViewMasterPageTest+DummyViewData'.");
}
[Fact]
public void GetViewDataFromNullPageThrows()
{
// Arrange
MockViewMasterPageDummyViewData vmp = new MockViewMasterPageDummyViewData();
// Assert
Assert.Throws<InvalidOperationException>(
delegate { object foo = vmp.ViewData; },
"A ViewMasterPage can be used only with content pages that derive from ViewPage or ViewPage<TModel>.");
}
[Fact]
public void GetViewDataFromRegularPageThrows()
{
// Arrange
MockViewMasterPageDummyViewData vmp = new MockViewMasterPageDummyViewData();
vmp.Page = new Page();
// Assert
Assert.Throws<InvalidOperationException>(
delegate { object foo = vmp.ViewData; },
"A ViewMasterPage can be used only with content pages that derive from ViewPage or ViewPage<TModel>.");
}
[Fact]
public void GetHtmlHelperFromViewPage()
{
// Arrange
ViewMasterPage vmp = new ViewMasterPage();
ViewPage vp = new ViewPage();
vmp.Page = vp;
ViewContext vc = new Mock<ViewContext>().Object;
HtmlHelper<object> htmlHelper = new HtmlHelper<object>(vc, vp);
vp.Html = htmlHelper;
// Assert
Assert.Equal(vmp.Html, htmlHelper);
}
[Fact]
public void GetUrlHelperFromViewPage()
{
// Arrange
ViewMasterPage vmp = new ViewMasterPage();
ViewPage vp = new ViewPage();
vmp.Page = vp;
RequestContext rc = new RequestContext(new Mock<HttpContextBase>().Object, new RouteData());
UrlHelper urlHelper = new UrlHelper(rc);
vp.Url = urlHelper;
// Assert
Assert.Equal(vmp.Url, urlHelper);
}
[Fact]
public void ViewBagProperty_ReflectsViewData()
{
// Arrange
ViewPage page = new ViewPage();
ViewMasterPage masterPage = new ViewMasterPage();
masterPage.Page = page;
masterPage.ViewData["A"] = 1;
// Act & Assert
Assert.NotNull(masterPage.ViewBag);
Assert.Equal(1, masterPage.ViewBag.A);
}
[Fact]
public void ViewBagProperty_PropagatesChangesToViewData()
{
// Arrange
ViewPage page = new ViewPage();
ViewMasterPage masterPage = new ViewMasterPage();
masterPage.Page = page;
masterPage.ViewData["A"] = 1;
// Act
masterPage.ViewBag.A = "foo";
masterPage.ViewBag.B = 2;
// Assert
Assert.Equal("foo", masterPage.ViewData["A"]);
Assert.Equal(2, masterPage.ViewData["B"]);
}
// Master page types
private sealed class MockViewMasterPageDummyViewData : ViewMasterPage<DummyViewData>
{
}
// View data types
private sealed class DummyViewData
{
public int MyInt { get; set; }
public string MyString { get; set; }
}
// Page types
private sealed class MockViewPageBogusViewData : ViewPage<SelectListItem>
{
}
private sealed class MockViewPageDummyViewData : ViewPage<DummyViewData>
{
}
private sealed class MockViewPage : ViewPage
{
public Action RenderCallback { get; set; }
protected override void RenderChildren(HtmlTextWriter writer)
{
if (RenderCallback != null)
{
RenderCallback();
}
base.RenderChildren(writer);
}
}
private sealed class FooModel
{
}
}
}
|