diff --git a/src/Orchard.Tests.Packages/Orchard.Tests.Packages.csproj b/src/Orchard.Tests.Packages/Orchard.Tests.Packages.csproj index 4e14ccacc..3e94ad83a 100644 --- a/src/Orchard.Tests.Packages/Orchard.Tests.Packages.csproj +++ b/src/Orchard.Tests.Packages/Orchard.Tests.Packages.csproj @@ -64,6 +64,7 @@ ..\..\lib\sqlite\System.Data.SQLite.DLL True + 3.5 @@ -85,6 +86,15 @@ + + + + + + + + + @@ -99,6 +109,10 @@ {ABC826D4-2FA1-4F2F-87DE-E6095F653810} Orchard.Tests + + {1ECC1131-0D0C-4822-AD90-E979868C63F3} + Orchard.CmsPages + {D10AD48F-407D-4DB5-A328-173EC7CB010F} Orchard.Roles diff --git a/src/Orchard.Tests.Packages/Pages/Controllers/AdminControllerTests.cs b/src/Orchard.Tests.Packages/Pages/Controllers/AdminControllerTests.cs new file mode 100644 index 000000000..6ec0f5df8 --- /dev/null +++ b/src/Orchard.Tests.Packages/Pages/Controllers/AdminControllerTests.cs @@ -0,0 +1,494 @@ +using System; +using System.Linq; +using System.Collections.Generic; +using System.Web; +using System.Web.Mvc; +using System.Web.Routing; +using NUnit.Framework; +using Orchard.CmsPages.Controllers; +using Orchard.CmsPages.Models; +using Orchard.CmsPages.Services; +using Orchard.CmsPages.Services.Templates; +using Orchard.CmsPages.ViewModels; +using Orchard.Data; +using Orchard.Security; +using Orchard.Security.Permissions; +using Orchard.Tests.Stubs; +using Orchard.UI.Notify; +using Orchard.Utility; + +namespace Orchard.Tests.Packages.Pages.Controllers { + [TestFixture] + public class AdminControllerTests : DatabaseEnabledTestsBase { + private AdminController _controller; + private IPageManager _pageManager; + private IPageScheduler _pageScheduler; + private IAuthorizationService _authorizationService; + private ITemplateProvider _templateProvider; + private int _slugPageId; + private IRepository _pagesRepository; + + [SetUp] + public override void Init() { + base.Init(); + + _pagesRepository = _container.Resolve>(); + //_pagesRepository.Create(new Page { Slug = "slug" }); + _pageManager = _container.Resolve(); + _pageScheduler = _container.Resolve(); + _templateProvider = _container.Resolve(); + _authorizationService = _container.Resolve(); + var page = _pageManager.CreatePage(new PageCreateViewModel { Slug = "slug", Templates = _templateProvider.List() }); + _slugPageId = page.Id; + + _controller = _container.Resolve(); + _controller.ControllerContext = new ControllerContext(new StubHttpContext("~/admin/cmspages"), new RouteData(), _controller); + } + + public override void Register(Autofac.Builder.ContainerBuilder builder) { + builder.Register(); + builder.Register().As(); + builder.Register().As(); + builder.Register().As(); + builder.Register(new StubTemplateProvider()).As(); + builder.Register(new StubAuthorizationService()).As(); + } + + protected override IEnumerable DatabaseTypes { + get { + return new[] { + typeof (Page), typeof (PageRevision), typeof (ContentItem), typeof (Published), + typeof (Scheduled) + }; + } + } + + class StubTemplateProvider : ITemplateProvider { + public IList List() { + return new List { + new TemplateDescriptor { Name = "twocolumn", Zones = new[] { "content1", "content2" } }, + new TemplateDescriptor { Name = "threecolumn", Zones = new[] { "content1", "content2", "content3" } } + }; + } + + public TemplateDescriptor Get(string name) { + if (name == "twocolumn") { + return List()[0]; + } + if (name == "threecolumn") { + return List()[1]; + } + return null; + } + } + + class StubAuthorizationService : IAuthorizationService { + #region Implementation of IAuthorizationService + + public bool CheckAccess(IUser user, Permission permission) { + return true; + } + + #endregion + } + + [Test] + public void CreateShouldReturnViewWithErrorIfSlugIsNull() { + var input = new FormCollection { { ReflectOn.NameOf(m => m.Slug), null } }; + var result = _controller.Create(input); + Assert.That(result, Is.TypeOf()); + Assert.That(_controller.ModelState.IsValid, Is.False); + } + + [Test] + public void CreateShouldReturnEmptyPageCreateViewModel() { + var result = _controller.Create(); + Assert.That(result, Is.Not.Null); + Assert.That(result, Is.TypeOf()); + + var model = ((ViewResult)result).ViewData.Model; + Assert.That(model, Is.TypeOf()); + + var pageModel = (PageCreateViewModel)model; + Assert.That(pageModel.TemplateName, Is.EqualTo("twocolumn")); + Assert.That(pageModel.Templates.Count(), Is.EqualTo(2)); + Assert.That(pageModel.Templates.First().Name, Is.EqualTo("twocolumn")); + Assert.That(pageModel.Templates.Skip(1).First().Name, Is.EqualTo("threecolumn")); + } + + [Test] + public void CreateShouldCreatePageWithSlugAndTemplateAndRedirectToEdit() { + + 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); + + Assert.That(result, Is.TypeOf()); + var redirect = (RedirectToRouteResult)result; + Assert.That(redirect.RouteValues["action"], Is.EqualTo("Edit")); + + var pageId = Convert.ToInt32(redirect.RouteValues["id"]); + + var pageWasCreated = _pageManager.GetLastRevision(pageId); + var pageStillNotVisible = _pageManager.GetPublishedBySlug("slug2"); + + Assert.That(pageDoesntExist, Is.Null); + Assert.That(pageWasCreated, Is.Not.Null); + Assert.That(pageWasCreated.Slug, Is.EqualTo("slug2")); + Assert.That(pageWasCreated.TemplateName, Is.EqualTo("threecolumn")); + Assert.That(pageStillNotVisible, Is.Null); + } + + [Test] + public void IndexShouldReturnTheListOfFilteredPages() { + var createPage = new PageCreateViewModel { Title = "hello", Slug = "world", TemplateName = "twocolumn" }; + var revision = _pageManager.CreatePage(createPage); + _pageManager.Publish(revision, new PublishOptions()); + + var createPage2 = new PageCreateViewModel { Title = "hello2", Slug = "world2", TemplateName = "twocolumn" }; + var revision2 = _pageManager.CreatePage(createPage2); + _pageScheduler.AddPublishTask(revision2, _clock.FutureMoment(TimeSpan.FromMinutes(1))); + + ClearSession(); + + Assert.That(_pagesRepository.Count(x => true), Is.EqualTo(3)); + + // No filter + { + var result = _controller.Index(new PageIndexOptions()); + var pages = (PageIndexViewModel)(((ViewResult)result).ViewData.Model); + Assert.That(pages.Options.Filter, Is.EqualTo(PageIndexFilter.All)); + Assert.That(pages.PageEntries.Count, Is.EqualTo(3)); + Assert.That( + pages.PageEntries.Single(p => p.IsPublished && p.Published.PageRevision.Id == revision.Id).Published. + PageRevision.Slug, Is.EqualTo("world")); + } + + // Published + { + var result = _controller.Index(new PageIndexOptions { Filter = PageIndexFilter.Published }); + + var pages = (PageIndexViewModel)(((ViewResult)result).ViewData.Model); + Assert.That(pages.Options.Filter, Is.EqualTo(PageIndexFilter.Published)); + Assert.That(pages.PageEntries.Count, Is.EqualTo(1)); + Assert.That(pages.PageEntries[0].Published.PageRevision.Slug, Is.EqualTo("world")); + } + + // Offline + { + var result = _controller.Index(new PageIndexOptions { Filter = PageIndexFilter.Offline }); + + var pages = (PageIndexViewModel)(((ViewResult)result).ViewData.Model); + Assert.That(pages.Options.Filter, Is.EqualTo(PageIndexFilter.Offline)); + Assert.That(pages.PageEntries.Count, Is.EqualTo(2)); + Assert.That(pages.PageEntries.OrderBy(page => page.Page.Id).First().Page.Revisions.Last().Slug, Is.EqualTo("slug")); + Assert.That(pages.PageEntries.OrderBy(page => page.Page.Id).Skip(1).First().Page.Revisions.Last().Slug, Is.EqualTo("world2")); + } + + // Scheduled + { + var result = _controller.Index(new PageIndexOptions { Filter = PageIndexFilter.Scheduled }); + + var pages = (PageIndexViewModel)(((ViewResult)result).ViewData.Model); + Assert.That(pages.Options.Filter, Is.EqualTo(PageIndexFilter.Scheduled)); + Assert.That(pages.PageEntries.Count, Is.EqualTo(1)); + Assert.That(pages.PageEntries[0].Page.Revisions.Last().Slug, Is.EqualTo("world2")); + } + } + + [Test] + public void IndexPostShouldPerformBulkPublishNow() { + var createPage = new PageCreateViewModel { Title = "hello", Slug = "world", TemplateName = "twocolumn" }; + var revision = _pageManager.CreatePage(createPage); + + // Add a scheduled publish task to make sure it's deleted when bulk "PublishNow" is called + _pageScheduler.AddPublishTask(revision, _clock.FutureMoment(TimeSpan.FromMinutes(1))); + + // Check database state + ClearSession(); + var pages = _pagesRepository.Table.ToList(); + Assert.That(pages.Count, Is.EqualTo(2)); + Assert.That(pages[0].Published, Is.Null); + 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.PublishNow.ToString() } }; + 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()); + } + + // Call controller + var result = _controller.Index(input); + + // Verify result, check database state + ClearSession(); + pages = _pagesRepository.Table.ToList(); + Assert.That(result, Is.InstanceOf()); + Assert.That(pages[0].Published, Is.Not.Null); + Assert.That(pages[1].Published, Is.Not.Null); + Assert.That(pages[0].Scheduled.Count, Is.EqualTo(0)); + Assert.That(pages[1].Scheduled.Count, Is.EqualTo(0)); + } + + [Test] + public void IndexPostShouldPerformBulkPublishLater() { + var createPage = new PageCreateViewModel { Title = "hello", Slug = "world", TemplateName = "twocolumn" }; + var revision = _pageManager.CreatePage(createPage); + + // Add a scheduled publish task to make sure it's deleted when bulk "PublishNow" is called + _pageScheduler.AddPublishTask(revision, _clock.FutureMoment(TimeSpan.FromMinutes(1))); + + // Check database state + ClearSession(); + var pages = _pagesRepository.Table.ToList(); + Assert.That(pages.Count, Is.EqualTo(2)); + Assert.That(pages[0].Published, Is.Null); + 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) } + }; + 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()); + } + + // Call controller + var result = _controller.Index(input); + + // Verify result, check database state + ClearSession(); + pages = _pagesRepository.Table.ToList(); + Assert.That(result, Is.InstanceOf()); + Assert.That(pages[0].Published, Is.Null); + Assert.That(pages[1].Published, Is.Null); + Assert.That(pages[0].Scheduled.Count, Is.EqualTo(1)); + Assert.That(pages[0].Scheduled[0].ScheduledDate, Is.EqualTo(scheduledDate)); + Assert.That(pages[1].Scheduled.Count, Is.EqualTo(1)); + Assert.That(pages[1].Scheduled[0].ScheduledDate, Is.EqualTo(scheduledDate)); + } + + [Test] + public void IndexPostShouldPerformBulkDelete() { + var createPage = new PageCreateViewModel { Title = "hello", Slug = "world", TemplateName = "twocolumn" }; + var revision = _pageManager.CreatePage(createPage); + + // Add a scheduled publish task to make sure it's deleted when bulk "PublishNow" is called + _pageScheduler.AddPublishTask(revision, _clock.FutureMoment(TimeSpan.FromMinutes(1))); + + // Check database state + ClearSession(); + var pages = _pagesRepository.Table.ToList(); + Assert.That(pages.Count, Is.EqualTo(2)); + Assert.That(pages[0].Published, Is.Null); + 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() } + }; + + 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()); + } + + // Call controller + var result = _controller.Index(input); + + // Verify result, check database state + ClearSession(); + pages = _pagesRepository.Table.ToList(); + Assert.That(result, Is.InstanceOf()); + } + + [Test] + public void IndexPostShouldPerformBulkUnpublish() { + var createPage = new PageCreateViewModel { Title = "hello", Slug = "world", TemplateName = "twocolumn" }; + var revision = _pageManager.CreatePage(createPage); + _pageManager.Publish(revision, new PublishOptions()); + + // Check database state + ClearSession(); + var pages = _pagesRepository.Table.ToList(); + Assert.That(pages.Count, Is.EqualTo(2)); + Assert.That(pages[0].Published, Is.Null); + Assert.That(pages[1].Published, Is.Not.Null); + + // Build controller input + var input = new FormCollection { + { ReflectOn.NameOf(m => m.Options.BulkAction), PageIndexBulkAction.Unpublish.ToString() }, + }; + + 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()); + } + + // Call controller + var result = _controller.Index(input); + + // Verify result, check database state + ClearSession(); + pages = _pagesRepository.Table.ToList(); + Assert.That(result, Is.InstanceOf()); + Assert.That(pages.Count, Is.EqualTo(2)); + Assert.That(pages[0].Published, Is.Null); + Assert.That(pages[1].Published, Is.Null); + } + + [Test] + [ExpectedException(typeof(HttpException))] + public void EditShouldThrow404IfSlugIsNotFound() { + _controller.Edit(6655321); + } + + [Test] + 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); + + var pageNotFoundAnymore = _pageManager.GetPublishedBySlug("slug"); + var pageFromNewSlug = _pageManager.GetPublishedBySlug("new-slug-value"); + + + Assert.That(result, Is.TypeOf()); + Assert.That(pageBeforeEdit, Is.Not.Null); + Assert.That(pageNotFoundAnymore, Is.Null); + Assert.That(pageFromNewSlug, Is.Not.Null); + Assert.That(pageBeforeEdit.Id, Is.EqualTo(pageFromNewSlug.Id)); + Assert.That(pageFromNewSlug.Slug, Is.EqualTo("new-slug-value")); + } + + [Test] + public void ChooseTemplateListsAvailableTemplatesWithCurrentOneSelected() { + var createPage = new PageCreateViewModel { Title = "hello", Slug = "world", TemplateName = "twocolumn" }; + var revision = _pageManager.CreatePage(createPage); + var result = _controller.ChooseTemplate(revision.Id); + + var viewModel = (ChooseTemplateViewModel)((ViewResult)result).ViewData.Model; + Assert.That(viewModel.TemplateName, Is.EqualTo("twocolumn")); + Assert.That(viewModel.Templates, Has.Some.Property("Name").EqualTo("twocolumn")); + Assert.That(viewModel.Templates, Has.Some.Property("Name").EqualTo("threecolumn")); + } + + + [Test] + public void PostingDifferentTemplateResultsInDraftAndExtendsNamedContentItems() { + var createPage = new PageCreateViewModel { Title = "hello", Slug = "world", TemplateName = "twocolumn" }; + var revision = _pageManager.CreatePage(createPage); + _pageManager.Publish(revision, new PublishOptions()); + + 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); + + Assert.That(result, Is.TypeOf()); + + _session.Flush(); + _session.Clear(); + + var published = _pageManager.GetPublishedBySlug("world"); + var draft = _pageManager.GetLastRevision(revision.Page.Id); + + // different revision for draft + Assert.That(draft.Page.Id, Is.EqualTo(published.Page.Id)); + Assert.That(draft.Id, Is.Not.EqualTo(published.Id)); + + // content item added + Assert.That(draft.Contents, Has.Count.EqualTo(3)); + Assert.That(draft.Contents, Has.Some.Property("ZoneName").EqualTo("content3")); + } + + [Test, Ignore("This can't be properly implementated until a transaction scope with rollback abilities is available to the controller")] + public void PostingSameTemplateDoesNotResultInDraftBeingCreated() { + var createPage = new PageCreateViewModel { Title = "hello", Slug = "world", TemplateName = "twocolumn" }; + var revision = _pageManager.CreatePage(createPage); + _pageManager.Publish(revision, new PublishOptions()); + + 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); + + Assert.That(result, Is.TypeOf()); + + _session.Flush(); + _session.Clear(); + + + var published = _pageManager.GetPublishedBySlug("world"); + var draft = _pageManager.GetLastRevision(revision.Page.Id); + Assert.That(draft.Id, Is.EqualTo(published.Id)); + + } + + [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); + 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); + ClearSession(); + + var chooseTemplateInput = new FormCollection { + {"TemplateName", "twocolumn"}, + }; + _controller.ChooseTemplate(pageId, chooseTemplateInput); + 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); + ClearSession(); + var revision2 = _pageManager.GetLastRevision(pageId); + Assert.That(revision2.Contents, Has.Count.EqualTo(2)); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Tests.Packages/Pages/Controllers/TemplatesControllerTests.cs b/src/Orchard.Tests.Packages/Pages/Controllers/TemplatesControllerTests.cs new file mode 100644 index 000000000..5d032b671 --- /dev/null +++ b/src/Orchard.Tests.Packages/Pages/Controllers/TemplatesControllerTests.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Web.Mvc; +using Autofac.Builder; +using NUnit.Framework; +using Orchard.CmsPages.Controllers; +using Orchard.CmsPages.Services; +using Orchard.CmsPages.Services.Templates; +using Orchard.CmsPages.ViewModels; +using Orchard.CmsPages.Models; +using System.Web; +using Orchard.Tests.Packages.Pages.Services.Templates; + +namespace Orchard.Tests.Packages.Pages.Controllers { + [TestFixture] + public class TemplatesControllerTests : DatabaseEnabledTestsBase { + private TemplatesController _controller; + private IPageManager _pageManager; + private ITemplateProvider _templateProvider; + + public override void Init() { + base.Init(); + + _pageManager = _container.Resolve(); + _templateProvider = _container.Resolve(); + _controller = _container.Resolve(); + + var revision = _pageManager.CreatePage(new PageCreateViewModel { Slug = "slug", Templates = _templateProvider.List() }); + _pageManager.Publish(revision, new PublishOptions()); + } + + public override void Register(ContainerBuilder builder) { + builder.Register(); + builder.Register().As(); + builder.Register().As(); + builder.Register().As(); + builder.Register(new StubTemplateEntryProvider()).As(); + } + + protected override IEnumerable DatabaseTypes { + get { + return new[] { + typeof (Page), typeof (PageRevision), typeof (ContentItem), typeof (Published), + typeof (Scheduled) + }; + } + } + + [Test] + [ExpectedException(typeof (HttpException))] + public void ShowShouldThrow404IfSlugIsNotFound() { + _controller.Show("notExisting"); + } + + [Test] + [ExpectedException(typeof (ArgumentNullException))] + public void ShowShouldThrowIfSlugIsNull() { + _controller.Show(null); + } + + [Test] + public void ShowShouldReturnAViewResult() { + Assert.That(_controller.Show("slug"), Is.Not.Null); + } + + [Test] + public void SlugShouldBeUsedToGetPageFromRepository() { + var result = _controller.Show("slug"); + var page = (PageRevision) (((ViewResult) result).ViewData.Model); + Assert.That(page.Slug, Is.EqualTo("slug")); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Tests.Packages/Pages/Services/PageManagerTests.cs b/src/Orchard.Tests.Packages/Pages/Services/PageManagerTests.cs new file mode 100644 index 000000000..e495c5584 --- /dev/null +++ b/src/Orchard.Tests.Packages/Pages/Services/PageManagerTests.cs @@ -0,0 +1,295 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using Autofac.Builder; +using NUnit.Framework; +using Orchard.CmsPages.Models; +using Orchard.CmsPages.Services; +using Orchard.CmsPages.Services.Templates; +using Orchard.CmsPages.ViewModels; +using Orchard.Data; + +namespace Orchard.Tests.Packages.Pages.Services { + [TestFixture] + public class PageManagerTests : DatabaseEnabledTestsBase { + private IPageManager _manager; + private ITemplateProvider _templateProvider; + + public override void Init() { + base.Init(); + + _manager = _container.Resolve(); + _templateProvider = _container.Resolve(); + } + + public override void Register(ContainerBuilder builder) { + builder.Register().As(); + builder.Register(new StubTemplateProvider()).As(); + } + + protected override IEnumerable DatabaseTypes { + get { + return new[] { + typeof (Page), typeof (PageRevision), typeof (ContentItem), typeof (Published), + typeof (Scheduled) + }; + } + } + + class StubTemplateProvider : ITemplateProvider { + public IList List() { + return new List { + new TemplateDescriptor { Name = "twocolumn", Zones = new[] { "content1", "content2" } } + }; + } + + public TemplateDescriptor Get(string name) { + if (name == "twocolumn") { + return List()[0]; + } + return null; + } + } + + + [Test] + public void CreatePageShouldAddInitialRecordsIncludingEmptyContentZonesFromTemplate() { + var page = _manager.CreatePage(PageCreate("foo", "The Foo Page", "twocolumn")); + + Assert.That(page.Slug, Is.EqualTo("foo")); + Assert.That(page.Title, Is.EqualTo("The Foo Page")); + Assert.That(page.TemplateName, Is.EqualTo("twocolumn")); + Assert.That(page.Contents, Has.Count.EqualTo(2)); + Assert.That(page.Contents, Has.Some.Property("ZoneName").EqualTo("content1")); + Assert.That(page.Contents, Has.Some.Property("ZoneName").EqualTo("content2")); + } + + private PageCreateViewModel PageCreate(string slug, string title, string template) { + return new PageCreateViewModel { Slug = slug, Title = title, TemplateName = template, Templates = _templateProvider.List() }; + } + + [Test] + public void CreatePageWithNullEmptyOrInvalidTemplateNameStillCreatesPage() { + var page1 = _manager.CreatePage(PageCreate("foo1", "The Foo1 Page", null)); + var page2 = _manager.CreatePage(PageCreate("foo2", "The Foo2 Page", string.Empty)); + var page3 = _manager.CreatePage(PageCreate("foo3", "The Foo3 Page", "NoSuchTemplate")); + + Assert.That(page1.Id, Is.Not.EqualTo(0)); + Assert.That(page2.Id, Is.Not.EqualTo(0)); + Assert.That(page3.Id, Is.Not.EqualTo(0)); + + //TODO: should a default named "content" always be assumed? + Assert.That(page1.Contents, Has.Count.EqualTo(0)); + Assert.That(page2.Contents, Has.Count.EqualTo(0)); + Assert.That(page3.Contents, Has.Count.EqualTo(0)); + } + + [Test] + public void ContentItemRecordsShouldFlushCorrectlyOnPageCreate() { + var page1 = _manager.CreatePage(PageCreate("foo", "The Foo Page", "twocolumn")); + _session.Clear(); + var page2 = _manager.GetLastRevision(page1.Id); + Assert.That(page2.Contents, Has.Count.EqualTo(2)); + } + + [Test] + public void GetPublishedBySlugShouldOnlyReturnPageAfterItIsPublished() { + var revision = _manager.CreatePage(new PageCreateViewModel { Slug = "hello-world", Templates = _templateProvider.List() }); + + var notPublishedYet = _manager.GetPublishedBySlug("hello-world"); + Assert.That(notPublishedYet, Is.Null); + + _manager.Publish(revision, new PublishOptions()); + + var publishedNow = _manager.GetPublishedBySlug("hello-world"); + Assert.That(publishedNow, Is.Not.Null); + } + + [Test] + [Ignore("Linq to NHib doesn't support calling 'String.Equals' in expressions. Figure out a workaround.")] + public void GetPublishedBySlugShouldBeCaseInsensitive() { + var revision = _manager.CreatePage(new PageCreateViewModel { Slug = "hello-world", Templates = _templateProvider.List() }); + _manager.Publish(revision, new PublishOptions()); + + var publishedNow = _manager.GetPublishedBySlug("hello-WORLD"); + Assert.That(publishedNow, Is.Not.Null); + } + + [Test] + public void PublishingPagesAddsToCurrentlyPublishedSlugList() { + _manager.Publish(_manager.CreatePage(new PageCreateViewModel { Slug = "one", Templates = _templateProvider.List() }), new PublishOptions()); + _manager.Publish(_manager.CreatePage(new PageCreateViewModel { Slug = "two", Templates = _templateProvider.List() }), new PublishOptions()); + _manager.Publish(_manager.CreatePage(new PageCreateViewModel { Slug = "three", Templates = _templateProvider.List() }), new PublishOptions()); + + var slugs = _manager.GetCurrentlyPublishedSlugs(); + Assert.That(slugs, Has.Count.GreaterThanOrEqualTo(3)); + Assert.That(slugs, Has.Some.EqualTo("one")); + Assert.That(slugs, Has.Some.EqualTo("two")); + Assert.That(slugs, Has.Some.EqualTo("three")); + } + + [Test] + public void PublishingPagesDoesNotChangeSlugCasing() { + _manager.Publish(_manager.CreatePage(new PageCreateViewModel { Slug = "One", Templates = _templateProvider.List() }), new PublishOptions()); + _manager.Publish(_manager.CreatePage(new PageCreateViewModel { Slug = "TWO", Templates = _templateProvider.List() }), new PublishOptions()); + _manager.Publish(_manager.CreatePage(new PageCreateViewModel { Slug = "thRee", Templates = _templateProvider.List() }), new PublishOptions()); + + var slugs = _manager.GetCurrentlyPublishedSlugs(); + Assert.That(slugs, Has.Count.GreaterThanOrEqualTo(3)); + Assert.That(slugs, Has.Some.EqualTo("One")); + Assert.That(slugs, Has.Some.EqualTo("TWO")); + Assert.That(slugs, Has.Some.EqualTo("thRee")); + } + + [Test] + public void PublishingThePublishedRevisionDoesNothing() { + var initial = _manager.CreatePage(new PageCreateViewModel { Slug = "foo", Templates = _templateProvider.List() }); + _manager.Publish(initial, new PublishOptions()); + + DateTime initialRevisionTime = initial.PublishedDate.Value; + + _clock.Advance(TimeSpan.FromSeconds(1)); + + _manager.Publish(initial, new PublishOptions()); + + Assert.That(initial.Page.Revisions.Count, Is.EqualTo(1)); + Assert.That(initial.Page.Revisions[0], Is.SameAs(initial)); + Assert.That(initial.Number, Is.EqualTo(1)); + Assert.That(initial.PublishedDate, Is.EqualTo(initialRevisionTime)); + } + + [Test] + public void AcquireDraftOnUnpublishedPageShouldReturnExistingRevision() { + var initial = _manager.CreatePage(new PageCreateViewModel { Slug = "foo", Templates = _templateProvider.List() }); + var draft = _manager.AcquireDraft(initial.Page.Id); + Assert.That(initial, Is.SameAs(draft)); + } + + [Test] + public void AcquireDraftForUpdateOnPublishedPageShouldCreateNewRevision() { + var initial = _manager.CreatePage(new PageCreateViewModel { Slug = "foo", Templates = _templateProvider.List() }); + _manager.Publish(initial, new PublishOptions()); + var draft = _manager.AcquireDraft(initial.Page.Id); + Assert.That(initial, Is.Not.SameAs(draft)); + Assert.That(initial.Number, Is.LessThan(draft.Number)); + } + + [Test] + public void PublishingDraftWithKeepHistoryFalseShouldDeletePreviousPublishedRevision() { + var initial = _manager.CreatePage(new PageCreateViewModel { Slug = "foo", Templates = _templateProvider.List() }); + var pageId = initial.Page.Id; + + _manager.Publish(initial, new PublishOptions()); + var draft = _manager.AcquireDraft(pageId); + _manager.Publish(draft, new PublishOptions { History = PublishHistory.Discard }); + + _session.Flush(); + _session.Clear(); + + var lastRevision = _manager.GetLastRevision(pageId); + + + Assert.That(lastRevision.Id, Is.EqualTo(draft.Id)); + Assert.That(lastRevision.Page.Revisions, Has.Count.EqualTo(1)); + } + + [Test] + public void PublishingDraftWithKeepHistoryTrueShouldLeavePreviousRevisionIntact() { + var initial = _manager.CreatePage(new PageCreateViewModel { Slug = "foo", Templates = _templateProvider.List() }); + var pageId = initial.Page.Id; + + Trace.WriteLine("Publish initial"); + _manager.Publish(initial, new PublishOptions()); + Trace.WriteLine("AcquireDraft"); + var draft = _manager.AcquireDraft(pageId); + Trace.WriteLine("Publish draft"); + _manager.Publish(draft, new PublishOptions { History = PublishHistory.Preserve }); + + _session.Flush(); + _session.Clear(); + + Trace.WriteLine("GetLastRevision"); + var lastRevision = _manager.GetLastRevision(pageId); + + Assert.That(lastRevision.Id, Is.EqualTo(draft.Id)); + Assert.That(lastRevision.Page.Revisions, Has.Count.EqualTo(2)); + } + + [Test] + public void PublishDateIsSetWhenPublishOccurs() { + var initial = _manager.CreatePage(new PageCreateViewModel { Slug = "foo", Templates = _templateProvider.List() }); + Assert.That(initial.PublishedDate, Is.Null); + _manager.Publish(initial, new PublishOptions()); + Assert.That(initial.PublishedDate, Is.EqualTo(_clock.UtcNow)); + } + + [Test] + public void ModifiedDateIsSetWhenPageIsCreatedAndWhenAcquireDraftIsCalled() { + var mark1 = _clock.UtcNow; + + var initial = _manager.CreatePage(new PageCreateViewModel { Slug = "foo", Templates = _templateProvider.List() }); + Assert.That(initial.PublishedDate, Is.Null); + Assert.That(initial.ModifiedDate, Is.EqualTo(mark1)); + + _clock.Advance(TimeSpan.FromMinutes(5)); + var mark2 = _clock.UtcNow; + + _manager.Publish(initial, new PublishOptions()); + Assert.That(initial.PublishedDate, Is.EqualTo(mark2)); + Assert.That(initial.ModifiedDate, Is.EqualTo(mark1)); + + _clock.Advance(TimeSpan.FromMinutes(5)); + var mark3 = _clock.UtcNow; + + var draft = _manager.AcquireDraft(initial.Page.Id); + Assert.That(draft.Id, Is.Not.EqualTo(initial.Id)); + Assert.That(draft.PublishedDate, Is.Null); + Assert.That(draft.ModifiedDate, Is.EqualTo(mark3)); + + Assert.That(mark1, Is.LessThan(mark2)); + Assert.That(mark2, Is.LessThan(mark3)); + + // verify changes flushed as expected + _session.Flush(); + _session.Clear(); + + var reloaded = _manager.GetLastRevision(initial.Page.Id); + + Assert.That(reloaded.PublishedDate, Is.Null); + Assert.That(reloaded.ModifiedDate, Is.EqualTo(mark3)); + + Assert.That(reloaded.Page.Revisions, Has.Count.EqualTo(2)); + + Assert.That(reloaded.Page.Revisions.First().PublishedDate, Is.EqualTo(mark2)); + Assert.That(reloaded.Page.Revisions.First().ModifiedDate, Is.EqualTo(mark1)); + } + + [Test] + public void PublishedPropertyShouldCascadeInsertsAndDeletesWhenSetAndNulled() { + var page = new Page {Published = new Published()}; + page.Published.Page = page; + + var pageRepos = _container.Resolve>(); + pageRepos.Create(page); + + ClearSession(); + + var page2 = pageRepos.Get(page.Id); + + Assert.That(page2.Published, Is.Not.Null); + + _container.Resolve>().Delete(page2.Published); + page2.Published = null; + + ClearSession(); + + var page3 = pageRepos.Get(page.Id); + Assert.That(page3.Published, Is.Null); + } + + // more tests: + // publish new revision on same slug + // publish on slug already published on different page + } +} \ No newline at end of file diff --git a/src/Orchard.Tests.Packages/Pages/Services/PageSchedulerTests.cs b/src/Orchard.Tests.Packages/Pages/Services/PageSchedulerTests.cs new file mode 100644 index 000000000..48dc0457a --- /dev/null +++ b/src/Orchard.Tests.Packages/Pages/Services/PageSchedulerTests.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Orchard.CmsPages.Models; +using Orchard.CmsPages.Services; +using Orchard.CmsPages.Services.Templates; +using Orchard.Data; + +namespace Orchard.Tests.Packages.Pages.Services { + [TestFixture] + public class PageSchedulerTests : DatabaseEnabledTestsBase { + private IPageScheduler _scheduler; + private IPageManager _manager; + + + public override void Init() { + base.Init(); + _manager = _container.Resolve(); + _scheduler = _container.Resolve(); + } + + public override void Register(Autofac.Builder.ContainerBuilder builder) { + builder.Register().As(); + builder.Register().As(); + builder.Register(new StubTemplateProvider()).As(); + } + + protected override IEnumerable DatabaseTypes { + get { + return new[] { + typeof (Page), typeof (PageRevision), typeof (ContentItem), typeof (Published), + typeof (Scheduled) + }; + } + } + + private class StubTemplateProvider : ITemplateProvider { + public IList List() { + return Enumerable.Empty().ToList(); + } + + public TemplateDescriptor Get(string name) { + return null; + } + } + + [Test] + public void SchedulerWillStoreScheduledTasksThatCanBeListedFromTheRevisionAndPage() { + var published = _manager.CreateAndPublishPage("hello", "Hello World"); + var draft = _manager.AcquireDraft(published.Page.Id); + var futureMoment1 = _clock.FutureMoment(TimeSpan.FromMinutes(5)); + var futureMoment2 = _clock.FutureMoment(TimeSpan.FromMinutes(6)); + _scheduler.AddPublishTask(draft, futureMoment1); + _scheduler.AddPublishTask(published, futureMoment2); + _session.Flush(); + _session.Clear(); + + var draft2 = _manager.GetLastRevision(published.Page.Id); + var published2 = _manager.GetPublishedBySlug("hello"); + + //each has one scheduled task + Assert.That(draft2.Scheduled, Has.Count.EqualTo(1)); + Assert.That(published2.Scheduled, Has.Count.EqualTo(1)); + + // both have same page, which has two publish tasks + Assert.That(draft2.Page, Is.SameAs(published2.Page)); + Assert.That(draft2.Page.Scheduled, Has.Count.EqualTo(2)); + Assert.That(published2.Page.Scheduled, Has.Count.EqualTo(2)); + Assert.That(published2.Page.Scheduled, Has.All.Property("Action").EqualTo(ScheduledAction.Publish)); + + // time of each task is correct + Assert.That(draft2.Scheduled.Single().ScheduledDate, Is.EqualTo(futureMoment1)); + Assert.That(published2.Scheduled.Single().ScheduledDate, Is.EqualTo(futureMoment2)); + } + + [Test] + public void SweepShouldPublishAndRemoveTaskRecordsWhenTheApproprioateTimeHasPassed() { + + var published = _manager.CreateAndPublishPage("hello", "Hello World"); + var draft = _manager.AcquireDraft(published.Page.Id); + var moment = _clock.FutureMoment(TimeSpan.FromMinutes(5)); + + Assert.That(draft.Id, Is.Not.EqualTo(published.Id)); + + _scheduler.AddPublishTask(draft, moment); + + _session.Flush(); + _scheduler.Sweep(); + + Assert.That(draft.Scheduled, Has.Count.EqualTo(1)); + Assert.That(_manager.GetPublishedBySlug("hello"), Has.Property("Id").EqualTo(published.Id)); + + _clock.Advance(TimeSpan.FromMinutes(6)); + _session.Flush(); + _scheduler.Sweep(); + + Assert.That(draft.Scheduled, Has.Count.EqualTo(0)); + Assert.That(_manager.GetPublishedBySlug("hello"), Has.Property("Id").EqualTo(draft.Id)); + } + + [Test] + public void SchedulerShouldRemoveTasksIfTheyFail() { + _scheduler.AddPublishTask( + _manager.CreateAndPublishPage("hello", "Hello World"), + _clock.FutureMoment(TimeSpan.FromMinutes(5))); + + // undefined action should throw an exception + _session.Flush(); + _container.Resolve>().Table.Single().Action = ScheduledAction.Undefined; + + _scheduler.Sweep(); + + _session.Flush(); + Assert.That(_container.Resolve>().Count(x => true), Is.EqualTo(1)); + + _clock.Advance(TimeSpan.FromMinutes(6)); + _scheduler.Sweep(); + + _session.Flush(); + Assert.That(_container.Resolve>().Count(x => true), Is.EqualTo(0)); + } + + } +} \ No newline at end of file diff --git a/src/Orchard.Tests.Packages/Pages/Services/Templates/CommentExtractorTests.cs b/src/Orchard.Tests.Packages/Pages/Services/Templates/CommentExtractorTests.cs new file mode 100644 index 000000000..4cd393497 --- /dev/null +++ b/src/Orchard.Tests.Packages/Pages/Services/Templates/CommentExtractorTests.cs @@ -0,0 +1,84 @@ +using System.Collections.Generic; +using System.IO; +using NUnit.Framework; +using Orchard.CmsPages.Services.Templates; + +namespace Orchard.Tests.Packages.Pages.Services.Templates { + [TestFixture] + public class CommentExtractorTests { + [Test] + public void ExtractorShouldReturnEmptyWhenNoComment() { + var reader = new StringReader(" \r\n "); + var extractor = new CommentExtractor(); + IList result = extractor.Process(reader); + + Assert.That(result.Count, Is.EqualTo(0)); + } + + [Test] + public void ExtractorShouldReturnOneComment() { + var reader = new StringReader("<%@Page %><%--n--%>"); + + var extractor = new CommentExtractor(); + IList result = extractor.Process(reader); + + Assert.That(result.Count, Is.EqualTo(1)); + Assert.That(result[0], Is.EqualTo("n")); + } + + [Test] + public void ExtractorShouldReturnManyComment() { + var reader = new StringReader(@" +<%@Page %> +<%-- n1 --%> +

+<%-- n2 --%> +text +<%-- n3 --%> +<%-- + n4 +--%> +"); + + var extractor = new CommentExtractor(); + IList result = extractor.Process(reader); + + Assert.That(result.Count, Is.EqualTo(4)); + Assert.That(result[0], Is.EqualTo(" n1 ")); + Assert.That(result[1], Is.EqualTo(" n2 ")); + Assert.That(result[2], Is.EqualTo(" n3 ")); + Assert.That(result[3], Is.EqualTo("\r\n n4 \r\n")); + } + + [Test] + public void ExtractorShouldReturnFirstComment() { + var reader = new StringReader(@" +<%@Page %> +<%-- n1 --%> +

+<%-- n2 --%> +text +<%-- n3 --%> +<%-- n4 --%> +"); + + var extractor = new CommentExtractor(); + string result = extractor.FirstComment(reader).ReadToEnd(); + + Assert.That(result, Is.EqualTo(" n1 ")); + } + + [Test] + public void ExtractorShouldReturnEmptyFirstComment() { + var reader = new StringReader(@" +<%@Page %> +<%-- n1 +"); + + var extractor = new CommentExtractor(); + string result = extractor.FirstComment(reader).ReadToEnd(); + + Assert.That(result, Is.EqualTo("")); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Tests.Packages/Pages/Services/Templates/TemplateMetadataParserTests.cs b/src/Orchard.Tests.Packages/Pages/Services/Templates/TemplateMetadataParserTests.cs new file mode 100644 index 000000000..d9ae9f5cb --- /dev/null +++ b/src/Orchard.Tests.Packages/Pages/Services/Templates/TemplateMetadataParserTests.cs @@ -0,0 +1,64 @@ +using System.Collections.Generic; +using System.IO; +using NUnit.Framework; +using Orchard.CmsPages.Services.Templates; + +namespace Orchard.Tests.Packages.Pages.Services.Templates { + [TestFixture] + public class TemplateMetadataParserTests { + [Test] + public void ParserShouldReturnEmptyListForEmptyMetadata() { + var reader = new StringReader(" \r\n "); + var parser = new TemplateMetadataParser(); + IList result = parser.Parse(reader); + + Assert.That(result.Count, Is.EqualTo(0)); + } + + [Test] + public void ParserShouldIgnoreEmptyTags() { + var reader = new StringReader(" : test value \r\n "); + var parser = new TemplateMetadataParser(); + IList result = parser.Parse(reader); + + Assert.That(result.Count, Is.EqualTo(0)); + } + + [Test] + public void ParserShouldReturnMetadata() { + var reader = new StringReader("Description: test"); + var parser = new TemplateMetadataParser(); + IList result = parser.Parse(reader); + + Assert.That(result.Count, Is.EqualTo(1)); + Assert.That(result[0].Tag, Is.EqualTo("Description")); + Assert.That(result[0].Value, Is.EqualTo("test")); + } + + [Test] + public void ParserShouldReturnMultiMetadata() { + var reader = new StringReader("Description: test\r\nTag2: this is my test "); + var parser = new TemplateMetadataParser(); + IList result = parser.Parse(reader); + + Assert.That(result.Count, Is.EqualTo(2)); + Assert.That(result[0].Tag, Is.EqualTo("Description")); + Assert.That(result[0].Value, Is.EqualTo("test")); + Assert.That(result[1].Tag, Is.EqualTo("Tag2")); + Assert.That(result[1].Value, Is.EqualTo("this is my test")); + } + + [Test] + public void ParserShouldSupportMultiLineValues() { + var reader = new StringReader("Description: test Tag2 this\r\n is my test\r\nName:\r\n FooBar"); + var parser = new TemplateMetadataParser(); + IList result = parser.Parse(reader); + + Assert.That(result.Count, Is.EqualTo(2)); + Assert.That(result[0].Tag, Is.EqualTo("Description")); + Assert.That(result[0].Value, Is.EqualTo("test Tag2 this is my test")); + Assert.That(result[1].Tag, Is.EqualTo("Name")); + Assert.That(result[1].Value, Is.EqualTo("FooBar")); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Tests.Packages/Pages/Services/Templates/TemplateProviderTests.cs b/src/Orchard.Tests.Packages/Pages/Services/Templates/TemplateProviderTests.cs new file mode 100644 index 000000000..f69f2dd42 --- /dev/null +++ b/src/Orchard.Tests.Packages/Pages/Services/Templates/TemplateProviderTests.cs @@ -0,0 +1,54 @@ +using NUnit.Framework; +using Orchard.CmsPages.Services.Templates; + +namespace Orchard.Tests.Packages.Pages.Services.Templates { + [TestFixture] + public class TemplateProviderTests { + private StubTemplateEntryProvider _entryProvider; + private ITemplateProvider _provider; + + [SetUp] + public void Init() { + _entryProvider = new StubTemplateEntryProvider(); + _provider = new TemplateProvider(_entryProvider, new TemplateMetadataParser()); + _entryProvider.AddTemplate("test1", @" +<%@Page %> +<%-- +name: Two column layout +description: This has a main content area and a sidebar on the right. +zones: Content, Right sidebar +author: Jon +OtherTag1: OtherValue1 +OtherTag2: OtherValue2 +--%> +"); + } + + [Test] + public void ProviderShouldReturnTemplates() { + var templateDescriptors = _provider.List(); + Assert.That(templateDescriptors.Count, Is.EqualTo(1)); + Assert.That(templateDescriptors[0].Name, Is.EqualTo("test1")); + Assert.That(templateDescriptors[0].DisplayName, Is.EqualTo("Two column layout")); + Assert.That(templateDescriptors[0].Description, Is.EqualTo("This has a main content area and a sidebar on the right.")); + Assert.That(templateDescriptors[0].Zones.Count, Is.EqualTo(2)); + Assert.That(templateDescriptors[0].Zones[0], Is.EqualTo("Content")); + Assert.That(templateDescriptors[0].Zones[1], Is.EqualTo("Right sidebar")); + Assert.That(templateDescriptors[0].Author, Is.EqualTo("Jon")); + Assert.That(templateDescriptors[0].Others.Count, Is.EqualTo(2)); + Assert.That(templateDescriptors[0].Others[0].Tag, Is.EqualTo("OtherTag1")); + Assert.That(templateDescriptors[0].Others[0].Value, Is.EqualTo("OtherValue1")); + Assert.That(templateDescriptors[0].Others[1].Tag, Is.EqualTo("OtherTag2")); + Assert.That(templateDescriptors[0].Others[1].Value, Is.EqualTo("OtherValue2")); + } + + [Test] + public void GetShouldLocateTemplateDescriptorByNameOrReturnNull() { + var test1= _provider.Get("test1"); + var test2 = _provider.Get("test2"); + + Assert.That(test1, Is.Not.Null); + Assert.That(test2, Is.Null); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Tests.Packages/Pages/Services/Templates/TestTemplateProvider.cs b/src/Orchard.Tests.Packages/Pages/Services/Templates/TestTemplateProvider.cs new file mode 100644 index 000000000..cbf6442ba --- /dev/null +++ b/src/Orchard.Tests.Packages/Pages/Services/Templates/TestTemplateProvider.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; +using System.IO; +using Orchard.CmsPages.Services.Templates; + +namespace Orchard.Tests.Packages.Pages.Services.Templates { + public class StubTemplateEntryProvider : ITemplateEntryProvider { + private readonly List _templates = new List(); + + public IEnumerable List() { + return _templates; + } + + public void AddTemplate(string fileName, string fileContent) { + _templates.Add(new TemplateEntry { Name = fileName, Content = new StringReader(fileContent) }); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Tests.Packages/Pages/Services/TestExtensions.cs b/src/Orchard.Tests.Packages/Pages/Services/TestExtensions.cs new file mode 100644 index 000000000..957144c84 --- /dev/null +++ b/src/Orchard.Tests.Packages/Pages/Services/TestExtensions.cs @@ -0,0 +1,13 @@ +using Orchard.CmsPages.Models; +using Orchard.CmsPages.Services; +using Orchard.CmsPages.ViewModels; + +namespace Orchard.Tests.Packages.Pages.Services { + public static class TestExtensions { + public static PageRevision CreateAndPublishPage(this IPageManager manager, string slug, string title) { + var revision = manager.CreatePage(new PageCreateViewModel {Slug = slug, Title = title}); + manager.Publish(revision, new PublishOptions()); + return revision; + } + } +} \ No newline at end of file diff --git a/src/Orchard.Tests/Localization/NullLocalizerTests.cs b/src/Orchard.Tests/Localization/NullLocalizerTests.cs new file mode 100644 index 000000000..880dc45c1 --- /dev/null +++ b/src/Orchard.Tests/Localization/NullLocalizerTests.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Orchard.Localization; + +namespace Orchard.Tests.Localization { + [TestFixture] + public class NullLocalizerTests { + [Test] + public void StringsShouldPassThrough() { + var result = NullLocalizer.Instance("hello world"); + Assert.That(result.ToString(), Is.EqualTo("hello world")); + } + + [Test] + public void StringsShouldFormatIfArgumentsArePassedIn() { + var result = NullLocalizer.Instance("hello {0} world", "!"); + Assert.That(result.ToString(), Is.EqualTo("hello ! world")); + } + + [Test] + public void StringsShouldNotFormatWithoutAnyArguments() { + var result = NullLocalizer.Instance("hello {0} world"); + Assert.That(result.ToString(), Is.EqualTo("hello {0} world")); + } + } +} diff --git a/src/Orchard.Tests/Orchard.Tests.csproj b/src/Orchard.Tests/Orchard.Tests.csproj index 2f00508fa..3f1837187 100644 --- a/src/Orchard.Tests/Orchard.Tests.csproj +++ b/src/Orchard.Tests/Orchard.Tests.csproj @@ -103,6 +103,7 @@ + diff --git a/src/Orchard.Web/Packages/Orchard.CmsPages.Tests/Controllers/AdminControllerTests.cs b/src/Orchard.Web/Packages/Orchard.CmsPages.Tests/Controllers/AdminControllerTests.cs index 6f0ad6c6d..39e385b74 100644 --- a/src/Orchard.Web/Packages/Orchard.CmsPages.Tests/Controllers/AdminControllerTests.cs +++ b/src/Orchard.Web/Packages/Orchard.CmsPages.Tests/Controllers/AdminControllerTests.cs @@ -54,6 +54,15 @@ namespace Orchard.CmsPages.Tests.Controllers { builder.Register(new StubAuthorizationService()).As(); } + protected override IEnumerable DatabaseTypes { + get { + return new[] { + typeof (Page), typeof (PageRevision), typeof (ContentItem), typeof (Published), + typeof (Scheduled) + }; + } + } + class StubTemplateProvider : ITemplateProvider { public IList List() { return new List { diff --git a/src/Orchard.Web/Packages/Orchard.CmsPages.Tests/Controllers/TemplatesControllerTests.cs b/src/Orchard.Web/Packages/Orchard.CmsPages.Tests/Controllers/TemplatesControllerTests.cs index a4b253107..2acfa98c4 100644 --- a/src/Orchard.Web/Packages/Orchard.CmsPages.Tests/Controllers/TemplatesControllerTests.cs +++ b/src/Orchard.Web/Packages/Orchard.CmsPages.Tests/Controllers/TemplatesControllerTests.cs @@ -1,4 +1,5 @@ -using System.Web.Mvc; +using System.Collections.Generic; +using System.Web.Mvc; using Autofac.Builder; using NUnit.Framework; using Orchard.CmsPages.Controllers; @@ -36,6 +37,14 @@ namespace Orchard.CmsPages.Tests.Controllers { builder.Register(new StubTemplateEntryProvider()).As(); } + protected override IEnumerable DatabaseTypes { + get { + return new[] { + typeof (Page), typeof (PageRevision), typeof (ContentItem), typeof (Published), + typeof (Scheduled) + }; + } + } [Test] [ExpectedException(typeof (HttpException))] diff --git a/src/Orchard.Web/Packages/Orchard.Users/Controllers/AdminController.cs b/src/Orchard.Web/Packages/Orchard.Users/Controllers/AdminController.cs index 1b70db641..df4b3e292 100644 --- a/src/Orchard.Web/Packages/Orchard.Users/Controllers/AdminController.cs +++ b/src/Orchard.Web/Packages/Orchard.Users/Controllers/AdminController.cs @@ -24,12 +24,12 @@ namespace Orchard.Users.Controllers { _modelManager = modelManager; _userRepository = userRepository; _notifier = notifier; + T = NullLocalizer.Instance; } public IUser CurrentUser { get; set; } - //public IText T { get; set; } - public Func T { get; set; } + public Localizer T { get; set; } public ActionResult Index() { var model = new UsersIndexViewModel(); diff --git a/src/Orchard.sln b/src/Orchard.sln index 653e1abb8..c721556ef 100644 --- a/src/Orchard.sln +++ b/src/Orchard.sln @@ -13,8 +13,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Packages", "Packages", "{E9 EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.CmsPages", "Orchard.Web\Packages\Orchard.CmsPages\Orchard.CmsPages.csproj", "{1ECC1131-0D0C-4822-AD90-E979868C63F3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.CmsPages.Tests", "Orchard.Web\Packages\Orchard.CmsPages.Tests\Orchard.CmsPages.Tests.csproj", "{0BF56F10-3023-4465-B273-026D22206355}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TinyMce", "Orchard.Web\Packages\TinyMce\TinyMce.csproj", "{954CA994-D204-468B-9D69-51F6AD3E1C29}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.Media", "Orchard.Web\Packages\Orchard.Media\Orchard.Media.csproj", "{D9A7B330-CD22-4DA1-A95A-8DE1982AD8EB}" @@ -53,10 +51,6 @@ Global {1ECC1131-0D0C-4822-AD90-E979868C63F3}.Debug|Any CPU.Build.0 = Debug|Any CPU {1ECC1131-0D0C-4822-AD90-E979868C63F3}.Release|Any CPU.ActiveCfg = Release|Any CPU {1ECC1131-0D0C-4822-AD90-E979868C63F3}.Release|Any CPU.Build.0 = Release|Any CPU - {0BF56F10-3023-4465-B273-026D22206355}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0BF56F10-3023-4465-B273-026D22206355}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0BF56F10-3023-4465-B273-026D22206355}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0BF56F10-3023-4465-B273-026D22206355}.Release|Any CPU.Build.0 = Release|Any CPU {954CA994-D204-468B-9D69-51F6AD3E1C29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {954CA994-D204-468B-9D69-51F6AD3E1C29}.Debug|Any CPU.Build.0 = Debug|Any CPU {954CA994-D204-468B-9D69-51F6AD3E1C29}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -87,7 +81,6 @@ Global EndGlobalSection GlobalSection(NestedProjects) = preSolution {1ECC1131-0D0C-4822-AD90-E979868C63F3} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5} - {0BF56F10-3023-4465-B273-026D22206355} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5} {954CA994-D204-468B-9D69-51F6AD3E1C29} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5} {D9A7B330-CD22-4DA1-A95A-8DE1982AD8EB} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5} {0DC6B598-6D03-4923-A6C2-274D09854117} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5} diff --git a/src/Orchard/Localization/NullLocalizer.cs b/src/Orchard/Localization/NullLocalizer.cs new file mode 100644 index 000000000..b55a94ceb --- /dev/null +++ b/src/Orchard/Localization/NullLocalizer.cs @@ -0,0 +1,12 @@ +namespace Orchard.Localization { + public static class NullLocalizer { + + static NullLocalizer () { + _instance = (format, args) => (args == null || args.Length == 0) ? format : string.Format(format, args); + } + + public static Localizer _instance; + + public static Localizer Instance { get { return _instance; } } + } +} \ No newline at end of file diff --git a/src/Orchard/Orchard.csproj b/src/Orchard/Orchard.csproj index a17e9f1ae..95fe9ea9c 100644 --- a/src/Orchard/Orchard.csproj +++ b/src/Orchard/Orchard.csproj @@ -121,6 +121,7 @@ +