From 2bce672863f037a35581a96e78f74488586c9f87 Mon Sep 17 00:00:00 2001 From: erickgonzalez Date: Wed, 30 Aug 2023 12:17:39 -0600 Subject: [PATCH] #24829 include in 23.01.6 --- .../viewtools/navigation/NavToolTest.java | 90 +++++++++++++++++-- .../viewtools/navigation/NavTool.java | 32 ++++--- hotfix_tracking.md | 1 + 3 files changed, 105 insertions(+), 18 deletions(-) diff --git a/dotCMS/src/integration-test/java/com/dotcms/rendering/velocity/viewtools/navigation/NavToolTest.java b/dotCMS/src/integration-test/java/com/dotcms/rendering/velocity/viewtools/navigation/NavToolTest.java index e0031d2fe15f..f5e70cabfafb 100644 --- a/dotCMS/src/integration-test/java/com/dotcms/rendering/velocity/viewtools/navigation/NavToolTest.java +++ b/dotCMS/src/integration-test/java/com/dotcms/rendering/velocity/viewtools/navigation/NavToolTest.java @@ -9,29 +9,28 @@ import com.dotcms.IntegrationTestBase; import com.dotcms.api.web.HttpServletRequestThreadLocal; -import com.dotcms.datagen.ContentletDataGen; -import com.dotcms.datagen.FileAssetDataGen; -import com.dotcms.datagen.FolderDataGen; -import com.dotcms.datagen.HTMLPageDataGen; -import com.dotcms.datagen.SiteDataGen; -import com.dotcms.datagen.TemplateDataGen; -import com.dotcms.datagen.TestDataUtils; +import com.dotcms.datagen.*; import com.dotcms.util.IntegrationTestInitService; import com.dotmarketing.beans.Host; import com.dotmarketing.beans.Identifier; import com.dotmarketing.business.APILocator; import com.dotmarketing.business.CacheLocator; +import com.dotmarketing.business.IdentifierAPI; +import com.dotmarketing.business.VersionableAPI; import com.dotmarketing.exception.DotDataException; import com.dotmarketing.exception.DotSecurityException; +import com.dotmarketing.portlets.contentlet.business.ContentletAPI; import com.dotmarketing.portlets.contentlet.model.Contentlet; import com.dotmarketing.portlets.contentlet.model.IndexPolicy; import com.dotmarketing.portlets.fileassets.business.FileAsset; import com.dotmarketing.portlets.fileassets.business.FileAssetAPI; import com.dotmarketing.portlets.fileassets.business.IFileAsset; +import com.dotmarketing.portlets.folders.business.FolderAPI; import com.dotmarketing.portlets.folders.model.Folder; import com.dotmarketing.portlets.htmlpageasset.model.HTMLPageAsset; import com.dotmarketing.portlets.htmlpageasset.model.IHTMLPage; import com.dotmarketing.portlets.languagesmanager.model.Language; +import com.dotmarketing.portlets.links.model.Link; import com.dotmarketing.portlets.templates.model.Template; import com.dotmarketing.util.Config; import com.dotmarketing.util.PageMode; @@ -70,6 +69,11 @@ public class NavToolTest extends IntegrationTestBase{ private static User user; private static Host site; private static Language spanishLanguage; + private static IdentifierAPI identifierAPI; + private static VersionableAPI versionableAPI; + private static FolderAPI folderAPI; + + private static ContentletAPI contentletAPI; @BeforeClass public static void prepare() throws Exception { @@ -79,6 +83,10 @@ public static void prepare() throws Exception { user = APILocator.getUserAPI().getSystemUser(); site = new SiteDataGen().nextPersisted(); spanishLanguage = TestDataUtils.getSpanishLanguage(); + identifierAPI = APILocator.getIdentifierAPI(); + versionableAPI = APILocator.getVersionableAPI(); + folderAPI = APILocator.getFolderAPI(); + contentletAPI = APILocator.getContentletAPI(); } @AfterClass @@ -626,4 +634,72 @@ public void test_getNav_multilingualPage_shouldOnlyReturnOne() throws Exception assertEquals(1,navResult.getChildren().size()); assertEquals("SPA Version", navResult.getChildren().get(0).getTitle()); } + + /** + * Method to test: NavTool.getNav + * Given scenario: get navigation of a folder, where it contains published and unpublished links + * Expected result: getting the navigation must return only the published links + * @throws Exception exception + */ + @Test + public void test_getNav_GivenLinkItems_ShouldOnlyShowLiveLinksLiveMode() throws Exception { + final Host host = new SiteDataGen().nextPersisted(); + final NavTool navTool = new NavTool(); + final User mockedUSer = mock(User.class); + final HttpServletRequest request = mock(HttpServletRequest.class); + when(request.getParameter(com.dotmarketing.util.WebKeys.PAGE_MODE_PARAMETER)).thenReturn(PageMode.LIVE.toString()); + when(request.getAttribute(com.liferay.portal.util.WebKeys.USER)).thenReturn(APILocator.systemUser()); + HttpServletRequestThreadLocal.INSTANCE.setRequest(request); + + final ViewContext viewContext = mock(ViewContext.class); + when(viewContext.getRequest()).thenReturn(request); + navTool.init(viewContext); + //Create Folder + folder = new FolderDataGen().site(site).title("test").showOnMenu(true).nextPersisted(); + + //Add create two links with different states + final Link publishLink = new LinkDataGen().hostId(host.getIdentifier()).title("testPublish").parent(folder).target("https://google.com").linkType("INTERNAL").showOnMenu(true).nextPersisted(); + APILocator.getVersionableAPI().setLive(publishLink); + + final Link unpublishLink = new LinkDataGen().hostId(host.getIdentifier()).title("testUnpublish").parent(folder).target("https://google.com").linkType("INTERNAL").showOnMenu(true).nextPersisted(); + + final NavResult navResult1 = navTool.getNav(site, folder.getPath()); + assertNotNull("There must be a valid NavResult object", navResult1); + assertEquals("Only only one item should appear in the nav result. ",1,navResult1.getChildren().size()); + } + + /** + * Method to test: NavTool.getNav + * Given scenario: get navigation of a folder, where it contains published and unpublished links + * Expected result: getting the navigation must return published and unpublished links + * @throws Exception exception + */ + @Test + public void test_getNav_GivenLinkItems_ShouldOnlyShowLinksEditMode() throws Exception { + + final Host host = new SiteDataGen().nextPersisted(); + final NavTool navTool = new NavTool(); + final User mockedUSer = mock(User.class); + final HttpServletRequest request = mock(HttpServletRequest.class); + when(request.getParameter(com.dotmarketing.util.WebKeys.PAGE_MODE_PARAMETER)).thenReturn(PageMode.EDIT_MODE.toString()); + when(request.getAttribute(com.liferay.portal.util.WebKeys.USER)).thenReturn(APILocator.systemUser()); + HttpServletRequestThreadLocal.INSTANCE.setRequest(request); + + final ViewContext viewContext = mock(ViewContext.class); + when(viewContext.getRequest()).thenReturn(request); + navTool.init(viewContext); + + //Create Folder + folder = new FolderDataGen().site(site).title("test").showOnMenu(true).nextPersisted(); + + //Add create two links with different states + final Link publishLink = new LinkDataGen().hostId(host.getIdentifier()).title("testPublish").parent(folder).target("https://google.com").linkType("INTERNAL").showOnMenu(true).nextPersisted(); + APILocator.getVersionableAPI().setLive(publishLink); + + Link unpublishLink = new LinkDataGen().hostId(host.getIdentifier()).title("testUnpublish").parent(folder).target("https://google.com").linkType("INTERNAL").showOnMenu(true).nextPersisted(); + + final NavResult navResult1 = navTool.getNav(site, folder.getPath()); + assertNotNull("There must be a valid NavResult object", navResult1); + assertEquals("Both items should appear in the nav result. ",2,navResult1.getChildren().size()); + } } diff --git a/dotCMS/src/main/java/com/dotcms/rendering/velocity/viewtools/navigation/NavTool.java b/dotCMS/src/main/java/com/dotcms/rendering/velocity/viewtools/navigation/NavTool.java index 495c7f6ca1af..f7a1d4c8d57f 100644 --- a/dotCMS/src/main/java/com/dotcms/rendering/velocity/viewtools/navigation/NavTool.java +++ b/dotCMS/src/main/java/com/dotcms/rendering/velocity/viewtools/navigation/NavTool.java @@ -66,6 +66,22 @@ public void init(Object initData) { } } + protected void setItemLinkValues(NavResult nav,Link itemLink, List children){ + if (itemLink.getLinkType().equals(LinkType.CODE.toString()) && LinkType.CODE.toString() != null) { + nav.setCodeLink(itemLink.getLinkCode()); + } else { + nav.setHref(itemLink.getWorkingURL()); + } + + nav.setTitle(itemLink.getTitle()); + nav.setOrder(itemLink.getSortOrder()); + nav.setType("link"); + nav.setTarget(itemLink.getTarget()); + nav.setPermissionId(itemLink.getPermissionId()); + nav.setShowOnMenu(itemLink.isShowOnMenu()); + children.add(nav); + } + protected NavResult getNav(Host host, String path) throws DotDataException, DotSecurityException { return getNav(host, path, this.currentLanguage, this.systemUser); } @@ -162,19 +178,13 @@ protected NavResultHydrated getNav(final Host host, String path, final long lang Link itemLink = (Link) item; NavResult nav = new NavResult(folder.getInode(), host.getIdentifier(), languageId); - if (itemLink.getLinkType() - .equals(LinkType.CODE.toString()) && LinkType.CODE.toString() != null) { - nav.setCodeLink(itemLink.getLinkCode()); + if (!pageMode.showLive) { + this.setItemLinkValues(nav, itemLink, children); } else { - nav.setHref(itemLink.getWorkingURL()); + if (itemLink.isLive() && itemLink.isWorking()){ + this.setItemLinkValues(nav, itemLink, children); + } } - nav.setTitle(itemLink.getTitle()); - nav.setOrder(itemLink.getSortOrder()); - nav.setType("link"); - nav.setTarget(itemLink.getTarget()); - nav.setPermissionId(itemLink.getPermissionId()); - nav.setShowOnMenu(itemLink.isShowOnMenu()); - children.add(nav); } else if ((Contentlet.class.cast(item)).isHTMLPage()) { final IHTMLPage itemPage = APILocator.getHTMLPageAssetAPI().fromContentlet(Contentlet.class.cast(item)); diff --git a/hotfix_tracking.md b/hotfix_tracking.md index fd75f4813283..a4a41eb03151 100644 --- a/hotfix_tracking.md +++ b/hotfix_tracking.md @@ -107,3 +107,4 @@ This maintenance release includes the following code fixes: 86. https://github.com/dotCMS/core/issues/22533 : Relay State SAML improvement 87. https://github.com/dotCMS/core/issues/25896 : Creating a contentlet in a 2nd language removes related content #25896 88. https://github.com/dotCMS/core/issues/23733 : Stream Starter Zip Generation #23733 +89. https://github.com/dotCMS/core/issues/24829 : NavTool method getNav must return only published links #24829