detect disabled ops earlier and fail
[scpubgit/Q-Branch.git] / t / 00new.t
1 use strict;
2 use warnings;
3 use Test::More;
4 use Test::Warn;
5 use Test::Exception;
6
7 use SQL::Abstract::Test import => [ qw(is_same_sql dumper) ];
8 use SQL::Abstract;
9
10 my @handle_tests = (
11       #1
12       {
13               args => {logic => 'OR'},
14               stmt => 'SELECT * FROM test WHERE ( a = ? AND b = ? )'
15       },
16       #2
17       {
18               args => {},
19               stmt => 'SELECT * FROM test WHERE ( a = ? AND b = ? )'
20       },
21       #3
22       {
23               args => {case => "upper"},
24               stmt => 'SELECT * FROM test WHERE ( a = ? AND b = ? )'
25       },
26       #4
27       {
28               args => {case => "upper", cmp => "="},
29               stmt => 'SELECT * FROM test WHERE ( a = ? AND b = ? )'
30       },
31       #5
32       {
33               args => {cmp => "=", logic => 'or'},
34               stmt => 'SELECT * FROM test WHERE ( a = ? AND b = ? )'
35       },
36       #6
37       {
38               args => {cmp => "like"},
39               stmt => 'SELECT * FROM test WHERE ( a LIKE ? AND b LIKE ? )'
40       },
41       #7
42       {
43               args => {logic => "or", cmp => "like"},
44               stmt => 'SELECT * FROM test WHERE ( a LIKE ? AND b LIKE ? )'
45       },
46       #8
47       {
48               args => {case => "lower"},
49               stmt => 'select * from test where ( a = ? and b = ? )'
50       },
51       #9
52       {
53               args => {case => "lower", cmp => "="},
54               stmt => 'select * from test where ( a = ? and b = ? )'
55       },
56       #10
57       {
58               args => {case => "lower", cmp => "like"},
59               stmt => 'select * from test where ( a like ? and b like ? )'
60       },
61       #11
62       {
63               args => {case => "lower", convert => "lower", cmp => "like"},
64               stmt => 'select * from test where ( lower(a) like lower(?) and lower(b) like lower(?) )'
65       },
66       #12
67       {
68               args => {convert => "Round"},
69               stmt => 'SELECT * FROM test WHERE ( ROUND(a) = ROUND(?) AND ROUND(b) = ROUND(?) )',
70       },
71       #13
72       {
73               args => {convert => "lower"},
74               stmt => 'SELECT * FROM test WHERE ( ( LOWER(ticket) = LOWER(?) ) OR ( LOWER(hostname) = LOWER(?) ) OR ( LOWER(taco) = LOWER(?) ) OR ( LOWER(salami) = LOWER(?) ) )',
75               where => [ { ticket => 11 }, { hostname => 11 }, { taco => 'salad' }, { salami => 'punch' } ],
76       },
77       #14
78       {
79               args => {convert => "upper"},
80               stmt => 'SELECT * FROM test WHERE ( ( UPPER(hostname) IN ( UPPER(?), UPPER(?), UPPER(?), UPPER(?) ) AND ( ( UPPER(ticket) = UPPER(?) ) OR ( UPPER(ticket) = UPPER(?) ) OR ( UPPER(ticket) = UPPER(?) ) ) ) OR ( UPPER(tack) BETWEEN UPPER(?) AND UPPER(?) ) OR ( ( ( UPPER(a) = UPPER(?) ) OR ( UPPER(a) = UPPER(?) ) OR ( UPPER(a) = UPPER(?) ) ) AND ( ( UPPER(e) != UPPER(?) ) OR ( UPPER(e) != UPPER(?) ) ) AND UPPER(q) NOT IN ( UPPER(?), UPPER(?), UPPER(?), UPPER(?), UPPER(?), UPPER(?), UPPER(?) ) ) )',
81               where => [ { ticket => [11, 12, 13],
82                            hostname => { in => ['ntf', 'avd', 'bvd', '123'] } },
83                         { tack => { between => [qw/tick tock/] } },
84                         { a => [qw/b c d/],
85                           e => { '!=', [qw(f g)] },
86                           q => { 'not in', [14..20] } } ],
87               warns => qr/\QA multi-element arrayref as an argument to the inequality op '!=' is technically equivalent to an always-true 1=1/,
88       },
89 );
90
91 for (@handle_tests) {
92   my $sqla  = SQL::Abstract->new($_->{args});
93   my $stmt;
94   lives_ok(sub {
95     (warnings_exist {
96       $stmt = $sqla->select(
97         'test',
98         '*',
99         $_->{where} || { a => 4, b => 0}
100       );
101     } $_->{warns} || []) || diag dumper($_);
102   }) or diag dumper({ %$_, threw => $@ });
103
104   is_same_sql($stmt, $_->{stmt});
105 }
106
107 done_testing;