X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F02where.t;h=c875047a17285f33562b66a59e753c5b9deb4a9c;hb=4f30591bc0678f8a5d657e79c6985606b064cd1d;hp=3e9e64923d3ea5406ac685cb2489c8cba1d6eb5a;hpb=c461c25c909bf7be7f4562f564a82af90b6fb71a;p=dbsrgits%2FSQL-Abstract.git diff --git a/t/02where.t b/t/02where.t index 3e9e649..c875047 100644 --- a/t/02where.t +++ b/t/02where.t @@ -4,15 +4,16 @@ use strict; use warnings; use Test::More; use Test::Exception; +use SQL::Abstract::Test import => ['is_same_sql_bind']; -use SQL::Abstract::Test qw/is_same_sql_bind/; -plan tests => 15; - +use Data::Dumper; use SQL::Abstract; # Make sure to test the examples, since having them break is somewhat # embarrassing. :-( +my $not_stringifiable = bless {}, 'SQLA::NotStringifiable'; + my @handle_tests = ( { where => { @@ -27,6 +28,15 @@ my @handle_tests = ( }, { + where => [ + status => 'completed', + user => 'nwiger', + ], + stmt => " WHERE ( status = ? OR user = ? )", + bind => [qw/completed nwiger/], + }, + + { where => { user => 'nwiger', status => 'completed' @@ -73,8 +83,9 @@ my @handle_tests = ( }, order => \'ticket, requestor', #LDNOTE: modified parentheses -# stmt => " WHERE ( completion_date BETWEEN ? AND ? AND status = ? ) ORDER BY ticket, requestor", - stmt => " WHERE ( ( completion_date BETWEEN ? AND ? ) AND status = ? ) ORDER BY ticket, requestor", +# +# acked by RIBASUSHI + stmt => "WHERE ( ( completion_date BETWEEN ? AND ? ) AND status = ? ) ORDER BY ticket, requestor", bind => [qw/2002-10-01 2003-02-06 completed/], }, @@ -122,7 +133,8 @@ my @handle_tests = ( }, order => \'requestor, ticket', #LDNOTE: modified parentheses -# stmt => " WHERE ( priority BETWEEN ? AND ? AND requestor IS NULL ) ORDER BY requestor, ticket", +# +# acked by RIBASUSHI stmt => " WHERE ( ( priority BETWEEN ? AND ? ) AND requestor IS NULL ) ORDER BY requestor, ticket", bind => [qw/1 3/], }, @@ -137,12 +149,14 @@ my @handle_tests = ( }, }, # LDNOTE : modified test below, just parentheses differ -# stmt => " WHERE ( id = ? AND num <= ? AND num > ? )", +# +# acked by RIBASUSHI stmt => " WHERE ( id = ? AND ( num <= ? AND num > ? ) )", bind => [qw/1 20 10/], }, { +# LDNOTE 23.03.09 : modified test below, just parentheses differ where => { foo => {-not_like => [7,8,9]}, fum => {'like' => [qw/a b/]}, nix => {'between' => [100,200] }, @@ -150,19 +164,23 @@ my @handle_tests = ( wix => {'in' => [qw/zz yy/]}, wux => {'not_in' => [qw/30 40/]} }, -# LDNOTE: modified parentheses for BETWEEN (trivial). -# Also modified the logic of "not_like" (severe, same reasons as #14 in 00where.t) -# stmt => " WHERE ( ( ( foo NOT LIKE ? ) OR ( foo NOT LIKE ? ) OR ( foo NOT LIKE ? ) ) AND ( ( fum LIKE ? ) OR ( fum LIKE ? ) ) AND nix BETWEEN ? AND ? AND nox NOT BETWEEN ? AND ? AND wix IN ( ?, ? ) AND wux NOT IN ( ?, ? ) )", - stmt => " WHERE ( ( foo NOT LIKE ? AND foo NOT LIKE ? AND foo NOT LIKE ? ) AND ( ( fum LIKE ? ) OR ( fum LIKE ? ) ) AND ( nix BETWEEN ? AND ? ) AND ( nox NOT BETWEEN ? AND ? ) AND wix IN ( ?, ? ) AND wux NOT IN ( ?, ? ) )", + stmt => " WHERE ( ( ( foo NOT LIKE ? ) OR ( foo NOT LIKE ? ) OR ( foo NOT LIKE ? ) ) AND ( ( fum LIKE ? ) OR ( fum LIKE ? ) ) AND ( nix BETWEEN ? AND ? ) AND ( nox NOT BETWEEN ? AND ? ) AND wix IN ( ?, ? ) AND wux NOT IN ( ?, ? ) )", bind => [7,8,9,'a','b',100,200,150,160,'zz','yy','30','40'], }, { where => { - id => [], bar => {'!=' => []}, }, - stmt => " WHERE ( 1=1 AND 0=1 )", + stmt => " WHERE ( 1=1 )", + bind => [], + }, + + { + where => { + id => [], + }, + stmt => " WHERE ( 0=1 )", bind => [], }, @@ -175,16 +193,45 @@ my @handle_tests = ( stmt => " WHERE ( (bar > ? AND bar < ?) AND foo IN (?, ?) )", bind => [44, 55, 22, 33], }, - + { + where => { -and => [{}, { 'me.id' => '1'}] }, + stmt => " WHERE ( ( me.id = ? ) )", + bind => [ 1 ], + }, + + { + where => { foo => $not_stringifiable, }, + stmt => " WHERE ( foo = ? )", + bind => [ $not_stringifiable ], + }, + + { + where => \[ 'foo = ?','bar' ], + stmt => " WHERE (foo = ?)", + bind => [ "bar" ], + }, + + { + where => [ \[ 'foo = ?','bar' ] ], + stmt => " WHERE (foo = ?)", + bind => [ "bar" ], + }, ); +plan tests => ( @handle_tests * 2 ) + 1; + for my $case (@handle_tests) { + local $Data::Dumper::Terse = 1; my $sql = SQL::Abstract->new; - my($stmt, @bind) = $sql->where($case->{where}, $case->{order}); - is_same_sql_bind($stmt, \@bind, $case->{stmt}, $case->{bind}) + my($stmt, @bind); + lives_ok (sub { + ($stmt, @bind) = $sql->where($case->{where}, $case->{order}); + is_same_sql_bind($stmt, \@bind, $case->{stmt}, $case->{bind}) + || diag "Search term:\n" . Dumper $case->{where}; + }); } dies_ok { my $sql = SQL::Abstract->new; $sql->where({ foo => { '>=' => [] }},); -} +};