Refactor to use a (hopefully) clearer dispatch table method
[dbsrgits/SQL-Abstract-2.0-ish.git] / t / 100_where_basic.t
1 use strict;
2 use warnings;
3
4 use Test::More tests => 12;
5 use Test::Differences;
6
7 use_ok('SQL::Abstract') or BAIL_OUT( "$@" );
8
9 my $sqla = SQL::Abstract->create(1);
10
11 is $sqla->dispatch(
12   [ -where =>
13       [ '>', [-name => qw/me id/], [-value => 500 ] ]
14   ]
15 ), "WHERE me.id > ?", 
16    "simple where clause";
17
18 is $sqla->dispatch(
19   [ -in => [  ] ]
20 ), "0 = 1", "emtpy -in";
21
22 is $sqla->dispatch(
23   [ -where =>
24       [ '>', [-name => qw/me id/], [-value => 500 ] ]
25   ]
26 ), "WHERE me.id > ?", 
27    "simple where clause";
28
29 eq_or_diff( [ SQL::Abstract->generate(
30     [ -ast_version => 1,
31       -where =>
32         [ '>', [-name => qw/me id/], [-value => 500 ] ],
33         [ '==', [-name => qw/me name/], [-value => '200' ] ]
34     ]
35   ) ], 
36   [ "WHERE me.id > ? AND me.name = ?",
37     [ 500,
38       '200'
39     ]
40   ],
41   "Where with binds"
42 );
43
44
45 is $sqla->dispatch(
46   [ -where =>  -or =>
47       [ '>', [-name => qw/me id/], [-value => 500 ] ],
48       [ '==', [-name => qw/me name/], [-value => '200' ] ],
49   ]
50 ), "WHERE me.id > ? OR me.name = ?", 
51    "where clause (simple or)";
52
53
54 is $sqla->dispatch(
55   [ -where =>  -or =>
56       [ '>', [-name => qw/me id/], [-value => 500 ] ],
57       [ -or => 
58         [ '==', [-name => qw/me name/], [-value => '200' ] ],
59         [ '==', [-name => qw/me name/], [-value => '100' ] ]
60       ]
61   ]
62 ), "WHERE me.id > ? OR me.name = ? OR me.name = ?",
63    "where clause (nested or)";
64
65 is $sqla->dispatch(
66   [ -where =>  -or =>
67       [ '==', [-name => qw/me id/], [-value => 500 ] ],
68       [ -and => 
69         [ '>', [-name => qw/me name/], [-value => '200' ] ],
70         [ '<', [-name => qw/me name/], [-value => '100' ] ]
71       ]
72   ]
73 ), "WHERE me.id = ? OR me.name > ? AND me.name < ?", 
74    "where clause (inner and)";
75
76 is $sqla->dispatch(
77   [ -where =>  -and =>
78       [ '==', [-name => qw/me id/], [-value => 500 ] ],
79       [ -and => 
80         [ '>', [-name => qw/me name/], [-value => '200' ] ],
81         [ '<', [-name => qw/me name/], [-value => '100' ] ]
82       ]
83   ]
84 ), "WHERE me.id = ? AND me.name > ? AND me.name < ?", 
85    "where clause (nested and)";
86
87
88 is $sqla->dispatch(
89   [ -where =>  -and =>
90       [ '==', [-name => qw/me id/], [-value => 500 ] ],
91       [ -or => 
92         [ '>', [-name => qw/me name/], [-value => '200' ] ],
93         [ '<', [-name => qw/me name/], [-value => '100' ] ]
94       ]
95   ]
96 ), "WHERE me.id = ? AND (me.name > ? OR me.name < ?)", 
97    "where clause (inner or)";
98
99 eq_or_diff(
100   [SQL::Abstract->generate(
101     [ -ast_version => 1,
102       -where =>
103       [ -in => 
104         [-name => qw/me id/],
105         [-value => '100' ],
106         [-value => '200' ],
107         [-value => '300' ],
108       ]
109     ]
110   ) ],
111
112   [ "WHERE me.id IN (?, ?, ?)", 
113     [ qw/100 200 300/]
114   ],
115   
116   "where IN clause");
117
118
119 eq_or_diff(
120   [SQL::Abstract->generate(
121     [ -ast_version => 1,
122       -where =>
123       [ -not_in => 
124         [-name => qw/me id/],
125         [-value => '100' ],
126         [-value => '200' ],
127         [-value => '300' ],
128       ]
129     ]
130   ) ],
131
132   [ "WHERE me.id NOT IN (?, ?, ?)", 
133     [ qw/100 200 300/]
134   ],
135   
136   "where NOT IN clause");