diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Pages/PageConsts.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Pages/PageConsts.cs index 22f284884f..084f5e3b68 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Pages/PageConsts.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Pages/PageConsts.cs @@ -1,4 +1,6 @@ -namespace Volo.CmsKit.Pages +using System; + +namespace Volo.CmsKit.Pages { public class PageConsts { @@ -13,5 +15,12 @@ public static int MaxScriptLength { get; set; } = int.MaxValue; public static int MaxStyleLength { get; set; } = int.MaxValue; + + private static string _urlPrefix = "/pages/"; + public static string UrlPrefix + { + get => _urlPrefix; + set => _urlPrefix = value.EnsureEndsWith('/').EnsureStartsWith('/'); + } } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/MenuManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/MenuManager.cs index 7f1843d7af..19a7c54fd5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/MenuManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/MenuManager.cs @@ -22,7 +22,7 @@ namespace Volo.CmsKit.Menus public virtual void SetPageUrl(MenuItem menuItem, Page page) { menuItem.SetPageId(page.Id); - menuItem.SetUrl(page.Slug.EnsureStartsWith('/')); + menuItem.SetUrl(PageConsts.UrlPrefix + page.Slug); } [UnitOfWork] @@ -46,11 +46,11 @@ namespace Volo.CmsKit.Menus await MenuRepository.UpdateAsync(menu); } - public void OrganizeTreeOrderForMenuItem(Menu menu, MenuItem menuItem) + public virtual void OrganizeTreeOrderForMenuItem(Menu menu, MenuItem menuItem) { var sameTree = menu.Items.Where(x => x.ParentId == menuItem.ParentId).OrderBy(x => x.Order).ToList(); - sameTree.Remove(menuItem); // Remove if exists + sameTree.Remove(menuItem); // Remove if exists to prevent misordering with same order number sameTree.Insert(menuItem.Order, menuItem); diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs index 970dd15db5..cb8578a8ce 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebModule.cs @@ -9,6 +9,7 @@ using Volo.Abp.UI.Navigation; using Volo.Abp.VirtualFileSystem; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Localization; +using Volo.CmsKit.Pages; using Volo.CmsKit.Public.Web.Menus; using Volo.CmsKit.Web; @@ -72,7 +73,7 @@ namespace Volo.CmsKit.Public.Web { Configure(options => { - options.Conventions.AddPageRoute("/Public/CmsKit/Pages/Index", @"/pages/{slug:minlength(1)}"); + options.Conventions.AddPageRoute("/Public/CmsKit/Pages/Index", @"{PageConsts.UrlPrefix}{slug:minlength(1)}"); options.Conventions.AddPageRoute("/Public/CmsKit/Blogs/Index", @"/blogs/{blogSlug:minlength(1)}"); options.Conventions.AddPageRoute("/Public/CmsKit/Blogs/BlogPost", @"/blogs/{blogSlug}/{blogPostSlug:minlength(1)}"); }); diff --git a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Menus/MenuManager_Test.cs b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Menus/MenuManager_Test.cs new file mode 100644 index 0000000000..88ae0c8458 --- /dev/null +++ b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Menus/MenuManager_Test.cs @@ -0,0 +1,109 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using Nito.AsyncEx; +using Shouldly; +using Volo.CmsKit.Pages; +using Xunit; + +namespace Volo.CmsKit.Menus +{ + public class MenuManager_Test : CmsKitDomainTestBase + { + private readonly MenuManager menuManager; + private readonly CmsKitTestData testData; + private readonly IMenuRepository menuRepository; + private readonly IPageRepository pageRepository; + + public MenuManager_Test() + { + menuManager = GetRequiredService(); + testData = GetRequiredService(); + menuRepository = GetRequiredService(); + pageRepository = GetRequiredService(); + } + + [Fact] + public async Task SetPageUrl_ShouldSetUrlSameWithPage_WithExistingPage() + { + var page = await pageRepository.GetAsync(testData.Page_1_Id); + var menu = await menuRepository.GetAsync(testData.Menu_1_Id); + var menuItem = menu.Items.First(); + + menuManager.SetPageUrl(menuItem, page); + + menuItem.Url.ShouldNotBeNullOrEmpty(); + menuItem.Url.ShouldBe(PageConsts.UrlPrefix + page.Slug); + } + + [Fact] + public async Task MoveAsync_ShouldMoveCorrectly_UnderAnotherMenu() + { + await menuManager.MoveAsync(testData.Menu_1_Id, testData.MenuItem_2_Id, testData.MenuItem_1_Id); + + var menu = await menuRepository.GetAsync(testData.Menu_1_Id); + + menu.Items.ShouldContain( + x => x.ParentId == testData.MenuItem_1_Id + && x.Id == testData.MenuItem_2_Id); + } + + [Fact] + public async Task MoveAsync_ShouldChangePositionCorrectly_UnderSameParent() + { + await menuManager.MoveAsync(testData.Menu_1_Id, testData.MenuItem_2_Id, null, 0); + + var menu = await menuRepository.GetAsync(testData.Menu_1_Id); + + var menuItem1 = menu.Items.First(x => x.Id == testData.MenuItem_1_Id); + var menuItem2 = menu.Items.First(x => x.Id == testData.MenuItem_2_Id); + + menuItem1.Order.ShouldBeGreaterThan(menuItem2.Order); + } + + [Fact] + public async Task OrganizeTreeOrderForMenuItem_ShouldWorkProperly_WithNewMenuItem() + { + var menu3Id = Guid.NewGuid(); + var menu = await menuRepository.GetAsync(testData.Menu_1_Id); + var menuItem1 = menu.Items.First(x => x.Id == testData.MenuItem_1_Id); + var menuItem2 = menu.Items.First(x => x.Id == testData.MenuItem_2_Id); + var menuItem3 = new MenuItem(menu3Id, menu.Id, "Menu 3", "#"); + + menu.Items.Add(menuItem3); + + menuItem3.Order = 0; + + menuManager.OrganizeTreeOrderForMenuItem(menu, menuItem3); + + menuItem3.Order.ShouldBeLessThan(menuItem1.Order); + menuItem3.Order.ShouldBeLessThan(menuItem2.Order); + } + + [Fact] + public async Task SetMainMenuAsync_ShouldSetOnlyOneMainMenu() + { + await menuManager.SetMainMenuAsync(testData.Menu_2_Id); + + var menuList = await menuRepository.GetListAsync(); + + var isMainMenuTrueCount = menuList.Count(menu => menu.IsMainMenu); + + isMainMenuTrueCount.ShouldBe(1); + menuList.ShouldContain(menu => menu.IsMainMenu && menu.Id == testData.Menu_2_Id); + } + + [Fact] + public async Task UnSetMainMenuAsync_ShouldUnsetProperly() + { + await menuManager.UnSetMainMenuAsync(testData.Menu_1_Id); + + var menuList = await menuRepository.GetListAsync(); + + var isMainMenuTrueCount = menuList.Count(menu => menu.IsMainMenu); + + isMainMenuTrueCount.ShouldBe(0); + menuList.ShouldNotContain(menu => menu.IsMainMenu && menu.Id == testData.Menu_1_Id); + } + } +} \ No newline at end of file diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs index 57a1c9505b..e18d573f0d 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs @@ -434,11 +434,19 @@ namespace Volo.CmsKit await _menuRepository.InsertAsync(menu); - await _menuRepository.InsertAsync( - new Menu( - _cmsKitTestData.Menu_2_Id, - null, - _cmsKitTestData.Menu_2_Name)); + var menu2 = new Menu( + _cmsKitTestData.Menu_2_Id, + null, + _cmsKitTestData.Menu_2_Name); + + menu2.Items.Add( + new MenuItem( + _cmsKitTestData.MenuItem_3_Id, + menu2.Id, + _cmsKitTestData.MenuItem_3_Name, + _cmsKitTestData.MenuItem_3_Url)); + + await _menuRepository.InsertAsync(menu2); } } } diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs index f9c40a6793..dfe88d8d0f 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestData.cs @@ -115,18 +115,26 @@ namespace Volo.CmsKit public string Menu_1_Name { get; } = "MainMenu"; public Guid MenuItem_1_Id { get; } = Guid.NewGuid(); - + public string MenuItem_1_Name { get; } = "About Us"; + public string MenuItem_1_Url { get; } = "/about-us"; public Guid MenuItem_2_Id { get; } = Guid.NewGuid(); - + public string MenuItem_2_Name { get; } = "Our Team"; + public string MenuItem_2_Url { get; } = "/team"; public Guid Menu_2_Id { get; } = Guid.NewGuid(); public string Menu_2_Name { get; } = "DraftMenu"; + + public Guid MenuItem_3_Id { get; } = Guid.NewGuid(); + + public string MenuItem_3_Name { get; } = "Products"; + + public string MenuItem_3_Url { get; } = "/products"; } }