3 use Test::More tests => 41;
7 use_ok 'Support::TestSetup';
8 use_ok 'SL::Controller::Helper::ParseFilter';
10 use SL::DB::OrderItem;
12 undef *::any; # Test::Deep exports any (for junctions) and MoreCommon exports any (like in List::Moreutils)
14 Support::TestSetup::login();
15 my ($filter, $expected);
18 my ($filter, $expect, $msg, %params) = @_;
19 my $target = delete $params{target};
20 my $args = { parse_filter($filter, %params) };
21 my $got = $args; $target ||= '';
22 $got = $filter if $target =~ /filter/;
23 $got = $params{launder_to} if $target =~ /launder/;
29 print STDERR "expected => ", Dumper($expect), "\ngot: => ", Dumper($got), $/;
51 query => [ 'customer.name' => 'rainer' ],
52 with_objects => [ 'customer' ],
53 }, 'joining customers';
62 query => [ 'customer.chart.accno' => 'test' ],
63 with_objects => bag( 'customer', 'customer.chart' ),
67 'customer:substr' => 'Meyer'
69 query => [ customer => '%Meyer%' ]
70 }, 'simple filter substr';
73 'customer::ilike' => 'Meyer'
75 query => [ customer => { ilike => 'Meyer' } ]
76 }, 'simple method ilike';
81 'accno:tail::like' => '1200'
86 query => [ 'customer.chart.accno' => { like => '%1200' } ],
87 with_objects => bag('customer', 'customer.chart' ),
102 'invoice.customer.name' => 'test',
103 'customer.name' => 'test',
105 'with_objects' => bag( 'invoice.customer', 'customer', 'invoice' )
106 }, 'object in more than one relationship';
109 'orddate:date::' => 'lt',
110 'orddate:date' => '20.3.2010',
113 'orddate' => { 'lt' => isa('DateTime') }
116 }, 'method dispatch and date constructor';
123 query => [ id => [ 123,125,157 ] ],
124 }, 'arrays as value';
127 'sellprice:number' => [
128 '123,4', '2,34', '0,4',
132 sellprice => [ 123.4, 2.34, 0.4 ],
134 }, 'arrays with filter';
137 ########### laundering
140 'sellprice:number' => [
141 '123,4', '2,34', '0,4',
144 'sellprice:number' => [ '123,4', '2,34', '0,4' ],
145 'sellprice_number_' => { '123,4' => 1, '2,34' => 1, '0,4' => 1 },
146 }, 'laundering with array', target => 'filter';
149 'sellprice:number' => [
150 '123,4', '2,34', '0,4',
157 }, 'laundering into launder does not alter filter', target => 'filter', launder_to => {};
162 'sellprice:number' => '123,4',
166 'sellprice:number' => '123,4',
167 'sellprice_number' => '123,4'
169 }, 'deep laundering', target => 'filter';
174 'sellprice:number' => '123,4',
178 'sellprice_number' => '123,4'
180 }, 'deep laundering, check for laundered hash', target => 'launder', launder_to => { };
184 'sellprice:number' => '2',
185 'sellprice:number::' => 'le',
189 'sellprice:number' => '2',
190 'sellprice:number::' => 'le',
192 }, 'laundering of indirect filters does not alter', target => 'filter', launder_to => { };
196 'sellprice:number' => '2',
197 'sellprice:number::' => 'le',
201 'sellprice_number' => '2',
202 'sellprice_number__' => 'le',
204 }, 'laundering of indirect filters', target => 'launder', launder_to => { };
208 'sellprice:number' => '2',
209 'sellprice:number::' => 'le',
213 'sellprice:number' => '2',
214 'sellprice:number::' => 'le',
215 'sellprice_number' => '2',
216 'sellprice_number__' => 'le',
218 }, 'laundering of indirect filters - inplace', target => 'filter';
225 'name:substr::ilike' => 'test',
229 query => [ 'order.customer.name' => { ilike => '%test%' } ],
230 with_objects => bag('order.customer', 'order'),
231 }, 'sub objects have to retain their prefix';
233 ### class filter dispatch
243 }, 'object test simple', class => 'SL::DB::Manager::Part';
246 'part_type' => 'assembly',
252 }, 'object test without prefix', class => 'SL::DB::Manager::Part';
255 'part.part_type' => 'assembly',
261 }, 'object test with prefix', class => 'SL::DB::Manager::OrderItem';
264 'part_type' => [ 'part', 'assembly' ],
275 }, 'object test without prefix but complex value', class => 'SL::DB::Manager::Part';
277 'part.part_type' => [ 'part', 'assembly' ],
288 }, 'object test with prefix but complex value', class => 'SL::DB::Manager::OrderItem';
291 description => 'test'
293 query => [ description => 'test' ],
294 with_objects => [ 'order' ]
295 }, 'with_objects don\'t get clobbered', with_objects => [ 'order' ];
299 description => 'test'
302 query => [ 'customer.description' => 'test' ],
303 with_objects => [ 'order', 'customer' ]
304 }, 'with_objects get extended with auto infered objects', with_objects => [ 'order' ];
308 description => 'test'
311 query => [ 'customer.description' => 'test' ],
312 with_objects => [ 'order', 'customer' ]
313 }, 'with_objects get extended with auto infered objects with classes', class => 'SL::DB::Manager::Order', with_objects => [ 'order' ];
317 description => 'test'
320 query => [ 'customer.description' => 'test' ],
321 with_objects => [ 'customer' ]
322 }, 'with_objects: no duplicates', with_objects => [ 'customer' ];
326 'partnumber:substr::ilike' => '1',
334 with_objects => [ 'part' ],
335 }, 'Regression check: prefixing of fallback filtering in relation with custom filters', class => 'SL::DB::Manager::OrderItem';
337 'description:substr:multi::ilike' => 'term1 term2',
341 description => { ilike => '%term1%' },
342 description => { ilike => '%term2%' },
349 'all:substr:multi::ilike' => 'term1 term2',
355 'part.partnumber' => { ilike => '%term1%' },
356 'part.description' => { ilike => '%term1%' },
359 'part.partnumber' => { ilike => '%term2%' },
360 'part.description' => { ilike => '%term2%' },
364 }, 'complex :multi with custom dispatch and prefix', class => 'SL::DB::Manager::OrderItem';
367 'description:substr:multi::ilike' => q|term1 "term2 and half" 'term3 and stuff'|,
371 description => { ilike => '%term1%' },
372 description => { ilike => '%term2 and half%' },
373 description => { ilike => '%term3 and stuff%' },
376 }, ':multi with complex tokenizing';
378 # test tokenizing for custom filters by monkeypatching a custom filter into Part
379 SL::DB::Manager::Part->add_filter_specs(
381 my ($key, $value, $prefix, @additional) = @_;
382 return "$prefix$key" => { @additional, $value };
387 'part.test.what' => 2,
390 'part.test' => { 'what', 2 },
392 }, 'additional tokens', class => 'SL::DB::Manager::OrderItem';
395 'part.test.what:substr::ilike' => 2,
398 'part.test' => { 'what', { ilike => '%2%' } },
400 }, 'additional tokens + filters + methods', class => 'SL::DB::Manager::OrderItem';
403 'orderitems.part.test.what:substr::ilike' => 2,
406 'orderitems.part.test' => { 'what', { ilike => '%2%' } },
408 }, 'relationship + additional tokens + filters + methods', class => 'SL::DB::Manager::Order';
412 'obsolete::lazy_bool_eq' => '0',
417 'part.obsolete' => undef,
421 with_objects => [ 'part' ],
422 }, 'complex methods modifying the key';
426 'customer:substr::ilike' => ' Meyer'
428 query => [ customer => { ilike => '%Meyer%' } ]
432 'customer:head::ilike' => ' Meyer '
434 query => [ customer => { ilike => 'Meyer%' } ]
438 'customer:tail::ilike' => "\nMeyer\x{a0}"
440 query => [ customer => { ilike => '%Meyer' } ]