X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=t%2Fcontrollers%2Fhelpers%2Fparse_filter.t;h=856ae2e337658ae60931a08aeb7d5fde44e43829;hb=70ba777d43331b446755116b26c04913212d2f1f;hp=179c236c9f914f0993e477a55bad5d450f05b14f;hpb=df5d9efd810efd8bd01349d22e3fd4f356cc99ac;p=kivitendo-erp.git diff --git a/t/controllers/helpers/parse_filter.t b/t/controllers/helpers/parse_filter.t index 179c236c9..856ae2e33 100644 --- a/t/controllers/helpers/parse_filter.t +++ b/t/controllers/helpers/parse_filter.t @@ -1,12 +1,14 @@ use lib 't'; -use Test::More tests => 17; +use Test::More tests => 28; use Test::Deep; use Data::Dumper; use_ok 'Support::TestSetup'; use_ok 'SL::Controller::Helper::ParseFilter'; +use SL::DB::OrderItem; + undef *::any; # Test::Deep exports any (for junctions) and MoreCommon exports any (like in List::Moreutils) Support::TestSetup::login(); @@ -16,7 +18,7 @@ sub test ($$$;%) { my ($filter, $expect, $msg, %params) = @_; my $target = delete $params{target}; my $args = { parse_filter($filter, %params) }; - my $got = $args; + my $got = $args; $target ||= ''; $got = $filter if $target =~ /filter/; $got = $params{launder_to} if $target =~ /launder/; cmp_deeply( @@ -35,10 +37,10 @@ test { name => 'Test', whut => 'moof', }, { - query => [ %{{ + query => bag( name => 'Test', whut => 'moof' - }} ], + ), }, 'basic test'; test { @@ -58,7 +60,7 @@ test { } }, { query => [ 'customer.chart.accno' => 'test' ], - with_objects => bag( 'customer', 'chart' ), + with_objects => bag( 'customer', 'customer.chart' ), }, 'nested joins'; test { @@ -82,7 +84,7 @@ test { }, { query => [ 'customer.chart.accno' => { like => '%1200' } ], - with_objects => bag('customer', 'chart' ), + with_objects => bag('customer', 'customer.chart' ), }, 'all together'; @@ -96,11 +98,11 @@ test { }, }, }, { - 'query' => [ %{{ + 'query' => bag( 'invoice.customer.name' => 'test', 'customer.name' => 'test', - }} ], - 'with_objects' => bag( 'invoice', 'customer' ) + ), + 'with_objects' => bag( 'invoice.customer', 'customer', 'invoice' ) }, 'object in more than one relationship'; test { @@ -140,7 +142,7 @@ test { ] }, { 'sellprice:number' => [ '123,4', '2,34', '0,4' ], - 'sellprice_number' => [ '123,4', '2,34', '0,4' ], + 'sellprice_number_' => { '123,4' => 1, '2,34' => 1, '0,4' => 1 }, }, 'laundering with array', target => 'filter'; my %args = ( @@ -177,3 +179,117 @@ test { } }, 'deep laundering, check for laundered hash', target => 'launder', launder_to => { }; +### bug: sub objects + +test { + order => { + customer => { + 'name:substr::ilike' => 'test', + } + } +}, { + query => [ 'order.customer.name' => { ilike => '%test%' } ], + with_objects => bag('order.customer', 'order'), +}, 'sub objects have to retain their prefix'; + +### class filter dispatch +# +test { + name => 'Test', + whut => 'moof', +}, { + query => bag( + name => 'Test', + whut => 'moof' + ), +}, 'object test simple', class => 'SL::DB::Manager::Part'; + +test { + 'type' => 'assembly', +}, { + query => [ + 'assembly' => 1 + ], +}, 'object test without prefix', class => 'SL::DB::Manager::Part'; + +test { + 'part.type' => 'assembly', +}, { + query => [ + 'part.assembly' => 1 + ], +}, 'object test with prefix', class => 'SL::DB::Manager::OrderItem'; + +test { + 'type' => [ 'part', 'assembly' ], +}, { + query => [ + or => [ + and => [ or => [ assembly => 0, assembly => undef ], + "!inventory_accno_id" => 0, + "!inventory_accno_id" => undef, + ], + assembly => 1, + ] + ], +}, 'object test without prefix but complex value', class => 'SL::DB::Manager::Part'; + +test { + '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, + ] + ], +}, 'object test with prefix but complex value', class => 'SL::DB::Manager::OrderItem'; + +test { + description => 'test' +}, { + query => [ description => 'test' ], + with_objects => [ 'order' ] +}, 'with_objects don\'t get clobbered', with_objects => [ 'order' ]; + +test { + customer => { + description => 'test' + } +}, { + query => [ 'customer.description' => 'test' ], + with_objects => [ 'order', 'customer' ] +}, 'with_objects get extended with auto infered objects', with_objects => [ 'order' ]; + +test { + customer => { + description => 'test' + } +}, { + query => [ 'customer.description' => 'test' ], + with_objects => [ 'order', 'customer' ] +}, 'with_objects get extended with auto infered objects with classes', class => 'SL::DB::Manager::Order', with_objects => [ 'order' ]; + +test { + customer => { + description => 'test' + } +}, { + query => [ 'customer.description' => 'test' ], + with_objects => [ 'customer' ] +}, 'with_objects: no duplicates', with_objects => [ 'customer' ]; + +test { + part => { + 'partnumber:substr::ilike' => '1', + }, +}, { + query => [ + 'part.partnumber', { + ilike => '%1%' + } + ] +}, 'Regression check: prefixing of fallback filtering in relation with custom filters', class => 'SL::DB::Manager::OrderItem';