ParseFilter: Laundern schon vor dem eigentlichen parsen.
authorSven Schöling <s.schoeling@linet-services.de>
Wed, 18 Feb 2015 09:50:03 +0000 (10:50 +0100)
committerSven Schöling <s.schoeling@linet-services.de>
Thu, 5 Mar 2015 12:42:59 +0000 (13:42 +0100)
Erlaubt es indirekte Filter im Template roundtrip safe zu machen.

SL/Controller/Helper/ParseFilter.pm
t/controllers/helpers/parse_filter.t

index 759e146..c38974e 100644 (file)
@@ -43,10 +43,10 @@ sub parse_filter {
     _add_uniq($objects, $_) for @$auto_objects;
   }
 
-  my $query = _parse_filter($flattened, $objects, %params);
-
   _launder_keys($filter, $params{launder_to}) unless $params{no_launder};
 
+  my $query = _parse_filter($flattened, $objects, %params);
+
   return
     ($query   && @$query   ? (query => $query) : ()),
     ($objects && @$objects ? ( with_objects => [ uniq @$objects ]) : ());
index 583b26c..a53c8c4 100644 (file)
@@ -1,6 +1,6 @@
 use lib 't';
 
-use Test::More tests => 31;
+use Test::More tests => 36;
 use Test::Deep;
 use Data::Dumper;
 
@@ -179,6 +179,44 @@ test {
   }
 }, 'deep laundering, check for laundered hash', target => 'launder', launder_to => { };
 
+test {
+  part => {
+   'sellprice:number' => '2',
+   'sellprice:number::' => 'le',
+  }
+}, {
+  part => {
+   'sellprice:number' => '2',
+   'sellprice:number::' => 'le',
+  }
+}, 'laundering of indirect filters does not alter', target => 'filter', launder_to => { };
+
+test {
+  part => {
+   'sellprice:number' => '2',
+   'sellprice:number::' => 'le',
+  }
+}, {
+  part => {
+    'sellprice_number' => '2',
+    'sellprice_number__' => 'le',
+  }
+}, 'laundering of indirect filters', target => 'launder', launder_to => { };
+
+test {
+  part => {
+   'sellprice:number' => '2',
+   'sellprice:number::' => 'le',
+  }
+}, {
+  part => {
+    'sellprice:number' => '2',
+    'sellprice:number::' => 'le',
+    'sellprice_number' => '2',
+    'sellprice_number__' => 'le',
+  }
+}, 'laundering of indirect filters - inplace', target => 'filter';
+
 ### bug: sub objects
 
 test {
@@ -335,3 +373,27 @@ test {
     ]
   ]
 }, ':multi with complex tokenizing';
+
+# test tokenizing for custom filters by monkeypatching a custom filter into Part
+SL::DB::Manager::Part->add_filter_specs(
+  test => sub {
+    my ($key, $value, $prefix, @additional) = @_;
+    return "$prefix$key" => { @additional, $value };
+  }
+);
+
+test {
+  'part.test.what' => 2,
+}, {
+  query => [
+    'part.test' => { 'what', 2 },
+  ]
+}, 'additional tokens', class => 'SL::DB::Manager::OrderItem';
+
+test {
+  'part.test.what:substr::ilike' => 2,
+}, {
+  query => [
+    'part.test' => { 'what', { ilike => '%2%' } },
+  ]
+}, 'additional tokens + filters + methods', class => 'SL::DB::Manager::OrderItem';