Reenable and update search POST tests [AI-assisted]

Change-Id: I4e3a8fc62da6428dbd890e8cf9aeffbf96097510
diff --git a/Changes b/Changes
index fbed821..d41938b 100644
--- a/Changes
+++ b/Changes
@@ -1,3 +1,7 @@
+# version 1.4
+
+- Reenable and update search POST tests [AI-assisted]
+
 # version 1.3
 
 - Add a large-context group allowing users to access larger context by request [AI-assisted, #745]
diff --git a/pom.xml b/pom.xml
index 64bd88e..ecc81b3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>de.ids-mannheim.korap.kustvakt</groupId>
 	<artifactId>Kustvakt</artifactId>
-	<version>1.3</version>
+	<version>1.4</version>
 	<properties>
 		<java.version>21</java.version>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/SearchControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/SearchControllerTest.java
index d2316e0..0ea71ea 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/SearchControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/SearchControllerTest.java
@@ -49,14 +49,6 @@
         return node;
     }
 
-    private String createJsonQuery () {
-        QuerySerializer s = new QuerySerializer(apiVersion);
-        s.setQuery("[orth=der]", "poliqarp");
-        s.setCollection("corpusSigle=GOE");
-        s.setQuery("Wasser", "poliqarp");
-        return s.toJSON();
-    }
-
     @Test
     public void testApiWelcomeMessage () {
         Response response = target().path(API_VERSION).path("").request().get();
@@ -395,75 +387,5 @@
         assertEquals("base/s:s", node.at("/meta/context").asText());
         assertNotEquals("/meta/version", "${project.version}");
     }
