/******************************************************************************* * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2015-2019) * * contact.vitam@culture.gouv.fr * * This software is a computer program whose purpose is to implement a digital archiving back-office system managing * high volumetry securely and efficiently. * * This software is governed by the CeCILL 2.1 license under French law and abiding by the rules of distribution of free * software. You can use, modify and/ or redistribute the software under the terms of the CeCILL 2.1 license as * circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". * * As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, * users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the * successive licensors have only limited liability. * * In this respect, the user's attention is drawn to the risks associated with loading, using, modifying and/or * developing or reproducing the software by the user in light of its specific status of free software, that may mean * that it is complicated to manipulate, and that also therefore means that it is reserved for developers and * experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the * software's suitability as regards their requirements in conditions enabling the security of their systems and/or data * to be ensured and, more generally, to use and operate it in the same conditions as regards security. * * The fact that you are presently reading this means that you have had knowledge of the CeCILL 2.1 license and that you * accept its terms. *******************************************************************************/ package fr.gouv.vitam.ihmdemo.core; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import fr.gouv.vitam.common.database.builder.request.exception.InvalidCreateOperationException; import fr.gouv.vitam.common.database.parser.request.multiple.RequestParserHelper; import fr.gouv.vitam.common.database.parser.request.multiple.RequestParserMultiple; import fr.gouv.vitam.common.database.parser.request.multiple.SelectParserMultiple; import fr.gouv.vitam.common.database.parser.request.multiple.UpdateParserMultiple; import fr.gouv.vitam.common.database.parser.request.single.SelectParserSingle; import fr.gouv.vitam.common.exception.InvalidParseOperationException; /** * DslQueryHelper junit test * */ public class DslQueryHelperTest { private static final String ACCESSION_REGISTER = "ACCESSIONREGISTER"; public static final String ORIGINATING_AGENCY = "OriginatingAgency"; private static final String RULES = "RULES"; private static final String RULETYPE = "RuleType"; private static final String EVENT_TYPE_PROCESS = "evTypeProc"; private static final String result = "QUERY: Requests: " + "{\"$and\":[" + "{\"$eq\":{\"date\":\"2006-03-05\"}}," + "{\"$eq\":{\"events.obIdIn\":\"name\"}}," + "{\"$exists\":\"PUID\"},{\"$or\":[{\"$eq\":{\"evTypeProc\":\"INGEST\"}},{\"$eq\":{\"evTypeProc\":\"INGEST_TEST\"}}]}," + "{\"$eq\":{\"title\":\"Archive2\"}}]}\n" + "\tFilter: {\"$limit\":10000,\"$orderby\":{\"evDateTime\":-1}}\n" + "\tProjection: {}"; private static final String result2 = "QUERY: Requests: " + "{\"$and\":[{\"$exists\":\"evTypeProc\"},{\"$exists\":\"evIdProc\"}]}\n" + "\tFilter: {\"$limit\":10000}\n" + "\tProjection: {}"; private static final String updateAction = "[ " + "{ $set : { mavar1 : 1, mavar2 : 1.2, mavar3 : true, mavar4 : 'ma chaine' } }," + "{ $unset : [ 'mavar5', 'mavar6' ] }," + "{ $inc : { mavar7 : 2 } }," + "{ $min : { mavar8 : 3 } }," + "{ $min : { mavar16 : 12 } }," + "{ $max : { mavar9 : 3 } }," + "{ $rename : { mavar10 : 'mavar11' } }," + "{ $push : { mavar12 : { $each : [ 1, 2 ] } } }," + "{ $add : { mavar13 : { $each : [ 1, 2 ] } } }," + "{ $pop : { mavar14 : -1 } }," + "{ $pull : { mavar15 : { $each : [ 1, 2 ] } } } ]"; private static final String exampleUpdateMd = "{ $roots : [ 'id0' ], $query : [ " + "{ $path : [ 'id1', 'id2'] }," + "{ $and : [ {$exists : 'mavar1'}, {$missing : 'mavar2'}, {$isNull : 'mavar3'}, { $or : [ {$in : { 'mavar4' : [1, 2, 'maval1'] }}, { $nin : { 'mavar5' : ['maval2', true] } } ] } ] }," + "{ $not : [ { $size : { 'mavar5' : 5 } }, { $gt : { 'mavar6' : 7 } }, { $lte : { 'mavar7' : 8 } } ] , $exactdepth : 4}," + "{ $not : [ { $eq : { 'mavar8' : 5 } }, { $ne : { 'mavar9' : 'ab' } }, { $range : { 'mavar10' : { $gte : 12, $lte : 20} } } ], $depth : 1}, " + "{ $and : [ { $term : { 'mavar14' : 'motMajuscule', 'mavar15' : 'simplemot' } } ] }, " + "{ $regex : { 'mavar14' : '^start?aa.*' }, $depth : -1 } " + "], " + "$filter : {$mult : false }," + "$action : " + updateAction + " }"; private static final String UNIT_ID = "1"; private static List<String> IMMEDIATE_PARENTS = new ArrayList<>(); @BeforeClass public static void setup() throws Exception { IMMEDIATE_PARENTS.add("P1"); IMMEDIATE_PARENTS.add("P2"); IMMEDIATE_PARENTS.add("P3"); } /** * Tests createLogBookSelectDSLQuery method : main scenario * * @throws InvalidCreateOperationException * @throws InvalidParseOperationException */ @Test public void testCreateSingleQueryDSL() throws InvalidCreateOperationException, InvalidParseOperationException { final HashMap<String, String> myHashMap = new HashMap(); myHashMap.put("title", "Archive2"); myHashMap.put("date", "2006-03-05"); myHashMap.put("orderby", "evDateTime"); myHashMap.put("obIdIn", "name"); myHashMap.put("INGEST", "date"); myHashMap.put("FORMAT", "PUID"); final JsonNode request = DslQueryHelper.createSingleQueryDSL(myHashMap); assertNotNull(request); final SelectParserSingle request2 = new SelectParserSingle(); request2.parse(request); assertEquals(result, request2.toString()); } /** * @throws InvalidParseOperationException * @throws InvalidCreateOperationException */ @Test public void testCreateSingleQueryDSLEvent() throws InvalidParseOperationException, InvalidCreateOperationException { final HashMap<String, String> myHashMap = new HashMap(); myHashMap.put("EventID", "all"); myHashMap.put("EventType", "all"); final JsonNode request = DslQueryHelper.createSingleQueryDSL(myHashMap); assertNotNull(request); final SelectParserSingle request2 = new SelectParserSingle(); request2.parse(request); assertEquals(result2, request2.toString()); System.out.println(request2.toString()); } @Test public void testCreateSelectElasticsearchDSLQuery() throws InvalidParseOperationException, InvalidCreateOperationException { final Map<String, String> queryMap = new HashMap(); queryMap.put("titleAndDescription", "Arch"); queryMap.put("orderby", "date"); queryMap.put("projection_", "#id"); queryMap.put(UiConstants.SELECT_BY_ID.toString(), "1"); final JsonNode selectRequest = DslQueryHelper.createSelectElasticsearchDSLQuery(queryMap); assertNotNull(selectRequest); final RequestParserMultiple selectParser = RequestParserHelper.getParser(selectRequest); assertTrue(selectParser instanceof SelectParserMultiple); assertTrue(selectParser.getRequest().getNbQueries() == 1); assertTrue(selectParser.getRequest().getRoots().size() == 1); assertTrue(selectParser.getRequest().getFilter().get("$orderby") != null); assertTrue(selectParser.getRequest().getProjection().size() == 1); } @Test public void testCreateSelectDSLQuery() throws InvalidParseOperationException, InvalidCreateOperationException { final Map<String, String> queryMap = new HashMap(); queryMap.put("Title", "Archive2"); queryMap.put("orderby", "date"); queryMap.put("projection_", "#id"); queryMap.put(UiConstants.SELECT_BY_ID.toString(), "1"); queryMap.put("isAdvancedSearchFlag", "YES"); final JsonNode selectRequest = DslQueryHelper.createSelectElasticsearchDSLQuery(queryMap); assertNotNull(selectRequest); final RequestParserMultiple selectParser = RequestParserHelper.getParser(selectRequest); assertTrue(selectParser instanceof SelectParserMultiple); assertTrue(selectParser.getRequest().getNbQueries() == 1); assertTrue(selectParser.getRequest().getRoots().size() == 1); assertTrue(selectParser.getRequest().getFilter().get("$orderby") != null); assertTrue(selectParser.getRequest().getProjection().size() == 1); } /** * Tests CreateSelectDSLQuery with empty queries part * * @throws InvalidParseOperationException * @throws InvalidCreateOperationException */ @Test public void testEmptyQueries() throws InvalidParseOperationException, InvalidCreateOperationException { final Map<String, String> queryMap = new HashMap(); queryMap.put("projection_id", "#id"); queryMap.put("projection_qualifiers", "#qualifiers"); final JsonNode selectRequest = DslQueryHelper.createSelectDSLQuery(queryMap); assertNotNull(selectRequest); final RequestParserMultiple selectParser = RequestParserHelper.getParser(selectRequest); assertTrue(selectParser instanceof SelectParserMultiple); assertTrue(selectParser.getRequest().getNbQueries() == 0); assertTrue(selectParser.getRequest().getRoots().size() == 0); assertTrue(selectParser.getRequest().getFilter().get("$orderby") == null); assertTrue(selectParser.getRequest().getProjection().size() == 1); } /** * Tests CreateSelectDSLQuery with invalid input parameter (empty value) * * @throws InvalidParseOperationException * @throws InvalidCreateOperationException */ @Test(expected = InvalidParseOperationException.class) public void testInvalidParseOperationExceptionWithEmptyValue() throws InvalidParseOperationException, InvalidCreateOperationException { final Map<String, String> queryMap = new HashMap(); queryMap.put("title", ""); DslQueryHelper.createSelectDSLQuery(queryMap); } /** * Tests CreateSelectDSLQuery with invalid input parameter (empty key) * * @throws InvalidParseOperationException * @throws InvalidCreateOperationException */ @Test(expected = InvalidParseOperationException.class) public void testInvalidParseOperationExceptionWithEmptyKey() throws InvalidParseOperationException, InvalidCreateOperationException { final Map<String, String> queryMap = new HashMap(); queryMap.put("", "value"); DslQueryHelper.createSelectDSLQuery(queryMap); } /** * Tests CreateUpdateDSLQuery mthod : main scenario * * @throws InvalidParseOperationException * @throws InvalidCreateOperationException */ @Test public void testCreateUpdateDSLQuery() throws InvalidParseOperationException, InvalidCreateOperationException { final Map<String, String> queryMap = new HashMap(); queryMap.put("title", "Archive2"); queryMap.put("date", "09/09/2015"); queryMap.put(UiConstants.SELECT_BY_ID.toString(), "#id"); final JsonNode updateRequest = DslQueryHelper.createUpdateDSLQuery(queryMap); assertNotNull(updateRequest); final RequestParserMultiple updateParser = RequestParserHelper.getParser(updateRequest); assertTrue(updateParser instanceof UpdateParserMultiple); assertTrue(updateParser.getRequest().getActions().size() == 2); assertTrue(updateParser.getRequest().getRoots().size() == 1); } /** * Tests CreateUpdateDSLQuery with empty queries part * * @throws InvalidParseOperationException * @throws InvalidCreateOperationException */ @Test public void testUpdateEmptyQueries() throws InvalidParseOperationException, InvalidCreateOperationException { final Map<String, String> queryMap = new HashMap(); queryMap.put("title", "Mosqueteers"); final JsonNode updateRequest = DslQueryHelper.createUpdateDSLQuery(queryMap); assertNotNull(updateRequest); final RequestParserMultiple updateParser = RequestParserHelper.getParser(updateRequest); assertTrue(updateParser instanceof UpdateParserMultiple); assertTrue(updateParser.getRequest().getActions().size() == 1); } /** * Tests CreateUpdateDSLQuery with invalid input parameter (empty key) * * @throws InvalidParseOperationException * @throws InvalidCreateOperationException */ @Test(expected = InvalidParseOperationException.class) public void testUpdateQueryInvalidParseOperationExceptionWithEmptyKey() throws InvalidParseOperationException, InvalidCreateOperationException { final Map<String, String> queryMap = new HashMap(); queryMap.put("", "value"); DslQueryHelper.createUpdateDSLQuery(queryMap); } /** * Tests CreateSelectUnitTreeDSLQuery method : main scenario * * @throws InvalidParseOperationException * @throws InvalidCreateOperationException */ @Test public void testCreateSelectUnitTreeDSLQuery() throws InvalidParseOperationException, InvalidCreateOperationException { final JsonNode selectRequest = DslQueryHelper.createSelectUnitTreeDSLQuery(UNIT_ID, IMMEDIATE_PARENTS); assertNotNull(selectRequest); final RequestParserMultiple selectParser = RequestParserHelper.getParser(selectRequest); assertTrue(selectParser instanceof SelectParserMultiple); assertTrue(selectParser.getRequest().getNbQueries() == 1); assertTrue(selectParser.getRequest().getRoots().size() == 0); assertTrue(selectParser.getRequest().getFilter().get("$orderby") == null); assertTrue( selectParser.getRequest().getProjection().get("$fields") .has(UiConstants.ID.getResultCriteria())); assertTrue( selectParser.getRequest().getProjection().get("$fields") .has(UiConstants.TITLE.getResultCriteria())); assertTrue( selectParser.getRequest().getProjection().get("$fields") .has(UiConstants.UNITUPS.getResultCriteria())); } /** * Tests testFundsRegisterDSLQuery: method : main scenario * * @throws InvalidParseOperationException * @throws InvalidCreateOperationException */ @Test public void testFundsRegisterDSLQuery() throws InvalidParseOperationException, InvalidCreateOperationException { final Map<String, String> queryMap = new HashMap(); queryMap.put(ACCESSION_REGISTER, ""); final JsonNode selectRequest = DslQueryHelper.createSingleQueryDSL(queryMap); assertNotNull(selectRequest); final RequestParserMultiple selectParser = RequestParserHelper.getParser(selectRequest); assertTrue(selectParser instanceof SelectParserMultiple); assertTrue(selectParser.getRequest().getNbQueries() == 1); assertTrue(selectParser.getRequest().getRoots().size() == 0); assertTrue(selectParser.getRequest().getFilter().get("$orderby") == null); final Map<String, String> queryMap2 = new HashMap(); queryMap2.put(ORIGINATING_AGENCY, "id01"); final JsonNode selectRequest2 = DslQueryHelper.createSingleQueryDSL(queryMap2); assertNotNull(selectRequest2); final RequestParserMultiple selectParser2 = RequestParserHelper.getParser(selectRequest2); assertTrue(selectParser2 instanceof SelectParserMultiple); assertTrue(selectParser2.getRequest().getNbQueries() == 1); assertTrue(selectParser2.getRequest().getRoots().size() == 0); assertTrue(selectParser2.getRequest().getFilter().get("$orderby") == null); } /** * Tests testRulesDSLQuery: method : main scenario * * @throws InvalidParseOperationException * @throws InvalidCreateOperationException */ @Test public void testRulesDSLQuery() throws InvalidParseOperationException, InvalidCreateOperationException { final Map<String, String> queryMap = new HashMap(); queryMap.put(RULES, ""); final JsonNode selectRequest = DslQueryHelper.createSingleQueryDSL(queryMap); assertNotNull(selectRequest); final RequestParserMultiple selectParser = RequestParserHelper.getParser(selectRequest); assertTrue(selectParser instanceof SelectParserMultiple); assertTrue(selectParser.getRequest().getNbQueries() == 1); assertTrue(selectParser.getRequest().getRoots().size() == 0); assertTrue(selectParser.getRequest().getFilter().get("$orderby") == null); final Map<String, String> queryMap2 = new HashMap(); queryMap2.put(RULETYPE, "AppraisingRule"); final JsonNode selectRequest2 = DslQueryHelper.createSingleQueryDSL(queryMap2); assertNotNull(selectRequest2); final RequestParserMultiple selectParser2 = RequestParserHelper.getParser(selectRequest2); assertTrue(selectParser2 instanceof SelectParserMultiple); assertTrue(selectParser2.getRequest().getNbQueries() == 1); assertTrue(selectParser2.getRequest().getRoots().size() == 0); assertTrue(selectParser2.getRequest().getFilter().get("$orderby") == null); final Map<String, String> queryMap3 = new HashMap(); queryMap3.put(RULETYPE, "AppraisingRule,test"); final JsonNode selectRequest3 = DslQueryHelper.createSingleQueryDSL(queryMap3); assertNotNull(selectRequest3); final RequestParserMultiple selectParser3 = RequestParserHelper.getParser(selectRequest3); assertTrue(selectParser3 instanceof SelectParserMultiple); assertTrue(selectParser3.getRequest().getNbQueries() == 1); assertTrue(selectParser3.getRequest().getRoots().size() == 0); assertTrue(selectParser3.getRequest().getFilter().get("$orderby") == null); } /** * Tests testTraceabilityDSLQuery: method : main scenario * * @throws InvalidParseOperationException * @throws InvalidCreateOperationException */ @Test public void testTraceabilityDSLQuery() throws InvalidParseOperationException, InvalidCreateOperationException { final Map<String, String> queryMap = new HashMap(); queryMap.put(EVENT_TYPE_PROCESS, "traceability"); final JsonNode selectRequest = DslQueryHelper.createSingleQueryDSL(queryMap); assertNotNull(selectRequest); final RequestParserMultiple selectParser = RequestParserHelper.getParser(selectRequest); assertTrue(selectParser instanceof SelectParserMultiple); assertTrue(selectParser.getRequest().getNbQueries() == 1); assertTrue(selectParser.getRequest().getRoots().size() == 0); assertTrue(selectParser.getRequest().getFilter().get("$orderby") == null); final Map<String, String> queryMap2 = new HashMap(); queryMap2.put(EVENT_TYPE_PROCESS, "traceability"); queryMap2.put("orderby", "evDateTime"); queryMap2.put("TraceabilityStartDate", "2017-01-01"); queryMap2.put("TraceabilityEndDate", "2017-02-09"); queryMap2.put("TraceabilityLogType", "OPERATION"); final JsonNode selectRequest2 = DslQueryHelper.createSingleQueryDSL(queryMap2); assertNotNull(selectRequest2); final RequestParserMultiple selectParser2 = RequestParserHelper.getParser(selectRequest2); assertTrue(selectParser2 instanceof SelectParserMultiple); assertTrue(selectParser2.getRequest().getNbQueries() == 1); JsonNode query = selectParser2.getRequest().getQueries().get(0).getCurrentQuery(); ArrayNode criterias = (ArrayNode)query.get("$and"); assertEquals("2017-02-09", criterias.get(0).get("$lte").get("events.evDetData.EndDate").asText()); assertEquals("traceability", criterias.get(1).get("$eq").get("evTypeProc").asText()); assertEquals("2017-01-01", criterias.get(2).get("$gte").get("events.evDetData.StartDate").asText()); assertEquals("OPERATION", criterias.get(3).get("$eq").get("events.evDetData.LogType").asText()); assertTrue(selectParser2.getRequest().getRoots().size() == 0); JsonNode orderBy = selectParser2.getRequest().getFilter().get("$orderby"); assertTrue(orderBy != null); assertTrue(orderBy.get("evDateTime").asInt() == -1); } }