From f193309e4c0eb4c00b8fbcda297750931f6c93ec Mon Sep 17 00:00:00 2001 From: Tom Page Date: Fri, 4 Oct 2024 15:22:38 +0100 Subject: [PATCH] MNT-24637 Add include=aspectNames to favourites API. --- .../rest/favorites/GetFavoritesTests.java | 14 ++ .../rest/api/impl/FavouritesImpl.java | 7 +- .../rest/api/model/DocumentTarget.java | 22 +++ .../alfresco/rest/api/model/Favourite.java | 43 +++++- .../org/alfresco/AppContext04TestSuite.java | 3 +- .../rest/api/impl/FavouritesImplUnitTest.java | 134 ++++++++++++++++++ 6 files changed, 218 insertions(+), 5 deletions(-) create mode 100644 remote-api/src/test/java/org/alfresco/rest/api/impl/FavouritesImplUnitTest.java diff --git a/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/favorites/GetFavoritesTests.java b/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/favorites/GetFavoritesTests.java index 8c1ff59d9d..3897d4cbcf 100644 --- a/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/favorites/GetFavoritesTests.java +++ b/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/favorites/GetFavoritesTests.java @@ -29,6 +29,7 @@ import org.alfresco.utility.testrail.annotation.TestRail; public class GetFavoritesTests extends RestTest { private static final String ALLOWABLE_OPERATIONS = "allowableOperations"; + private static final String ASPECT_NAMES = "aspectNames"; private UserModel adminUserModel, userModel; private SiteModel firstSiteModel; private SiteModel secondSiteModel; @@ -589,4 +590,17 @@ public class GetFavoritesTests extends RestTest restClient.onResponse().assertThat().body("list.entries.entry[0].isFavorite", Matchers.notNullValue()); }); } + + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, + description = "Verify if get favorites response returns aspectNames when requested") + public void checkResponsesForGetFavoritesWithAspectNames() + { + final RestPersonFavoritesModelsCollection adminFavorites = restClient.authenticateUser(adminUserModel).withCoreAPI().usingAuthUser().include(ASPECT_NAMES).getFavorites(); + restClient.assertStatusCodeIs(HttpStatus.OK); + + adminFavorites.getEntries().stream() + .map(RestPersonFavoritesModel::onModel) + .forEach(m -> m.assertThat().field(ASPECT_NAMES).isNotEmpty()); + } } diff --git a/remote-api/src/main/java/org/alfresco/rest/api/impl/FavouritesImpl.java b/remote-api/src/main/java/org/alfresco/rest/api/impl/FavouritesImpl.java index 8fa3a3e0ad..0774beeec2 100644 --- a/remote-api/src/main/java/org/alfresco/rest/api/impl/FavouritesImpl.java +++ b/remote-api/src/main/java/org/alfresco/rest/api/impl/FavouritesImpl.java @@ -26,6 +26,7 @@ package org.alfresco.rest.api.impl; import static org.alfresco.rest.api.Nodes.PARAM_INCLUDE_ALLOWABLEOPERATIONS; +import static org.alfresco.rest.api.Nodes.PARAM_INCLUDE_ASPECTNAMES; import java.util.AbstractList; import java.util.ArrayList; @@ -92,7 +93,7 @@ public class FavouritesImpl implements Favourites { private static final Log logger = LogFactory.getLog(FavouritesImpl.class); - private static final List ALLOWED_INCLUDES = List.of(PARAM_INCLUDE_PROPERTIES, PARAM_INCLUDE_ALLOWABLEOPERATIONS); + private static final List ALLOWED_INCLUDES = List.of(PARAM_INCLUDE_PROPERTIES, PARAM_INCLUDE_ASPECTNAMES, PARAM_INCLUDE_ALLOWABLEOPERATIONS); private People people; private Sites sites; @@ -191,6 +192,10 @@ public class FavouritesImpl implements Favourites { fav.setProperties(filteredNodeProperties); } + if (paramsInclude.contains(PARAM_INCLUDE_ASPECTNAMES)) + { + fav.setAspectNames(node.getAspectNames()); + } final List allowableOperations = node.getAllowableOperations(); if (CollectionUtils.isNotEmpty(allowableOperations) && paramsInclude.contains(PARAM_INCLUDE_ALLOWABLEOPERATIONS)) { diff --git a/remote-api/src/main/java/org/alfresco/rest/api/model/DocumentTarget.java b/remote-api/src/main/java/org/alfresco/rest/api/model/DocumentTarget.java index bb9fc16c7d..6f9a3a42a2 100644 --- a/remote-api/src/main/java/org/alfresco/rest/api/model/DocumentTarget.java +++ b/remote-api/src/main/java/org/alfresco/rest/api/model/DocumentTarget.java @@ -25,6 +25,8 @@ */ package org.alfresco.rest.api.model; +import java.util.Objects; + /** * A document target favourite. * @@ -62,4 +64,24 @@ public class DocumentTarget extends Target return "DocumentTarget [file=" + file + "]"; } + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (o == null || getClass() != o.getClass()) + { + return false; + } + DocumentTarget that = (DocumentTarget) o; + return Objects.equals(file, that.file); + } + + @Override + public int hashCode() + { + return Objects.hashCode(file); + } } diff --git a/remote-api/src/main/java/org/alfresco/rest/api/model/Favourite.java b/remote-api/src/main/java/org/alfresco/rest/api/model/Favourite.java index 878043a6a5..a499a19410 100644 --- a/remote-api/src/main/java/org/alfresco/rest/api/model/Favourite.java +++ b/remote-api/src/main/java/org/alfresco/rest/api/model/Favourite.java @@ -28,6 +28,7 @@ package org.alfresco.rest.api.model; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Objects; import org.alfresco.rest.framework.resource.UniqueId; @@ -43,6 +44,7 @@ public class Favourite private Date createdAt; private Target target; private Map properties; + private List aspectNames; private List allowableOperations; public Date getCreatedAt() @@ -86,6 +88,16 @@ public class Favourite this.properties = properties; } + public List getAspectNames() + { + return aspectNames; + } + + public void setAspectNames(List aspectNames) + { + this.aspectNames = aspectNames; + } + public List getAllowableOperations() { return allowableOperations; @@ -99,7 +111,34 @@ public class Favourite @Override public String toString() { - return "Favourite [targetGuid=" + targetGuid - + ", createdAt=" + createdAt + ", target=" + target + ", properties=" + properties + "]"; + return "Favourite{" + + "targetGuid='" + targetGuid + '\'' + + ", createdAt=" + createdAt + + ", target=" + target + + ", properties=" + properties + + ", aspectNames=" + aspectNames + + ", allowableOperations=" + allowableOperations + + '}'; + } + + @Override + public boolean equals(Object o) + { + if (this == o) + { + return true; + } + if (o == null || getClass() != o.getClass()) + { + return false; + } + Favourite favourite = (Favourite) o; + return Objects.equals(targetGuid, favourite.targetGuid) && Objects.equals(createdAt, favourite.createdAt) && Objects.equals(target, favourite.target) && Objects.equals(properties, favourite.properties) && Objects.equals(aspectNames, favourite.aspectNames) && Objects.equals(allowableOperations, favourite.allowableOperations); + } + + @Override + public int hashCode() + { + return Objects.hash(targetGuid, createdAt, target, properties, aspectNames, allowableOperations); } } diff --git a/remote-api/src/test/java/org/alfresco/AppContext04TestSuite.java b/remote-api/src/test/java/org/alfresco/AppContext04TestSuite.java index 2651b987e5..2ffec4fc7b 100644 --- a/remote-api/src/test/java/org/alfresco/AppContext04TestSuite.java +++ b/remote-api/src/test/java/org/alfresco/AppContext04TestSuite.java @@ -36,8 +36,6 @@ import org.alfresco.util.testing.category.NonBuildTests; @RunWith(Categories.class) @Categories.ExcludeCategory({DBTests.class, NonBuildTests.class}) @Suite.SuiteClasses({ - // [classpath:alfresco/application-context.xml, classpath:alfresco/web-scripts-application-context-test.xml, - // classpath:alfresco/web-scripts-application-context.xml] org.alfresco.repo.web.scripts.quickshare.QuickShareRestApiTest.class, org.alfresco.repo.web.scripts.admin.AdminWebScriptTest.class, org.alfresco.repo.web.scripts.audit.AuditWebScriptTest.class, @@ -78,6 +76,7 @@ import org.alfresco.util.testing.category.NonBuildTests; org.alfresco.repo.web.scripts.node.NodeWebScripTest.class, org.alfresco.rest.api.impl.CommentsImplUnitTest.class, org.alfresco.rest.api.impl.DownloadsImplCheckArchiveStatusUnitTest.class, + org.alfresco.rest.api.impl.FavouritesImplUnitTest.class, org.alfresco.rest.api.impl.RestApiDirectUrlConfigUnitTest.class }) public class AppContext04TestSuite diff --git a/remote-api/src/test/java/org/alfresco/rest/api/impl/FavouritesImplUnitTest.java b/remote-api/src/test/java/org/alfresco/rest/api/impl/FavouritesImplUnitTest.java new file mode 100644 index 0000000000..da38348a9e --- /dev/null +++ b/remote-api/src/test/java/org/alfresco/rest/api/impl/FavouritesImplUnitTest.java @@ -0,0 +1,134 @@ +/* + * #%L + * Alfresco Remote API + * %% + * Copyright (C) 2005 - 2020 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +package org.alfresco.rest.api.impl; + +import static java.util.Collections.singleton; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.openMocks; + +import static org.alfresco.model.ContentModel.TYPE_CONTENT; +import static org.alfresco.service.cmr.favourites.FavouritesService.Type.FILE; + +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import org.alfresco.repo.favourites.PersonFavourite; +import org.alfresco.rest.api.Nodes; +import org.alfresco.rest.api.People; +import org.alfresco.rest.api.model.Document; +import org.alfresco.rest.api.model.DocumentTarget; +import org.alfresco.rest.api.model.Favourite; +import org.alfresco.rest.framework.resource.parameters.Parameters; +import org.alfresco.service.cmr.favourites.FavouritesService; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.namespace.NamespaceService; + +/** + * Unit tests for {@link FavouritesImpl} class. + */ +public class FavouritesImplUnitTest +{ + static final String NODE_ID = "12345678"; + static final NodeRef NODE_REF = new NodeRef("favourite://node/" + NODE_ID); + static final String PERSON_ID = "personId"; + static final String ASPECT_NAME = "some:aspect"; + + @InjectMocks + FavouritesImpl favouritesImpl; + @Mock + People people; + @Mock + Nodes nodes; + @Mock + FavouritesService favouritesService; + @Mock + NamespaceService namespaceService; + @Mock + Favourite favourite; + @Mock + Document document; + @Mock + PersonFavourite personFavourite; + + @Before + public void setUp() + { + openMocks(this); + + when(nodes.getDocument(NODE_REF)).thenReturn(document); + when(nodes.nodeMatches(NODE_REF, singleton(TYPE_CONTENT), null)).thenReturn(true); + when(document.getGuid()).thenReturn(NODE_REF); + when(people.validatePerson(PERSON_ID, true)).thenReturn(PERSON_ID); + when(personFavourite.getNodeRef()).thenReturn(NODE_REF); + when(personFavourite.getType()).thenReturn(FILE); + when(favouritesService.addFavourite(PERSON_ID, NODE_REF)).thenReturn(personFavourite); + when(namespaceService.getPrefixes(anyString())).thenReturn(List.of("prefix")); + } + + @Test + public void testAddFavourite() + { + DocumentTarget documentTarget = new DocumentTarget(document); + when(favourite.getTarget()).thenReturn(documentTarget); + + Favourite response = favouritesImpl.addFavourite(PERSON_ID, favourite); + + Favourite expected = new Favourite(); + expected.setTarget(documentTarget); + expected.setTargetGuid(NODE_ID); + assertEquals(expected, response); + } + + @Test + public void testAddFavouriteIncludeAspectNames() + { + List includes = List.of("aspectNames"); + + DocumentTarget documentTarget = new DocumentTarget(document); + when(favourite.getTarget()).thenReturn(documentTarget); + when(nodes.getFolderOrDocument(NODE_REF, null, null, includes, null)).thenReturn(document); + when(document.getAspectNames()).thenReturn(List.of(ASPECT_NAME)); + + Parameters parameters = mock(Parameters.class); + when(parameters.getInclude()).thenReturn(includes); + + Favourite response = favouritesImpl.addFavourite(PERSON_ID, favourite, parameters); + + Favourite expected = new Favourite(); + expected.setTarget(documentTarget); + expected.setTargetGuid(NODE_ID); + expected.setAspectNames(List.of(ASPECT_NAME)); + assertEquals(expected, response); + } +}