X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=t%2Fcontrollers%2Fhelpers%2Fparse_filter.t;h=bfccf4eda61e6447e9e9929f66ae305f3b069d5f;hb=770cfea95d02adbaa8e6ebfddd39ef9e52252b97;hp=0511346607ac1a35c994dc90f134da34a46a5850;hpb=05047096df7e18aad6331c61e705499c2820ddde;p=kivitendo-erp.git diff --git a/t/controllers/helpers/parse_filter.t b/t/controllers/helpers/parse_filter.t index 051134660..bfccf4eda 100644 --- a/t/controllers/helpers/parse_filter.t +++ b/t/controllers/helpers/parse_filter.t @@ -1,6 +1,6 @@ use lib 't'; -use Test::More tests => 31; +use Test::More tests => 41; 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 { @@ -205,47 +243,48 @@ test { }, 'object test simple', class => 'SL::DB::Manager::Part'; test { - 'type' => 'assembly', + 'part_type' => 'assembly', }, { query => [ - 'assembly' => 1 - ], + 'part_type', + 'assembly' + ] , }, 'object test without prefix', class => 'SL::DB::Manager::Part'; test { - 'part.type' => 'assembly', + 'part.part_type' => 'assembly', }, { query => [ - 'part.assembly' => 1 - ], + 'part.part_type', + 'assembly' + ] }, 'object test with prefix', class => 'SL::DB::Manager::OrderItem'; test { - 'type' => [ 'part', 'assembly' ], + 'part_type' => [ 'part', 'assembly' ], }, { query => [ - or => [ - and => [ or => [ assembly => 0, assembly => undef ], - "!inventory_accno_id" => 0, - "!inventory_accno_id" => undef, - ], - assembly => 1, - ] - ], + 'or', + [ + 'part_type', + 'part', + 'part_type', + 'assembly' + ] + ] }, 'object test without prefix but complex value', class => 'SL::DB::Manager::Part'; - test { - 'part.type' => [ 'part', 'assembly' ], + 'part.part_type' => [ 'part', 'assembly' ], }, { query => [ - or => [ - and => [ or => [ 'part.assembly' => 0, 'part.assembly' => undef ], - "!part.inventory_accno_id" => 0, - "!part.inventory_accno_id" => undef, - ], - 'part.assembly' => 1, - ] - ], + 'or', + [ + 'part.part_type', + 'part', + 'part.part_type', + 'assembly' + ] + ] }, 'object test with prefix but complex value', class => 'SL::DB::Manager::OrderItem'; test { @@ -291,7 +330,8 @@ test { 'part.partnumber', { ilike => '%1%' } - ] + ], + with_objects => [ 'part' ], }, 'Regression check: prefixing of fallback filtering in relation with custom filters', class => 'SL::DB::Manager::OrderItem'; test { 'description:substr:multi::ilike' => 'term1 term2', @@ -314,10 +354,12 @@ test { or => [ 'part.partnumber' => { ilike => '%term1%' }, 'part.description' => { ilike => '%term1%' }, + 'part.ean' => { ilike => '%term1%' }, ], or => [ 'part.partnumber' => { ilike => '%term2%' }, 'part.description' => { ilike => '%term2%' }, + 'part.ean' => { ilike => '%term2%' }, ], ] ], @@ -334,3 +376,68 @@ 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'; + +test { + 'orderitems.part.test.what:substr::ilike' => 2, +}, { + query => [ + 'orderitems.part.test' => { 'what', { ilike => '%2%' } }, + ] +}, 'relationship + additional tokens + filters + methods', class => 'SL::DB::Manager::Order'; + +test { + part => { + 'obsolete::lazy_bool_eq' => '0', + }, +}, { + query => [ + or => [ + 'part.obsolete' => undef, + 'part.obsolete' => 0 + ], + ], + with_objects => [ 'part' ], +}, 'complex methods modifying the key'; + + +test { + 'customer:substr::ilike' => ' Meyer' +}, { + query => [ customer => { ilike => '%Meyer%' } ] +}, 'auto trim 1'; + +test { + 'customer:head::ilike' => ' Meyer ' +}, { + query => [ customer => { ilike => 'Meyer%' } ] +}, 'auto trim 2'; + +test { + 'customer:tail::ilike' => "\nMeyer\x{a0}" +}, { + query => [ customer => { ilike => '%Meyer' } ] +}, 'auto trim 2';