-
-    // EM: The API is disabled
-    @Disabled
-    @Test
-    public void testSearchSimpleCQL () throws KustvaktException {
-        QuerySerializer s = new QuerySerializer(apiVersion);
-        s.setQuery("(der) or (das)", "CQL");
-        Response response = target().path(API_VERSION).path("search").request()
-                .post(Entity.json(s.toJSON()));
-        assertEquals(Status.OK.getStatusCode(), response.getStatus());
-        String ent = response.readEntity(String.class);
-        JsonNode node = JsonUtils.readTree(ent);
-        assertNotNull(node);
-        assertNotEquals(0, node.path("matches").size());
-        // assertEquals(17027, node.at("/meta/totalResults").asInt());
-    }
-
-    // EM: The API is disabled
-    @Test
-    @Disabled
-    public void testSearchRawQuery () throws KustvaktException {
-        Response response = target().path(API_VERSION).path("search").request()
-                .post(Entity.json(createJsonQuery()));
-        assertEquals(Status.OK.getStatusCode(), response.getStatus());
-        String ent = response.readEntity(String.class);
-        JsonNode node = JsonUtils.readTree(ent);
-        assertNotNull(node);
-        assertNotEquals(0, node.path("matches").size());
-        assertEquals(freeCorpusAccess,
-                node.at(CORPUS_PATH+"/rewrites/0/scope").asText());
-    }
-
-    // EM: The API is disabled
-    @Test
-    @Disabled
-    public void testSearchPostAll () throws KustvaktException {
-        Response response = target().path(API_VERSION).path("search").request()
-                .header(HttpHeaders.X_FORWARDED_FOR, "10.27.0.32")
-                .header(Attributes.AUTHORIZATION,
-                        HttpAuthorizationHandler
-                                .createBasicAuthorizationHeaderValue("kustvakt",
-                                        "kustvakt2015"))
-                .post(Entity.json(createJsonQuery()));
-        assertEquals(Status.OK.getStatusCode(), response.getStatus());
-        String ent = response.readEntity(String.class);
-        JsonNode node = JsonUtils.readTree(ent);
-        assertNotNull(node);
-        assertNotEquals(0, node.path("matches").size());
-        assertEquals(allCorpusAccess,
-                node.at(CORPUS_PATH+"/rewrites/0/scope").asText());
-    }
-
-    // EM: The API is disabled
-    @Test
-    @Disabled
-    public void testSearchPostPublic () throws KustvaktException {
-        Response response = target().path(API_VERSION).path("search").request()
-                .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
-                .header(Attributes.AUTHORIZATION,
-                        HttpAuthorizationHandler
-                                .createBasicAuthorizationHeaderValue("kustvakt",
-                                        "kustvakt2015"))
-                .post(Entity.json(createJsonQuery()));
-        assertEquals(Status.OK.getStatusCode(), response.getStatus());
-        String ent = response.readEntity(String.class);
-        JsonNode node = JsonUtils.readTree(ent);
-        assertNotNull(node);
-        assertNotEquals(0, node.path("matches").size());
-        assertEquals(publicCorpusAccess,
-                node.at(CORPUS_PATH+"/rewrites/0/scope").asText());
-    }
+    
 }
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/SearchPostTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/SearchPostTest.java
new file mode 100644
index 0000000..c2964a9
--- /dev/null
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/SearchPostTest.java
@@ -0,0 +1,319 @@
+package de.ids_mannheim.korap.web.controller;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.junit.jupiter.api.Test;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.net.HttpHeaders;
+
+import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
+import de.ids_mannheim.korap.config.Attributes;
+import de.ids_mannheim.korap.config.SpringJerseyTest;
+import de.ids_mannheim.korap.exceptions.KustvaktException;
+import de.ids_mannheim.korap.query.serialize.QuerySerializer;
+import de.ids_mannheim.korap.utils.JsonUtils;
+import jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response.Status;
+
+/** Reactivated Search Post tests. 
+ *  [AI-assisted]
+ * 
+ */
+public class SearchPostTest extends SpringJerseyTest {
+
+    private double apiVersion = Double.parseDouble(API_VERSION.substring(1));
+    
+    private String createJsonQuery () {
+        QuerySerializer s = new QuerySerializer(apiVersion);
+        s.setQuery("[orth=der]", "poliqarp");
+        s.setCollection("corpusSigle=GOE");
+        s.setQuery("Wasser", "poliqarp");
+        return s.toJSON();
+    }
+    
+    @Test
+    public void testSearchSimpleCQL () throws KustvaktException {
+        QuerySerializer s = new QuerySerializer(apiVersion);
+        s.setQuery("(der) or (das)", "CQL");
+        String query = s.toJSON();
+        Response response = target().path(API_VERSION).path("search").request()
+                .post(Entity.json(query));
+        assertEquals(Status.OK.getStatusCode(), response.getStatus());
+        String ent = response.readEntity(String.class);
+        JsonNode node = JsonUtils.readTree(ent);
+        assertNotNull(node);
+        assertFalse(node.at("/query").isMissingNode());
+        assertFalse(node.at(CORPUS_PATH).isMissingNode());
+        assertFalse(node.at("/matches").isMissingNode());
+    }
+
+    @Test
+    public void testSearchRawQuery () throws KustvaktException {
+        Response response = target().path(API_VERSION).path("search").request()
+                .post(Entity.json(createJsonQuery()));
+        assertEquals(Status.OK.getStatusCode(), response.getStatus());
+        String ent = response.readEntity(String.class);
+        JsonNode node = JsonUtils.readTree(ent);
+        assertNotNull(node);
+        
+        // Check query structure
+        assertFalse(node.at("/query").isMissingNode());
+        assertEquals("koral:token", node.at("/query/@type").asText());
+        
+        // Check query wrap structure
+        assertFalse(node.at("/query/wrap").isMissingNode());
+        assertEquals("koral:term", node.at("/query/wrap/@type").asText());
+        assertEquals("match:eq", node.at("/query/wrap/match").asText());
+        assertEquals("orth", node.at("/query/wrap/layer").asText());
+        assertEquals("Wasser", node.at("/query/wrap/key").asText());
+        assertEquals("opennlp", node.at("/query/wrap/foundry").asText());
+        
+        // Check query wrap rewrites
+        assertFalse(node.at("/query/wrap/rewrites").isMissingNode());
+        assertTrue(node.at("/query/wrap/rewrites").isArray());
+        assertNotEquals(0, node.at("/query/wrap/rewrites").size());
+        assertEquals("koral:rewrite", node.at("/query/wrap/rewrites/0/@type").asText());
+        assertEquals("Kustvakt", node.at("/query/wrap/rewrites/0/src").asText());
+        assertEquals("Kustvakt", node.at("/query/wrap/rewrites/0/editor").asText());
+        assertEquals("operation:injection", node.at("/query/wrap/rewrites/0/operation").asText());
+        assertEquals("foundry", node.at("/query/wrap/rewrites/0/scope").asText());
+        assertNotNull(node.at("/query/wrap/rewrites/0/_comment").asText());
+        
+        // Check matches and metadata
+        assertNotEquals(0, node.path("matches").size());
+        assertFalse(node.at("/meta").isMissingNode());
+        assertTrue(node.at("/meta/count").isInt());
+        assertNotNull(node.at("/meta/count").asInt());
+        
+        // Check corpus structure
+        assertFalse(node.at(CORPUS_PATH).isMissingNode());
+        assertEquals("koral:docGroup", node.at(CORPUS_PATH+"/@type").asText());
+        assertEquals("operation:and", node.at(CORPUS_PATH+"/operation").asText());
+        
+        // Check corpus operands
+        assertTrue(node.at(CORPUS_PATH+"/operands").isArray());
+        assertEquals(2, node.at(CORPUS_PATH+"/operands").size());
+        
+        // Check first operand (availability)
+        assertEquals("koral:doc", node.at(CORPUS_PATH+"/operands/0/@type").asText());
+        assertEquals("match:eq", node.at(CORPUS_PATH+"/operands/0/match").asText());
+        assertEquals("type:regex", node.at(CORPUS_PATH+"/operands/0/type").asText());
+        assertEquals("CC.*", node.at(CORPUS_PATH+"/operands/0/value").asText());
+        assertEquals("availability", node.at(CORPUS_PATH+"/operands/0/key").asText());
+        
+        // Check second operand (corpusSigle)
+        assertEquals("koral:doc", node.at(CORPUS_PATH+"/operands/1/@type").asText());
+        assertEquals("match:eq", node.at(CORPUS_PATH+"/operands/1/match").asText());
+        assertEquals("GOE", node.at(CORPUS_PATH+"/operands/1/value").asText());
+        assertEquals("corpusSigle", node.at(CORPUS_PATH+"/operands/1/key").asText());
+        
+        // Check corpus rewrites
+        assertFalse(node.at(CORPUS_PATH+"/rewrites").isMissingNode());
+        assertTrue(node.at(CORPUS_PATH+"/rewrites").isArray());
+        assertNotEquals(0, node.at(CORPUS_PATH+"/rewrites").size());
+        assertEquals("koral:rewrite", node.at(CORPUS_PATH+"/rewrites/0/@type").asText());
+        assertEquals("Kustvakt", node.at(CORPUS_PATH+"/rewrites/0/src").asText());
+        assertEquals("Kustvakt", node.at(CORPUS_PATH+"/rewrites/0/editor").asText());
+        assertEquals("operation:override", node.at(CORPUS_PATH+"/rewrites/0/operation").asText());
+        assertEquals(freeCorpusAccess, node.at(CORPUS_PATH+"/rewrites/0/_comment").asText());
+        
+        // Check rewrite original
+        assertFalse(node.at(CORPUS_PATH+"/rewrites/0/original").isMissingNode());
+        assertEquals("koral:doc", node.at(CORPUS_PATH+"/rewrites/0/original/@type").asText());
+        assertEquals("match:eq", node.at(CORPUS_PATH+"/rewrites/0/original/match").asText());
+        assertEquals("GOE", node.at(CORPUS_PATH+"/rewrites/0/original/value").asText());
+        assertEquals("corpusSigle", node.at(CORPUS_PATH+"/rewrites/0/original/key").asText());
+    }
+
+    @Test
+    public void testSearchPostAll () throws KustvaktException {
+        Response response = target().path(API_VERSION).path("search").request()
+                .header(HttpHeaders.X_FORWARDED_FOR, "10.27.0.32")
+                .header(Attributes.AUTHORIZATION,
+                        HttpAuthorizationHandler
+                                .createBasicAuthorizationHeaderValue("kustvakt",
+                                        "kustvakt2015"))
+                .post(Entity.json(createJsonQuery()));
+        assertEquals(Status.OK.getStatusCode(), response.getStatus());
+        String ent = response.readEntity(String.class);
+        JsonNode node = JsonUtils.readTree(ent);
+        assertNotNull(node);
+        assertNotEquals(0, node.path("matches").size());
+        
+        // Check corpus structure
+        assertFalse(node.at(CORPUS_PATH).isMissingNode());
+        assertEquals("koral:docGroup", node.at(CORPUS_PATH+"/@type").asText());
+        assertEquals("operation:and", node.at(CORPUS_PATH+"/operation").asText());
+        
+        // Check root operands (2 operands)
+        assertTrue(node.at(CORPUS_PATH+"/operands").isArray());
+        assertEquals(2, node.at(CORPUS_PATH+"/operands").size());
+        
+        // Check first operand (nested availability docGroup)
+        assertEquals("koral:docGroup", node.at(CORPUS_PATH+"/operands/0/@type").asText());
+        assertEquals("operation:or", node.at(CORPUS_PATH+"/operands/0/operation").asText());
+        
+        // Check first operand's operands (nested availability checks)
+        assertTrue(node.at(CORPUS_PATH+"/operands/0/operands").isArray());
+        assertEquals(2, node.at(CORPUS_PATH+"/operands/0/operands").size());
+        
+        // Check CC.* availability
+        assertEquals("koral:doc", node.at(CORPUS_PATH+"/operands/0/operands/0/@type").asText());
+        assertEquals("match:eq", node.at(CORPUS_PATH+"/operands/0/operands/0/match").asText());
+        assertEquals("type:regex", node.at(CORPUS_PATH+"/operands/0/operands/0/type").asText());
+        assertEquals("CC.*", node.at(CORPUS_PATH+"/operands/0/operands/0/value").asText());
+        assertEquals("availability", node.at(CORPUS_PATH+"/operands/0/operands/0/key").asText());
+        
+        // Check second level nested docGroup (ACA.* and QAO checks)
+        assertEquals("koral:docGroup", node.at(CORPUS_PATH+"/operands/0/operands/1/@type").asText());
+        assertEquals("operation:or", node.at(CORPUS_PATH+"/operands/0/operands/1/operation").asText());
+        
+        // Check second level operands
+        assertTrue(node.at(CORPUS_PATH+"/operands/0/operands/1/operands").isArray());
+        assertEquals(2, node.at(CORPUS_PATH+"/operands/0/operands/1/operands").size());
+        
+        // Check ACA.* availability
+        assertEquals("koral:doc", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/0/@type").asText());
+        assertEquals("match:eq", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/0/match").asText());
+        assertEquals("type:regex", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/0/type").asText());
+        assertEquals("ACA.*", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/0/value").asText());
+        assertEquals("availability", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/0/key").asText());
+        
+        // Check third level nested docGroup (QAO checks)
+        assertEquals("koral:docGroup", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/1/@type").asText());
+        assertEquals("operation:or", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/1/operation").asText());
+        
+        // Check third level operands
+        assertTrue(node.at(CORPUS_PATH+"/operands/0/operands/1/operands/1/operands").isArray());
+        assertEquals(2, node.at(CORPUS_PATH+"/operands/0/operands/1/operands/1/operands").size());
+        
+        // Check QAO-NC availability
+        assertEquals("koral:doc", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/1/operands/0/@type").asText());
+        assertEquals("match:eq", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/1/operands/0/match").asText());
+        assertEquals("type:regex", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/1/operands/0/type").asText());
+        assertEquals("QAO-NC", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/1/operands/0/value").asText());
+        assertEquals("availability", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/1/operands/0/key").asText());
+        
+        // Check QAO-NC-LOC:ids.* availability
+        assertEquals("koral:doc", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/1/operands/1/@type").asText());
+        assertEquals("match:eq", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/1/operands/1/match").asText());
+        assertEquals("type:regex", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/1/operands/1/type").asText());
+        assertEquals("QAO-NC-LOC:ids.*", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/1/operands/1/value").asText());
+        assertEquals("availability", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/1/operands/1/key").asText());
+        
+        // Check second root operand (corpusSigle)
+        assertEquals("koral:doc", node.at(CORPUS_PATH+"/operands/1/@type").asText());
+        assertEquals("match:eq", node.at(CORPUS_PATH+"/operands/1/match").asText());
+        assertEquals("GOE", node.at(CORPUS_PATH+"/operands/1/value").asText());
+        assertEquals("corpusSigle", node.at(CORPUS_PATH+"/operands/1/key").asText());
+        
+        // Check corpus rewrites
+        assertFalse(node.at(CORPUS_PATH+"/rewrites").isMissingNode());
+        assertTrue(node.at(CORPUS_PATH+"/rewrites").isArray());
+        assertNotEquals(0, node.at(CORPUS_PATH+"/rewrites").size());
+        assertEquals("koral:rewrite", node.at(CORPUS_PATH+"/rewrites/0/@type").asText());
+        assertEquals("Kustvakt", node.at(CORPUS_PATH+"/rewrites/0/src").asText());
+        assertEquals("Kustvakt", node.at(CORPUS_PATH+"/rewrites/0/editor").asText());
+        assertEquals("operation:override", node.at(CORPUS_PATH+"/rewrites/0/operation").asText());
+        assertEquals(allCorpusAccess, node.at(CORPUS_PATH+"/rewrites/0/_comment").asText());
+        
+        // Check rewrite original
+        assertFalse(node.at(CORPUS_PATH+"/rewrites/0/original").isMissingNode());
+        assertEquals("koral:doc", node.at(CORPUS_PATH+"/rewrites/0/original/@type").asText());
+        assertEquals("match:eq", node.at(CORPUS_PATH+"/rewrites/0/original/match").asText());
+        assertEquals("GOE", node.at(CORPUS_PATH+"/rewrites/0/original/value").asText());
+        assertEquals("corpusSigle", node.at(CORPUS_PATH+"/rewrites/0/original/key").asText());
+    }
+
+    @Test
+    public void testSearchPostPublic () throws KustvaktException {
+        Response response = target().path(API_VERSION).path("search").request()
+                .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
+                .header(Attributes.AUTHORIZATION,
+                        HttpAuthorizationHandler
+                                .createBasicAuthorizationHeaderValue("kustvakt",
+                                        "kustvakt2015"))
+                .post(Entity.json(createJsonQuery()));
+        assertEquals(Status.OK.getStatusCode(), response.getStatus());
+        String ent = response.readEntity(String.class);
+        JsonNode node = JsonUtils.readTree(ent);
+        assertNotNull(node);
+        assertNotEquals(0, node.path("matches").size());
+        
+        // Check corpus structure
+        assertFalse(node.at(CORPUS_PATH).isMissingNode());
+        assertEquals("koral:docGroup", node.at(CORPUS_PATH+"/@type").asText());
+        assertEquals("operation:and", node.at(CORPUS_PATH+"/operation").asText());
+        
+        // Check root operands (2 operands)
+        assertTrue(node.at(CORPUS_PATH+"/operands").isArray());
+        assertEquals(2, node.at(CORPUS_PATH+"/operands").size());
+        
+        // Check first operand (nested availability docGroup)
+        assertEquals("koral:docGroup", node.at(CORPUS_PATH+"/operands/0/@type").asText());
+        assertEquals("operation:or", node.at(CORPUS_PATH+"/operands/0/operation").asText());
+        
+        // Check first operand's operands (nested availability checks)
+        assertTrue(node.at(CORPUS_PATH+"/operands/0/operands").isArray());
+        assertEquals(2, node.at(CORPUS_PATH+"/operands/0/operands").size());
+        
+        // Check CC.* availability
+        assertEquals("koral:doc", node.at(CORPUS_PATH+"/operands/0/operands/0/@type").asText());
+        assertEquals("match:eq", node.at(CORPUS_PATH+"/operands/0/operands/0/match").asText());
+        assertEquals("type:regex", node.at(CORPUS_PATH+"/operands/0/operands/0/type").asText());
+        assertEquals("CC.*", node.at(CORPUS_PATH+"/operands/0/operands/0/value").asText());
+        assertEquals("availability", node.at(CORPUS_PATH+"/operands/0/operands/0/key").asText());
+        
+        // Check second level nested docGroup (ACA.* and QAO checks)
+        assertEquals("koral:docGroup", node.at(CORPUS_PATH+"/operands/0/operands/1/@type").asText());
+        assertEquals("operation:or", node.at(CORPUS_PATH+"/operands/0/operands/1/operation").asText());
+        
+        // Check second level operands
+        assertTrue(node.at(CORPUS_PATH+"/operands/0/operands/1/operands").isArray());
+        assertEquals(2, node.at(CORPUS_PATH+"/operands/0/operands/1/operands").size());
+        
+        // Check ACA.* availability
+        assertEquals("koral:doc", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/0/@type").asText());
+        assertEquals("match:eq", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/0/match").asText());
+        assertEquals("type:regex", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/0/type").asText());
+        assertEquals("ACA.*", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/0/value").asText());
+        assertEquals("availability", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/0/key").asText());
+        
+        // Check QAO-NC availability
+        assertEquals("koral:doc", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/1/@type").asText());
+        assertEquals("match:eq", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/1/match").asText());
+        assertEquals("type:regex", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/1/type").asText());
+        assertEquals("QAO-NC", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/1/value").asText());
+        assertEquals("availability", node.at(CORPUS_PATH+"/operands/0/operands/1/operands/1/key").asText());
+        
+        // Check second root operand (corpusSigle)
+        assertEquals("koral:doc", node.at(CORPUS_PATH+"/operands/1/@type").asText());
+        assertEquals("match:eq", node.at(CORPUS_PATH+"/operands/1/match").asText());
+        assertEquals("GOE", node.at(CORPUS_PATH+"/operands/1/value").asText());
+        assertEquals("corpusSigle", node.at(CORPUS_PATH+"/operands/1/key").asText());
+        
+        // Check corpus rewrites
+        assertFalse(node.at(CORPUS_PATH+"/rewrites").isMissingNode());
+        assertTrue(node.at(CORPUS_PATH+"/rewrites").isArray());
+        assertNotEquals(0, node.at(CORPUS_PATH+"/rewrites").size());
+        assertEquals("koral:rewrite", node.at(CORPUS_PATH+"/rewrites/0/@type").asText());
+        assertEquals("Kustvakt", node.at(CORPUS_PATH+"/rewrites/0/src").asText());
+        assertEquals("Kustvakt", node.at(CORPUS_PATH+"/rewrites/0/editor").asText());
+        assertEquals("operation:override", node.at(CORPUS_PATH+"/rewrites/0/operation").asText());
+        assertEquals(publicCorpusAccess, node.at(CORPUS_PATH+"/rewrites/0/_comment").asText());
+        
+        // Check rewrite original
+        assertFalse(node.at(CORPUS_PATH+"/rewrites/0/original").isMissingNode());
+        assertEquals("koral:doc", node.at(CORPUS_PATH+"/rewrites/0/original/@type").asText());
+        assertEquals("match:eq", node.at(CORPUS_PATH+"/rewrites/0/original/match").asText());
+        assertEquals("GOE", node.at(CORPUS_PATH+"/rewrites/0/original/value").asText());
+        assertEquals("corpusSigle", node.at(CORPUS_PATH+"/rewrites/0/original/key").asText());
+    }
+
+}