Add support for response pipes

Change-Id: I86905bb22ffa70b86476f0de6fa8343f687dc740
diff --git a/t/corpus_info.t b/t/corpus_info.t
index ecbf2dd..e92d8d6 100644
--- a/t/corpus_info.t
+++ b/t/corpus_info.t
@@ -35,6 +35,29 @@
   ->header_isnt('X-Kalamar-Cache', 'true')
   ;
 
+# Query passed
+$t->get_ok('/corpus')
+  ->status_is(200)
+  ->content_like(qr!"tokens":5991667065!)
+  ->json_is('/documents', 20216975)
+  ->json_is('/tokens', 5991667065)
+  ->json_is('/sentences', 403923016)
+  ->json_is('/paragraphs', 129385487)
+  ->json_is('/meta/responsePipes',undef)
+  ->header_is('X-Kalamar-Cache', 'true')
+  ;
+
+$t->get_ok('/corpus?response-pipe=glemm')
+  ->status_is(200)
+  ->content_like(qr!"tokens":5991667065!)
+  ->json_is('/documents', 20216975)
+  ->json_is('/tokens', 5991667065)
+  ->json_is('/sentences', 403923016)
+  ->json_is('/paragraphs', 129385487)
+  ->json_is('/meta/responsePipes','glemm')
+  ->header_isnt('X-Kalamar-Cache', 'true')
+  ;
+
 $t->get_ok('/corpus?cq=docSigle+%3D+\"GOE/AGA\"')
   ->status_is(200)
   ->json_is('/documents', 5)
diff --git a/t/fixtures/response_query_baum_o0_c25_pglemm_rprewind.json b/t/fixtures/response_query_baum_o0_c25_pglemm_rprewind.json
new file mode 100644
index 0000000..a1727e3
--- /dev/null
+++ b/t/fixtures/response_query_baum_o0_c25_pglemm_rprewind.json
@@ -0,0 +1,76 @@
+{
+  "status" : 200,
+  "json" : {
+    "@context" : "http://korap.ids-mannheim.de/ns/KoralQuery/v0.3/context.jsonld",
+    "meta" :  {
+      "count" : 25,
+      "startIndex" : 0,
+      "authorized" : null,
+      "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
+    },
+    "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"
+      },
+      {
+        "field" : "tokens",
+        "pubPlace" : "München",
+        "textSigle" : "GOE/AGI/00001",
+        "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"
+      }
+    ]
+  }
+}
diff --git a/t/match_info.t b/t/match_info.t
index 1dfa55f..edd84b4 100644
--- a/t/match_info.t
+++ b/t/match_info.t
@@ -33,10 +33,11 @@
   ->header_isnt('X-Kalamar-Cache', 'true')
   ;
 
-$t->get_ok('/corpus/GOE/AGF/02286/p75682-75683?_format=json')
+$t->get_ok('/corpus/GOE/AGF/02286/p75682-75683?_format=json&response-pipe=glemm')
   ->status_is(200)
   ->json_is('/textSigle', 'GOE/AGF/02286')
   ->json_is('/title','Materialien zur Geschichte der Farbenlehre')
+  ->json_is('/meta/responsePipes','glemm')
   ;
 
 # TODO:
@@ -115,6 +116,13 @@
   ->text_is('div.notify', 'Parameter "spans" invalid')
   ;
 
+$t->get_ok('/corpus/WPD15/232/39681/p2133-2134?spans=no')
+  ->content_type_is('text/html;charset=UTF-8')
+  ->status_is(400)
+  ->text_is('p.no-results', 'Unable to perform the action.')
+  ->text_is('div.notify', 'Parameter "spans" invalid')
+  ;
+
 
 done_testing;
 __END__
diff --git a/t/query.t b/t/query.t
index 0d909f4..9b51aab 100644
--- a/t/query.t
+++ b/t/query.t
@@ -345,9 +345,10 @@
 is($match->{matchID}, 'p5441-5442');
 
 # Query with pipe
-$err = $t->get_ok('/?q=baum&pipe=glemm')
+$err = $t->get_ok('/?q=baum&pipe=glemm&response-pipe=rewind')
   ->status_is(200)
   ->content_like(qr/${q}pipes${q}:${q}glemm${q}/)
