diff --git a/src/Orchard.Tests.Packages/Orchard.Tests.Packages.csproj b/src/Orchard.Tests.Packages/Orchard.Tests.Packages.csproj index aa7b6a996..b0f089de4 100644 --- a/src/Orchard.Tests.Packages/Orchard.Tests.Packages.csproj +++ b/src/Orchard.Tests.Packages/Orchard.Tests.Packages.csproj @@ -99,6 +99,7 @@ + diff --git a/src/Orchard.Tests.Packages/Pages/Controllers/AdminControllerTests.cs b/src/Orchard.Tests.Packages/Pages/Controllers/AdminControllerTests.cs index 09afcfb07..813edccb4 100644 --- a/src/Orchard.Tests.Packages/Pages/Controllers/AdminControllerTests.cs +++ b/src/Orchard.Tests.Packages/Pages/Controllers/AdminControllerTests.cs @@ -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.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()); 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.NameOf(m => m.Slug), "slug2" }, - { ReflectOn.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()); 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.NameOf(m => m.Options.BulkAction), PageIndexBulkAction.PublishNow.ToString() } }; + + var options = new PageIndexOptions { + BulkAction = PageIndexBulkAction.PublishNow + }; + + var pageEntries = new List(); 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.NameOf(m => m.Options.BulkAction), PageIndexBulkAction.PublishLater.ToString() } , - { ReflectOn.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(); 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.NameOf(m => m.Options.BulkAction), PageIndexBulkAction.Delete.ToString() }, - { ReflectOn.NameOf(m => m.Options.BulkDeleteConfirmed), true.ToString() } - }; + // Build controller input + + var options = new PageIndexOptions { + BulkAction = PageIndexBulkAction.Delete, + BulkDeleteConfirmed = true, + }; + + var pageEntries = new List(); 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.NameOf(m => m.Options.BulkAction), PageIndexBulkAction.Unpublish.ToString() }, - }; + var options = new PageIndexOptions { + BulkAction = PageIndexBulkAction.Unpublish, + }; + var pageEntries = new List(); 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.NameOf(m => m.Revision.Slug), "new-slug-value" }, - { ReflectOn.NameOf(m => m.Command), PageEditCommand.PublishNow.ToString() } - }; - var result = _controller.Edit(_slugPageId, input); + _controller.ValueProvider = Values.From(new Dictionary { + {"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 { + { "TemplateName", "threecolumn" } + }); + var result = _controller.ChooseTemplatePOST(revision.Id); Assert.That(result, Is.TypeOf()); @@ -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 { + { "TemplateName", "twocolumn" } + }); + var result = _controller.ChooseTemplatePOST(revision.Id); Assert.That(result, Is.TypeOf()); @@ -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 { + {"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 { + {"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 { + {"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)); diff --git a/src/Orchard.Tests.Packages/Users/Controllers/AdminControllerTests.cs b/src/Orchard.Tests.Packages/Users/Controllers/AdminControllerTests.cs index 0d420576d..635dade2c 100644 --- a/src/Orchard.Tests.Packages/Users/Controllers/AdminControllerTests.cs +++ b/src/Orchard.Tests.Packages/Users/Controllers/AdminControllerTests.cs @@ -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 obj) { - return new ValueProvider(obj); - } - class ValueProvider : 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(); - 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(); - controller.ValueProvider = Values.Of(new { + controller.ValueProvider = Values.From(new { UserName = "bubba", Email = "hotep", }); diff --git a/src/Orchard.Tests.Packages/Values.cs b/src/Orchard.Tests.Packages/Values.cs new file mode 100644 index 000000000..6ab28b8fd --- /dev/null +++ b/src/Orchard.Tests.Packages/Values.cs @@ -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 obj) { + if (obj is IDictionary) { + return new DictionaryValueProvider( + (IDictionary)obj, + CultureInfo.InvariantCulture); + } + return new ValueProvider(obj); + } + + class ValueProvider : 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); + } + } + } +} diff --git a/src/Orchard.Tests/Models/DefaultModelManagerTests.cs b/src/Orchard.Tests/Models/DefaultModelManagerTests.cs index 2a9524780..62d32beaa 100644 --- a/src/Orchard.Tests/Models/DefaultModelManagerTests.cs +++ b/src/Orchard.Tests/Models/DefaultModelManagerTests.cs @@ -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()); - Assert.That(t1.Model, Is.TypeOf()); - Assert.That(t2.Model, Is.TypeOf()); - - Assert.That(t0.Position, Is.EqualTo("3")); - Assert.That(t1.Position, Is.Null); - Assert.That(t2.Position, Is.EqualTo("10")); - - - } - } } diff --git a/src/Orchard.Tests/UI/Notify/NotifyFilterTests.cs b/src/Orchard.Tests/UI/Notify/NotifyFilterTests.cs index 358cf3f7a..312e3a831 100644 --- a/src/Orchard.Tests/UI/Notify/NotifyFilterTests.cs +++ b/src/Orchard.Tests/UI/Notify/NotifyFilterTests.cs @@ -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(model), - TempData = context.Controller.TempData - }; + ViewData = new ViewDataDictionary(model), + TempData = context.Controller.TempData + }; filter.OnActionExecuted(context); filter.OnResultExecuting(new ResultExecutingContext(context, context.Result)); diff --git a/src/Orchard.Web/Packages/Orchard.CmsPages/Controllers/AdminController.cs b/src/Orchard.Web/Packages/Orchard.CmsPages/Controllers/AdminController.cs index 4d63b6b7f..52b4fae33 100644 --- a/src/Orchard.Web/Packages/Orchard.CmsPages/Controllers/AdminController.cs +++ b/src/Orchard.Web/Packages/Orchard.CmsPages/Controllers/AdminController.cs @@ -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 pageEntries) { + //var viewModel = new PageIndexViewModel(); + //UpdateModel(viewModel); try { - IEnumerable checkedEntries = viewModel.PageEntries.Where(p => p.IsChecked); - switch (viewModel.Options.BulkAction) { + IEnumerable 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); diff --git a/src/Orchard/ContentManagement/Drivers/PartTemplateResult.cs b/src/Orchard/ContentManagement/Drivers/PartTemplateResult.cs index a1b647ee2..544d60649 100644 --- a/src/Orchard/ContentManagement/Drivers/PartTemplateResult.cs +++ b/src/Orchard/ContentManagement/Drivers/PartTemplateResult.cs @@ -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) {