Test with page request

Change-Id: If9600aaec0bab143f43b9433ad2b00ff7b3fb960
diff --git a/lib/Kalamar/API.pm b/lib/Kalamar/API.pm
index fcf1c5e..9f9c2b7 100644
--- a/lib/Kalamar/API.pm
+++ b/lib/Kalamar/API.pm
@@ -389,6 +389,8 @@
 
     if ($meta->{totalResults} && $meta->{totalResults} > -1) {
       my $c = $index->controller;
+
+      # TODO: Cache on auth_keys!
       my $user = $c->stash('user') // '?';
 
       $c->app->log->debug('Cache total result');
diff --git a/lib/Kalamar/Apps/test_backend.pl b/lib/Kalamar/Apps/test_backend.pl
index ee3d821..aeb0860 100644
--- a/lib/Kalamar/Apps/test_backend.pl
+++ b/lib/Kalamar/Apps/test_backend.pl
@@ -38,80 +38,89 @@
   $v->optional('count');
   $v->optional('context');
 
-  # Simple search fixture
-  return $c->render(
-    json => {
-      "\@context" => "http://korap.ids-mannheim.de/ns/KoralQuery/v0.3/context.jsonld",
-      "meta" => {
-        "count" => 25,
-        "startIndex" => 0,
-        "timeout" => 120000,
-        "context" => {
-          "left" => ["token",40],
-          "right" => ["token",40]
-        },
-        "fields" => ["pubDate","subTitle","author","pubPlace","title","textSigle","UID","ID","layerInfos","corpusSigle","docSigle","corpusID","textClass"],
-        "version" => "0.55.7",
-        "benchmark" => "0.120577834 s",
-        "totalResults" => 51,
-        "serialQuery" => "tokens:s:Baum",
-        "itemsPerPage" => 25
+  # Check for Baum
+  my $response = {
+    "\@context" => "http://korap.ids-mannheim.de/ns/KoralQuery/v0.3/context.jsonld",
+    "meta" => {
+      "count" => 25,
+      "startIndex" => 0,
+      "timeout" => 120000,
+      "context" => {
+        "left" => ["token",40],
+        "right" => ["token",40]
       },
-      "query" => {
-        "\@type" => "koral:token",
-        "wrap" => {
-          "\@type" => "koral:term",
-          "layer" => "orth",
-          "key" => "Baum",
-          "match" => "match:eq",
-          "foundry" => "opennlp",
-          "rewrites" => [
-            {
+      "fields" => ["pubDate","subTitle","author","pubPlace","title","textSigle","UID","ID","layerInfos","corpusSigle","docSigle","corpusID","textClass"],
+      "version" => "0.55.7",
+      "benchmark" => "0.120577834 s",
+      "totalResults" => 51,
+      "serialQuery" => "tokens:s:Baum",
+      "itemsPerPage" => 25
+    },
+    "query" => {
+      "\@type" => "koral:token",
+      "wrap" => {
+        "\@type" => "koral:term",
+        "layer" => "orth",
+        "key" => "Baum",
+        "match" => "match:eq",
+        "foundry" => "opennlp",
+        "rewrites" => [
+          {
               "\@type" => "koral:rewrite",
               "src" => "Kustvakt",
               "operation" => "operation:injection",
               "scope" => "foundry"
             }
-          ]
-        }
+        ]
+      }
+    },
+    "matches" => [
+      {
+        "field" => "tokens",
+        "pubPlace" => "München",
+        "textSigle" => "GOE/AGI/00000",
+        "docSigle" => "GOE/AGI",
+        "corpusSigle" => "GOE",
+        "title" => "Italienische Reise",
+        "subTitle" => "Auch ich in Arkadien!",
+        "author" => "Goethe, Johann Wolfgang von",
+        "layerInfos" => "base/s=spans corenlp/c=spans corenlp/p=tokens corenlp/s=spans dereko/s=spans malt/d=rels mdp/d=rels opennlp/p=tokens opennlp/s=spans tt/l=tokens tt/p=tokens tt/s=spans",
+        "startMore" => true,
+        "endMore" => true,
+        "snippet" => "<span class=\"context-left\"><span class=\"more\"></span>sie etwas bedeuten zu wollen und machte mit der Oberlippe eine fatale Miene. ich sprach sehr viel mit ihr durch, sie war überall zu Hause und merkte gut auf die Gegenstände. so fragte sie mich einmal, was das für ein </span><span class=\"match\"><mark>Baum</mark></span><span class=\"context-right\"> sei. es war ein schöner großer Ahorn, der erste, der mir auf der ganzen Reise zu Gesichte kam. den hatte sie doch gleich bemerkt und freute sich, da mehrere nach und nach erschienen, daß sie auch diesen Baum unterscheiden könne<span class=\"more\"></span></span>",
+        "matchID" => "match-GOE/AGI/00000-p2030-2031",
+        "UID" => 0,
+        "pubDate" => "1982"
       },
-      "matches" => [
-        {
-          "field" => "tokens",
-          "pubPlace" => "München",
-          "textSigle" => "GOE/AGI/00000",
-          "docSigle" => "GOE/AGI",
-          "corpusSigle" => "GOE",
-          "title" => "Italienische Reise",
-          "subTitle" => "Auch ich in Arkadien!",
-          "author" => "Goethe, Johann Wolfgang von",
-          "layerInfos" => "base/s=spans corenlp/c=spans corenlp/p=tokens corenlp/s=spans dereko/s=spans malt/d=rels mdp/d=rels opennlp/p=tokens opennlp/s=spans tt/l=tokens tt/p=tokens tt/s=spans",
-          "startMore" => true,
-          "endMore" => true,
-          "snippet" => "<span class=\"context-left\"><span class=\"more\"></span>sie etwas bedeuten zu wollen und machte mit der Oberlippe eine fatale Miene. ich sprach sehr viel mit ihr durch, sie war überall zu Hause und merkte gut auf die Gegenstände. so fragte sie mich einmal, was das für ein </span><span class=\"match\"><mark>Baum</mark></span><span class=\"context-right\"> sei. es war ein schöner großer Ahorn, der erste, der mir auf der ganzen Reise zu Gesichte kam. den hatte sie doch gleich bemerkt und freute sich, da mehrere nach und nach erschienen, daß sie auch diesen Baum unterscheiden könne<span class=\"more\"></span></span>",
-          "matchID" => "match-GOE/AGI/00000-p2030-2031",
-          "UID" => 0,
-          "pubDate" => "1982"
-        },
-        {
-          "field" => "tokens",
-          "pubPlace" => "München",
-          "textSigle" => "GOE/AGI/00000",
-          "docSigle" => "GOE/AGI",
-          "corpusSigle" => "GOE",
-          "title" => "Italienische Reise",
-          "subTitle" => "Auch ich in Arkadien!",
-          "author" => "Goethe, Johann Wolfgang von",
-          "layerInfos" => "base/s=spans corenlp/c=spans corenlp/p=tokens corenlp/s=spans dereko/s=spans malt/d=rels mdp/d=rels opennlp/p=tokens opennlp/s=spans tt/l=tokens tt/p=tokens tt/s=spans",
-          "startMore" => true,
-          "endMore" => true,
-          "snippet" => "<span class=\"context-left\"><span class=\"more\"></span>für ein Baum sei. es war ein schöner großer Ahorn, der erste, der mir auf der ganzen Reise zu Gesichte kam. den hatte sie doch gleich bemerkt und freute sich, da mehrere nach und nach erschienen, daß sie auch diesen </span><span class=\"match\"><mark>Baum</mark></span><span class=\"context-right\"> unterscheiden könne. sie gehe, sagte sie, nach Bozen auf die Messe, wo ich doch wahrscheinlich auch hinzöge. wenn sie mich dort anträfe, müsse ich ihr einen Jahrmarkt kaufen, welches ich ihr denn auch versprach. dort wollte sie auch ihre neue<span class=\"more\"></span></span>",
-          "matchID" => "match-GOE/AGI/00000-p2068-2069",
-          "UID" => 0,
-          "pubDate" => "1982"
-        }
-      ]
-    }
+      {
+        "field" => "tokens",
+        "pubPlace" => "München",
+        "textSigle" => "GOE/AGI/00000",
+        "docSigle" => "GOE/AGI",
+        "corpusSigle" => "GOE",
+        "title" => "Italienische Reise",
+        "subTitle" => "Auch ich in Arkadien!",
+        "author" => "Goethe, Johann Wolfgang von",
+        "layerInfos" => "base/s=spans corenlp/c=spans corenlp/p=tokens corenlp/s=spans dereko/s=spans malt/d=rels mdp/d=rels opennlp/p=tokens opennlp/s=spans tt/l=tokens tt/p=tokens tt/s=spans",
+        "startMore" => true,
+        "endMore" => true,
+        "snippet" => "<span class=\"context-left\"><span class=\"more\"></span>für ein Baum sei. es war ein schöner großer Ahorn, der erste, der mir auf der ganzen Reise zu Gesichte kam. den hatte sie doch gleich bemerkt und freute sich, da mehrere nach und nach erschienen, daß sie auch diesen </span><span class=\"match\"><mark>Baum</mark></span><span class=\"context-right\"> unterscheiden könne. sie gehe, sagte sie, nach Bozen auf die Messe, wo ich doch wahrscheinlich auch hinzöge. wenn sie mich dort anträfe, müsse ich ihr einen Jahrmarkt kaufen, welches ich ihr denn auch versprach. dort wollte sie auch ihre neue<span class=\"more\"></span></span>",
+        "matchID" => "match-GOE/AGI/00000-p2068-2069",
+        "UID" => 0,
+        "pubDate" => "1982"
+      }
+    ]
+  };
+
+
+  if ($v->param('page')) {
+    $response->{meta}->{startIndex} = $v->param("startIndex");
+  };
+
+
+  # Simple search fixture
+  return $c->render(
+    json => $response
   );
 };
 
diff --git a/lib/Kalamar/Controller/Search.pm b/lib/Kalamar/Controller/Search.pm
index a29d9d3..c246ba1 100644
--- a/lib/Kalamar/Controller/Search.pm
+++ b/lib/Kalamar/Controller/Search.pm
@@ -5,8 +5,18 @@
 # Query the KorAP backends and render a template
 sub query {
   my $c = shift;
+  my $v = $c->validation;
 
-  my $query = $c->param('q');
+  $v->optional('q');
+  $v->optional('ql');
+  $v->optional('collection');
+  $v->optional('action');
+  $v->optional('snippet');
+  $v->optional('cutoff');
+  $v->optional('count');
+  $v->optional('p');
+
+  my $query = $v->param('q');
 
   # No query
   unless ($query) {
@@ -15,26 +25,26 @@
 
   # Base parameters for remote access
   my %param = (
-    query_language => scalar $c->param('ql'),
+    query_language => scalar $v->param('ql'),
     query => $query,
-    collection => scalar $c->param('collection')
+    collection => scalar $v->param('collection')
   );
 
   # May be not relevant
-  my $inspect = (scalar $c->param('action') // '') eq 'inspect' ? 1 : 0;
+  my $inspect = (scalar $v->param('action') // '') eq 'inspect' ? 1 : 0;
 
   # Just check the serialization non-blocking
   if ($inspect) {
     $c->search->trace(
       %param => sub {
-	return $c->render(template => 'query_info');
+        return $c->render(template => 'query_info');
       }
     );
     return;
   };
 
   # Choose the snippet based on the parameter
-  my $template = scalar $c->param('snippet') ? 'snippet' : 'search';
+  my $template = scalar $v->param('snippet') ? 'snippet' : 'search';
 
   # Search non-blocking
   $c->delay(
@@ -43,11 +53,11 @@
 
       # Search with a callback (async)
       $c->search(
-	cutoff     => scalar $c->param('cutoff'),
-	count      => scalar $c->param('count'),
-	start_page => scalar $c->param('p'),
-	cb         => $delay->begin,
-	%param
+        cutoff     => scalar $v->param('cutoff'),
+        count      => scalar $v->param('count'),
+        start_page => scalar $v->param('p'),
+        cb         => $delay->begin,
+        %param
       ) if $query;
 
       # Search resource (async)
diff --git a/t/remote.t b/t/remote.t
index 53ab29e..6770c4f 100644
--- a/t/remote.t
+++ b/t/remote.t
@@ -21,12 +21,8 @@
   ->text_is('#pagination a[rel=self] span', 1)
   ;
 
-done_testing;
-__END__
-
 # Check paging
 $t->get_ok('/?q=test&p=2')
-  # ->text_is('pre.query.serial span', 'JSON-LD Serialization for "test"')
   ->text_like('#total-results', qr/\d+$/)
   ->text_is('#pagination a[rel=self] span', 2)
 ;