Updated KorapClientTest.

Change-Id: I400ae1a5c48eaa700a7a76e68107d2d6fff5fd3e
diff --git a/pom.xml b/pom.xml
index cb00dee..5ca6b15 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,11 +24,6 @@
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-surefire-plugin</artifactId>
 				<version>2.22.2</version>
-				<configuration>
-					<excludes>
-						<exclude>de/ids_mannheim/korap/test/*.java</exclude>
-					</excludes>
-				</configuration>
 			</plugin>
 		</plugins>
 	</build>
@@ -36,7 +31,7 @@
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<jersey.version>1.19.4</jersey.version>
-    <slf4j.version>1.7.30</slf4j.version>
+    	<slf4j.version>1.7.30</slf4j.version>
 	</properties>
 
 	<dependencies>
@@ -61,12 +56,12 @@
 		<dependency>
 			<groupId>org.apache.httpcomponents</groupId>
 			<artifactId>httpclient</artifactId>
-			<version>4.5.9</version>
+			<version>4.5.13</version>
 		</dependency>
 		<dependency>
 			<groupId>com.fasterxml.jackson.core</groupId>
 			<artifactId>jackson-databind</artifactId>
-			<version>2.11.3</version>
+			<version>2.12.2</version>
 		</dependency>
 		<dependency>
 			<groupId>org.slf4j</groupId>
diff --git a/src/test/java/de/ids_mannheim/korap/test/BaseTest.java b/src/test/java/de/ids_mannheim/korap/test/BaseTest.java
index 27c0a63..560a11e 100644
--- a/src/test/java/de/ids_mannheim/korap/test/BaseTest.java
+++ b/src/test/java/de/ids_mannheim/korap/test/BaseTest.java
@@ -44,36 +44,51 @@
         mockServer.stop();
     }
 
+    protected void createRetrieveResource () throws IOException {
+        String korapResources = IOUtils.toString(
+                ClassLoader.getSystemResourceAsStream(
+                        "korap-api-responses/resources.json"),
+                StandardCharsets.UTF_8);
+
+        mockClient.reset()
+                .when(request().withMethod("GET").withPath("/resource"))
+                .respond(response()
+                        .withHeader(new Header("Content-Type",
+                                "application/json; charset=utf-8"))
+                        .withBody(korapResources).withStatusCode(200));
+    }
+
     protected void createExpectationForSearch (String query,
+            String queryLanguage, String version, String offset,
             String jsonFilename) throws IOException {
         String searchResult = IOUtils.toString(
                 ClassLoader.getSystemResourceAsStream(
-                        "korap-api-responses/"+jsonFilename),
+                        "korap-api-responses/" + jsonFilename),
                 StandardCharsets.UTF_8);
 
         mockClient.reset()
                 .when(request().withMethod("GET").withPath("/search")
                         .withQueryStringParameter("q", query)
-                        .withQueryStringParameter("ql", "fcsql")
-                        .withQueryStringParameter("v", "2.0")
+                        .withQueryStringParameter("ql", queryLanguage)
+                        .withQueryStringParameter("v", version)
                         .withQueryStringParameter("context", "sentence")
                         .withQueryStringParameter("count", "1")
-                        .withQueryStringParameter("offset", "0"))
+                        .withQueryStringParameter("offset", offset))
                 .respond(response()
                         .withHeader(new Header("Content-Type",
                                 "application/json; charset=utf-8"))
                         .withBody(searchResult).withStatusCode(200));
     }
 
-    protected void createExpectationForMatchInfoLemmaBar () throws IOException {
+    protected void createExpectationForMatchInfo (String jsonFilename,
+            String uriPath) throws IOException {
         String matchInfoResult = IOUtils.toString(
                 ClassLoader.getSystemResourceAsStream(
-                        "korap-api-responses/GOE-AGA-01784-p614-615.jsonld"),
+                        "korap-api-responses/" + jsonFilename),
                 StandardCharsets.UTF_8);
 
         mockClient
-                .when(request().withMethod("GET")
-                        .withPath("/corpus/GOE/AGA/01784/p614-615/matchInfo")
+                .when(request().withMethod("GET").withPath(uriPath)
                         .withQueryStringParameter("foundry", "*")
                         .withQueryStringParameter("spans", "false"))
                 .respond(response()
@@ -82,26 +97,51 @@
                         .withBody(matchInfoResult).withStatusCode(200));
     }
 
+    protected Document checkSearchRetrieveResponseSRUVersion1_2 (InputStream entity)
+            throws SAXException, IOException, ParserConfigurationException {
 
-    protected void createExpectationForMatchInfoLemmaFein ()
-            throws IOException {
-        String matchInfoResult = IOUtils.toString(
-                ClassLoader.getSystemResourceAsStream(
-                        "korap-api-responses/GOE-AGF-00000-p4276-4277.jsonld"),
-                StandardCharsets.UTF_8);
+        docBuilder = factory.newDocumentBuilder();
+        Document doc = docBuilder.parse(entity);
 
-        mockClient
-                .when(request().withMethod("GET")
-                        .withPath("/corpus/GOE/AGF/00000/p4276-4277/matchInfo")
-                        .withQueryStringParameter("foundry", "*")
-                        .withQueryStringParameter("spans", "false"))
-                .respond(response()
-                        .withHeader(new Header("Content-Type",
-                                "application/json; charset=utf-8"))
-                        .withBody(matchInfoResult).withStatusCode(200));
+        NodeList nodelist = doc.getElementsByTagName("sru:version");
+        assertEquals("1.2", nodelist.item(0).getTextContent());
+        nodelist = doc.getElementsByTagName("sru:recordSchema");
+        assertEquals("http://clarin.eu/fcs/resource",
+                nodelist.item(0).getTextContent());
+
+        NodeList resources = doc.getElementsByTagName("fcs:Resource");
+        String attr = resources.item(0).getAttributes().getNamedItem("pid")
+                .getNodeValue();
+
+        nodelist = doc.getElementsByTagName("fcs:DataView");
+        attr = nodelist.item(0).getAttributes().getNamedItem("type")
+                .getNodeValue();
+        assertEquals("application/x-clarin-fcs-hits+xml", attr);
+
+        Node node = nodelist.item(0).getFirstChild();
+        assertEquals("hits:Result", node.getNodeName());
+        NodeList children = node.getChildNodes();
+        if (children.getLength() > 1) {
+            assertEquals("hits:Hit", children.item(1).getNodeName());
+        }
+
+        attr = nodelist.item(1).getAttributes().getNamedItem("type")
+                .getNodeValue();
+        assertEquals("application/x-clarin-fcs-adv+xml", attr);
+        node = nodelist.item(1).getFirstChild();
+        assertEquals("adv:Advanced", node.getNodeName());
+
+        nodelist = node.getChildNodes();
+        node = nodelist.item(0);
+        assertEquals("adv:Segments", node.getNodeName());
+        node = nodelist.item(1);
+        assertEquals("adv:Layers", node.getNodeName());
+
+        checkSegmentPosition(resources);
+        return doc;
     }
-
-    protected Document checkSRUSearchRetrieveResponse (InputStream entity)
+    
+    protected Document checkSearchRetrieveResponseSRUVersion2 (InputStream entity)
             throws SAXException, IOException, ParserConfigurationException {
 
         docBuilder = factory.newDocumentBuilder();
diff --git a/src/test/java/de/ids_mannheim/korap/test/FCSQLRequestTest.java b/src/test/java/de/ids_mannheim/korap/test/FCSQLRequestTest.java
index e4d9349..f0b9d49 100644
--- a/src/test/java/de/ids_mannheim/korap/test/FCSQLRequestTest.java
+++ b/src/test/java/de/ids_mannheim/korap/test/FCSQLRequestTest.java
@@ -39,9 +39,10 @@
     public void testLemmaRegex () throws URISyntaxException, IOException,
             SAXException, ParserConfigurationException {
 
-        createExpectationForSearch("[tt:lemma=\".*bar\"]",
+        createExpectationForSearch("[tt:lemma=\".*bar\"]", "fcsql", "2.0", "0",
                 "search-lemma-bar.jsonld");
-        createExpectationForMatchInfoLemmaBar();
+        createExpectationForMatchInfo("GOE-AGA-01784-p614-615.jsonld",
+                "/corpus/GOE/AGA/01784/p614-615/matchInfo");
 
         ClientResponse response = resource()
                 .queryParam("operation", "searchRetrieve")
@@ -50,7 +51,7 @@
                 .queryParam("maximumRecords", "1").get(ClientResponse.class);
 
         InputStream entity = response.getEntity(InputStream.class);
-        Document doc = checkSRUSearchRetrieveResponse(entity);
+        Document doc = checkSearchRetrieveResponseSRUVersion2(entity);
 
         NodeList nodeList =
                 doc.getElementsByTagName("sruResponse:numberOfRecords");
@@ -63,7 +64,8 @@
     public void testUnsupportedLayer () throws URISyntaxException, IOException,
             SAXException, ParserConfigurationException {
 
-        createExpectationForSearch("[unknown=\"fein\"]", "unknownLayer.jsonld");
+        createExpectationForSearch("[unknown=\"fein\"]", "fcsql", "2.0", "0",
+                "unknownLayer.jsonld");
 
         ClientResponse response = resource()
                 .queryParam("operation", "searchRetrieve")
@@ -83,8 +85,8 @@
     @Test
     public void testUnsupportedQualifer () throws URISyntaxException,
             IOException, SAXException, ParserConfigurationException {
-        createExpectationForSearch("[unknown:lemma=\"fein\"]",
-                "unknownQualifier.jsonld");
+        createExpectationForSearch("[unknown:lemma=\"fein\"]", "fcsql", "2.0",
+                "0", "unknownQualifier.jsonld");
 
         ClientResponse response = resource()
                 .queryParam("operation", "searchRetrieve")
diff --git a/src/test/java/de/ids_mannheim/korap/test/KorapClientTest.java b/src/test/java/de/ids_mannheim/korap/test/KorapClientTest.java
index 341f91d..30b5ec3 100644
--- a/src/test/java/de/ids_mannheim/korap/test/KorapClientTest.java
+++ b/src/test/java/de/ids_mannheim/korap/test/KorapClientTest.java
@@ -14,79 +14,99 @@
 import de.ids_mannheim.korap.sru.KorapResult;
 import de.ids_mannheim.korap.sru.QueryLanguage;
 
-
 /**
  * The tests are based on the sample corpus from the Goethe corpus.
  * 
  * @author margaretha
  *
  */
