Changes to tests for MVC 2 value provider changes

--HG--
extra : convert_revision : svn%3A5ff7c347-ad56-4c35-b696-ccb81de16e03/trunk%4044578
This commit is contained in:
loudej
2009-12-25 09:03:03 +00:00
parent 96f427eb00
commit 27098815f3
8 changed files with 182 additions and 160 deletions

View File

@@ -99,6 +99,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Roles\Controllers\AdminControllerTests.cs" />
<Compile Include="Roles\Services\RoleServiceTests.cs" />
<Compile Include="Values.cs" />
<Compile Include="Users\Controllers\AdminControllerTests.cs" />
<Compile Include="Users\Services\MembershipServiceTests.cs" />
<Compile Include="XmlRpc\Controllers\HomeControllerTests.cs" />

View File

@@ -1,4 +1,5 @@
using System;
using System.Globalization;
using System.Linq;
using System.Collections.Generic;
using System.Web;
@@ -83,7 +84,7 @@ namespace Orchard.Tests.Packages.Pages.Controllers {
}
}
class StubAuthorizer: IAuthorizer {
class StubAuthorizer : IAuthorizer {
#region IAuthorizer Members
public bool Authorize(Permission permission, LocalizedString message) {
@@ -103,8 +104,11 @@ namespace Orchard.Tests.Packages.Pages.Controllers {
[Test]
public void CreateShouldReturnViewWithErrorIfSlugIsNull() {
var input = new FormCollection { { ReflectOn<PageCreateViewModel>.NameOf(m => m.Slug), null } };
var result = _controller.Create(input);
_controller.ValueProvider = Values.From(new PageCreateViewModel {
Slug = null
});
var result = _controller.CreatePOST();
Assert.That(result, Is.TypeOf<ViewResult>());
Assert.That(_controller.ModelState.IsValid, Is.False);
}
@@ -130,12 +134,12 @@ namespace Orchard.Tests.Packages.Pages.Controllers {
var pageDoesntExist = _pageManager.GetPublishedBySlug("slug2");
var input = new FormCollection {
{ ReflectOn<PageCreateViewModel>.NameOf(m => m.Slug), "slug2" },
{ ReflectOn<PageCreateViewModel>.NameOf(m => m.TemplateName), "threecolumn" }
};
var result = _controller.Create(input);
_controller.ValueProvider = Values.From(new PageCreateViewModel {
Title = "title2",
Slug = "slug2",
TemplateName = "threecolumn",
});
var result = _controller.CreatePOST();
Assert.That(result, Is.TypeOf<RedirectToRouteResult>());
var redirect = (RedirectToRouteResult)result;
@@ -227,15 +231,21 @@ namespace Orchard.Tests.Packages.Pages.Controllers {
Assert.That(_pagesRepository.Get(revision.Page.Id).Scheduled.Count, Is.EqualTo(1));
// Build controller input
var input = new FormCollection { { ReflectOn<PageIndexViewModel>.NameOf(m => m.Options.BulkAction), PageIndexBulkAction.PublishNow.ToString() } };
var options = new PageIndexOptions {
BulkAction = PageIndexBulkAction.PublishNow
};
var pageEntries = new List<PageEntry>();
for (int i = 0; i < 2; i++) {
//TODO: Use "NameOf" when it supports these expressions
input.Add(string.Format("PageEntries[{0}].PageId", i), pages[i].Id.ToString());
input.Add(string.Format("PageEntries[{0}].IsChecked", i), true.ToString());
pageEntries.Add(new PageEntry {
PageId = pages[i].Id,
IsChecked = true
});
}
// Call controller
var result = _controller.Index(input);
// call controller
var result = _controller.IndexPOST(options, pageEntries);
// Verify result, check database state
ClearSession();
@@ -263,21 +273,25 @@ namespace Orchard.Tests.Packages.Pages.Controllers {
Assert.That(pages[1].Published, Is.Null);
Assert.That(_pagesRepository.Get(revision.Page.Id).Scheduled.Count, Is.EqualTo(1));
// Build controller input
DateTime scheduledDate = _clock.FutureMoment(TimeSpan.FromMinutes(1));
var input = new FormCollection {
{ ReflectOn<PageIndexViewModel>.NameOf(m => m.Options.BulkAction), PageIndexBulkAction.PublishLater.ToString() } ,
{ ReflectOn<PageIndexViewModel>.NameOf(m => m.Options.BulkPublishLaterDate), string.Format("{0:d} {0:T}", scheduledDate) }
};
// Build controller input
DateTime scheduledDate = _clock.FutureMoment(TimeSpan.FromMinutes(1));
var options = new PageIndexOptions {
BulkAction = PageIndexBulkAction.PublishLater,
BulkPublishLaterDate = scheduledDate,
};
var pageEntries = new List<PageEntry>();
for (int i = 0; i < 2; i++) {
//TODO: Use "NameOf" when it supports these expressions
input.Add(string.Format("PageEntries[{0}].PageId", i), pages[i].Id.ToString());
input.Add(string.Format("PageEntries[{0}].IsChecked", i), true.ToString());
pageEntries.Add(new PageEntry {
PageId = pages[i].Id,
IsChecked = true
});
}
// Call controller
var result = _controller.Index(input);
// call controller
var result = _controller.IndexPOST(options, pageEntries);
// Verify result, check database state
ClearSession();
@@ -307,20 +321,24 @@ namespace Orchard.Tests.Packages.Pages.Controllers {
Assert.That(pages[1].Published, Is.Null);
Assert.That(_pagesRepository.Get(revision.Page.Id).Scheduled.Count, Is.EqualTo(1));
// Build controller input
var input = new FormCollection {
{ ReflectOn<PageIndexViewModel>.NameOf(m => m.Options.BulkAction), PageIndexBulkAction.Delete.ToString() },
{ ReflectOn<PageIndexViewModel>.NameOf(m => m.Options.BulkDeleteConfirmed), true.ToString() }
};
// Build controller input
var options = new PageIndexOptions {
BulkAction = PageIndexBulkAction.Delete,
BulkDeleteConfirmed = true,
};
var pageEntries = new List<PageEntry>();
for (int i = 0; i < 2; i++) {
//TODO: Use "NameOf" when it supports these expressions
input.Add(string.Format("PageEntries[{0}].PageId", i), pages[i].Id.ToString());
input.Add(string.Format("PageEntries[{0}].IsChecked", i), true.ToString());
pageEntries.Add(new PageEntry {
PageId = pages[i].Id,
IsChecked = true
});
}
// Call controller
var result = _controller.Index(input);
// call controller
var result = _controller.IndexPOST(options, pageEntries);
// Verify result, check database state
ClearSession();
@@ -342,18 +360,20 @@ namespace Orchard.Tests.Packages.Pages.Controllers {
Assert.That(pages[1].Published, Is.Not.Null);
// Build controller input
var input = new FormCollection {
{ ReflectOn<PageIndexViewModel>.NameOf(m => m.Options.BulkAction), PageIndexBulkAction.Unpublish.ToString() },
};
var options = new PageIndexOptions {
BulkAction = PageIndexBulkAction.Unpublish,
};
var pageEntries = new List<PageEntry>();
for (int i = 0; i < 2; i++) {
//TODO: Use "NameOf" when it supports these expressions
input.Add(string.Format("PageEntries[{0}].PageId", i), pages[i].Id.ToString());
input.Add(string.Format("PageEntries[{0}].IsChecked", i), true.ToString());
pageEntries.Add(new PageEntry {
PageId = pages[i].Id,
IsChecked = true
});
}
// Call controller
var result = _controller.Index(input);
// call controller
var result = _controller.IndexPOST(options, pageEntries);
// Verify result, check database state
ClearSession();
@@ -374,11 +394,11 @@ namespace Orchard.Tests.Packages.Pages.Controllers {
public void PublishNowShouldApplyChangesAndRedirect() {
var pageBeforeEdit = _pageManager.GetLastRevision(_slugPageId);
var input = new FormCollection {
{ ReflectOn<PageEditViewModel>.NameOf(m => m.Revision.Slug), "new-slug-value" },
{ ReflectOn<PageEditViewModel>.NameOf(m => m.Command), PageEditCommand.PublishNow.ToString() }
};
var result = _controller.Edit(_slugPageId, input);
_controller.ValueProvider = Values.From(new Dictionary<string, string> {
{"Revision.Slug","new-slug-value" },
{"Command","PublishNow"},
});
var result = _controller.EditPOST(_slugPageId);
var pageNotFoundAnymore = _pageManager.GetPublishedBySlug("slug");
var pageFromNewSlug = _pageManager.GetPublishedBySlug("new-slug-value");
@@ -414,8 +434,10 @@ namespace Orchard.Tests.Packages.Pages.Controllers {
Assert.That(revision.Contents, Has.Count.EqualTo(2));
Assert.That(revision.Contents, Has.None.Property("ZoneName").EqualTo("content3"));
var input = new FormCollection { { "TemplateName", "threecolumn" } };
var result = _controller.ChooseTemplate(revision.Id, input);
_controller.ValueProvider = Values.From(new Dictionary<string, string> {
{ "TemplateName", "threecolumn" }
});
var result = _controller.ChooseTemplatePOST(revision.Id);
Assert.That(result, Is.TypeOf<RedirectToRouteResult>());
@@ -443,8 +465,10 @@ namespace Orchard.Tests.Packages.Pages.Controllers {
Assert.That(revision.Contents, Has.Count.EqualTo(2));
Assert.That(revision.Contents, Has.None.Property("ZoneName").EqualTo("content3"));
var input = new FormCollection { { "TemplateName", "twocolumn" } };
var result = _controller.ChooseTemplate(revision.Id, input);
_controller.ValueProvider = Values.From(new Dictionary<string, string> {
{ "TemplateName", "twocolumn" }
});
var result = _controller.ChooseTemplatePOST(revision.Id);
Assert.That(result, Is.TypeOf<RedirectToRouteResult>());
@@ -460,41 +484,41 @@ namespace Orchard.Tests.Packages.Pages.Controllers {
[Test, Ignore("This actually requires the data binder to be registered, because it's going through contoller's update model method.")]
public void SavingDraftAfterEmptyingUnusedContentItemShouldRemoveUnusedItems() {
var createInput = new FormCollection {
{"Title", "One"},
{"Slug", "Two"},
{"TemplateName", "threecolumn"},
};
var createResult = (RedirectToRouteResult)_controller.Create(createInput);
_controller.ValueProvider = Values.From(new PageCreateViewModel {
Title = "One",
Slug = "Two",
TemplateName = "threecolumn",
});
var createResult = (RedirectToRouteResult)_controller.CreatePOST();
ClearSession();
var pageId = (int)createResult.RouteValues["id"];
var publishInput = new FormCollection {
{"Command", "PublishNow"},
{"Revision.Contents[content1].Content", "alpha"},
{"Revision.Contents[content2].Content", "beta"},
{"Revision.Contents[content3].Content", "gamma"},
};
_controller.Edit(pageId, publishInput);
_controller.ValueProvider = Values.From(new Dictionary<string, string> {
{"Command", "PublishNow"},
{"Revision.Contents[content1].Content", "alpha"},
{"Revision.Contents[content2].Content", "beta"},
{"Revision.Contents[content3].Content", "gamma"},
});
_controller.EditPOST(pageId);
ClearSession();
var chooseTemplateInput = new FormCollection {
{"TemplateName", "twocolumn"},
};
_controller.ChooseTemplate(pageId, chooseTemplateInput);
_controller.ValueProvider = Values.From(new Dictionary<string, string> {
{"TemplateName", "twocolumn"},
});
_controller.ChooseTemplatePOST(pageId);
ClearSession();
var revision = _pageManager.GetLastRevision(pageId);
Assert.That(revision.Contents, Has.Count.EqualTo(3));
var publishInput2 = new FormCollection {
{"Command", "PublishNow"},
{"Revision.Contents[content1].Content", "alpha"},
{"Revision.Contents[content2].Content", "beta"},
{"Revision.Contents[content3].Content", ""},
};
_controller.Edit(pageId, publishInput2);
_controller.ValueProvider = Values.From(new Dictionary<string, string> {
{"Command", "PublishNow"},
{"Revision.Contents[content1].Content", "alpha"},
{"Revision.Contents[content2].Content", "beta"},
{"Revision.Contents[content3].Content", ""},
});
_controller.EditPOST(pageId);
ClearSession();
var revision2 = _pageManager.GetLastRevision(pageId);
Assert.That(revision2.Contents, Has.Count.EqualTo(2));

View File

@@ -80,37 +80,11 @@ namespace Orchard.Tests.Packages.Users.Controllers {
Assert.That(model.Rows, Is.Not.Null);
}
public static class Values {
public static IValueProvider Of<T>(T obj) {
return new ValueProvider<T>(obj);
}
class ValueProvider<T> : IValueProvider {
private readonly T _obj;
public ValueProvider(T obj) {
_obj = obj;
}
public bool ContainsPrefix( string prefix) {
return typeof(T).GetProperties().Any(x => x.Name.StartsWith(prefix));
}
public ValueProviderResult GetValue( string key) {
var property = typeof(T).GetProperty(key);
if (property == null)
return null;
return new ValueProviderResult(
property.GetValue(_obj, null),
Convert.ToString(property.GetValue(_obj, null)),
null);
}
}
}
[Test]
public void CreateShouldAddUserAndRedirect() {
var controller = _container.Resolve<AdminController>();
controller.ValueProvider = Values.Of(new {
controller.ValueProvider = Values.From(new {
UserName = "four",
Password = "five",
ConfirmPassword = "five"
@@ -134,7 +108,7 @@ namespace Orchard.Tests.Packages.Users.Controllers {
Assert.That(model.UserName, Is.EqualTo("two"));
var controller = _container.Resolve<AdminController>();
controller.ValueProvider = Values.Of(new {
controller.ValueProvider = Values.From(new {
UserName = "bubba",
Email = "hotep",
});

View File

@@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Web.Mvc;
namespace Orchard.Tests.Packages {
public static class Values {
public static IValueProvider From<T>(T obj) {
if (obj is IDictionary<string,string>) {
return new DictionaryValueProvider<string>(
(IDictionary<string,string>)obj,
CultureInfo.InvariantCulture);
}
return new ValueProvider<T>(obj);
}
class ValueProvider<T> : IValueProvider {
private readonly T _obj;
public ValueProvider(T obj) {
_obj = obj;
}
public bool ContainsPrefix(string prefix) {
return typeof(T).GetProperties().Any(x => x.Name.StartsWith(prefix));
}
public ValueProviderResult GetValue(string key) {
var property = typeof(T).GetProperty(key);
if (property == null)
return null;
return new ValueProviderResult(
property.GetValue(_obj, null),
Convert.ToString(property.GetValue(_obj, null)),
null);
}
}
}
}

View File

@@ -172,26 +172,5 @@ namespace Orchard.Tests.Models {
return modelRecord;
}
[Test]
public void EditorsShouldBeOrderedByPositionAndDefaultPositionIsSix() {
var alpha = _manager.New("alpha");
var templates = _manager.BuildDisplayModel(alpha, null).Displays;
Assert.That(templates.Count(), Is.EqualTo(3));
var t0 = templates.First();
var t1 = templates.Skip(1).First();
var t2 = templates.Skip(2).First();
Assert.That(t0.Model, Is.TypeOf<Alpha>());
Assert.That(t1.Model, Is.TypeOf<Flavored>());
Assert.That(t2.Model, Is.TypeOf<Styled>());
Assert.That(t0.Position, Is.EqualTo("3"));
Assert.That(t1.Position, Is.Null);
Assert.That(t2.Position, Is.EqualTo("10"));
}
}
}

View File

@@ -65,11 +65,11 @@ namespace Orchard.Tests.UI.Notify {
var model = new AdminViewModel();
var context = BuildContext();
context.Controller.TempData.Add("messages", "dont-destroy" + System.Environment.NewLine);
context.Controller.TempData.Add("messages", "dont-destroy" + System.Environment.NewLine + "-" + System.Environment.NewLine);
context.Result = new ViewResult {
ViewData = new ViewDataDictionary<AdminViewModel>(model),
TempData = context.Controller.TempData
};
ViewData = new ViewDataDictionary<AdminViewModel>(model),
TempData = context.Controller.TempData
};
filter.OnActionExecuted(context);
filter.OnResultExecuting(new ResultExecutingContext(context, context.Result));

View File

@@ -82,15 +82,15 @@ namespace Orchard.CmsPages.Controllers {
return View(model);
}
[HttpPost]
[HttpPost, ActionName("Index")]
[FormValueRequired("submit.BulkEdit")]
public ActionResult Index(FormCollection input) {
var viewModel = new PageIndexViewModel();
UpdateModel(viewModel, input.ToValueProvider());
public ActionResult IndexPOST(PageIndexOptions options, IList<PageEntry> pageEntries) {
//var viewModel = new PageIndexViewModel();
//UpdateModel(viewModel);
try {
IEnumerable<PageEntry> checkedEntries = viewModel.PageEntries.Where(p => p.IsChecked);
switch (viewModel.Options.BulkAction) {
IEnumerable<PageEntry> checkedEntries = pageEntries.Where(p => p.IsChecked);
switch (options.BulkAction) {
case PageIndexBulkAction.None:
break;
@@ -111,17 +111,20 @@ namespace Orchard.CmsPages.Controllers {
if (!_authorizer.Authorize(Permissions.SchedulePages, T("Couldn't publish page")))
return new HttpUnauthorizedResult();
if (viewModel.Options.BulkPublishLaterDate != null) {
if (options.BulkPublishLaterDate != null) {
//TODO: Transaction
foreach (PageEntry entry in checkedEntries) {
var page = _repository.Get(entry.PageId);
var revision = _pageManager.AcquireDraft(page.Id);
_pageScheduler.ClearTasks(page);
_pageScheduler.AddPublishTask(revision, viewModel.Options.BulkPublishLaterDate.Value);
_pageScheduler.AddPublishTask(revision, options.BulkPublishLaterDate.Value);
}
}
else {
return View("BulkPublishLater", viewModel);
return View("BulkPublishLater", new PageIndexViewModel {
Options = options,
PageEntries = pageEntries
});
}
break;
@@ -139,7 +142,7 @@ namespace Orchard.CmsPages.Controllers {
if (!_authorizer.Authorize(Permissions.DeletePages, T("Couldn't delete page")))
return new HttpUnauthorizedResult();
if (viewModel.Options.BulkDeleteConfirmed) {
if (options.BulkDeleteConfirmed) {
//TODO: Transaction
foreach (PageEntry entry in checkedEntries) {
var page = _repository.Get(entry.PageId);
@@ -148,7 +151,10 @@ namespace Orchard.CmsPages.Controllers {
}
}
else {
return View("BulkDeleteConfirm", viewModel);
return View("BulkDeleteConfirm", new PageIndexViewModel {
Options = options,
PageEntries = pageEntries
});
}
break;
@@ -159,7 +165,7 @@ namespace Orchard.CmsPages.Controllers {
catch (Exception ex) {
ModelState.AddModelError("", ex);
//TODO: Is this a good idea to return to the index view in case of error?
return Index(viewModel.Options);
return Index(options);
}
return RedirectToAction("Index");
@@ -191,12 +197,12 @@ namespace Orchard.CmsPages.Controllers {
return View(model);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection input) {
[AcceptVerbs(HttpVerbs.Post), ActionName("Create")]
public ActionResult CreatePOST() {
var viewModel = new PageCreateViewModel { Templates = _templateProvider.List() };
try {
UpdateModel(viewModel, input.ToValueProvider());
UpdateModel(viewModel);
if (!_authorizer.Authorize(Permissions.CreatePages, T("Couldn't create page")))
return new HttpUnauthorizedResult();
@@ -235,9 +241,9 @@ namespace Orchard.CmsPages.Controllers {
return View(model);
}
[HttpPost]
[HttpPost, ActionName("Edit")]
[FormValueRequired("submit.Save")]
public ActionResult Edit(int id, FormCollection input) {
public ActionResult EditPOST(int id) {
var model = new PageEditViewModel();
try {
//TODO: need a transaction to surround this entire lot, really
@@ -245,7 +251,7 @@ namespace Orchard.CmsPages.Controllers {
model.Revision = _pageManager.AcquireDraft(id);
model.Template = _templateProvider.Get(model.Revision.TemplateName);
UpdateModel(model, input.ToValueProvider());
UpdateModel(model);
RemoveUnusedContentItems(model.Revision, model.Template);
_pageScheduler.ClearTasks(model.Revision.Page);
@@ -342,11 +348,11 @@ namespace Orchard.CmsPages.Controllers {
return View(viewModel);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult ChooseTemplate(int id, FormCollection input) {
[HttpPost, ActionName("ChooseTemplate")]
public ActionResult ChooseTemplatePOST(int id) {
var viewModel = new ChooseTemplateViewModel();
try {
UpdateModel(viewModel, input.ToValueProvider());
UpdateModel(viewModel);
//todo: needs transaction
var draft = _pageManager.AcquireDraft(id);

View File

@@ -16,19 +16,16 @@ namespace Orchard.ContentManagement.Drivers {
}
public override void Apply(BuildDisplayModelContext context) {
context.AddDisplay(new TemplateViewModel(Model, Prefix) {
TemplateName = TemplateName,
ZoneName = Zone,
Position = Position
});
context.DisplayModel.Zones.AddDisplayPart(
Zone + ":" + Position, Model, TemplateName, Prefix);
}
public override void Apply(BuildEditorModelContext context) {
context.AddEditor(new TemplateViewModel(Model, Prefix) {
TemplateName = TemplateName,
ZoneName = Zone,
Position = Position
});
TemplateName = TemplateName,
ZoneName = Zone,
Position = Position
});
}
public PartTemplateResult Location(string zone) {