Falsche Anzahl Tests
[kivitendo-erp.git] / t / controllers / helpers / parse_filter.t
1 use lib 't';
2
3 use Test::More tests => 18;
4 use Test::Deep;
5 use Data::Dumper;
6
7 use_ok 'Support::TestSetup';
8 use_ok 'SL::Controller::Helper::ParseFilter';
9
10 undef *::any; # Test::Deep exports any (for junctions) and MoreCommon exports any (like in List::Moreutils)
11
12 Support::TestSetup::login();
13 my ($filter, $expected);
14
15 sub test ($$$;%) {
16   my ($filter, $expect, $msg, %params) = @_;
17   my $target = delete $params{target};
18   my $args = { parse_filter($filter, %params) };
19   my $got  = $args; $target ||= '';
20      $got = $filter             if $target =~ /filter/;
21      $got = $params{launder_to} if $target =~ /launder/;
22   cmp_deeply(
23     $got,
24     $expect,
25     $msg,
26   ) or do {
27     print STDERR "expected => ", Dumper($expect), "\ngot: => ", Dumper($got), $/;
28   }
29 }
30
31 test { }, {
32 }, 'minimal test';
33
34 test {
35   name => 'Test',
36   whut => 'moof',
37 }, {
38   query => [ %{{
39     name => 'Test',
40     whut => 'moof'
41   }} ],
42 }, 'basic test';
43
44 test {
45   customer => {
46     name => 'rainer',
47   }
48 }, {
49   query => [ 'customer.name' => 'rainer' ],
50   with_objects => [ 'customer' ],
51 }, 'joining customers';
52
53 test {
54   customer => {
55     chart => {
56       accno => 'test',
57     }
58   }
59 }, {
60   query => [ 'customer.chart.accno' => 'test' ],
61   with_objects => bag( 'customer', 'customer.chart' ),
62 }, 'nested joins';
63
64 test {
65   'customer:substr' => 'Meyer'
66 }, {
67   query => [ customer => '%Meyer%' ]
68 }, 'simple filter substr';
69
70 test {
71   'customer::ilike' => 'Meyer'
72 }, {
73   query => [ customer => { ilike => 'Meyer' } ]
74 }, 'simple method ilike';
75
76 test {
77   customer => {
78     chart => {
79       'accno:tail::like' => '1200'
80     }
81   },
82 },
83 {
84   query => [ 'customer.chart.accno' => { like => '%1200' } ],
85   with_objects => bag('customer', 'customer.chart' ),
86 }, 'all together';
87
88
89 test {
90   customer => {
91     name => 'test',
92   },
93   invoice => {
94     customer => {
95       name => 'test',
96     },
97   },
98 }, {
99   'query' => [ %{{
100                'invoice.customer.name'  => 'test',
101                'customer.name'          => 'test',
102              }} ],
103   'with_objects' => bag( 'invoice.customer', 'customer', 'invoice' )
104 }, 'object in more than one relationship';
105
106 test {
107   'orddate:date::' => 'lt',
108   'orddate:date' => '20.3.2010',
109 }, {
110     'query' => [
111                  'orddate' => { 'lt' => isa('DateTime') }
112                ]
113
114 }, 'method dispatch and date constructor';
115
116 test {
117   id => [
118     123, 125, 157
119   ]
120 }, {
121   query => [ id => [ 123,125,157 ] ],
122 }, 'arrays as value';
123
124 test {
125   'sellprice:number' => [
126     '123,4', '2,34', '0,4',
127   ]
128 }, {
129   query => [
130     sellprice => [ 123.4, 2.34, 0.4 ],
131   ],
132 }, 'arrays with filter';
133
134
135 ########### laundering
136
137 test {
138   'sellprice:number' => [
139     '123,4', '2,34', '0,4',
140   ]
141 }, {
142   'sellprice:number' => [ '123,4', '2,34', '0,4' ],
143   'sellprice_number' => [ '123,4', '2,34', '0,4' ],
144 }, 'laundering with array', target => 'filter';
145
146 my %args = (
147   'sellprice:number' => [
148     '123,4', '2,34', '0,4',
149   ],
150 );
151 test {
152   %args,
153 }, {
154   %args
155 }, 'laundering into launder does not alter filter', target => 'filter', launder_to => {};
156
157
158 test {
159   part => {
160    'sellprice:number' => '123,4',
161   }
162 }, {
163   part => {
164     'sellprice:number' => '123,4',
165     'sellprice_number' => '123,4'
166   }
167 }, 'deep laundering', target => 'filter';
168
169
170 test {
171   part => {
172    'sellprice:number' => '123,4',
173   }
174 }, {
175   part => {
176     'sellprice_number' => '123,4'
177   }
178 }, 'deep laundering, check for laundered hash', target => 'launder', launder_to => { };
179
180 ### bug: sub objects
181
182 test {
183   order => {
184     customer => {
185       'name:substr::ilike' => 'test',
186     }
187   }
188 }, {
189   query => [ 'order.customer.name' => { ilike => '%test%' } ],
190   with_objects => bag('order.customer', 'order'),
191 }, 'sub objects have to retain their prefix';
192