-public class KorapClientTest {
+public class KorapClientTest extends BaseTest {
     private KorapClient c;
     private KorapResult result;
     private KorapMatch match;
-    
+
     public KorapClientTest () {
-        c = new KorapClient("http://localhost:1080/api/v1.0", 25, 50);
+        c = new KorapClient("http://localhost:1080", 25, 50);
     }
 
     @Test
     public void testCQLQuery () throws HttpResponseException, IOException {
-        
-        
-        result = c.query("der", QueryLanguage.CQL, "1.2", 1, 1,
-                null);
+
+        createExpectationForSearch("der", "cql", "1.2", "50",
+                "search-der.jsonld");
+
+        result = c.query("der", QueryLanguage.CQL, "1.2", 51, 1, null);
         assertEquals(1, result.getMatchSize());
         assertEquals(1858, result.getTotalResults());
-    
+
         match = result.getMatch(0);
-        assertEquals("match-GOE/AGA/01784-p18-19",match.getMatchId());
-        
+        assertEquals("match-GOE/AGA/01784-p1856-1857", match.getMatchId());
+
         match.parseMatchId();
         assertEquals("GOE", match.getCorpusId());
         assertEquals("AGA", match.getDocId());
-        assertEquals("p18-19", match.getPositionId());
-        
+        assertEquals("p1856-1857", match.getPositionId());
+
     }
 
     @Test
-    public void testFCS2Query() throws HttpResponseException, IOException {
-    	result = c.query("(\"blaue\"|\"grüne\")", QueryLanguage.FCSQL, "2.0", 1,
-                25, null);
-    	
-    	assertEquals(25, result.getMatchSize());
+    public void testOrQuery () throws HttpResponseException, IOException {
+
+        createExpectationForSearch("(\"blaue\"|\"grüne\")", "fcsql", "2.0", "0",
+                "search-or.jsonld");
+
+        createExpectationForMatchInfo("GOE-AGF-00000-p7744-7745.jsonld",
+                "/corpus/GOE/AGF/00000/p7744-7745/matchInfo");
+
+        result = c.query("(\"blaue\"|\"grüne\")", QueryLanguage.FCSQL, "2.0", 1,
+                1, null);
+
+        assertEquals(1, result.getMatchSize());
         assertEquals(55, result.getTotalResults());
 
         match = result.getMatch(0);
-        assertEquals("match-GOE/AGF/00000-p7744-7745",match.getMatchId());
-        
+        assertEquals("match-GOE/AGF/00000-p7744-7745", match.getMatchId());
+
         match.parseMatchId();
         assertEquals("GOE", match.getCorpusId());
         assertEquals("AGF", match.getDocId());
         assertEquals("p7744-7745", match.getPositionId());
-	}
-    
+    }
+
     @Test
-    public void testRetrieveAnnotations() throws IOException, URISyntaxException {
-    	String annotationSnippet = c.retrieveAnnotations(
-    			"GOE", "AGF", "00000",
-    			"p7667-7668", "*");
-    	
-    	assertEquals(true, annotationSnippet.startsWith("<snippet><span class="
-    			+ "\"context-left\"></span><span class=\"match\"><span title="));
-	}
-    
+    public void testRetrieveAnnotations ()
+            throws IOException, URISyntaxException {
+        createExpectationForMatchInfo("GOE-AGF-00000-p4276-4277.jsonld",
+                "/corpus/GOE/AGF/00000/p4276-4277/matchInfo");
+
+        String annotationSnippet =
+                c.retrieveAnnotations("GOE", "AGF", "00000", "p4276-4277", "*");
+
+        assertEquals(
+                "<snippet><span class=\"context-left\"><span class=\"more\">"
+                        + "</span></span><span class=\"match\"><mark>feineren</mark>"
+                        + "</span><span class=\"context-right\"><span class=\"more\">"
+                        + "</span></span></snippet>",
+                annotationSnippet);
+    }
+
     @Test
-    public void testRetrieveNonexistingAnnotation() throws IOException, URISyntaxException {
-    	String annotationSnippet = c.retrieveAnnotations(
-    			"WPD15", "D18", "06488",
-    			"p588-589", "*");
-    	
-    	assertEquals("<snippet></snippet>", annotationSnippet);
-	}
-    
+    public void testRetrieveNonexistingAnnotation ()
+            throws IOException, URISyntaxException {
+
+        createExpectationForMatchInfo("unknownMatchInfo.jsonld",
+                "/corpus/WPD15/D18/06488/p588-589/matchInfo");
+
+        String annotationSnippet =
+                c.retrieveAnnotations("WPD15", "D18", "06488", "p588-589", "*");
+
+        assertEquals("<snippet></snippet>", annotationSnippet);
+    }
+
     @Test
-    public void testRetrieveResource () throws HttpResponseException, Exception {
+    public void testRetrieveResource ()
+            throws HttpResponseException, Exception {
+        createRetrieveResource();
         KorapResource[] resources = c.retrieveResources();
         assertEquals(3, resources.length);
         assertEquals("WPD17", resources[0].getResourceId());
diff --git a/src/test/java/de/ids_mannheim/korap/test/KorapSRUTest.java b/src/test/java/de/ids_mannheim/korap/test/KorapSRUTest.java
index 7928982..ef6511a 100644
--- a/src/test/java/de/ids_mannheim/korap/test/KorapSRUTest.java
+++ b/src/test/java/de/ids_mannheim/korap/test/KorapSRUTest.java
@@ -44,7 +44,7 @@
                 .when(request().withMethod("GET").withPath("/search")
                         .withQueryStringParameter("q", "fein")
                         .withQueryStringParameter("ql", "cql")
-                        .withQueryStringParameter("v", "2.0")
+                        .withQueryStringParameter("v", "1.2")
                         .withQueryStringParameter("context", "sentence")
                         .withQueryStringParameter("count", "25")
                         .withQueryStringParameter("offset", "0"))
@@ -113,10 +113,11 @@
 
         ClientResponse response =
                 resource().queryParam("operation", "searchRetrieve")
+                        .queryParam("version", "1.2")
                         .queryParam("query", "fein").get(ClientResponse.class);
 
         InputStream entity = response.getEntity(InputStream.class);
-        checkSRUSearchRetrieveResponse(entity);
+        checkSearchRetrieveResponseSRUVersion1_2(entity);
     }
 
     @Test
@@ -128,20 +129,21 @@
 
         ClientResponse response = resource()
                 .queryParam("operation", "searchRetrieve")
-                .queryParam("query", "fein").queryParam("x-fcs-context", "GOE")
-                .get(ClientResponse.class);
+                .queryParam("query", "fein").queryParam("version", "1.2")
+                .queryParam("x-fcs-context", "GOE").get(ClientResponse.class);
 
         InputStream entity = response.getEntity(InputStream.class);
-        checkSRUSearchRetrieveResponse(entity);
+        checkSearchRetrieveResponseSRUVersion1_2(entity);
     }
 
     @Test
     public void searchRetrieveFCSQLTest ()
             throws IOException, SAXException, ParserConfigurationException {
 
-        createExpectationForSearch("[tt:lemma=\"fein\"]",
+        createExpectationForSearch("[tt:lemma=\"fein\"]", "fcsql", "2.0", "0",
                 "search-lemma-fein.jsonld");
-        createExpectationForMatchInfoLemmaFein();
+        createExpectationForMatchInfo("GOE-AGF-00000-p4276-4277.jsonld",
+                "/corpus/GOE/AGF/00000/p4276-4277/matchInfo");
 
         ClientResponse response = resource()
                 .queryParam("operation", "searchRetrieve")
@@ -150,7 +152,7 @@
                 .queryParam("maximumRecords", "1").get(ClientResponse.class);
 
         InputStream entity = response.getEntity(InputStream.class);
-        checkSRUSearchRetrieveResponse(entity);
+        checkSearchRetrieveResponseSRUVersion2(entity);
     }
 
     @Test
@@ -166,7 +168,7 @@
                 .when(request().withMethod("GET").withPath("/search")
                         .withQueryStringParameter("q", "der")
                         .withQueryStringParameter("ql", "cql")
-                        .withQueryStringParameter("v", "2.0")
+                        .withQueryStringParameter("v", "1.2")
                         .withQueryStringParameter("context", "sentence")
                         .withQueryStringParameter("count", "1")
                         .withQueryStringParameter("offset", "50"))
@@ -193,12 +195,13 @@
         ClientResponse response = resource()
                 .queryParam("operation", "searchRetrieve")
                 .queryParam("query", "der").queryParam("startRecord", "51")
-                .queryParam("maximumRecords", "1").get(ClientResponse.class);
+                .queryParam("version", "1.2").queryParam("maximumRecords", "1")
+                .get(ClientResponse.class);
         InputStream entity = response.getEntity(InputStream.class);
         Document doc = docBuilder.parse(entity);
 
         NodeList nodelist =
-                doc.getElementsByTagName("sruResponse:recordPosition");
+                doc.getElementsByTagName("sru:recordPosition");
         assertEquals("51", nodelist.item(0).getTextContent());
     }
 
@@ -276,17 +279,7 @@
             throws URISyntaxException, ClientProtocolException, IOException,
             IllegalStateException, SAXException {
 
-        String korapResources = IOUtils.toString(
-                ClassLoader.getSystemResourceAsStream(
-                        "korap-api-responses/resources.json"),
-                StandardCharsets.UTF_8);
-
-        mockClient.reset()
-                .when(request().withMethod("GET").withPath("/resource"))
-                .respond(response()
-                        .withHeader(new Header("Content-Type",
-                                "application/json; charset=utf-8"))
-                        .withBody(korapResources).withStatusCode(200));
+        createRetrieveResource();
 
         ClientResponse response = resource().queryParam("operation", "explain")
                 .queryParam("x-fcs-endpoint-description", "true")
diff --git a/src/test/java/de/ids_mannheim/korap/test/RedirectTest.java b/src/test/java/de/ids_mannheim/korap/test/RedirectTest.java
index 35df809..cda0c2f 100644
--- a/src/test/java/de/ids_mannheim/korap/test/RedirectTest.java
+++ b/src/test/java/de/ids_mannheim/korap/test/RedirectTest.java
@@ -12,16 +12,12 @@
 
 import org.apache.commons.io.IOUtils;
 import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.HttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
 import org.junit.Test;
 import org.mockserver.model.Header;
 import org.xml.sax.SAXException;
 
 import com.sun.jersey.api.client.ClientResponse;
 
-import de.ids_mannheim.korap.util.RedirectStrategy;
-
 /**
  * 
  * @author margaretha
@@ -62,6 +58,9 @@
                                 "application/json; charset=utf-8"))
                         .withBody(searchResult).withStatusCode(200));
 
+        createExpectationForMatchInfo("GOE-AGF-00000-p4276-4277.jsonld",
+                "/corpus/GOE/AGF/00000/p4276-4277/matchInfo");
+
         ClientResponse response = resource()
                 .queryParam("operation", "searchRetrieve")
                 .queryParam("query", "[tt:lemma=\"fein\"]")
@@ -69,6 +68,6 @@
                 .queryParam("maximumRecords", "1").get(ClientResponse.class);
 
         InputStream entity = response.getEntity(InputStream.class);
-        checkSRUSearchRetrieveResponse(entity);
+        checkSearchRetrieveResponseSRUVersion2(entity);
     }
 }
diff --git a/src/test/resources/korap-api-responses/GOE-AGF-00000-p7744-7745.jsonld b/src/test/resources/korap-api-responses/GOE-AGF-00000-p7744-7745.jsonld
new file mode 100644
index 0000000..7571afe
--- /dev/null
+++ b/src/test/resources/korap-api-responses/GOE-AGF-00000-p7744-7745.jsonld
@@ -0,0 +1,26 @@
+{
+    "@context": "http://korap.ids-mannheim.de/ns/KoralQuery/v0.3/context.jsonld",
+    "meta": {"version": "Krill-0.59.3"},
+    "snippet": "<span class=\"context-left\"><span class=\"more\"><\/span><\/span><span class=\"match\"><mark>grüne<\/mark><\/span><span class=\"context-right\"><span class=\"more\"><\/span><\/span>",
+    "matchID": "match-GOE/AGF/00000-p7744-7745",
+    "textSigle": "GOE/AGF/00000",
+    "subTitle": "Didaktischer Teil",
+    "author": "Goethe, Johann Wolfgang von",
+    "docSigle": "GOE/AGF",
+    "layerInfos": "corenlp/c=spans corenlp/p=tokens corenlp/s=spans dereko/s=spans malt/d=rels marmot/m=tokens marmot/p=tokens opennlp/p=tokens opennlp/s=spans tt/l=tokens tt/p=tokens",
+    "pubPlace": "München",
+    "availability": "CC-BY-SA",
+    "title": "Zur Farbenlehre",
+    "pubDate": "1982",
+    "corpusSigle": "GOE",
+    "context": {
+        "left": [
+            "token",
+            0
+        ],
+        "right": [
+            "token",
+            0
+        ]
+    }
+}
diff --git a/src/test/resources/korap-api-responses/search-or.jsonld b/src/test/resources/korap-api-responses/search-or.jsonld
new file mode 100644
index 0000000..7a794d8
--- /dev/null
+++ b/src/test/resources/korap-api-responses/search-or.jsonld
@@ -0,0 +1,90 @@
+{
+    "@context": "http://korap.ids-mannheim.de/ns/KoralQuery/v0.3/context.jsonld",
+    "meta": {
+        "count": 1,
+        "startIndex": 0,
+        "timeout": 10000,
+        "context": "base/s:s",
+        "fields": [
+            "ID",
+            "UID",
+            "textSigle",
+            "corpusID",
+            "author",
+            "title",
+            "subTitle",
+            "textClass",
+            "pubPlace",
+            "pubDate",
+            "availability",
+            "layerInfos",
+            "docSigle",
+            "corpusSigle"
+        ],
+        "version": "0.59.3",
+        "benchmark": "23.809748 ms",
+        "totalResults": 55,
+        "serialQuery": "spanOr([SpanMultiTermQueryWrapper(tokens:/s:blaue/), SpanMultiTermQueryWrapper(tokens:/s:grüne/)])",
+        "itemsPerPage": 1
+    },
+    "query": {
+        "@type": "koral:group",
+        "operation": "operation:disjunction",
+        "operands": [
+            {
+                "@type": "koral:token",
+                "wrap": {
+                    "@type": "koral:term",
+                    "key": "blaue",
+                    "foundry": "opennlp",
+                    "layer": "orth",
+                    "type": "type:regex",
+                    "match": "match:eq"
+                }
+            },
+            {
+                "@type": "koral:token",
+                "wrap": {
+                    "@type": "koral:term",
+                    "key": "grüne",
+                    "foundry": "opennlp",
+                    "layer": "orth",
+                    "type": "type:regex",
+                    "match": "match:eq"
+                }
+            }
+        ]
+    },
+    "collection": {
+        "@type": "koral:doc",
+        "match": "match:eq",
+        "type": "type:regex",
+        "value": "CC-BY.*",
+        "key": "availability",
+        "rewrites": [
+            {
+                "@type": "koral:rewrite",
+                "src": "Kustvakt",
+                "operation": "operation:insertion",
+                "scope": "availability(FREE)"
+            }
+        ]
+    },
+    "matches": [
+        {
+            "snippet": "<span class=\"context-left\">die Purpurfarbe, welche die vom Schnee Geblendeten erblicken, gehört hieher so wie die ungemein schöne <\/span><span class=\"match\"><mark>grüne<\/mark><\/span><span class=\"context-right\"> Farbe dunkler Gegenstände, nachdem man auf ein weißes Papier in der Sonne lange hingesehen.<\/span>",
+            "matchID": "match-GOE/AGF/00000-p7744-7745",
+            "UID": 0,
+            "textSigle": "GOE/AGF/00000",
+            "subTitle": "Didaktischer Teil",
+            "author": "Goethe, Johann Wolfgang von",
+            "docSigle": "GOE/AGF",
+            "layerInfos": "corenlp/c=spans corenlp/p=tokens corenlp/s=spans dereko/s=spans malt/d=rels marmot/m=tokens marmot/p=tokens opennlp/p=tokens opennlp/s=spans tt/l=tokens tt/p=tokens",
+            "pubPlace": "München",
+            "availability": "CC-BY-SA",
+            "title": "Zur Farbenlehre",
+            "pubDate": "1982",
+            "corpusSigle": "GOE"
+        }
+    ]
+}
diff --git a/src/test/resources/korap-api-responses/unknownMatchInfo.jsonld b/src/test/resources/korap-api-responses/unknownMatchInfo.jsonld
new file mode 100644
index 0000000..8581882
--- /dev/null
+++ b/src/test/resources/korap-api-responses/unknownMatchInfo.jsonld
@@ -0,0 +1,6 @@
+{
+    "@context": "http://korap.ids-mannheim.de/ns/KoralQuery/v0.3/context.jsonld",
+    "meta": {"version": "Krill-0.59.3"},
+    "matchID": "match-WPD15/D18/06488-p588-589",
+    "textSigle": "WPD15/D18/06488"
+}