From 62feae6c241087aceec694106dd4667ea4274ddd Mon Sep 17 00:00:00 2001 From: Pawel Rainer Date: Thu, 12 Oct 2023 00:53:12 +0200 Subject: [PATCH 1/7] ACS-3832: test support for parent queries against categories --- .../NodeWithCategoryIndexingTests.java | 89 +++++++++++++++++++ .../NodesSecondaryChildrenRelatedTests.java | 10 +++ .../reindexing/utils/Categories.java | 63 +++++++++++++ .../reindexing/utils/Category.java | 35 ++++++++ .../tas/AlfrescoStackInitializer.java | 1 + 5 files changed, 198 insertions(+) create mode 100644 tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java create mode 100644 tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/utils/Categories.java create mode 100644 tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/utils/Category.java diff --git a/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java b/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java new file mode 100644 index 0000000000..b592db3817 --- /dev/null +++ b/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java @@ -0,0 +1,89 @@ +package org.alfresco.elasticsearch.reindexing; + +import static org.alfresco.elasticsearch.SearchQueryService.req; +import static org.alfresco.utility.report.log.Step.STEP; + +import org.alfresco.elasticsearch.reindexing.utils.Categories; +import org.alfresco.rest.search.SearchRequest; +import org.alfresco.utility.model.TestGroup; +import org.springframework.beans.factory.annotation.Autowired; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +/** + * Tests verifying live indexing of secondary children and ANCESTOR index in Elasticsearch. + */ +@SuppressWarnings({"PMD.JUnitTestsShouldIncludeAssert", "PMD.JUnit4TestShouldUseTestAnnotation"}) // these are testng tests and use searchQueryService.expectResultsFromQuery for assertion +public class NodeWithCategoryIndexingTests extends NodesSecondaryChildrenRelatedTests +{ + + @Autowired + private Categories categories; + + /* + A --- B (folders) + \____ + \ + K --- L (categories) + */ + @BeforeClass(alwaysRun = true) + @Override + public void dataPreparation() + { + super.dataPreparation(); + + // given + STEP("Create nested folders in site's Document Library."); + folders().createNestedFolders(A, B); + + STEP("Create nested categories."); + categories.createNestedCategories(K, L); + + STEP("Link folders to category."); + folders(A).linkToCategory(categories.get(L)); + } + + @Test(groups = TestGroup.SEARCH) + public void testParentQueryAgainstCategory() + { + // then + STEP("Verify that searching by PARENT and category will find one descendant node: categoryL."); + SearchRequest query = req("PARENT:" + categories.get(K).getId()); + searchQueryService.expectResultsFromQuery(query, testUser, categories.get(L).getName()); + } + + @Test(groups = TestGroup.SEARCH) + public void testParentQueryAgainstFolder() + { + // then + STEP("Verify that searching by PARENT and category will find one descendant node: folderA."); + SearchRequest query = req("PARENT:" + categories.get(L).getId()); + searchQueryService.expectResultsFromQuery(query, testUser, folders(A).getName()); + } + + @Test(groups = TestGroup.SEARCH) + public void testParentQueryAgainstFolderAfterCategoryDeletion() + { + // given + STEP("Create nested folders in site's Document Library."); + folders().createNestedFolders(C); + + STEP("Create nested categories."); + categories.createNestedCategories(M); + + STEP("Link folders to category."); + folders(C).linkToCategory(categories.get(M)); + + // when + STEP("Verify that searching by PARENT and category will find one descendant node: folderC."); + SearchRequest query = req("PARENT:" + categories.get(M).getId()); + searchQueryService.expectResultsFromQuery(query, testUser, folders(C).getName()); + + // then + STEP("Delete categoryM."); + categories.delete(M); + + STEP("Verify that searching by PARENT and deleted category will find no descendant nodes."); + searchQueryService.expectResultsFromQuery(query, testUser); + } +} diff --git a/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodesSecondaryChildrenRelatedTests.java b/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodesSecondaryChildrenRelatedTests.java index 45fa739402..d983005093 100644 --- a/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodesSecondaryChildrenRelatedTests.java +++ b/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodesSecondaryChildrenRelatedTests.java @@ -12,6 +12,8 @@ import org.alfresco.elasticsearch.SearchQueryService; import org.alfresco.rest.core.RestWrapper; +import org.alfresco.rest.model.RestCategoryLinkBodyModel; +import org.alfresco.rest.model.RestCategoryModel; import org.alfresco.rest.model.RestNodeBodyMoveCopyModel; import org.alfresco.rest.model.RestNodeModel; import org.alfresco.tas.AlfrescoStackInitializer; @@ -193,6 +195,12 @@ protected Folder copyTo(Folder target) return folderCopy; } + protected void linkToCategory(RestCategoryModel category) { + restClient.authenticateUser(testUser).withCoreAPI() + .usingNode(this) + .linkToCategory(RestCategoryLinkBodyModel.builder().categoryId(category.getId()).create()); + } + private void delete() { dataContent.usingUser(user).usingResource(this).deleteContent(); @@ -211,6 +219,8 @@ protected FileModel createDocument(String filename) .createContent(new FileModel(filename, FileType.TEXT_PLAIN, "content")); } + + private static String generateRandomFolderNameWith(String folderSuffix) { return "folder" + folderSuffix + "_" + UUID.randomUUID(); diff --git a/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/utils/Categories.java b/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/utils/Categories.java new file mode 100644 index 0000000000..269869623b --- /dev/null +++ b/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/utils/Categories.java @@ -0,0 +1,63 @@ +package org.alfresco.elasticsearch.reindexing.utils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.alfresco.rest.core.RestWrapper; +import org.alfresco.rest.model.RestCategoryModel; +import org.alfresco.utility.data.DataUser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class Categories +{ + private static final String ROOT_CATEGORY_ID = "-root-"; + public static final RestCategoryModel ROOT_CATEGORY = RestCategoryModel.builder() + .id(ROOT_CATEGORY_ID) + .create(); + + @Autowired + private RestWrapper restClient; + + @Autowired + private DataUser dataUser; + + private final Map categories = new HashMap<>(); + + public List createNestedCategories(String... nestedCategoriesNames) + { + if (nestedCategoriesNames.length == 0) + { + return Collections.emptyList(); + } + + List categories = new ArrayList<>(); + categories.add(new Category(restClient, dataUser.getAdminUser(), ROOT_CATEGORY, nestedCategoriesNames[0])); + + for (int i = 1; i < nestedCategoriesNames.length; i++) + { + categories.add(categories.get(i - 1).createSubcategory(nestedCategoriesNames[i])); + } + + categories.forEach(category -> this.categories.put(category.getName(), category)); + + return categories; + } + + public Category get(String categoryName) { + return categories.get(categoryName); + } + + public void delete(String categoryName) { + Category categoryToDelete = categories.remove(categoryName); + + restClient.authenticateUser(dataUser.getAdminUser()) + .withCoreAPI() + .usingCategory(categoryToDelete) + .deleteCategory(); + } +} diff --git a/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/utils/Category.java b/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/utils/Category.java new file mode 100644 index 0000000000..2bad298649 --- /dev/null +++ b/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/utils/Category.java @@ -0,0 +1,35 @@ +package org.alfresco.elasticsearch.reindexing.utils; + +import org.alfresco.rest.core.RestWrapper; +import org.alfresco.rest.model.RestCategoryModel; +import org.alfresco.utility.model.UserModel; + +public class Category extends RestCategoryModel +{ + private final RestWrapper restClient; + + private final UserModel user; + + public Category(RestWrapper restClient, UserModel user, RestCategoryModel parent, String newCategoryName) + { + this.restClient = restClient; + this.user = user; + + RestCategoryModel category = restClient.authenticateUser(user) + .withCoreAPI() + .usingCategory(parent) + .createSingleCategory(RestCategoryModel.builder().name(newCategoryName).create()); + + setName(category.getName()); + setCount(category.getCount()); + setId(category.getId()); + setPath(category.getPath()); + setParentId(category.getParentId()); + setHasChildren(category.getHasChildren()); + } + + public Category createSubcategory(String subcategoryName) + { + return new Category(restClient, user, this, subcategoryName); + } +} diff --git a/tests/testcontainers-env/src/main/java/org/alfresco/tas/AlfrescoStackInitializer.java b/tests/testcontainers-env/src/main/java/org/alfresco/tas/AlfrescoStackInitializer.java index b97d271aa3..7b1548e938 100644 --- a/tests/testcontainers-env/src/main/java/org/alfresco/tas/AlfrescoStackInitializer.java +++ b/tests/testcontainers-env/src/main/java/org/alfresco/tas/AlfrescoStackInitializer.java @@ -404,6 +404,7 @@ protected GenericContainer createAlfrescoContainer() "-Dcsrf.filter.enabled=false " + "-Dalfresco.restApi.basicAuthScheme=true " + "-Dquery.cmis.queryConsistency=EVENTUAL " + + "-Dquery.fts.queryConsistency=EVENTUAL " + "-Xms1500m -Xmx1500m ") .withNetwork(network) .withNetworkAliases("alfresco") From 4aac97c2063f40cb30eca5bd8a85cfd0f62c9127 Mon Sep 17 00:00:00 2001 From: Pawel Rainer Date: Thu, 12 Oct 2023 07:41:07 +0200 Subject: [PATCH 2/7] test support for path queries against categories --- .../NodeWithCategoryIndexingTests.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java b/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java index b592db3817..63064e536e 100644 --- a/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java +++ b/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java @@ -1,5 +1,7 @@ package org.alfresco.elasticsearch.reindexing; +import static java.lang.String.format; + import static org.alfresco.elasticsearch.SearchQueryService.req; import static org.alfresco.utility.report.log.Step.STEP; @@ -86,4 +88,59 @@ public void testParentQueryAgainstFolderAfterCategoryDeletion() STEP("Verify that searching by PARENT and deleted category will find no descendant nodes."); searchQueryService.expectResultsFromQuery(query, testUser); } + + + @Test(groups = TestGroup.SEARCH) + public void testSearchByPath() + { + // given + String Kname = categories.get(K).getName(); + String Lname = categories.get(L).getName(); + String Aname = folders(A).getName(); + + // then + STEP("Verify that searching by PATH and category will find: folderA"); + SearchRequest query = req(format("PATH:'/cm:categoryRoot/cm:generalclassifiable/cm:%s/cm:%s/cm:%s'", Kname, Lname, Aname)); + searchQueryService.expectResultsFromQuery(query, testUser, folders(A).getName()); + } + + @Test(groups = TestGroup.SEARCH) + public void ensureCategoriesAreNotTransitive_lookingForExactChildren() + { + // given + String Kname = categories.get(K).getName(); + String Lname = categories.get(L).getName(); + String Aname = folders(A).getName(); + String Bname = folders(B).getName(); + + // then + STEP("Verify that searching by PATH for nested folder will return no results (Dependency to category is not transitive)"); + SearchRequest query = req(format("PATH:'/cm:categoryRoot/cm:generalclassifiable/cm:%s/cm:%s/cm:%s/cm:%s'", Kname, Lname, Aname, Bname)); + searchQueryService.expectResultsFromQuery(query, testUser); + } + + @Test(groups = TestGroup.SEARCH) + public void ensureCategoriesAreNotTransitive_lookingForAllChildren() + { + // given + String Kname = categories.get(K).getName(); + String Lname = categories.get(L).getName(); + + // then + STEP("Verify that searching by PATH and category will find: folderA"); + SearchRequest query = req(format("PATH:'/cm:categoryRoot/cm:generalclassifiable/cm:%s/cm:%s//*'", Kname, Lname)); + searchQueryService.expectResultsFromQuery(query, testUser, folders(A).getName()); + } + + @Test(groups = TestGroup.SEARCH) + public void ensureCategoriesAreNotTransitive_lookingForAllChildren_byParentCategory() + { + // given + String Kname = categories.get(K).getName(); + + // then + STEP("Verify that searching by PATH and category will find: folderA"); + SearchRequest query = req(format("PATH:'/cm:categoryRoot/cm:generalclassifiable/cm:%s//*'", Kname)); + searchQueryService.expectResultsFromQuery(query, testUser, categories.get(L).getName(), folders(A).getName()); + } } From 47034d8e8989505b7e71efc99cd8a24f9e0e2abd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Rainer?= <62990104+Pawel-608@users.noreply.github.com> Date: Mon, 23 Oct 2023 12:42:12 +0200 Subject: [PATCH 3/7] Update tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java Co-authored-by: Tom Page --- .../elasticsearch/reindexing/NodeWithCategoryIndexingTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java b/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java index 63064e536e..8d7948c0a2 100644 --- a/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java +++ b/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java @@ -133,7 +133,7 @@ public void ensureCategoriesAreNotTransitive_lookingForAllChildren() } @Test(groups = TestGroup.SEARCH) - public void ensureCategoriesAreNotTransitive_lookingForAllChildren_byParentCategory() + public void ensureCategoriesAreNotTransitive_lookingForAllDescendants_byParentCategory() { // given String Kname = categories.get(K).getName(); From 2e1b93839a9b1ca8ac8f14fb38008313a291996e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Rainer?= <62990104+Pawel-608@users.noreply.github.com> Date: Mon, 23 Oct 2023 12:42:22 +0200 Subject: [PATCH 4/7] Update tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java Co-authored-by: Tom Page --- .../elasticsearch/reindexing/NodeWithCategoryIndexingTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java b/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java index 8d7948c0a2..3a71831864 100644 --- a/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java +++ b/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java @@ -120,7 +120,7 @@ public void ensureCategoriesAreNotTransitive_lookingForExactChildren() } @Test(groups = TestGroup.SEARCH) - public void ensureCategoriesAreNotTransitive_lookingForAllChildren() + public void ensureCategoriesAreNotTransitive_lookingForAllDescendants() { // given String Kname = categories.get(K).getName(); From 6eae6127e30a3cfbd68b89cfdf1fed42325b3a7c Mon Sep 17 00:00:00 2001 From: Pawel Rainer Date: Mon, 13 Nov 2023 15:23:52 +0100 Subject: [PATCH 5/7] test --- .../reindexing/NodesSecondaryChildrenRelatedTests.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodesSecondaryChildrenRelatedTests.java b/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodesSecondaryChildrenRelatedTests.java index d983005093..fc4c86bb1a 100644 --- a/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodesSecondaryChildrenRelatedTests.java +++ b/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodesSecondaryChildrenRelatedTests.java @@ -219,8 +219,6 @@ protected FileModel createDocument(String filename) .createContent(new FileModel(filename, FileType.TEXT_PLAIN, "content")); } - - private static String generateRandomFolderNameWith(String folderSuffix) { return "folder" + folderSuffix + "_" + UUID.randomUUID(); From 0a5bb65aead9a85c18dcf31d63761c73c6167898 Mon Sep 17 00:00:00 2001 From: Pawel Rainer Date: Mon, 13 Nov 2023 15:24:44 +0100 Subject: [PATCH 6/7] test --- .../elasticsearch/reindexing/NodeWithCategoryIndexingTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java b/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java index 5b4264cf1d..d02eeac855 100644 --- a/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java +++ b/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java @@ -141,7 +141,7 @@ public void ensureCategoriesAreNotTransitive_lookingForExactChildren() // then STEP("Verify that searching by PATH for nested folder will return no results (Dependency to category is not transitive)"); SearchRequest query = req(format("PATH:'/cm:categoryRoot/cm:generalclassifiable/cm:%s/cm:%s/cm:%s/cm:%s'", Kname, Lname, Aname, Bname)); - searchQueryService.expectResultsFromQuery(query, testUser); + searchQueryService.expectNoResultsFromQuery(query, testUser); } @Test(groups = TestGroup.SEARCH) From 3ef2d54da34a7b9f2cfe0a8d71794959b2464f5d Mon Sep 17 00:00:00 2001 From: Pawel Rainer Date: Mon, 13 Nov 2023 15:27:04 +0100 Subject: [PATCH 7/7] pmd --- .../elasticsearch/reindexing/NodeWithCategoryIndexingTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java b/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java index d02eeac855..8ae5e3e263 100644 --- a/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java +++ b/tests/tas-elasticsearch/src/test/java/org/alfresco/elasticsearch/reindexing/NodeWithCategoryIndexingTests.java @@ -15,7 +15,7 @@ /** * Tests verifying live indexing of secondary children and ANCESTOR index in Elasticsearch. */ -@SuppressWarnings({"PMD.JUnitTestsShouldIncludeAssert", "PMD.JUnit4TestShouldUseTestAnnotation"}) // these are testng tests and use searchQueryService.expectResultsFromQuery for assertion +@SuppressWarnings({"PMD.JUnitTestsShouldIncludeAssert", "PMD.JUnit4TestShouldUseTestAnnotation", "PMD.MethodNamingConventions", "PMD.LocalVariableNamingConventions"}) // these are testng tests and use searchQueryService.expectResultsFromQuery for assertion public class NodeWithCategoryIndexingTests extends NodesSecondaryChildrenRelatedTests {