From bbd5f4fe1c597aaa9b4de78ead90ccafe141fd58 Mon Sep 17 00:00:00 2001 From: Meenal Bhave Date: Thu, 3 May 2018 11:14:40 +0100 Subject: [PATCH] Search 829 Fix TAS Rest API Search Tests --- .../rest/search/AbstractSearchTest.java | 109 +++++++++++++---- .../rest/search/FacetIntervalSearchTest.java | 14 ++- .../rest/search/FacetRangeSearchTest.java | 20 ++-- .../rest/search/FacetedSearchTest.java | 108 +++++++++-------- .../alfresco/rest/search/FingerPrintTest.java | 111 ++++++++++-------- .../rest/search/PivotFacetedSearchTest.java | 7 +- .../alfresco/rest/search/SearchAPATHTest.java | 15 ++- .../rest/search/SearchSpellCheckTest.java | 71 +++++++++-- .../org/alfresco/rest/search/SearchTest.java | 6 +- .../alfresco/rest/search/ShardInfoTest.java | 7 +- .../sharedLinks/SharedLinksSanityTests.java | 2 - e2e-test/resources/SearchSuite.xml | 35 ++++++ e2e-test/resources/default.properties | 3 + 13 files changed, 347 insertions(+), 161 deletions(-) create mode 100644 e2e-test/resources/SearchSuite.xml diff --git a/e2e-test/java/org/alfresco/rest/search/AbstractSearchTest.java b/e2e-test/java/org/alfresco/rest/search/AbstractSearchTest.java index 4eeb2abc6..560f385dd 100644 --- a/e2e-test/java/org/alfresco/rest/search/AbstractSearchTest.java +++ b/e2e-test/java/org/alfresco/rest/search/AbstractSearchTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 Alfresco Software Limited. + * Copyright (C) 2018 Alfresco Software Limited. * * This file is part of Alfresco * @@ -18,9 +18,10 @@ */ package org.alfresco.rest.search; +import org.alfresco.dataprep.SiteService.Visibility; import org.alfresco.rest.RestTest; -import org.alfresco.rest.model.builder.NodesBuilder; -import org.alfresco.utility.model.ContentModel; +import org.alfresco.utility.Utility; +import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.FileModel; import org.alfresco.utility.model.FileType; import org.alfresco.utility.model.FolderModel; @@ -36,41 +37,65 @@ import org.testng.annotations.BeforeClass; *
  • Preparing search requests. * * @author Michael Suzuki + * @author Meenal Bhave * */ public class AbstractSearchTest extends RestTest { - protected static final String SEARCH_DATA_SAMPLE_FOLDER = "folder"; + + protected static final String SEARCH_DATA_SAMPLE_FOLDER = "FolderSearch"; UserModel userModel, adminUserModel; SiteModel siteModel; UserModel searchedUser; - NodesBuilder nodesBuilder; - protected FileModel file,file2; + protected FileModel file, file2, file3, file4; + + protected static String unique_searchString; @BeforeClass(alwaysRun = true) public void dataPreparation() throws Exception { adminUserModel = dataUser.getAdminUser(); - userModel = dataUser.createRandomTestUser(); - siteModel = dataSite.usingUser(userModel).createPublicRandomSite(); + userModel = dataUser.createRandomTestUser("UserSearch"); + + siteModel = new SiteModel(RandomData.getRandomName("SiteSearch")); + siteModel.setVisibility(Visibility.PRIVATE); + + siteModel = dataSite.usingUser(userModel).createSite(siteModel); + + unique_searchString = siteModel.getTitle().replace("SiteSearch", "Unique"); + /* * Create the following file structure for preconditions : * |- folder * |-- pangram.txt - * |-- cars.pdf + * |-- cars.txt + * |-- alfresco.txt + * |-- */ - nodesBuilder = restClient.authenticateUser(userModel).withCoreAPI().usingNode(ContentModel.my()).defineNodes(); + FolderModel folder = new FolderModel(SEARCH_DATA_SAMPLE_FOLDER); dataContent.usingUser(userModel).usingSite(siteModel).createFolder(folder); + //Create files - file = new FileModel("pangram.txt", FileType.TEXT_PLAIN, "The quick brown fox jumps over the lazy dog"); - file2 = new FileModel("cars.txt", FileType.TEXT_PLAIN, "The landrover discovery is not a sports car"); - ContentModel cm = new ContentModel(); - cm.setCmisLocation(folder.getCmisLocation()); - cm.setName(folder.getName()); - dataContent.usingUser(userModel).usingSite(siteModel).usingResource(cm).createContent(file); - dataContent.usingUser(userModel).usingSite(siteModel).usingResource(cm).createContent(file2); + String title = "Title: " + unique_searchString; + String description = "Description: File is created for search tests by Author: " + unique_searchString + " . "; + + file = new FileModel("pangram.txt", "pangram" + title, description, FileType.TEXT_PLAIN, description + " The quick brown fox jumps over the lazy dog"); + + file2 = new FileModel("cars.txt", "cars" + title, description, FileType.TEXT_PLAIN, "The landrover discovery is not a sports car "); + + file3 = new FileModel("alfresco.txt", "alfresco", "alfresco", FileType.TEXT_PLAIN, "Alfresco text file for search "); + + file4 = new FileModel(unique_searchString + ".txt", "uniquee" + title, description, FileType.TEXT_PLAIN, "Unique text file for search "); + + dataContent.usingUser(userModel).usingSite(siteModel).usingResource(folder).createContent(file); + dataContent.usingUser(userModel).usingSite(siteModel).usingResource(folder).createContent(file2); + dataContent.usingUser(userModel).usingSite(siteModel).usingResource(folder).createContent(file3); + dataContent.usingUser(userModel).usingSite(siteModel).usingResource(folder).createContent(file4); + + waitForIndexing(file4.getName(), true); } + /** * Helper method which create an http post request to Search API end point. * @param term String search term @@ -84,7 +109,7 @@ public class AbstractSearchTest extends RestTest queryReq.setLanguage("afts"); queryReq.setQuery(term); SearchRequest query = new SearchRequest(queryReq); - return restClient.authenticateUser(dataUser.getAdminUser()).withSearchAPI().search(query); + return restClient.authenticateUser(userModel).withSearchAPI().search(query); } /** * Helper method which create an http post request to Search API end point. @@ -97,7 +122,7 @@ public class AbstractSearchTest extends RestTest { SearchRequest query = new SearchRequest(queryReq); query.setHighlight(highlight); - return restClient.authenticateUser(dataUser.getAdminUser()).withSearchAPI().search(query); + return restClient.authenticateUser(userModel).withSearchAPI().search(query); } /** * Helper method which create an http post request to Search API end point. @@ -108,7 +133,7 @@ public class AbstractSearchTest extends RestTest */ protected SearchResponse query(SearchRequest query) throws Exception { - return restClient.authenticateUser(dataUser.getAdminUser()).withSearchAPI().search(query); + return restClient.authenticateUser(userModel).withSearchAPI().search(query); } protected SearchRequest createQuery(String term) { @@ -122,4 +147,48 @@ public class AbstractSearchTest extends RestTest { return createQuery("cars"); } + + /** + * Wait for Solr to finish indexing: Indexing has caught up = true if search returns appropriate results + * @param userQuery: string to search for, unique search string will guarantee accurate results + * @param expectedInResults, true if entry is expected in the results set + * @return true (indexing is finished) if search returns appropriate results + * @throws Exception + */ + public boolean waitForIndexing(String userQuery, Boolean expectedInResults) throws Exception + { + Boolean found = false; + Boolean resultAsExpected = false; + + SearchRequest searchRequest = createQuery(userQuery); + SearchResponse response = query(searchRequest); + + // Repeat search until the query results are as expected or Search Retry count is hit + for (int searchCount = 1; searchCount <= 3; searchCount++) + { + if (searchCount > 1) + { + // Wait for the solr indexing. + Utility.waitToLoopTime(properties.getSolrWaitTimeInSeconds(), "Wait For Indexing"); + } + + if (response.getEntries().size() >= 1) + { + found = true; + } + else + { + found = false; + } + + // Loop again if result is not as expected: To cater for solr lag: eventual consistency + resultAsExpected = (expectedInResults.equals(found)); + if (resultAsExpected) + { + break; + } + } + + return resultAsExpected; + } } diff --git a/e2e-test/java/org/alfresco/rest/search/FacetIntervalSearchTest.java b/e2e-test/java/org/alfresco/rest/search/FacetIntervalSearchTest.java index 9d8d74b37..d32f3ebe9 100644 --- a/e2e-test/java/org/alfresco/rest/search/FacetIntervalSearchTest.java +++ b/e2e-test/java/org/alfresco/rest/search/FacetIntervalSearchTest.java @@ -48,23 +48,23 @@ public class FacetIntervalSearchTest extends AbstractSearchTest facetIntervalsModel.setIntervals(Arrays.asList(facetInterval)); query.setFacetIntervals(facetIntervalsModel); - SearchResponse response = query(query); + query(query); restClient.assertStatusCodeIs(HttpStatus.BAD_REQUEST).assertLastError() .containsSummary(String.format(RestErrorModel.MANDATORY_PARAM, "facetIntervals intervals field")); facetInterval.setField("created"); - response = query(query); + query(query); restClient.assertStatusCodeIs(HttpStatus.BAD_REQUEST).assertLastError() .containsSummary(String.format(RestErrorModel.MANDATORY_COLLECTION, "facetIntervals intervals sets")); RestRequestFacetSetModel restFacetSetModel = new RestRequestFacetSetModel(); restFacetSetModel.setLabel("theRest"); facetInterval.setSets(Arrays.asList(restFacetSetModel)); - response = query(query); + query(query); restClient.assertStatusCodeIs(HttpStatus.BAD_REQUEST).assertLastError() .containsSummary(String.format(RestErrorModel.MANDATORY_PARAM, "facetIntervals intervals created sets start")); restFacetSetModel.setStart("A"); - response = query(query); + query(query); restClient.assertStatusCodeIs(HttpStatus.BAD_REQUEST).assertLastError() .containsSummary(String.format(RestErrorModel.MANDATORY_PARAM, "facetIntervals intervals created sets end")); @@ -74,7 +74,8 @@ public class FacetIntervalSearchTest extends AbstractSearchTest duplicate.setLabel("theRest"); duplicate.setStart("A"); duplicate.setEnd("C"); - response = query(query); + + query(query); restClient.assertStatusCodeIs(HttpStatus.BAD_REQUEST).assertLastError() .containsSummary("duplicate set interval label [theRest=2]"); @@ -83,7 +84,8 @@ public class FacetIntervalSearchTest extends AbstractSearchTest FacetInterval duplicateLabel = new FacetInterval("creator", "thesame", Arrays.asList(duplicate)); facetIntervalsModel.setIntervals(Arrays.asList(facetInterval, duplicateLabel)); query.setFacetIntervals(facetIntervalsModel); - response = query(query); + + query(query); restClient.assertStatusCodeIs(HttpStatus.BAD_REQUEST).assertLastError() .containsSummary("duplicate interval label [thesame=2]"); diff --git a/e2e-test/java/org/alfresco/rest/search/FacetRangeSearchTest.java b/e2e-test/java/org/alfresco/rest/search/FacetRangeSearchTest.java index d4ae6bfa7..1add86965 100644 --- a/e2e-test/java/org/alfresco/rest/search/FacetRangeSearchTest.java +++ b/e2e-test/java/org/alfresco/rest/search/FacetRangeSearchTest.java @@ -61,11 +61,7 @@ import org.testng.annotations.Test; */ public class FacetRangeSearchTest extends AbstractSearchTest { - @Override - public void dataPreparation() throws Exception - { - //Skip setup - } + @Test(groups = { TestGroup.REST_API, TestGroup.SEARCH, TestGroup.ASS_1 }) @TestRail(section = {TestGroup.REST_API, TestGroup.SEARCH, TestGroup.ASS_1 }, executionType = ExecutionType.REGRESSION, description = "Check facet intervals mandatory fields") @@ -76,7 +72,7 @@ public class FacetRangeSearchTest extends AbstractSearchTest RestRequestRangesModel facetRangeModel = new RestRequestRangesModel(); ranges.add(facetRangeModel); query.setRanges(ranges); - SearchResponse response = query(query); + query(query); restClient.assertStatusCodeIs(HttpStatus.BAD_REQUEST).assertLastError() .containsSummary(String.format(RestErrorModel.MANDATORY_PARAM, "field")); @@ -84,21 +80,27 @@ public class FacetRangeSearchTest extends AbstractSearchTest facetRangeModel.setField("content.size"); ranges.add(facetRangeModel); query.setRanges(ranges); - response = query(query); + + query(query); + restClient.assertStatusCodeIs(HttpStatus.BAD_REQUEST).assertLastError() .containsSummary(String.format(RestErrorModel.MANDATORY_PARAM, "start")); facetRangeModel.setStart("0"); ranges.clear(); ranges.add(facetRangeModel); query.setRanges(ranges); - response = query(query); + + query(query); + restClient.assertStatusCodeIs(HttpStatus.BAD_REQUEST).assertLastError() .containsSummary(String.format(RestErrorModel.MANDATORY_PARAM, "end")); facetRangeModel.setEnd("400"); query.setRanges(ranges); ranges.clear(); ranges.add(facetRangeModel); - response = query(query); + + query(query); + restClient.assertStatusCodeIs(HttpStatus.BAD_REQUEST).assertLastError() .containsSummary(String.format(RestErrorModel.MANDATORY_PARAM, "gap")); diff --git a/e2e-test/java/org/alfresco/rest/search/FacetedSearchTest.java b/e2e-test/java/org/alfresco/rest/search/FacetedSearchTest.java index a8eccf613..351281858 100644 --- a/e2e-test/java/org/alfresco/rest/search/FacetedSearchTest.java +++ b/e2e-test/java/org/alfresco/rest/search/FacetedSearchTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 Alfresco Software Limited. + * Copyright (C) 2018 Alfresco Software Limited. * * This file is part of Alfresco * @@ -36,9 +36,6 @@ import org.testng.annotations.Test; public class FacetedSearchTest extends AbstractSearchTest { - @Test(groups = { TestGroup.REST_API, TestGroup.SEARCH, TestGroup.ASS_1 }) - @TestRail(section = {TestGroup.REST_API, TestGroup.SEARCH, TestGroup.ASS_1 }, executionType = ExecutionType.REGRESSION, - description = "Checks facet queries for the Search api") /** * Perform the below facet query. * { @@ -89,13 +86,16 @@ public class FacetedSearchTest extends AbstractSearchTest * }} * @throws Exception */ + + @Test(groups = { TestGroup.REST_API, TestGroup.SEARCH, TestGroup.ASS_1 }) + @TestRail(section = { TestGroup.REST_API, TestGroup.SEARCH, + TestGroup.ASS_1 }, executionType = ExecutionType.REGRESSION, description = "Checks facet queries for the Search api") public void searchWithQueryFaceting() throws Exception - { + { SearchRequest query = new SearchRequest(); - RestRequestQueryModel queryReq = new RestRequestQueryModel(); + RestRequestQueryModel queryReq = new RestRequestQueryModel(); queryReq.setQuery("cars"); query.setQuery(queryReq); - List facets = new ArrayList(); facets.add(new FacetQuery("content.size:[0 TO 102400]", "small")); @@ -109,9 +109,11 @@ public class FacetedSearchTest extends AbstractSearchTest query.setFacetFields(facetFields); query.setIncludeRequest(true); - SearchResponse response = query(query); + SearchResponse response = query(query); + response.assertThat().entriesListIsNotEmpty(); response.getContext().assertThat().field("facetQueries").isNotEmpty(); + FacetFieldBucket facet = response.getContext().getFacetQueries().get(0); facet.assertThat().field("label").contains("small").and().field("count").isGreaterThan(0); facet.assertThat().field("label").contains("small").and().field("filterQuery").is("content.size:[0 TO 102400]"); @@ -173,52 +175,53 @@ public class FacetedSearchTest extends AbstractSearchTest public void searchQueryFacetingWithGroup() throws Exception { SearchRequest query = new SearchRequest(); - RestRequestQueryModel queryReq = new RestRequestQueryModel(); + RestRequestQueryModel queryReq = new RestRequestQueryModel(); queryReq.setQuery("cars"); query.setQuery(queryReq); List facets = new ArrayList(); facets.add(new FacetQuery("content.size:[0 TO 102400]", "small", "foo")); - facets.add(new FacetQuery("content.size:[102400 TO 1048576]", "medium","foo")); - facets.add(new FacetQuery("content.size:[1048576 TO 16777216]", "large","foo")); + facets.add(new FacetQuery("content.size:[102400 TO 1048576]", "medium", "foo")); + facets.add(new FacetQuery("content.size:[1048576 TO 16777216]", "large", "foo")); query.setFacetQueries(facets); - + RestRequestFacetFieldsModel facetFields = new RestRequestFacetFieldsModel(); List list = new ArrayList<>(); list.add(new RestRequestFacetFieldModel("'content.size'")); facetFields.setFacets(list); - query.setFacetFields(facetFields); - SearchResponse response = query(query); - //We don't expect to see the FacetQueries if group is being used. + + SearchResponse response = query(query); + + // We don't expect to see the FacetQueries if group is being used. Assert.assertTrue(response.getContext().getFacetQueries() == null); - //Validate the facet field structure is correct. + // Validate the facet field structure is correct. Assert.assertFalse(response.getContext().getFacets().isEmpty()); Assert.assertEquals(response.getContext().getFacets().get(0).getLabel(), "foo"); - + RestGenericBucketModel bucket = response.getContext().getFacets().get(0).getBuckets().get(0); bucket.assertThat().field("label").isNotEmpty(); - Assert.assertEquals( bucket.getMetrics().get(0).getType(), "count"); - Assert.assertNotEquals( bucket.getMetrics().get(0).getValue(), ""); + Assert.assertEquals(bucket.getMetrics().get(0).getType(), "count"); + Assert.assertNotEquals(bucket.getMetrics().get(0).getValue(), ""); bucket.assertThat().field("filterQuery").isNotEmpty(); response.getContext().getFacets().get(0).getBuckets().forEach(action -> { switch (action.getLabel()) { - case "small": - Assert.assertEquals(action.getFilterQuery(), "content.size:[0 TO 102400]"); - break; - case "medium": - Assert.assertEquals(action.getFilterQuery(), "content.size:[102400 TO 1048576]"); - break; - case "large": - Assert.assertEquals(action.getFilterQuery(), "content.size:[1048576 TO 16777216]"); - break; + case "small": + Assert.assertEquals(action.getFilterQuery(), "content.size:[0 TO 102400]"); + break; + case "medium": + Assert.assertEquals(action.getFilterQuery(), "content.size:[102400 TO 1048576]"); + break; + case "large": + Assert.assertEquals(action.getFilterQuery(), "content.size:[1048576 TO 16777216]"); + break; - default: - throw new TestException("Unexpected value returned"); + default: + throw new TestException("Unexpected value returned"); } }); - + } @Test @@ -235,29 +238,34 @@ public class FacetedSearchTest extends AbstractSearchTest public void searchWithFactedFields() throws Exception { SearchRequest query = new SearchRequest(); - RestRequestQueryModel queryReq = new RestRequestQueryModel(); - queryReq.setQuery("*"); + RestRequestQueryModel queryReq = new RestRequestQueryModel(); + queryReq.setQuery(unique_searchString); query.setQuery(queryReq); + RestRequestFacetFieldsModel facetFields = new RestRequestFacetFieldsModel(); - Listfacets = new ArrayList(); + List facets = new ArrayList(); facets.add(new RestRequestFacetFieldModel("cm:mimetype")); facets.add(new RestRequestFacetFieldModel("modifier")); facetFields.setFacets(facets); query.setFacetFields(facetFields); - SearchResponse response = query(query); + + SearchResponse response = query(query); + Assert.assertFalse(response.getContext().getFacetsFields().isEmpty()); Assert.assertNull(response.getContext().getFacetQueries()); Assert.assertNull(response.getContext().getFacets()); + RestResultBucketsModel model = response.getContext().getFacetsFields().get(0); Assert.assertEquals(model.getLabel(), "modifier"); - + model.assertThat().field("label").is("modifier"); FacetFieldBucket bucket1 = model.getBuckets().get(0); - bucket1.assertThat().field("label").is("System"); - bucket1.assertThat().field("display").is("System"); - bucket1.assertThat().field("filterQuery").is("modifier:\"System\""); - bucket1.assertThat().field("count").is(684); + bucket1.assertThat().field("label").is(userModel.getUsername()); + bucket1.assertThat().field("display").is(userModel.getUsername() + " FirstName LN-" + userModel.getUsername()); + bucket1.assertThat().field("filterQuery").is("modifier:\"" + userModel.getUsername() + "\""); + bucket1.assertThat().field("count").is(1); } + @Test /** * Test that items returned are in the format of generic facets. @@ -274,29 +282,31 @@ public class FacetedSearchTest extends AbstractSearchTest public void searchWithFactedFieldsFacetFormatV2() throws Exception { SearchRequest query = new SearchRequest(); - RestRequestQueryModel queryReq = new RestRequestQueryModel(); - queryReq.setQuery("*"); + RestRequestQueryModel queryReq = new RestRequestQueryModel(); + queryReq.setQuery(unique_searchString); query.setQuery(queryReq); query.setFacetFormat("V2"); RestRequestFacetFieldsModel facetFields = new RestRequestFacetFieldsModel(); - Listfacets = new ArrayList(); + List facets = new ArrayList(); facets.add(new RestRequestFacetFieldModel("cm:mimetype")); facets.add(new RestRequestFacetFieldModel("modifier")); facetFields.setFacets(facets); query.setFacetFields(facetFields); - SearchResponse response = query(query); + + SearchResponse response = query(query); + Assert.assertNull(response.getContext().getFacetsFields()); Assert.assertNull(response.getContext().getFacetQueries()); Assert.assertFalse(response.getContext().getFacets().isEmpty()); RestGenericFacetResponseModel model = response.getContext().getFacets().get(0); Assert.assertEquals(model.getLabel(), "modifier"); - + model.assertThat().field("label").is("modifier"); RestGenericBucketModel bucket1 = model.getBuckets().get(0); - bucket1.assertThat().field("label").is("System"); - bucket1.assertThat().field("display").isNull(); - bucket1.assertThat().field("filterQuery").is("modifier:\"System\""); - bucket1.assertThat().field("metrics").is("[{entry=null, type=count, value={count=684}}]"); + bucket1.assertThat().field("label").is(userModel.getUsername()); + bucket1.assertThat().field("display").is(userModel.getUsername() + " FirstName LN-" + userModel.getUsername()); + bucket1.assertThat().field("filterQuery").is("modifier:\"" + userModel.getUsername() + "\""); + bucket1.assertThat().field("metrics").is("[{entry=null, type=count, value={count=1}}]"); } } diff --git a/e2e-test/java/org/alfresco/rest/search/FingerPrintTest.java b/e2e-test/java/org/alfresco/rest/search/FingerPrintTest.java index 675d5da3c..04e0e57bf 100644 --- a/e2e-test/java/org/alfresco/rest/search/FingerPrintTest.java +++ b/e2e-test/java/org/alfresco/rest/search/FingerPrintTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 Alfresco Software Limited. + * Copyright (C) 2018 Alfresco Software Limited. * * This file is part of Alfresco * @@ -18,7 +18,6 @@ */ package org.alfresco.rest.search; -import org.alfresco.utility.model.ContentModel; import org.alfresco.utility.model.FileModel; import org.alfresco.utility.model.FileType; import org.alfresco.utility.model.FolderModel; @@ -34,34 +33,37 @@ import org.testng.annotations.Test; */ public class FingerPrintTest extends AbstractSearchTest { - private FileModel file1,file2,file3,file4; - @BeforeClass + private FileModel file1, file2, file3, file4; + + @BeforeClass(alwaysRun = true) public void indexSimilarFile() throws Exception { - adminUserModel = dataUser.getAdminUser(); - userModel = dataUser.createRandomTestUser(); - siteModel = dataSite.usingUser(userModel).createPublicRandomSite(); + /* - * Create the following file structure for preconditions : - * |- folder - * |-- fox.txt + * Create the following file structure in the same Site : In addition to the preconditions created in dataPreparation + * |- folder + * |-- pangram-banana.txt + * |-- pangram-taco.txt + * |-- pangram-cat.txt + * |-- dog.txt */ - nodesBuilder = restClient.authenticateUser(userModel).withCoreAPI().usingNode(ContentModel.my()).defineNodes(); - FolderModel folder = new FolderModel(SEARCH_DATA_SAMPLE_FOLDER); + + FolderModel folder = new FolderModel("The quick brown fox jumps over"); dataContent.usingUser(userModel).usingSite(siteModel).createFolder(folder); + file1 = new FileModel("pangram-banana.txt", FileType.TEXT_PLAIN, "The quick brown fox jumps over the lazy banana"); file2 = new FileModel("pangram-taco.txt", FileType.TEXT_PLAIN, "The quick brown fox jumps over the lazy dog that ate the taco"); file3 = new FileModel("pangram-cat.txt", FileType.TEXT_PLAIN, "The quick brown fox jumps over the lazy cat"); file4 = new FileModel("dog.txt", FileType.TEXT_PLAIN, "The quick brown fox ate the lazy dog"); - ContentModel cm = new ContentModel(); - cm.setCmisLocation(folder.getCmisLocation()); - cm.setName(folder.getName()); - dataContent.usingUser(userModel).usingSite(siteModel).usingResource(cm).createContent(file1); - dataContent.usingUser(userModel).usingSite(siteModel).usingResource(cm).createContent(file2); - dataContent.usingUser(userModel).usingSite(siteModel).usingResource(cm).createContent(file3); - dataContent.usingUser(userModel).usingSite(siteModel).usingResource(cm).createContent(file4); - Thread.sleep(35000);//Allow indexing to complete. + + dataContent.usingUser(userModel).usingSite(siteModel).usingResource(folder).createContent(file1); + dataContent.usingUser(userModel).usingSite(siteModel).usingResource(folder).createContent(file2); + dataContent.usingUser(userModel).usingSite(siteModel).usingResource(folder).createContent(file3); + dataContent.usingUser(userModel).usingSite(siteModel).usingResource(folder).createContent(file4); + + waitForIndexing(file4.getName(), true); } + /** * Search similar document based on document finger print. * The data prep should have loaded 2 files which one is similar @@ -70,7 +72,7 @@ public class FingerPrintTest extends AbstractSearchTest * * @throws Exception */ - @Test(groups= {TestGroup.REST_API, TestGroup.SEARCH, TestGroup.ASS_1}) + @Test(groups = { TestGroup.REST_API, TestGroup.SEARCH, TestGroup.ASS_1 }) public void search() throws Exception { String uuid = file1.getNodeRefWithoutVersion(); @@ -79,46 +81,50 @@ public class FingerPrintTest extends AbstractSearchTest SearchResponse response = query(fingerprint); int count = response.getEntries().size(); Assert.assertTrue(count > 1); - for(SearchNodeModel m :response.getEntries()) + for (SearchNodeModel m : response.getEntries()) { String match = m.getModel().getName(); switch (match) { - case "pangram.txt": - break; - case "pangram-banana.txt": - break; - case "pangram-taco.txt": - break; - case "pangram-cat.txt": - break; - default: - throw new AssertionError("Not a match to an expected file: " + m.getModel().getName()); + case "pangram.txt": + break; + case "pangram-banana.txt": + break; + case "pangram-taco.txt": + break; + case "pangram-cat.txt": + break; + default: + throw new AssertionError("Not a match to an expected file: " + m.getModel().getName()); } m.getModel().assertThat().field("name").isNot("dog.txt"); m.getModel().assertThat().field("name").isNot("cars.txt"); } } - @Test(groups= {TestGroup.REST_API, TestGroup.SEARCH, TestGroup.ASS_1}) + + @Test(groups = { TestGroup.REST_API, TestGroup.SEARCH, TestGroup.ASS_1 }) public void searchSimilar() throws Exception { String uuid = file2.getNodeRefWithoutVersion(); Assert.assertNotNull(uuid); - // In the response eneity there is a score of each doc, change below threshold to bring more like or less. - String fingerprint = String.format("FINGERPRINT:%s_68", uuid); + + // In the response entity there is a score of each doc, change below threshold to bring more like or less. + String fingerprint = String.format("FINGERPRINT:%s_68", uuid); SearchResponse response = query(fingerprint); + int count = response.getEntries().size(); Assert.assertTrue(count > 1); - for(SearchNodeModel m :response.getEntries()) + + for (SearchNodeModel m : response.getEntries()) { switch (m.getModel().getName()) { - case "pangram.txt": - break; - case "pangram-taco.txt": - break; - default: - throw new AssertionError("Not a match to an expected file: " + m.getModel().getName()); + case "pangram.txt": + break; + case "pangram-taco.txt": + break; + default: + throw new AssertionError("Not a match to an expected file: " + m.getModel().getName()); } m.getModel().assertThat().field("name").isNot("pangram-banana.txt"); m.getModel().assertThat().field("name").isNot("pangram-cat.txt"); @@ -126,7 +132,8 @@ public class FingerPrintTest extends AbstractSearchTest m.getModel().assertThat().field("name").isNot("cars.txt"); } } - @Test(groups= {TestGroup.REST_API, TestGroup.SEARCH, TestGroup.ASS_1}) + + @Test(groups = { TestGroup.REST_API, TestGroup.SEARCH, TestGroup.ASS_1 }) public void searchSimilar67Percent() throws Exception { String uuid = file2.getNodeRefWithoutVersion(); @@ -135,18 +142,18 @@ public class FingerPrintTest extends AbstractSearchTest SearchResponse response = query(fingerprint); int count = response.getEntries().size(); Assert.assertTrue(count > 1); - for(SearchNodeModel m :response.getEntries()) + for (SearchNodeModel m : response.getEntries()) { switch (m.getModel().getName()) { - case "pangram.txt": - break; - case "pangram-taco.txt": - break; - case "pangram-cat.txt": - break; - default: - throw new AssertionError("Not a match to an expected file: " + m.getModel().getName()); + case "pangram.txt": + break; + case "pangram-taco.txt": + break; + case "pangram-cat.txt": + break; + default: + throw new AssertionError("Not a match to an expected file: " + m.getModel().getName()); } m.getModel().assertThat().field("name").isNot("pangram-banana.txt"); m.getModel().assertThat().field("name").isNot("dog.txt"); diff --git a/e2e-test/java/org/alfresco/rest/search/PivotFacetedSearchTest.java b/e2e-test/java/org/alfresco/rest/search/PivotFacetedSearchTest.java index bc54be77d..c21b9e2c7 100644 --- a/e2e-test/java/org/alfresco/rest/search/PivotFacetedSearchTest.java +++ b/e2e-test/java/org/alfresco/rest/search/PivotFacetedSearchTest.java @@ -60,12 +60,15 @@ public class PivotFacetedSearchTest extends AbstractSearchTest pivotModelList.add(pivots); query.setPivots(pivotModelList); - SearchResponse response = query(query); + query(query); + restClient.assertStatusCodeIs(HttpStatus.BAD_REQUEST).assertLastError() .containsSummary(String.format(RestErrorModel.MANDATORY_PARAM, "pivot key")); pivots.setKey("none_like_this"); - response = query(query); + + query(query); + restClient.assertStatusCodeIs(HttpStatus.BAD_REQUEST) .assertLastError().containsSummary("invalid argument was received") .containsSummary("Pivot parameter none_like_this does not reference"); diff --git a/e2e-test/java/org/alfresco/rest/search/SearchAPATHTest.java b/e2e-test/java/org/alfresco/rest/search/SearchAPATHTest.java index 030494997..0a2b9c762 100644 --- a/e2e-test/java/org/alfresco/rest/search/SearchAPATHTest.java +++ b/e2e-test/java/org/alfresco/rest/search/SearchAPATHTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 Alfresco Software Limited. + * Copyright (C) 2018 Alfresco Software Limited. * * This file is part of Alfresco * @@ -116,12 +116,15 @@ public class SearchAPATHTest extends AbstractSearchTest Assert.assertEquals(4,fresponse.getBuckets().size()); fresponse.getBuckets().get(0).assertThat().field("label").contains("1/"); } + @Test(groups={TestGroup.SEARCH, TestGroup.REST_API, TestGroup.ASS_1}) public void searchLevel2() throws Exception { + String queryString = "name:"+ "cars"; + SearchRequest searchQuery = new SearchRequest(); RestRequestQueryModel queryReq = new RestRequestQueryModel(); - queryReq.setQuery("name:*"); + queryReq.setQuery(queryString); searchQuery.setQuery(queryReq); RestRequestFacetFieldsModel facetFields = new RestRequestFacetFieldsModel(); @@ -131,6 +134,7 @@ public class SearchAPATHTest extends AbstractSearchTest searchQuery.setFacetFields(facetFields); SearchResponse response = query(searchQuery); + RestResultBucketsModel fresponse = response.getContext().getFacetsFields().get(0); String path = fresponse.getBuckets().get(0).getLabel().replace("1/", "2/"); list.remove(0); @@ -140,7 +144,7 @@ public class SearchAPATHTest extends AbstractSearchTest searchQuery.setFacetFields(facetFields); response = query(searchQuery); fresponse = response.getContext().getFacetsFields().get(0); - Assert.assertEquals(fresponse.getBuckets().size(),3); + Assert.assertTrue(fresponse.getBuckets().size() >= 1); fresponse.getBuckets().get(0).assertThat().field("label").contains("2/"); fresponse.getBuckets().get(0).assertThat().field("label").contains(path); /** @@ -151,7 +155,7 @@ public class SearchAPATHTest extends AbstractSearchTest */ searchQuery = new SearchRequest(); queryReq = new RestRequestQueryModel(); - queryReq.setQuery("name:*"); + queryReq.setQuery(queryString); searchQuery.setQuery(queryReq); facetFields = new RestRequestFacetFieldsModel(); list.remove(0); @@ -160,8 +164,7 @@ public class SearchAPATHTest extends AbstractSearchTest searchQuery.setFacetFields(facetFields); response = query(searchQuery); fresponse = response.getContext().getFacetsFields().get(0); - System.out.println(response); - Assert.assertTrue(fresponse.getBuckets().size() > 5); + Assert.assertTrue(fresponse.getBuckets().size() >= 1); fresponse.getBuckets().get(0).assertThat().field("label").contains("3/"); } } diff --git a/e2e-test/java/org/alfresco/rest/search/SearchSpellCheckTest.java b/e2e-test/java/org/alfresco/rest/search/SearchSpellCheckTest.java index a13e447fb..c55d0b215 100644 --- a/e2e-test/java/org/alfresco/rest/search/SearchSpellCheckTest.java +++ b/e2e-test/java/org/alfresco/rest/search/SearchSpellCheckTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 Alfresco Software Limited. + * Copyright (C) 2018 Alfresco Software Limited. * * This file is part of Alfresco * @@ -19,6 +19,8 @@ package org.alfresco.rest.search; import org.alfresco.rest.model.RestRequestSpellcheckModel; +import org.alfresco.utility.model.FileModel; +import org.alfresco.utility.model.FileType; import org.alfresco.utility.model.TestGroup; import org.junit.Assert; import org.testng.annotations.Test; @@ -26,10 +28,11 @@ import org.testng.annotations.Test; /** * Search end point Public API test with spell checking enabled. * @author Michael Suzuki - *5 + * @author Meenal Bhave */ public class SearchSpellCheckTest extends AbstractSearchTest { + /** * Perform the below query * { @@ -61,24 +64,48 @@ public class SearchSpellCheckTest extends AbstractSearchTest * * @throws Exception */ - @Test(groups={TestGroup.SEARCH, TestGroup.REST_API}) - public void searchMissSpelled() throws Exception + @Test(groups={TestGroup.SEARCH, TestGroup.REST_API, TestGroup.ACS_60n}, priority=1) + public void testSearchMissSpelled() throws Exception { + // Name SearchRequest searchReq = new SearchRequest(); RestRequestQueryModel queryReq = new RestRequestQueryModel(); + queryReq.setQuery("cm:name:alfrezco"); + queryReq.setUserQuery("alfrezco"); + searchReq.setQuery(queryReq); + searchReq.setSpellcheck(new RestRequestSpellcheckModel()); + assertResponse(query(searchReq)); + + // Title queryReq.setQuery("cm:title:alfrezco"); queryReq.setUserQuery("alfrezco"); searchReq.setQuery(queryReq); searchReq.setSpellcheck(new RestRequestSpellcheckModel()); assertResponse(query(searchReq)); + + // Description + queryReq.setQuery("cm:description:alfrezco"); + queryReq.setUserQuery("alfrezco"); + searchReq.setQuery(queryReq); + searchReq.setSpellcheck(new RestRequestSpellcheckModel()); + assertResponse(query(searchReq)); + + // Content + queryReq.setQuery("cm:content:alfrezco"); + queryReq.setUserQuery("alfrezco"); + searchReq.setQuery(queryReq); + searchReq.setSpellcheck(new RestRequestSpellcheckModel()); + assertResponse(query(searchReq)); } + private void assertResponse(SearchResponse nodes) throws Exception { nodes.assertThat().entriesListIsNotEmpty(); nodes.getContext().assertThat().field("spellCheck").isNotEmpty(); nodes.getContext().getSpellCheck().assertThat().field("suggestions").contains("alfresco"); + nodes.getContext().getSpellCheck().assertThat().field("type").is("searchInsteadFor"); } - @Test + /** * Perform alternative way by setting the value in spellcheck object. * @@ -91,7 +118,8 @@ public class SearchSpellCheckTest extends AbstractSearchTest * } * @throws Exception */ - public void searchMissSpelledVersion2() throws Exception + @Test(groups={TestGroup.SEARCH, TestGroup.REST_API, TestGroup.ACS_60n}, priority=2) + public void testSearchMissSpelledVersion2() throws Exception { SearchRequest searchReq = new SearchRequest(); RestRequestQueryModel queryReq = new RestRequestQueryModel(); @@ -103,8 +131,9 @@ public class SearchSpellCheckTest extends AbstractSearchTest searchReq.setSpellcheck(spellCheck); assertResponse(query(searchReq)); } - @Test - public void searchWithSpellcheckerAndCorrectSpelling() throws Exception + + @Test(groups={TestGroup.SEARCH, TestGroup.REST_API, TestGroup.ACS_60n}, priority=3) + public void testSearchWithSpellcheckerAndCorrectSpelling() throws Exception { SearchRequest searchReq = new SearchRequest(); RestRequestQueryModel queryReq = new RestRequestQueryModel(); @@ -113,7 +142,31 @@ public class SearchSpellCheckTest extends AbstractSearchTest searchReq.setQuery(queryReq); searchReq.setSpellcheck(new RestRequestSpellcheckModel()); SearchResponse res = query(searchReq); - Assert.assertNull(res.getContext()); + Assert.assertNull(res.getContext().getSpellCheck()); res.assertThat().entriesListIsNotEmpty(); } + + @Test(groups={TestGroup.SEARCH, TestGroup.REST_API, TestGroup.ACS_60n}, priority=4) + public void testSpellCheckType() throws Exception + { + // Create a file with mis-spelt name, expect spellcheck type = didYouMean + FileModel file = new FileModel(unique_searchString + "-1.txt", "uniquee" + "uniquee", "uniquee", FileType.TEXT_PLAIN, "Unique text file for search "); + dataContent.usingUser(userModel).usingSite(siteModel).createContent(file); + + waitForIndexing(file.getName(), true); + + // Search + SearchRequest searchReq = new SearchRequest(); + RestRequestQueryModel queryReq = new RestRequestQueryModel(); + queryReq.setQuery("cm:title:uniquee"); + queryReq.setUserQuery("uniquee"); + searchReq.setQuery(queryReq); + searchReq.setSpellcheck(new RestRequestSpellcheckModel()); + SearchResponse nodes = query(searchReq); + + nodes.assertThat().entriesListIsNotEmpty(); + nodes.getContext().assertThat().field("spellCheck").isNotEmpty(); + nodes.getContext().getSpellCheck().assertThat().field("suggestions").contains("unique"); + nodes.getContext().getSpellCheck().assertThat().field("type").is("didYouMean"); + } } diff --git a/e2e-test/java/org/alfresco/rest/search/SearchTest.java b/e2e-test/java/org/alfresco/rest/search/SearchTest.java index 5f038dfc6..b1a285c6c 100644 --- a/e2e-test/java/org/alfresco/rest/search/SearchTest.java +++ b/e2e-test/java/org/alfresco/rest/search/SearchTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 Alfresco Software Limited. + * Copyright (C) 2018 Alfresco Software Limited. * * This file is part of Alfresco * @@ -36,14 +36,14 @@ public class SearchTest extends AbstractSearchTest @Test(groups={TestGroup.SEARCH, TestGroup.REST_API}) public void searchOnIndexedData() throws Exception { - SearchResponse nodes = query("ipsum"); + SearchResponse nodes = query(unique_searchString); restClient.assertStatusCodeIs(HttpStatus.OK); nodes.assertThat().entriesListIsNotEmpty(); SearchNodeModel entity = nodes.getEntryByIndex(0); entity.assertThat().field("search").contains("score"); entity.getSearch().assertThat().field("score").isNotEmpty(); - Assert.assertEquals("Project Overview.ppt",entity.getName()); + Assert.assertEquals("pangram.txt",entity.getName()); } @Test(groups={TestGroup.SEARCH,TestGroup.REST_API}) diff --git a/e2e-test/java/org/alfresco/rest/search/ShardInfoTest.java b/e2e-test/java/org/alfresco/rest/search/ShardInfoTest.java index abc59ff03..d4c5678c1 100644 --- a/e2e-test/java/org/alfresco/rest/search/ShardInfoTest.java +++ b/e2e-test/java/org/alfresco/rest/search/ShardInfoTest.java @@ -41,7 +41,7 @@ import org.testng.annotations.Test; public class ShardInfoTest extends AbstractSearchTest { @Bug(id="DELENG-1", status=Bug.Status.OPENED) - @Test(groups={TestGroup.SEARCH, TestGroup.REST_API}) + @Test(groups={TestGroup.SEARCH, TestGroup.REST_API, TestGroup.ACS_60n}) public void getShardInfoWithAdminAuthority() throws JsonProcessingException, EmptyRestModelCollectionException { RestShardInfoModelCollection info = restClient.authenticateUser(dataUser.getAdminUser()).withShardInfoAPI().getInfo(); @@ -70,7 +70,8 @@ public class ShardInfoTest extends AbstractSearchTest RestInstanceModel instance = instances.iterator().next(); assertNotNull(instance); baseUrls.contains(instance.getBaseUrl()); - assertEquals(instance.getHost(), "localhost"); + // TODO: Ideally Solr Host and Port should be Parameterised + assertEquals(instance.getHost(), "search"); assertEquals(instance.getPort().intValue(), 8983); assertEquals(instance.getState(), "ACTIVE"); assertEquals(instance.getMode(), "MASTER"); @@ -78,7 +79,7 @@ public class ShardInfoTest extends AbstractSearchTest } @Bug(id="DELENG-1", status=Bug.Status.OPENED) - @Test(groups={TestGroup.SEARCH, TestGroup.REST_API}) + @Test(groups={TestGroup.SEARCH, TestGroup.REST_API, TestGroup.ACS_60n}) public void getShardInfoWithoutAdminAuthority() throws Exception { restClient.authenticateUser(dataUser.createRandomTestUser()).withShardInfoAPI().getInfo(); diff --git a/e2e-test/java/org/alfresco/rest/sharedLinks/SharedLinksSanityTests.java b/e2e-test/java/org/alfresco/rest/sharedLinks/SharedLinksSanityTests.java index d41f2d646..c9dbc91fe 100644 --- a/e2e-test/java/org/alfresco/rest/sharedLinks/SharedLinksSanityTests.java +++ b/e2e-test/java/org/alfresco/rest/sharedLinks/SharedLinksSanityTests.java @@ -1,7 +1,5 @@ package org.alfresco.rest.sharedLinks; -import static org.testng.Assert.assertEquals; - import javax.json.Json; import org.alfresco.dataprep.CMISUtil.DocumentType; diff --git a/e2e-test/resources/SearchSuite.xml b/e2e-test/resources/SearchSuite.xml new file mode 100644 index 000000000..34bc53bb6 --- /dev/null +++ b/e2e-test/resources/SearchSuite.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/e2e-test/resources/default.properties b/e2e-test/resources/default.properties index 7c7516125..b44ef9b4a 100644 --- a/e2e-test/resources/default.properties +++ b/e2e-test/resources/default.properties @@ -8,6 +8,9 @@ sync.scheme=http sync.server=localhost sync.port=9090 +#Solr Indexing Time +solrWaitTimeInSeconds=20 + # credentials admin.user=admin admin.password=admin