Set up the test framework with SpringServlet.

Change-Id: Ie5a4e05e54fdf4c77b52daf9a34808e2bf7f0581
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/full/SearchService.java b/src/main/java/de/ids_mannheim/korap/web/service/full/SearchService.java
index 66d6e1c..6f2835f 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/full/SearchService.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/full/SearchService.java
@@ -28,6 +28,7 @@
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.sun.jersey.core.util.MultivaluedMapImpl;
@@ -70,6 +71,7 @@
  */
 @Controller
 @Path("/")
+@RequestMapping ( "/" )
 @ResourceFilters({ AuthFilter.class, DemoUserFilter.class, PiwikFilter.class })
 @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
 public class SearchService {
@@ -312,133 +314,133 @@
     }
 
 
-//    /* EM: potentially an unused service! */
-//    /** Builds a json query serialization from the given parameters.
-//     * 
-//     * @param locale
-//     * @param securityContext
-//     * @param q query string
-//     * @param ql query language
-//     * @param v version
-//     * @param context
-//     * @param cutoff true if the number of results should be limited
-//     * @param pageLength number of results per page
-//     * @param pageIndex
-//     * @param startPage
-//     * @param cq collection query
-//     * @return
-//     */
-//    // ref query parameter removed!
-//    // EM: change the HTTP method to from TRACE to GET
-//    // EM: change path from search to query
-//    @GET
-//    @Path("query")
-//    public Response serializeQuery (@Context Locale locale,
-//            @Context SecurityContext securityContext, @QueryParam("q") String q,
-//            @QueryParam("ql") String ql, @QueryParam("v") String v,
-//            @QueryParam("context") String context,
-//            @QueryParam("cutoff") Boolean cutoff,
-//            @QueryParam("count") Integer pageLength,
-//            @QueryParam("offset") Integer pageIndex,
-//            @QueryParam("page") Integer startPage,
-//            @QueryParam("cq") String cq) {
-//        TokenContext ctx = (TokenContext) securityContext.getUserPrincipal();
-//        QuerySerializer ss = new QuerySerializer().setQuery(q, ql, v);
-//        if (cq != null)
-//            ss.setCollection(cq);
-//
-//        MetaQueryBuilder meta = new MetaQueryBuilder();
-//        if (pageIndex != null)
-//            meta.addEntry("startIndex", pageIndex);
-//        if (pageIndex == null && startPage != null)
-//            meta.addEntry("startPage", startPage);
-//        if (pageLength != null)
-//            meta.addEntry("count", pageLength);
-//        if (context != null)
-//            meta.setSpanContext(context);
-//        meta.addEntry("cutOff", cutoff);
-//
-//        ss.setMeta(meta.raw());
-//        String result = ss.toJSON();
-//        jlog.debug("Query: "+result);
-//        return Response.ok(result).build();
-//    }
-//
-//
-//    /**
-//     * currently only supports either no reference at all in which
-//     * case all corpora are retrieved or a corpus name like "WPD".
-//     * No virtual collections supported!
-//     * 
-//     * @param locale
-//     * @param q
-//     * @param ql
-//     * @param v
-//     * @param pageLength
-//     * @param pageIndex
-//     * @return
-//     */
-//
-//    // todo: does cq have any sensible worth here? --> would say no! --> is
-//    // useful in non type/id scenarios
-//    
-//    /* EM: potentially an unused service! */    
-//    // EM: build query using the given virtual collection id
-//    // EM: change the HTTP method to from TRACE to GET
-//    // EM: change path from search to query
-//    // EM: there is no need to check resource licenses since the service just serialize a query serialization
-//    @GET
-//    @Path("{type}/{id}/query")
-//    public Response serializeQueryWithResource (@Context Locale locale,
-//            @Context SecurityContext securityContext, @QueryParam("q") String q,
-//            @QueryParam("ql") String ql, @QueryParam("v") String v,
-//            @QueryParam("context") String context,
-//            @QueryParam("cutoff") Boolean cutoff,
-//            @QueryParam("count") Integer pageLength,
-//            @QueryParam("offset") Integer pageIndex,
-//            @QueryParam("page") Integer startPage,
-//            @PathParam("type") String type, @PathParam("id") String id) {
-//        TokenContext ctx = (TokenContext) securityContext.getUserPrincipal();
-//        type = StringUtils.normalize(type);
-//        id = StringUtils.decodeHTML(id);
-//
-//        QuerySerializer ss = new QuerySerializer().setQuery(q, ql, v);
-//
-//        MetaQueryBuilder meta = new MetaQueryBuilder();
-//        if (pageIndex != null)
-//            meta.addEntry("startIndex", pageIndex);
-//        if (pageIndex == null && startPage != null)
-//            meta.addEntry("startPage", startPage);
-//        if (pageLength != null)
-//            meta.addEntry("count", pageLength);
-//        if (context != null)
-//            meta.setSpanContext(context);
-//        if (cutoff != null)
-//            meta.addEntry("cutOff", cutoff);
-//
-//        ss.setMeta(meta.raw());
-//
-//        KoralCollectionQueryBuilder cquery = new KoralCollectionQueryBuilder();
-//        cquery.setBaseQuery(ss.toJSON());
-//
-//        String query = "";
-//        // EM: is this necessary at all?
-//        KustvaktResource resource = isCollectionIdValid(ctx.getName(), id);
-//        if (resource!=null){
-//            if (resource instanceof VirtualCollection) {
-//                JsonNode node = cquery.and().mergeWith(resource.getData());
-//                query = JsonUtils.toJSON(node);
-//            }
-//            else if (resource instanceof Corpus) {
-//                cquery.and().with(Attributes.CORPUS_SIGLE, "=",
-//                        resource.getPersistentID());
-//                query = cquery.toJSON();
-//            }
-//        }
-//
-//        jlog.debug("Query: "+query);
-//        return Response.ok(query).build();
-//    }
+    /* EM: potentially an unused service! */
+    /** Builds a json query serialization from the given parameters.
+     * 
+     * @param locale
+     * @param securityContext
+     * @param q query string
+     * @param ql query language
+     * @param v version
+     * @param context
+     * @param cutoff true if the number of results should be limited
+     * @param pageLength number of results per page
+     * @param pageIndex
+     * @param startPage
+     * @param cq collection query
+     * @return
+     */
+    // ref query parameter removed!
+    // EM: change the HTTP method to from TRACE to GET
+    // EM: change path from search to query
+    @GET
+    @Path("query")
+    public Response serializeQuery (@Context Locale locale,
+            @Context SecurityContext securityContext, @QueryParam("q") String q,
+            @QueryParam("ql") String ql, @QueryParam("v") String v,
+            @QueryParam("context") String context,
+            @QueryParam("cutoff") Boolean cutoff,
+            @QueryParam("count") Integer pageLength,
+            @QueryParam("offset") Integer pageIndex,
+            @QueryParam("page") Integer startPage,
+            @QueryParam("cq") String cq) {
+        TokenContext ctx = (TokenContext) securityContext.getUserPrincipal();
+        QuerySerializer ss = new QuerySerializer().setQuery(q, ql, v);
+        if (cq != null)
+            ss.setCollection(cq);
+
+        MetaQueryBuilder meta = new MetaQueryBuilder();
+        if (pageIndex != null)
+            meta.addEntry("startIndex", pageIndex);
+        if (pageIndex == null && startPage != null)
+            meta.addEntry("startPage", startPage);
+        if (pageLength != null)
+            meta.addEntry("count", pageLength);
+        if (context != null)
+            meta.setSpanContext(context);
+        meta.addEntry("cutOff", cutoff);
+
+        ss.setMeta(meta.raw());
+        String result = ss.toJSON();
+        jlog.debug("Query: "+result);
+        return Response.ok(result).build();
+    }
+
+
+    /**
+     * currently only supports either no reference at all in which
+     * case all corpora are retrieved or a corpus name like "WPD".
+     * No virtual collections supported!
+     * 
+     * @param locale
+     * @param q
+     * @param ql
+     * @param v
+     * @param pageLength
+     * @param pageIndex
+     * @return
+     */
+
+    // todo: does cq have any sensible worth here? --> would say no! --> is
+    // useful in non type/id scenarios
+    
+    /* EM: potentially an unused service! */    
+    // EM: build query using the given virtual collection id
+    // EM: change the HTTP method to from TRACE to GET
+    // EM: change path from search to query
+    // EM: there is no need to check resource licenses since the service just serialize a query serialization
+    @GET
+    @Path("{type}/{id}/query")
+    public Response serializeQueryWithResource (@Context Locale locale,
+            @Context SecurityContext securityContext, @QueryParam("q") String q,
+            @QueryParam("ql") String ql, @QueryParam("v") String v,
+            @QueryParam("context") String context,
+            @QueryParam("cutoff") Boolean cutoff,
+            @QueryParam("count") Integer pageLength,
+            @QueryParam("offset") Integer pageIndex,
+            @QueryParam("page") Integer startPage,
+            @PathParam("type") String type, @PathParam("id") String id) {
+        TokenContext ctx = (TokenContext) securityContext.getUserPrincipal();
+        type = StringUtils.normalize(type);
+        id = StringUtils.decodeHTML(id);
+
+        QuerySerializer ss = new QuerySerializer().setQuery(q, ql, v);
+
+        MetaQueryBuilder meta = new MetaQueryBuilder();
+        if (pageIndex != null)
+            meta.addEntry("startIndex", pageIndex);
+        if (pageIndex == null && startPage != null)
+            meta.addEntry("startPage", startPage);
+        if (pageLength != null)
+            meta.addEntry("count", pageLength);
+        if (context != null)
+            meta.setSpanContext(context);
+        if (cutoff != null)
+            meta.addEntry("cutOff", cutoff);
+
+        ss.setMeta(meta.raw());
+
+        KoralCollectionQueryBuilder cquery = new KoralCollectionQueryBuilder();
+        cquery.setBaseQuery(ss.toJSON());
+
+        String query = "";
+        // EM: is this necessary at all?
+        KustvaktResource resource = isCollectionIdValid(ctx.getName(), id);
+        if (resource!=null){
+            if (resource instanceof VirtualCollection) {
+                JsonNode node = cquery.and().mergeWith(resource.getData());
+                query = JsonUtils.toJSON(node);
+            }
+            else if (resource instanceof Corpus) {
+                cquery.and().with(Attributes.CORPUS_SIGLE, "=",
+                        resource.getPersistentID());
+                query = cquery.toJSON();
+            }
+        }
+
+        jlog.debug("Query: "+query);
+        return Response.ok(query).build();
+    }
 
     // EM: prototype
     private KustvaktResource isCollectionIdValid (String username, String collectionId) {
diff --git a/src/test/java/de/ids_mannheim/korap/config/BeanConfigTest.java b/src/test/java/de/ids_mannheim/korap/config/BeanConfigTest.java
index 74def43..79042d5 100644
--- a/src/test/java/de/ids_mannheim/korap/config/BeanConfigTest.java
+++ b/src/test/java/de/ids_mannheim/korap/config/BeanConfigTest.java
@@ -8,6 +8,7 @@
 import org.junit.runners.model.InitializationError;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
 import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@@ -31,6 +32,7 @@
 
 
     public void init () throws Exception {
+//        context = new ClassPathXmlApplicationContext("test-default-config.xml");
         assertNotNull("Application context must not be null!", this.context);
         jlog.debug("running one-time before init for class "
                 + this.getClass().getSimpleName() + " ...");
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/FastJerseyTest.java b/src/test/java/de/ids_mannheim/korap/web/service/FastJerseyTest.java
index 87457bd..932ffb1 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/FastJerseyTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/FastJerseyTest.java
@@ -4,6 +4,7 @@
 import com.sun.jersey.api.client.WebResource;
 import com.sun.jersey.api.core.DefaultResourceConfig;
 import com.sun.jersey.spi.inject.SingletonTypeInjectableProvider;
+import com.sun.jersey.spi.spring.container.servlet.SpringServlet;
 import com.sun.jersey.test.framework.AppDescriptor;
 import com.sun.jersey.test.framework.LowLevelAppDescriptor;
 import com.sun.jersey.test.framework.WebAppDescriptor;
@@ -16,6 +17,7 @@
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
+import org.springframework.web.context.ContextLoaderListener;
 
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.UriBuilder;
@@ -31,7 +33,8 @@
 
     private final static String API_VERSION = "v0.1";
 
-    private static DefaultResourceConfig resourceConfig = new DefaultResourceConfig();
+    private static DefaultResourceConfig resourceConfig =
+            new DefaultResourceConfig();
 
     private static TestContainerFactory testContainerFactory;
 
@@ -99,7 +102,11 @@
         if (classPackages == null)
             ad = new LowLevelAppDescriptor.Builder(resourceConfig).build();
         else
-            ad = new WebAppDescriptor.Builder(classPackages).build();
+            ad = new WebAppDescriptor.Builder(classPackages)
+                    .servletClass(SpringServlet.class)
+                    .contextListenerClass(ContextLoaderListener.class)
+                    .contextParam("contextConfigLocation", "classpath:test-default-config.xml")
+                    .build();
 
         TestContainerFactory tcf = testContainerFactory;
         if (tcf == null) {
@@ -109,8 +116,8 @@
                 tcf = new GrizzlyWebTestContainerFactory();
         }
 
-        testContainer = tcf.create(UriBuilder.fromUri(containerURI)
-                .port(port).build(), ad);
+        testContainer = tcf.create(
+                UriBuilder.fromUri(containerURI).port(port).build(), ad);
         client = testContainer.getClient();
         if (client == null) {
             client = Client.create(ad.getClientConfig());
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/full/MatchInfoServiceTest.java b/src/test/java/de/ids_mannheim/korap/web/service/full/MatchInfoServiceTest.java
index 170ab18..73dbc4a 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/full/MatchInfoServiceTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/full/MatchInfoServiceTest.java
@@ -30,7 +30,7 @@
     @Test
     public void testGetMatchInfoPublicCorpus () {
 
-        ClientResponse response = resource().path(getAPIVersion())
+        ClientResponse response = resource()
                 .path("corpus").path("GOE").path("AGA").path("01784")
                 .path("p36-100").path("matchInfo")
                 .queryParam("foundry", "*")
@@ -56,7 +56,7 @@
     @Test
     public void testGetMatchInfoNotAllowed () {
 
-        ClientResponse response = resource().path(getAPIVersion())
+        ClientResponse response = resource()
                 .path("corpus").path("GOE").path("AGI").path("04846")
                 .path("p36875-36876").path("matchInfo")
                 .queryParam("foundry", "*")
@@ -76,7 +76,7 @@
 
     @Test
     public void testGetMatchInfoWithAuthentication () {
-        ClientResponse response = resource().path(getAPIVersion())
+        ClientResponse response = resource()
                 .path("corpus").path("GOE").path("AGI").path("04846")
                 .path("p36875-36876").path("matchInfo")
                 .queryParam("foundry", "*")
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/full/QuerySerializationServiceTest.java b/src/test/java/de/ids_mannheim/korap/web/service/full/QuerySerializationServiceTest.java
index f735063..e33eb9e 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/full/QuerySerializationServiceTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/full/QuerySerializationServiceTest.java
@@ -1,4 +1,5 @@
 package de.ids_mannheim.korap.web.service.full;
+
 /**
  * @author hanl, margaretha
  * @lastUpdate 19/04/2017
@@ -31,7 +32,7 @@
 
     @Override
     public void initMethod () throws KustvaktException {
-//        helper().runBootInterfaces();
+        //        helper().runBootInterfaces();
     }
 
 
@@ -41,15 +42,14 @@
                 "de.ids_mannheim.korap.web.filter",
                 "de.ids_mannheim.korap.web.utils");
     }
-    
+
+
     @Test
     public void testQuerySerializationFilteredPublic () {
         ClientResponse response = resource()
-                .path(getAPIVersion())
-                .path("corpus/WPD13/query")
-                .queryParam("q", "[orth=der]")
-                .queryParam("ql", "poliqarp")
-                .queryParam("context", "base/s:s")
+
+                .path("corpus/WPD13/query").queryParam("q", "[orth=der]")
+                .queryParam("ql", "poliqarp").queryParam("context", "base/s:s")
                 .method("GET", ClientResponse.class);
         assertEquals(ClientResponse.Status.OK.getStatusCode(),
                 response.getStatus());
@@ -59,17 +59,15 @@
         assertEquals("corpusSigle", node.at("/collection/key").asText());
         assertEquals("WPD13", node.at("/collection/value").asText());
     }
-    
-    
+
+
 
     @Test
     public void testQuerySerializationUnexistingResource () {
         ClientResponse response = resource()
-                .path(getAPIVersion())
-                .path("corpus/ZUW19/query")
-                .queryParam("q", "[orth=der]")
-                .queryParam("ql", "poliqarp")
-                .queryParam("context", "base/s:s")
+
+                .path("corpus/ZUW19/query").queryParam("q", "[orth=der]")
+                .queryParam("ql", "poliqarp").queryParam("context", "base/s:s")
                 .method("GET", ClientResponse.class);
         assertEquals(ClientResponse.Status.BAD_REQUEST.getStatusCode(),
                 response.getStatus());
@@ -79,15 +77,14 @@
         assertEquals("[Cannot found public Corpus with ids: [ZUW19]]",
                 node.at("/errors/0/2").asText());
     }
-    
+
+
     @Test
     public void testQuerySerializationWithNonPublicCorpus () {
         ClientResponse response = resource()
-                .path(getAPIVersion())
-                .path("corpus/BRZ10/query")
-                .queryParam("q", "[orth=der]")
-                .queryParam("ql", "poliqarp")
-                .queryParam("context", "base/s:s")
+
+                .path("corpus/BRZ10/query").queryParam("q", "[orth=der]")
+                .queryParam("ql", "poliqarp").queryParam("context", "base/s:s")
                 .method("GET", ClientResponse.class);
         assertEquals(ClientResponse.Status.BAD_REQUEST.getStatusCode(),
                 response.getStatus());
@@ -98,12 +95,12 @@
                 node.at("/errors/0/2").asText());
     }
 
+
     @Test
     public void testQuerySerializationWithAuthentication () {
         ClientResponse response = resource()
-                .path(getAPIVersion())
-                .path("corpus/BRZ10/query")
-                .queryParam("q", "[orth=der]")
+
+                .path("corpus/BRZ10/query").queryParam("q", "[orth=der]")
                 .queryParam("ql", "poliqarp")
                 .header(Attributes.AUTHORIZATION,
                         BasicHttpAuth.encode("kustvakt", "kustvakt2015"))
@@ -118,23 +115,24 @@
         assertEquals("BRZ10", node.at("/collection/value").asText());
     }
 
+
     @Test
     public void testQuerySerializationWithNewCollection () {
         // Add Virtual Collection
         ClientResponse response = resource()
-                .path(getAPIVersion())
-                .path("virtualcollection")
-                .queryParam("filter", "false")
-                .queryParam("query", "creationDate since 1775 & corpusSigle=GOE")
+
+                .path("virtualcollection").queryParam("filter", "false")
+                .queryParam("query",
+                        "creationDate since 1775 & corpusSigle=GOE")
                 .queryParam("name", "Weimarer Werke")
                 .queryParam("description", "Goethe-Werke in Weimar (seit 1775)")
                 .header(Attributes.AUTHORIZATION,
                         BasicHttpAuth.encode("kustvakt", "kustvakt2015"))
                 .post(ClientResponse.class);
-        
+
         assertEquals(ClientResponse.Status.OK.getStatusCode(),
                 response.getStatus());
-        
+
         String ent = response.getEntity(String.class);
         JsonNode node = JsonUtils.readTree(ent);
         assertNotNull(node);
@@ -143,7 +141,7 @@
 
         // Get virtual collections
         response = resource()
-                .path(getAPIVersion())
+
                 .path("collection")
                 .header(Attributes.AUTHORIZATION,
                         BasicHttpAuth.encode("kustvakt", "kustvakt2015"))
@@ -166,12 +164,9 @@
 
         // query serialization service
         response = resource()
-                .path(getAPIVersion())
-                .path("collection")
-                .path(id)
-                .path("query")
-                .queryParam("q", "[orth=der]")
-                .queryParam("ql", "poliqarp")
+
+                .path("collection").path(id).path("query")
+                .queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
                 .queryParam("context", "base/s:s")
                 .header(Attributes.AUTHORIZATION,
                         BasicHttpAuth.encode("kustvakt", "kustvakt2015"))
@@ -181,105 +176,100 @@
         ent = response.getEntity(String.class);
         node = JsonUtils.readTree(ent);
         assertNotNull(node);
-        System.out.println("NODE "+ent);
+        System.out.println("NODE " + ent);
         assertEquals("koral:docGroup", node.at("/collection/@type").asText());
-        assertEquals("koral:doc", node.at("/collection/operands/0/@type")
-                .asText());
-        assertEquals("creationDate", node.at("/collection/operands/0/key")
-                .asText());
-        assertEquals("1775", node.at("/collection/operands/0/value")
-                .asText());
-        assertEquals("type:date", node.at("/collection/operands/0/type")
-                .asText());
-        assertEquals("match:geq", node.at("/collection/operands/0/match")
-                .asText());
-        
-        assertEquals("koral:doc", node.at("/collection/operands/1/@type")
-                .asText());
-        assertEquals("corpusSigle", node.at("/collection/operands/1/key")
-                .asText());
-        assertEquals("GOE", node.at("/collection/operands/1/value")
-                .asText());
-        assertEquals("match:eq", node.at("/collection/operands/1/match")
-                .asText());
+        assertEquals("koral:doc",
+                node.at("/collection/operands/0/@type").asText());
+        assertEquals("creationDate",
+                node.at("/collection/operands/0/key").asText());
+        assertEquals("1775", node.at("/collection/operands/0/value").asText());
+        assertEquals("type:date",
+                node.at("/collection/operands/0/type").asText());
+        assertEquals("match:geq",
+                node.at("/collection/operands/0/match").asText());
+
+        assertEquals("koral:doc",
+                node.at("/collection/operands/1/@type").asText());
+        assertEquals("corpusSigle",
+                node.at("/collection/operands/1/key").asText());
+        assertEquals("GOE", node.at("/collection/operands/1/value").asText());
+        assertEquals("match:eq",
+                node.at("/collection/operands/1/match").asText());
     }
-    
+
+
     @Test
     public void testQuerySerializationOfVirtualCollection () {
         ClientResponse response = resource()
-                .path(getAPIVersion())
-                .path("collection/GOE-VC/query")
-                .queryParam("q", "[orth=der]")
-                .queryParam("ql", "poliqarp")
-                .queryParam("context", "base/s:s")
+
+                .path("collection/GOE-VC/query").queryParam("q", "[orth=der]")
+                .queryParam("ql", "poliqarp").queryParam("context", "base/s:s")
                 .method("GET", ClientResponse.class);
         assertEquals(ClientResponse.Status.OK.getStatusCode(),
                 response.getStatus());
         String ent = response.getEntity(String.class);
         JsonNode node = JsonUtils.readTree(ent);
         assertNotNull(node);
-        assertEquals("koral:doc", node.at("/collection/operands/0/@type")
-                .asText());
-        assertEquals("corpusSigle", node.at("/collection/operands/0/key").asText());
+        assertEquals("koral:doc",
+                node.at("/collection/operands/0/@type").asText());
+        assertEquals("corpusSigle",
+                node.at("/collection/operands/0/key").asText());
         assertEquals("GOE", node.at("/collection/operands/0/value").asText());
-        assertEquals("koral:doc", node.at("/collection/operands/1/@type")
-                .asText());
-        assertEquals("creationDate", node.at("/collection/operands/1/key").asText());
-        assertEquals("1810-01-01", node.at("/collection/operands/1/value").asText());
+        assertEquals("koral:doc",
+                node.at("/collection/operands/1/@type").asText());
+        assertEquals("creationDate",
+                node.at("/collection/operands/1/key").asText());
+        assertEquals("1810-01-01",
+                node.at("/collection/operands/1/value").asText());
 
     }
-    
+
+
     @Test
     public void testMetaQuerySerialization () {
         ClientResponse response = resource()
-                .path(getAPIVersion())
-                .path("query")
-                .queryParam("context", "sentence")
-                .queryParam("count", "20")
-                .queryParam("page", "5")
-                .queryParam("cutoff", "true")
-                .queryParam("q", "[pos=ADJA]")
+
+                .path("query").queryParam("context", "sentence")
+                .queryParam("count", "20").queryParam("page", "5")
+                .queryParam("cutoff", "true").queryParam("q", "[pos=ADJA]")
                 .queryParam("ql", "poliqarp")
                 .method("GET", ClientResponse.class);
         assertEquals(response.getStatus(),
                 ClientResponse.Status.OK.getStatusCode());
-        
+
         String ent = response.getEntity(String.class);
         JsonNode node = JsonUtils.readTree(ent);
-        
+
         assertEquals("sentence", node.at("/meta/context").asText());
         assertEquals(20, node.at("/meta/count").asInt());
-        assertEquals(5, node.at("/meta/startPage").asInt());        
+        assertEquals(5, node.at("/meta/startPage").asInt());
         assertEquals(true, node.at("/meta/cutOff").asBoolean());
-        
+
         assertEquals("koral:term", node.at("/query/wrap/@type").asText());
         assertEquals("pos", node.at("/query/wrap/layer").asText());
         assertEquals("match:eq", node.at("/query/wrap/match").asText());
         assertEquals("ADJA", node.at("/query/wrap/key").asText());
     }
 
+
     @Test
     public void testMetaQuerySerializationWithOffset () {
         ClientResponse response = resource()
-                .path(getAPIVersion())
-                .path("query")
-                .queryParam("context", "sentence")
-                .queryParam("count", "20")
-                .queryParam("page", "5")
-                .queryParam("offset", "2")
-                .queryParam("cutoff", "true")
-                .queryParam("q", "[pos=ADJA]")
-                .queryParam("ql", "poliqarp")
+
+                .path("query").queryParam("context", "sentence")
+                .queryParam("count", "20").queryParam("page", "5")
+                .queryParam("offset", "2").queryParam("cutoff", "true")
+                .queryParam("q", "[pos=ADJA]").queryParam("ql", "poliqarp")
                 .method("GET", ClientResponse.class);
         assertEquals(response.getStatus(),
                 ClientResponse.Status.OK.getStatusCode());
-        
+
         String ent = response.getEntity(String.class);
         JsonNode node = JsonUtils.readTree(ent);
-        
+
         assertEquals("sentence", node.at("/meta/context").asText());
         assertEquals(20, node.at("/meta/count").asInt());
-        assertEquals(2, node.at("/meta/startIndex").asInt());        
+        assertEquals(2, node.at("/meta/startIndex").asInt());
         assertEquals(true, node.at("/meta/cutOff").asBoolean());
     }
 
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/full/SearchServiceTest.java b/src/test/java/de/ids_mannheim/korap/web/service/full/SearchServiceTest.java
index 1a7afff..909a250 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/full/SearchServiceTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/full/SearchServiceTest.java
@@ -8,6 +8,8 @@
 import java.util.Iterator;
 import java.util.Set;
 
+import javax.ws.rs.core.MediaType;
+
 import org.eclipse.jetty.http.HttpHeaders;
 import org.junit.BeforeClass;
 import org.junit.Ignore;
@@ -38,7 +40,7 @@
     @Override
     public void initMethod () throws KustvaktException {
 //        helper().runBootInterfaces();
-        helper().setupAccount();
+//        helper().setupAccount();
     }
 
 
@@ -52,12 +54,14 @@
 
     @Test
     public void testSearchQueryPublicCorpora () {
-        ClientResponse response = resource().path("kustvakt")
+        ClientResponse response = resource()
                 .path("search").queryParam("q", "[orth=der]")
-                .queryParam("ql", "poliqarp").get(ClientResponse.class);
+                .queryParam("ql", "poliqarp")
+                .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
 //        assertEquals(ClientResponse.Status.OK.getStatusCode(),
 //                response.getStatus());
         String ent = response.getEntity(String.class);
+        System.out.println(ent);
         JsonNode node = JsonUtils.readTree(ent);
         assertNotNull(node);
         assertEquals("koral:doc", node.at("/collection/@type").asText());
@@ -72,7 +76,7 @@
 
     @Test
     public void testSearchQueryWithMeta () {
-        ClientResponse response = resource().path("kustvakt")
+        ClientResponse response = resource()
                 .path("search").queryParam("q", "[orth=der]")
                 .queryParam("ql", "poliqarp").queryParam("cutoff", "true")
                 .queryParam("count", "5").queryParam("page", "1")
@@ -93,7 +97,7 @@
 
     @Test
     public void testSearchQueryFreeExtern () {
-        ClientResponse response = resource().path("kustvakt")
+        ClientResponse response = resource()
                 .path("search").queryParam("q", "[orth=die]")
                 .queryParam("ql", "poliqarp")
                 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
@@ -115,7 +119,7 @@
     
     @Test
     public void testSearchQueryFreeIntern () {
-        ClientResponse response = resource().path("kustvakt")
+        ClientResponse response = resource()
                 .path("search").queryParam("q", "[orth=die]")
                 .queryParam("ql", "poliqarp")
                 .header(HttpHeaders.X_FORWARDED_FOR, "172.27.0.32")
@@ -138,7 +142,7 @@
     
     @Test
     public void testSearchQueryExternAuthorized () {
-        ClientResponse response = resource().path("kustvakt")
+        ClientResponse response = resource()
                 .path("search").queryParam("q", "[orth=die]")
                 .queryParam("ql", "poliqarp")
                 .header(Attributes.AUTHORIZATION,
@@ -164,7 +168,7 @@
 
     @Test
     public void testSearchQueryInternAuthorized () {
-        ClientResponse response = resource().path("kustvakt")
+        ClientResponse response = resource()
                 .path("search").queryParam("q", "[orth=die]")
                 .queryParam("ql", "poliqarp")
                 .header(Attributes.AUTHORIZATION,
@@ -195,7 +199,7 @@
     @Test
     @Ignore
     public void testSearchQueryWithCollectionQueryAuthorizedWithoutIP () {
-        ClientResponse response = resource().path("kustvakt")
+        ClientResponse response = resource()
                 .path("search").queryParam("q", "[orth=das]")
                 .queryParam("ql", "poliqarp")
                 .queryParam("cq", "textClass=politik & corpusSigle=BRZ10")
@@ -225,7 +229,7 @@
     @Test
     @Ignore
     public void testSearchQueryAuthorizedWithoutIP () {
-        ClientResponse response = resource().path("kustvakt")
+        ClientResponse response = resource()
                 .path("search").queryParam("q", "[orth=die]")
                 .queryParam("ql", "poliqarp")
                 .header(Attributes.AUTHORIZATION,
@@ -251,7 +255,7 @@
     @Test
     @Ignore
     public void testSearchForPublicCorpusWithStringId () {
-        ClientResponse response = resource().path("kustvakt")
+        ClientResponse response = resource()
                 .path("corpus").path("GOE").path("search")
                 .queryParam("q", "blau").queryParam("ql", "poliqarp")
                 .get(ClientResponse.class);
@@ -277,7 +281,7 @@
     @Test
     @Ignore
     public void testSearchForVirtualCollectionWithStringId () {
-        ClientResponse response = resource().path("kustvakt")
+        ClientResponse response = resource()
                 .path("collection").path("GOE-VC").path("search")
                 .queryParam("q", "blau").queryParam("ql", "poliqarp")
                 .get(ClientResponse.class);
@@ -315,7 +319,7 @@
             }
         }
 
-        ClientResponse response = resource().path("kustvakt")
+        ClientResponse response = resource()
                 .path("corpus").path(id).path("search").queryParam("q", "blau")
                 .queryParam("ql", "poliqarp").get(ClientResponse.class);
 
@@ -342,7 +346,7 @@
     @Test
     @Ignore
     public void testSearchForCorpusWithStringIdUnauthorized () {
-        ClientResponse response = resource().path("kustvakt")
+        ClientResponse response = resource()
                 .path("corpus").path("WPD15").path("search")
                 .queryParam("q", "blau").queryParam("ql", "poliqarp")
                 .get(ClientResponse.class);
@@ -359,7 +363,7 @@
     @Test
     @Ignore
     public void testSearchForSpecificCorpus () {
-        ClientResponse response = resource().path("kustvakt")
+        ClientResponse response = resource()
                 .path("corpus").path("GOE").path("search")
                 .queryParam("q", "[orth=das]").queryParam("ql", "poliqarp")
                 .header(Attributes.AUTHORIZATION,
@@ -401,7 +405,7 @@
                 //                System.out.println("Corpus "+id);
             }
         }
-        ClientResponse response = resource().path("kustvakt")
+        ClientResponse response = resource()
                 .path("corpus").path(id).path("search")
                 .queryParam("q", "[orth=das]").queryParam("ql", "poliqarp")
                 .header(Attributes.AUTHORIZATION,
@@ -427,7 +431,7 @@
 
     @Test
     public void testSearchSentenceMeta () {
-        ClientResponse response = resource().path("kustvakt")
+        ClientResponse response = resource()
                 .path("search").queryParam("q", "[orth=der]")
                 .queryParam("ql", "poliqarp").queryParam("context", "sentence")
                 .get(ClientResponse.class);
@@ -446,7 +450,7 @@
         QuerySerializer s = new QuerySerializer();
         s.setQuery("(der) or (das)", "CQL");
 
-        ClientResponse response = resource().path("kustvakt")
+        ClientResponse response = resource()
                 .path("search").post(ClientResponse.class, s.toJSON());
         assertEquals(ClientResponse.Status.OK.getStatusCode(),
                 response.getStatus());
@@ -465,7 +469,7 @@
         s.setQuery("[orth=der]", "poliqarp");
         s.setCollection("corpusSigle=GOE");
 
-        ClientResponse response = resource().path("kustvakt")
+        ClientResponse response = resource()
                 .path("search").post(ClientResponse.class, s.toJSON());
         assertEquals(ClientResponse.Status.OK.getStatusCode(),
                 response.getStatus());
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/full/SearchWithAvailabilityTest.java b/src/test/java/de/ids_mannheim/korap/web/service/full/SearchWithAvailabilityTest.java
index 5dc44c2..d2b1386 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/full/SearchWithAvailabilityTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/full/SearchWithAvailabilityTest.java
@@ -162,7 +162,7 @@
     
 
     private ClientResponse builtSimpleClientResponse (String collectionQuery) {
-        return resource().path(getAPIVersion()).path("search")
+        return resource().path("search")
                 .queryParam("q", "[orth=das]").queryParam("ql", "poliqarp")
                 .queryParam("cq", collectionQuery).get(ClientResponse.class);
     }
@@ -170,7 +170,7 @@
 
     private ClientResponse builtClientResponseWithIP (String collectionQuery,
             String ip) {
-        return resource().path(getAPIVersion()).path("search")
+        return resource().path("search")
                 .queryParam("q", "[orth=das]").queryParam("ql", "poliqarp")
                 .queryParam("cq", collectionQuery)
                 .header(Attributes.AUTHORIZATION,
diff --git a/src/test/java/de/ids_mannheim/korap/web/service/full/StatisticsServiceTest.java b/src/test/java/de/ids_mannheim/korap/web/service/full/StatisticsServiceTest.java
index 3252ed8..335f564 100644
--- a/src/test/java/de/ids_mannheim/korap/web/service/full/StatisticsServiceTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/service/full/StatisticsServiceTest.java
@@ -40,7 +40,7 @@
     public void testGetStatisticsNoResource ()
             throws JsonProcessingException, IOException {
         String collectionQuery = "corpusSigle=WPD15";
-        ClientResponse response = resource().path(getAPIVersion())
+        ClientResponse response = resource()
                 .path("statistics")
                 .queryParam("collectionQuery", collectionQuery)
                 .get(ClientResponse.class);
@@ -58,7 +58,7 @@
     public void testGetStatisticsWithCollectionQuery1 ()
             throws JsonProcessingException, IOException {
         String collectionQuery = "corpusSigle=GOE";
-        ClientResponse response = resource().path(getAPIVersion())
+        ClientResponse response = resource()
                 .path("statistics")
                 .queryParam("collectionQuery", collectionQuery)
                 .get(ClientResponse.class);
@@ -75,7 +75,7 @@
     @Test
     public void testGetStatisticsWithCollectionQuery2 ()
             throws JsonProcessingException, IOException {
-        ClientResponse response = resource().path(getAPIVersion())
+        ClientResponse response = resource()
                 .path("statistics")
                 .queryParam("collectionQuery", "creationDate since 1810")
                 .get(ClientResponse.class);
@@ -93,7 +93,7 @@
     @Test
     public void testGetStatisticsWithWrongCollectionQuery ()
             throws JsonProcessingException, IOException {
-        ClientResponse response = resource().path(getAPIVersion())
+        ClientResponse response = resource()
                 .path("statistics")
                 .queryParam("collectionQuery", "creationDate geq 1810")
                 .get(ClientResponse.class);
@@ -113,7 +113,7 @@
     @Test
     public void testGetStatisticsWithWrongCollectionQuery2 ()
             throws JsonProcessingException, IOException {
-        ClientResponse response = resource().path(getAPIVersion())
+        ClientResponse response = resource()
                 .path("statistics")
                 .queryParam("collectionQuery", "creationDate >= 1810")
                 .get(ClientResponse.class);
diff --git a/src/test/resources/test-default-config.xml b/src/test/resources/test-default-config.xml
index 8c6464d..09d4822 100644
--- a/src/test/resources/test-default-config.xml
+++ b/src/test/resources/test-default-config.xml
@@ -34,9 +34,11 @@
 		<property name="ignoreResourceNotFound" value="true" />
 		<property name="locations">
 			<array>
-				<value>classpath:jdbc.properties</value>
+				<value>classpath:test-jdbc.properties</value>
 				<value>classpath:hibernate.properties</value>
 				<!-- <value>file:./jdbc.properties</value> -->
+				<value>file:./kustvakt.conf</value>
+				<value>classpath:kustvakt.conf</value>
 			</array>
 		</property>
 	</bean>
@@ -55,17 +57,29 @@
 
 	<!--class="org.apache.commons.dbcp2.BasicDataSource" -->
 	<!-- org.springframework.jdbc.datasource.SingleConnectionDataSource -->
-	<!-- org.springframework.jdbc.datasource.DriverManagerDataSource -->
-	<bean id="dataSource"
+	<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
+		lazy-init="true">
+		<property name="driverClassName" value="${jdbc.driverClassName}" />
+		<property name="url" value="${jdbc.url}" />
+		<property name="username" value="${jdbc.username}" />
+		<property name="password" value="${jdbc.password}" />
+		<!-- relevant for single connection datasource and sqlite -->
+		<!-- <property name="suppressClose"> <value>true</value> </property> -->
+		<!--<property name="initialSize" value="2"/> -->
+		<property name="maxTotal" value="4" />
+		<property name="maxIdle" value="2" />
+		<property name="minIdle" value="1" />
+		<property name="maxWaitMillis" value="15000" />
+		<!--<property name="poolPreparedStatements" value="true"/> -->
+	</bean>
+
+	<bean id="sqliteDataSource"
 		class="org.springframework.jdbc.datasource.SingleConnectionDataSource"
-		lazy-init="false">
-		<property name="driverClassName" value="org.sqlite.JDBC" />
-		<property name="url" value="jdbc:sqlite::memory:" />
-		<!--<property name="initialSize" value="1" /> -->
-		<!--<property name="maxTotal" value="1" /> -->
-		<!--<property name="maxIdle" value="1" /> -->
-		<!--<property name="username" value="${jdbc.username}"/> -->
-		<!--<property name="password" value="${jdbc.password}"/> -->
+		lazy-init="true">
+		<property name="driverClassName" value="${jdbc.driverClassName}" />
+		<property name="url" value="${jdbc.url}" />
+		<property name="username" value="${jdbc.username}" />
+		<property name="password" value="${jdbc.password}" />
 		<!-- relevant for single connection datasource and sqlite -->
 		<property name="suppressClose">
 			<value>true</value>
@@ -76,9 +90,9 @@
 
 	<!-- to configure database for sqlite, mysql, etc. migrations -->
 	<bean id="flyway" class="org.flywaydb.core.Flyway" init-method="migrate">
-		<property name="baselineOnMigrate" value="false" />
+		<property name="baselineOnMigrate" value="true" />
 		<property name="locations" value="classpath:db.sqlite" />
-		<property name="dataSource" ref="dataSource" />
+		<property name="dataSource" ref="sqliteDataSource" />
 	</bean>
 
 	<bean id="kustvakt_db" class="de.ids_mannheim.korap.handlers.JDBCClient">
@@ -126,6 +140,11 @@
 	<bean id="resourceDao" class="de.ids_mannheim.korap.dao.ResourceDao"/>
 	<!-- <bean id="annotationDao" class="de.ids_mannheim.korap.dao.AnnotationDao"/> -->
 
+	<!-- Krill -->
+	<bean id="search_krill" class="de.ids_mannheim.korap.web.SearchKrill">
+		<constructor-arg value="${krill.indexDir}"/>
+	</bean>
+
 	<bean id="kustvakt_auditing" class="de.ids_mannheim.korap.handlers.JDBCAuditing">
 		<constructor-arg ref="kustvakt_db" />
 	</bean>
diff --git a/src/test/resources/test-jdbc.properties b/src/test/resources/test-jdbc.properties
new file mode 100644
index 0000000..1865408
--- /dev/null
+++ b/src/test/resources/test-jdbc.properties
@@ -0,0 +1,10 @@
+#-------------------------------------------------------------------------------
+# Sqlite Settings
+
+jdbc.database=sqlite
+jdbc.driverClassName=org.sqlite.JDBC
+jdbc.url=jdbc:sqlite:db.sqlite
+# jdbc.url=jdbc:sqlite:kustvakt_init_test.sqlite
+jdbc.username=pc
+jdbc.password=pc
+jdbc.schemaPath=classpath:db.sqlite