+  ->content_like(qr/${q}responsePipes${q}:${q}rewind${q}/)
   ->tx->res->dom->at('#error')
   ;
 is(defined $err ? $err->text : '', '');
diff --git a/t/server/mock.pl b/t/server/mock.pl
index 32485fb..1af2fb0 100644
--- a/t/server/mock.pl
+++ b/t/server/mock.pl
@@ -142,6 +142,7 @@
   $v->optional('context');
   $v->optional('offset');
   $v->optional('pipes');
+  $v->optional('response-pipes');
   $v->optional('fields');
   $v->optional('cutoff')->in(qw/true false/);
 
@@ -180,6 +181,7 @@
   push @slug_base, 'co' . $v->param('cutoff') if defined $v->param('cutoff');
   push @slug_base, 'cq' if defined $v->param('cq');
   push @slug_base, 'p' . $v->param('pipes') if defined $v->param('pipes');
+  push @slug_base, 'rp' . $v->param('response-pipes') if defined $v->param('response-pipes');
 
   if (defined $v->param('fields') && ($v->param('fields') ne join(',', @default_search_fields))) {
     push @slug_base, 'f' .join('-', split(',', $v->param('fields')));
@@ -227,6 +229,10 @@
     $response->{json}->{meta}->{pipes} = $v->param('pipes');
   };
 
+  if ($v->param('response-pipes')) {
+    $response->{json}->{meta}->{responsePipes} = $v->param('response-pipes');
+  };
+
   # Set page parameter
   if ($v->param('page')) {
     $response->{json}->{meta}->{startIndex} = $v->param("startIndex");
@@ -243,6 +249,8 @@
 # Textinfo fixtures
 get '/v1.0/corpus/#corpusId/#docId/#textId' => sub {
   my $c = shift;
+  my $v = $c->validation;
+  $v->optional('response-pipes');
 
   my $file = join('_', (
     'textinfo',
@@ -255,6 +263,11 @@
 
   # Get response based on query parameter
   my $response = $c->load_response($slug);
+
+  if ($v->param('response-pipes')) {
+    $response->{json}->{meta}->{responsePipes} = $v->param('response-pipes');
+  };
+
   return $c->render(%$response);
 };
 
@@ -262,6 +275,8 @@
 # Matchinfo fixtures
 get '/v1.0/corpus/#corpusId/#docId/#textId/#matchId' => sub {
   my $c = shift;
+  my $v = $c->validation;
+  $v->optional('response-pipes');
 
   my $file = join('_', (
     'matchinfo',
@@ -275,6 +290,11 @@
 
   # Get response based on query parameter
   my $response = $c->load_response($slug);
+
+  if ($v->param('response-pipes')) {
+    $response->{json}->{meta}->{responsePipes} = $v->param('response-pipes');
+  };
+
   return $c->render(%$response);
 };
 
@@ -284,6 +304,7 @@
   my $c = shift;
   my $v = $c->validation;
   $v->optional('cq');
+  $v->optional('response-pipes', 'trim');
 
   my @list = 'corpusinfo';
   if ($v->param('cq')) {
@@ -293,6 +314,13 @@
 
   # Get response based on query parameter
   my $response = $c->load_response($slug);
+
+  if ($v->param('response-pipes')) {
+    my $meta = $response->{json}->{meta} // {};
+    $meta->{responsePipes} = $v->param('response-pipes');
+    $response->{json}->{meta} = $meta;
+  };
+
   return $c->render(%$response);
 };
 
diff --git a/t/text_info.t b/t/text_info.t
index 55b9637..4107931 100644
--- a/t/text_info.t
+++ b/t/text_info.t
@@ -31,6 +31,14 @@
   ->json_is('/document/fields/0/value', 'GOE/AGI/00000')
   ;
 
+$t->get_ok('/corpus/GOE/AGI/00000?response-pipe=glemm')
+  ->status_is(200)
+  ->json_is('/document/fields/0/key', 'textSigle')
+  ->json_is('/document/fields/0/value', 'GOE/AGI/00000')
+  ->json_is('/meta/responsePipes', 'glemm')
+  ;
+
+
 # Not found - should probably be 404
 $t->get_ok('/corpus/GOE/AGY/00000')
   ->status_is(200)