Search-427, merge changes from head and add missing facet fields e2e tests

This commit is contained in:
Michael Suzuki
2017-05-22 21:02:57 +01:00
6 changed files with 356 additions and 48 deletions
@@ -11,6 +11,7 @@ import org.alfresco.utility.model.SiteModel;
import org.alfresco.utility.model.TestGroup;
import org.alfresco.utility.model.UserModel;
import org.alfresco.utility.report.Bug;
import org.alfresco.utility.report.Bug.Status;
import org.alfresco.utility.testrail.ExecutionType;
import org.alfresco.utility.testrail.annotation.TestRail;
import org.springframework.http.HttpStatus;
@@ -43,7 +44,7 @@ public class CreateRenditionTests extends RestTest
document = dataContent.usingUser(user).usingSite(site).createContent(DocumentType.TEXT_PLAIN);
}
@Bug(id = "REPO-2042", description = "Should fail only on MAC OS System and Linux" )
@Bug(id = "REPO-2042", description = "Should fail only on MAC OS System and Linux", status = Status.FIXED )
@TestRail(section = { TestGroup.REST_API, TestGroup.RENDITIONS }, executionType = ExecutionType.SANITY,
description = "Verify admin user creates rendition with Rest API and status code is 202")
@Test(groups = { TestGroup.REST_API, TestGroup.RENDITIONS, TestGroup.SANITY })
@@ -52,11 +53,11 @@ public class CreateRenditionTests extends RestTest
restClient.authenticateUser(adminUser).withCoreAPI().usingNode(document).createNodeRendition("pdf");
restClient.assertStatusCodeIs(HttpStatus.ACCEPTED);
restClient.withCoreAPI().usingNode(document).getNodeRendition("pdf")
restClient.withCoreAPI().usingNode(document).getNodeRenditionUntilIsCreated("pdf")
.assertThat().field("status").is("CREATED");
}
@Bug(id = "REPO-2042", description = "Should fail only on MAC OS System and Linux" )
@Bug(id = "REPO-2042", description = "Should fail only on MAC OS System and Linux", status = Status.FIXED )
@TestRail(section = { TestGroup.REST_API, TestGroup.RENDITIONS }, executionType = ExecutionType.SANITY,
description = "Verify user that created the document can also creates 'pdf' rendition for it with Rest API and status code is 202")
@Test(groups = { TestGroup.REST_API, TestGroup.RENDITIONS, TestGroup.SANITY })
@@ -65,11 +66,11 @@ public class CreateRenditionTests extends RestTest
restClient.authenticateUser(user).withCoreAPI().usingNode(document).createNodeRendition("pdf");
restClient.assertStatusCodeIs(HttpStatus.ACCEPTED);
restClient.withCoreAPI().usingNode(document).getNodeRendition("pdf")
restClient.withCoreAPI().usingNode(document).getNodeRenditionUntilIsCreated("pdf")
.assertThat().field("status").is("CREATED");
}
@Bug(id = "REPO-2042", description = "Should fail only on MAC OS System and Linux" )
@Bug(id = "REPO-2042", description = "Should fail only on MAC OS System and Linux", status = Status.FIXED )
@TestRail(section = { TestGroup.REST_API, TestGroup.RENDITIONS }, executionType = ExecutionType.SANITY,
description = "Verify user that created the document can also creates 'doclib' rendition for it with Rest API and status code is 202")
@Test(groups = { TestGroup.REST_API, TestGroup.RENDITIONS, TestGroup.SANITY })
@@ -89,7 +90,7 @@ public class CreateRenditionTests extends RestTest
restClient.authenticateUser(user).withCoreAPI().usingNode(document).createNodeRendition("doclib");
restClient.assertStatusCodeIs(HttpStatus.ACCEPTED);
restClient.withCoreAPI().usingNode(document).getNodeRendition("doclib")
restClient.withCoreAPI().usingNode(document).getNodeRenditionUntilIsCreated("doclib")
.assertThat().field("status").is("CREATED");
}
}
@@ -111,13 +111,16 @@ public class AbstractSearchTest extends RestTest
{
return restClient.authenticateUser(dataUser.getAdminUser()).withSearchAPI().search(query);
}
protected SearchRequest carsQuery()
protected SearchRequest createQuery(String term)
{
SearchRequest query = new SearchRequest();
RestRequestQueryModel queryReq = new RestRequestQueryModel();
queryReq.setQuery("cars");
queryReq.setQuery(term);
query.setQuery(queryReq);
return query;
}
protected SearchRequest carsQuery()
{
return createQuery("cars");
}
}
@@ -0,0 +1,269 @@
/*
* Copyright (C) 2017 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.alfresco.rest.search;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.alfresco.rest.model.RestErrorModel;
import org.alfresco.rest.model.RestRequestRangesModel;
import org.alfresco.utility.model.TestGroup;
import org.alfresco.utility.testrail.ExecutionType;
import org.alfresco.utility.testrail.annotation.TestRail;
import org.springframework.http.HttpStatus;
import org.testng.Assert;
import org.testng.annotations.Test;
/**
* Faceted Range Search Query for numeric range
* {
* "query": {
* "query": "name:A*"
* },
* "range": {
* "field": "content.size",
* "start": "0",
* "end": "400",
* "gap": "100"
* }
* }
* Date range query:
* {
* "query": {
* "query": "name:A*"
* },
* "range": {
* "field": "created",
* "start": "2015-09-29T10:45:15.729Z",
* "end": "2016-09-29T10:45:15.729Z",
* "gap": "+100DAY"
* }
* }
* @author Michael Suzuki
*
*/
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")
public void checkingFacetsMandatoryErrorMessages()throws Exception
{
SearchRequest query = carsQuery();
List<RestRequestRangesModel> ranges = new ArrayList<RestRequestRangesModel>();
RestRequestRangesModel facetRangeModel = new RestRequestRangesModel();
ranges.add(facetRangeModel);
query.setRanges(ranges);
SearchResponse response = query(query);
restClient.assertStatusCodeIs(HttpStatus.BAD_REQUEST).assertLastError()
.containsSummary(String.format(RestErrorModel.MANDATORY_PARAM, "field"));
ranges.clear();
facetRangeModel.setField("content.size");
ranges.add(facetRangeModel);
query.setRanges(ranges);
response = 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);
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);
restClient.assertStatusCodeIs(HttpStatus.BAD_REQUEST).assertLastError()
.containsSummary(String.format(RestErrorModel.MANDATORY_PARAM, "gap"));
facetRangeModel.setGap("100");
}
@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 basic facet range search api")
public void searchWithRange()throws Exception
{
SearchRequest query = createQuery("A*");
RestRequestRangesModel facetRangeModel = new RestRequestRangesModel();
facetRangeModel.setField("content.size");
facetRangeModel.setStart("0");
facetRangeModel.setEnd("500");
facetRangeModel.setGap("200");
List<RestRequestRangesModel> ranges = new ArrayList<RestRequestRangesModel>();
ranges.add(facetRangeModel);
query.setRanges(ranges);
SearchResponse response = query(query);
response.assertThat().entriesListIsNotEmpty();
response.getContext().assertThat().field("facets").isNotEmpty();
RestGenericFacetResponseModel facetResponseModel = response.getContext().getFacets().get(0);
RestGenericBucketModel bucket = facetResponseModel.getBuckets().get(0);
bucket.assertThat().field("label").is("0 - 200");
bucket.assertThat().field("filterQuery").is("content.size:(0 TO 200)");
Map<String,String> metric = (Map<String, String>) bucket.getMetrics().get(0).getValue();
Assert.assertTrue(new Integer(metric.get("count")) > 4);
Map<String, String> info = (Map<String, String>) bucket.getBucketInfo();
Assert.assertEquals(info.get("start"),"0");
Assert.assertEquals(info.get("end"),"200");
Assert.assertTrue(!info.get("count").isEmpty());
bucket = facetResponseModel.getBuckets().get(1);
bucket.assertThat().field("label").is("200 - 400");
bucket.assertThat().field("filterQuery").is("content.size:(200 TO 400)");
metric = (Map<String, String>) bucket.getMetrics().get(0).getValue();
Integer count = new Integer(metric.get("count"));
Assert.assertTrue(count >= 4);
info = (Map<String, String>) bucket.getBucketInfo();
Assert.assertEquals(info.get("start"),"200");
Assert.assertEquals(info.get("end"),"400");
bucket = facetResponseModel.getBuckets().get(2);
bucket.assertThat().field("label").is("400 - 600");
bucket.assertThat().field("filterQuery").is("content.size:(400 TO 600)");
metric = (Map<String, String>) bucket.getMetrics().get(0).getValue();
Assert.assertTrue(new Integer(metric.get("count")) >= 7);
info = (Map<String, String>) bucket.getBucketInfo();
Assert.assertEquals(info.get("start"),"400");
Assert.assertEquals(info.get("end"),"600");
}
@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 date facet intervals search api")
public void searchWithRangeHardend()throws Exception
{
SearchRequest query = createQuery("A*");
RestRequestRangesModel facetRangeModel = new RestRequestRangesModel();
facetRangeModel.setField("content.size");
facetRangeModel.setStart("0");
facetRangeModel.setEnd("500");
facetRangeModel.setGap("200");
facetRangeModel.setHardend(true);
List<RestRequestRangesModel> ranges = new ArrayList<RestRequestRangesModel>();
ranges.add(facetRangeModel);
query.setRanges(ranges);
SearchResponse response = query(query);
response.assertThat().entriesListIsNotEmpty();
response.getContext().assertThat().field("facets").isNotEmpty();
RestGenericFacetResponseModel facetResponseModel = response.getContext().getFacets().get(0);
RestGenericBucketModel bucket = facetResponseModel.getBuckets().get(0);
bucket.assertThat().field("label").is("0 - 200");
bucket.assertThat().field("filterQuery").is("content.size:(0 TO 200)");
Map<String,String> metric = (Map<String, String>) bucket.getMetrics().get(0).getValue();
Assert.assertTrue(new Integer(metric.get("count")) >= 4);
Map<String, String> info = (Map<String, String>) bucket.getBucketInfo();
Assert.assertEquals(info.get("start"),"0");
Assert.assertEquals(info.get("end"),"200");
Assert.assertTrue(!info.get("count").isEmpty());
bucket = facetResponseModel.getBuckets().get(1);
bucket.assertThat().field("label").is("200 - 400");
bucket.assertThat().field("filterQuery").is("content.size:(200 TO 400)");
info = (Map<String, String>) bucket.getBucketInfo();
Assert.assertEquals(info.get("start"),"200");
Assert.assertEquals(info.get("end"),"400");
metric = (Map<String, String>) bucket.getMetrics().get(0).getValue();
Assert.assertTrue(new Integer(metric.get("count")) >= 4);
Assert.assertTrue(!info.get("count").isEmpty());
bucket = facetResponseModel.getBuckets().get(2);
bucket.assertThat().field("label").is("400 - 500");
bucket.assertThat().field("filterQuery").is("content.size:(400 TO 500)");
metric = (Map<String, String>) bucket.getMetrics().get(0).getValue();
Assert.assertTrue(new Integer(metric.get("count")) >= 3);
info = (Map<String, String>) bucket.getBucketInfo();
Assert.assertEquals(info.get("start"),"400");
Assert.assertEquals(info.get("end"),"500");
Assert.assertTrue(!info.get("count").isEmpty());
}
@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 date facet intervals search api")
public void searchDateRange()throws Exception
{
SearchRequest query = createQuery("name:A*");
RestRequestRangesModel facetRangeModel = new RestRequestRangesModel();
facetRangeModel.setField("created");
facetRangeModel.setStart("2015-09-29T10:45:15.729Z");
facetRangeModel.setEnd("2016-09-29T10:45:15.729Z");
facetRangeModel.setGap("+280DAY");
List<RestRequestRangesModel> ranges = new ArrayList<RestRequestRangesModel>();
ranges.add(facetRangeModel);
query.setRanges(ranges);
SearchResponse response = query(query);
response.assertThat().entriesListIsNotEmpty();
response.getContext().assertThat().field("facets").isNotEmpty();
RestGenericFacetResponseModel facetResponseModel = response.getContext().getFacets().get(0);
RestGenericBucketModel bucket = facetResponseModel.getBuckets().get(0);
bucket.assertThat().field("label").is("2015-09-29T10:45:15.729Z - 2016-07-05T10:45:15.729Z");
bucket.assertThat().field("filterQuery").is("created:(2015-09-29T10:45:15.729Z TO 2016-07-05T10:45:15.729Z)");
bucket.getMetrics().get(0).assertThat().field("value").is("{count=1}");
Map<String, String> info = (Map<String, String>) bucket.getBucketInfo();
Assert.assertEquals(info.get("start"),"2015-09-29T10:45:15.729Z");
Assert.assertEquals(info.get("end"),"2016-07-05T10:45:15.729Z");
Assert.assertEquals(info.get("count"),"1");
bucket = facetResponseModel.getBuckets().get(1);
bucket.assertThat().field("label").is("2016-07-05T10:45:15.729Z - 2017-04-11T10:45:15.729Z");
bucket.assertThat().field("filterQuery").is("created:(2016-07-05T10:45:15.729Z TO 2017-04-11T10:45:15.729Z)");
bucket.getMetrics().get(0).assertThat().field("value").is("{count=0}");
info = (Map<String, String>) bucket.getBucketInfo();
Assert.assertEquals(info.get("start"),"2016-07-05T10:45:15.729Z");
Assert.assertEquals(info.get("end"),"2017-04-11T10:45:15.729Z");
Assert.assertEquals(info.get("count"),"0");
}
@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 date facet intervals search api")
public void searchDateAndSizeRanges()throws Exception
{
SearchRequest query = createQuery("name:A*");
List<RestRequestRangesModel> ranges = new ArrayList<RestRequestRangesModel>();
RestRequestRangesModel facetRangeModel = new RestRequestRangesModel();
facetRangeModel.setField("created");
facetRangeModel.setStart("2015-09-29T10:45:15.729Z");
facetRangeModel.setEnd("2016-09-29T10:45:15.729Z");
facetRangeModel.setGap("+280DAY");
ranges.add(facetRangeModel);
RestRequestRangesModel facetCountRangeModel = new RestRequestRangesModel();
facetCountRangeModel.setField("content.size");
facetCountRangeModel.setStart("0");
facetCountRangeModel.setEnd("500");
facetCountRangeModel.setGap("200");
ranges.add(facetCountRangeModel);
query.setRanges(ranges);
}
}
@@ -64,30 +64,32 @@ public class FacetedSearchTest extends AbstractSearchTest
* "count": 61,
* "skipCount": 0
* },
* "context": {
* "consistency": {"lastTxId": 512},
* "facetQueries": [
* "facetsFields": [
* {
* "type": "query",
* "label": "foo",
* "buckets": [
* {
* "count": 61,
* "label": "small",
* "filterQuery": "content.size:[o TO 102400]"
* "label": "small",
* "filterQuery": "content.size:[0 TO 102400]",
* "display": 1
* },
* {
* "count": 0,
* "label": "large",
* "filterQuery": "content.size:[o TO 102400]"
* "label": "large",
* "filterQuery": "content.size:[1048576 TO 16777216]",
* "metrics": [
* {
* "type": "count",
* "value": {
* "count": 0
* }
* }
* ]
* },
* {
* "count": 0,
* "label": "medium",
* "filterQuery": "content.size:[o TO 102400]"
* }
* ]
* }
* }}
* @throws Exception
*/
public void searchWithFaceting() throws Exception
public void searchWithQueryFaceting() throws Exception
{
SearchRequest query = new SearchRequest();
RestRequestQueryModel queryReq = new RestRequestQueryModel();
@@ -154,7 +156,7 @@ public class FacetedSearchTest extends AbstractSearchTest
* "context": {
* "consistency": {"lastTxId": 512},
* //Added below as part of SEARCH-374
* "facetsFields": [
* "facets": [
* { "label": "foo",
* "buckets": [
* { "label": "small", "count": 61, "filterQuery": "content.size:[o TO 102400]"},
@@ -168,7 +170,7 @@ public class FacetedSearchTest extends AbstractSearchTest
*
* @throws Exception
*/
public void searchFacetGroup() throws Exception
public void searchQueryFacetingWithGroup() throws Exception
{
SearchRequest query = new SearchRequest();
RestRequestQueryModel queryReq = new RestRequestQueryModel();
@@ -191,13 +193,15 @@ public class FacetedSearchTest extends AbstractSearchTest
//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.
Assert.assertFalse(response.getContext().getFacetsFields().isEmpty());
Assert.assertEquals(response.getContext().getFacetsFields().get(0).getLabel(), "foo");
FacetFieldBucket bucket = response.getContext().getFacetsFields().get(0).getBuckets().get(0);
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();
bucket.assertThat().field("count").isNotEmpty();
Assert.assertEquals( bucket.getMetrics().get(0).getType(), "count");
Assert.assertNotEquals( bucket.getMetrics().get(0).getValue(), "");
bucket.assertThat().field("filterQuery").isNotEmpty();
response.getContext().getFacetsFields().get(0).getBuckets().forEach(action -> {
response.getContext().getFacets().get(0).getBuckets().forEach(action -> {
switch (action.getLabel())
{
case "small":
@@ -217,4 +221,43 @@ public class FacetedSearchTest extends AbstractSearchTest
}
@Test
/**
* {
* "query": {
* "query": "*"
* },
* "facetFields": {
* "facets": [{"field": "cm:mimetype"},{"field": "modifier"}]
* }
* }
*/
public void searchWithFactedFields() throws Exception
{
SearchRequest query = new SearchRequest();
RestRequestQueryModel queryReq = new RestRequestQueryModel();
queryReq.setQuery("*");
query.setQuery(queryReq);
RestRequestFacetFieldsModel facetFields = new RestRequestFacetFieldsModel();
List<RestRequestFacetFieldModel>facets = new ArrayList<RestRequestFacetFieldModel>();
facets.add(new RestRequestFacetFieldModel("cm:mimetype"));
facets.add(new RestRequestFacetFieldModel("modifier"));
facetFields.setFacets(facets);
query.setFacetFields(facetFields);
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);
}
}
@@ -18,18 +18,17 @@
*/
package org.alfresco.rest.search;
import java.util.ArrayList;
import java.util.List;
import org.alfresco.rest.model.RestErrorModel;
import org.alfresco.utility.model.TestGroup;
import org.alfresco.utility.testrail.ExecutionType;
import org.alfresco.utility.testrail.annotation.TestRail;
import org.springframework.http.HttpStatus;
import org.testng.Assert;
import org.testng.TestException;
import org.testng.annotations.Test;
import java.util.ArrayList;
import java.util.List;
/**
* Faceted search test.
* @author Gethin James
@@ -24,6 +24,8 @@ import org.alfresco.utility.testrail.annotation.TestRail;
import org.springframework.http.HttpStatus;
import org.testng.annotations.Test;
import junit.framework.Assert;
/**
* Search end point Public API test.
* @author Michael Suzuki
@@ -34,23 +36,14 @@ public class SearchTest extends AbstractSearchTest
@Test(groups={TestGroup.SEARCH, TestGroup.REST_API})
public void searchOnIndexedData() throws Exception
{
SearchResponse nodes = query("fox");
SearchResponse nodes = query("ipsum");
restClient.assertStatusCodeIs(HttpStatus.OK);
nodes.assertThat().entriesListIsNotEmpty();
SearchNodeModel entity = nodes.getEntryByIndex(0);
entity.assertThat().field("search").contains("score");
entity.getSearch().assertThat().field("score").isNotEmpty();
entity.assertThat().field("name").contains("pangram.txt");
nodes = query("car");
restClient.assertStatusCodeIs(HttpStatus.OK);
entity = nodes.getEntryByIndex(0);
nodes.assertThat().entriesListIsNotEmpty();
entity.assertThat().field("search").contains("score");
entity.getSearch().assertThat().field("score").isNotEmpty();
entity.assertThat().field("name").contains("cars.txt");
Assert.assertEquals("Project Overview.ppt",entity.getName());
}
@Test(groups={TestGroup.SEARCH,TestGroup.REST_API})