Add tests for more basic constructs
[dbsrgits/SQL-Abstract-2.0-ish.git] / t / 001_basic.t
1 use strict;
2 use warnings;
3
4 use Test::More tests => 18;
5 use Test::Differences;
6
7 use_ok('SQL::Abstract') or BAIL_OUT( "$@" );
8
9 # TODO: once MXMS supports %args, use that here
10 my $sqla = SQL::Abstract->create(1);
11 is $sqla->dispatch( [ -name => qw/me id/]), "me.id",
12   "Simple name generator";
13
14 is $sqla->dispatch(
15   [ '-false' ]
16 ), "0 = 1", "false value";
17
18 is $sqla->dispatch(
19   [ '-true' ]
20 ), "1 = 1", "true value";
21
22 is $sqla->dispatch(
23   [ -list => 
24     [ -name => qw/me id/],
25     [ -name => qw/me foo bar/],
26     [ -name => qw/bar/]
27   ] 
28 ), "me.id, me.foo.bar, bar",
29   "List generator";
30
31 is $sqla->dispatch(
32   [ -alias => [ -name => qw/me id/], "foobar", ] 
33 ), "me.id AS foobar",
34   "Alias generator";
35
36 is $sqla->dispatch(
37   [ -order_by => [ -name => qw/me date/ ] ]
38 ), "ORDER BY me.date";
39
40 is $sqla->dispatch(
41   [ -order_by => 
42     [ -name => qw/me date/ ],
43     [ -name => qw/me foobar/ ],
44   ]
45 ), "ORDER BY me.date, me.foobar";
46
47 is $sqla->dispatch(
48   [ -order_by => [ -desc => [ -name => qw/me date/ ] ] ]
49 ), "ORDER BY me.date DESC";
50
51
52 is $sqla->dispatch(
53   [ -in => [  ] ]
54 ), "0 = 1", "emtpy -in";
55
56 is $sqla->dispatch(
57   [ -where =>
58       [ '>', [-name => qw/me id/], [-value => 500 ] ]
59   ]
60 ), "WHERE me.id > ?", "where clause";
61
62 eq_or_diff( [ SQL::Abstract->generate(
63     [ -ast_version => 1,
64       -where =>
65         [ '>', [-name => qw/me id/], [-value => 500 ] ],
66         [ '==', [-name => qw/me name/], [-value => '200' ] ]
67     ]
68   ) ], 
69   [ "WHERE me.id > ? AND me.name = ?",
70     [ 500,
71       '200'
72     ]
73   ],
74   "Where with binds"
75 );
76
77
78 is $sqla->dispatch(
79   [ -where =>  -or =>
80       [ '>', [-name => qw/me id/], [-value => 500 ] ],
81       [ '==', [-name => qw/me name/], [-value => '200' ] ],
82   ]
83 ), "WHERE me.id > ? OR me.name = ?", "where clause";
84
85
86 is $sqla->dispatch(
87   [ -where =>  -or =>
88       [ '>', [-name => qw/me id/], [-value => 500 ] ],
89       [ -or => 
90         [ '==', [-name => qw/me name/], [-value => '200' ] ],
91         [ '==', [-name => qw/me name/], [-value => '100' ] ]
92       ]
93   ]
94 ), "WHERE me.id > ? OR me.name = ? OR me.name = ?", "where clause";
95
96 is $sqla->dispatch(
97   [ -where =>  -or =>
98       [ '==', [-name => qw/me id/], [-value => 500 ] ],
99       [ -and => 
100         [ '>', [-name => qw/me name/], [-value => '200' ] ],
101         [ '<', [-name => qw/me name/], [-value => '100' ] ]
102       ]
103   ]
104 ), "WHERE me.id = ? OR me.name > ? AND me.name < ?", "where clause";
105
106 is $sqla->dispatch(
107   [ -where =>  -and =>
108       [ '==', [-name => qw/me id/], [-value => 500 ] ],
109       [ -and => 
110         [ '>', [-name => qw/me name/], [-value => '200' ] ],
111         [ '<', [-name => qw/me name/], [-value => '100' ] ]
112       ]
113   ]
114 ), "WHERE me.id = ? AND me.name > ? AND me.name < ?", "where clause";
115
116
117 is $sqla->dispatch(
118   [ -where =>  -and =>
119       [ '==', [-name => qw/me id/], [-value => 500 ] ],
120       [ -or => 
121         [ '>', [-name => qw/me name/], [-value => '200' ] ],
122         [ '<', [-name => qw/me name/], [-value => '100' ] ]
123       ]
124   ]
125 ), "WHERE me.id = ? AND (me.name > ? OR me.name < ?)", "where clause";
126
127 eq_or_diff(
128   [SQL::Abstract->generate(
129     [ -ast_version => 1,
130       -where =>
131       [ -in => 
132         [-name => qw/me id/],
133         [-value => '100' ],
134         [-value => '200' ],
135         [-value => '300' ],
136       ]
137     ]
138   ) ],
139
140   [ "WHERE me.id IN (?, ?, ?)", 
141     [ qw/100 200 300/]
142   ],
143   
144   "where IN clause");