X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F05in_between.t;h=2fa8f2b789939e5b4175fcb0c3e52ebd506b673b;hb=904c36212d6024755df9c19a5f32b3e8c290bcd4;hp=f39b3e67270da92c365512a537ef6e4f97cb741e;hpb=2fadf08e171ee68c239cec896075428ae21f2232;p=dbsrgits%2FSQL-Abstract.git diff --git a/t/05in_between.t b/t/05in_between.t index f39b3e6..2fa8f2b 100644 --- a/t/05in_between.t +++ b/t/05in_between.t @@ -1,8 +1,7 @@ -#!/usr/bin/perl - use strict; use warnings; use Test::More; +use Test::Warn; use Test::Exception; use SQL::Abstract::Test import => [qw(is_same_sql_bind diag_where)]; @@ -68,7 +67,7 @@ my @in_between_tests = ( ( map { { where => { x => { -between => $_ } }, test => 'invalid -between args', - exception => qr|Operator 'BETWEEN' requires either an arrayref with two defined values or expressions, or a single literal scalarref/arrayref-ref|, + throws => qr|Operator 'BETWEEN' requires either an arrayref with two defined values or expressions, or a single literal scalarref/arrayref-ref|, } } ( [ 1, 2, 3 ], [ 1, undef, 3 ], @@ -128,6 +127,18 @@ my @in_between_tests = ( ], test => '-between POD test', }, + { + where => { 'test1.a' => { 'In', ['boom', 'bang'] } }, + stmt => ' WHERE ( test1.a IN ( ?, ? ) )', + bind => ['boom', 'bang'], + test => 'In (no dash, initial cap) with qualified column', + }, + { + where => { a => { 'between', ['boom', 'bang'] } }, + stmt => ' WHERE ( a BETWEEN ? AND ? )', + bind => ['boom', 'bang'], + test => 'between (no dash) with two placeholders', + }, { parenthesis_significant => 1, @@ -150,10 +161,12 @@ my @in_between_tests = ( bind => [], test => '-in with a literal scalarref', }, + + # note that outer parens are opened even though literal was requested below { parenthesis_significant => 1, where => { x => { -in => \['( ( ?,?,lower(y) ) )', 1, 2] } }, - stmt => "WHERE ( x IN ( ?,?,lower(y) ) )", # note that outer parens are opened even though literal was requested (RIBASUSHI) + stmt => "WHERE ( x IN ( ?,?,lower(y) ) )", bind => [1, 2], test => '-in with a literal arrayrefref', }, @@ -162,7 +175,6 @@ my @in_between_tests = ( where => { status => { -in => \"(SELECT status_codes\nFROM states)" }, }, - # failed to open outer parens on a multi-line query in 1.61 (semifor) stmt => " WHERE ( status IN ( SELECT status_codes FROM states )) ", bind => [], test => '-in multi-line subquery test', @@ -185,6 +197,7 @@ my @in_between_tests = ( bind => [2000], test => '-in POD test', }, + { where => { x => { -in => [ \['LOWER(?)', 'A' ], \'LOWER(b)', { -lower => 'c' } ] } }, stmt => " WHERE ( x IN ( LOWER(?), LOWER(b), LOWER ? ) )", @@ -192,7 +205,7 @@ my @in_between_tests = ( test => '-in with an array of function array refs with args', }, { - exception => qr/ + throws => qr/ \QSQL::Abstract before v1.75 used to generate incorrect SQL \E \Qwhen the -IN operator was given an undef-containing list: \E \Q!!!AUDIT YOUR CODE AND DATA!!! (the upcoming Data::Query-based \E @@ -205,7 +218,7 @@ my @in_between_tests = ( test => '-in with undef as an element', }, { - exception => qr/ + throws => qr/ \QSQL::Abstract before v1.75 used to generate incorrect SQL \E \Qwhen the -IN operator was given an undef-containing list: \E \Q!!!AUDIT YOUR CODE AND DATA!!! (the upcoming Data::Query-based \E @@ -217,34 +230,76 @@ my @in_between_tests = ( bind => [ 1, 2, 3 ], test => '-in with multiple undef elements', }, + { + where => { a => { -in => 42 }, b => { -not_in => 42 } }, + stmt => ' WHERE a IN ( ? ) AND b NOT IN ( ? )', + bind => [ 42, 42 ], + test => '-in, -not_in with scalar', + }, + { + where => { a => { -in => [] }, b => { -not_in => [] } }, + stmt => ' WHERE ( 0=1 AND 1=1 )', + bind => [], + test => '-in, -not_in with empty arrays', + }, + { + throws => qr/ + \QSQL::Abstract before v1.75 used to generate incorrect SQL \E + \Qwhen the -IN operator was given an undef-containing list: \E + \Q!!!AUDIT YOUR CODE AND DATA!!! (the upcoming Data::Query-based \E + \Qversion of SQL::Abstract will emit the logically correct SQL \E + \Qinstead of raising this exception)\E + /x, + where => { a => { -in => [42, undef] }, b => { -not_in => [42, undef] } }, + stmt => ' WHERE ( ( a IN ( ? ) OR a IS NULL ) AND b NOT IN ( ? ) AND b IS NOT NULL )', + bind => [ 42, 42 ], + test => '-in, -not_in with undef among elements', + }, + { + throws => qr/ + \QSQL::Abstract before v1.75 used to generate incorrect SQL \E + \Qwhen the -IN operator was given an undef-containing list: \E + \Q!!!AUDIT YOUR CODE AND DATA!!! (the upcoming Data::Query-based \E + \Qversion of SQL::Abstract will emit the logically correct SQL \E + \Qinstead of raising this exception)\E + /x, + where => { a => { -in => [undef] }, b => { -not_in => [undef] } }, + stmt => ' WHERE ( a IS NULL AND b IS NOT NULL )', + bind => [], + test => '-in, -not_in with just undef element', + }, + { + where => { a => { -in => undef } }, + throws => qr/Argument passed to the 'IN' operator can not be undefined/, + test => '-in with undef argument', + }, ); for my $case (@in_between_tests) { TODO: { local $TODO = $case->{todo} if $case->{todo}; local $SQL::Abstract::Test::parenthesis_significant = $case->{parenthesis_significant}; - - - my @w; - local $SIG{__WARN__} = sub { push @w, @_ }; + my $label = $case->{test} || 'in-between test'; my $sql = SQL::Abstract->new ($case->{args} || {}); - if ($case->{exception}) { - throws_ok { $sql->where($case->{where}) } $case->{exception}; + if (my $e = $case->{throws}) { + throws_ok { $sql->where($case->{where}) } $e, "$label throws correctly"; } else { - my ($stmt, @bind) = $sql->where($case->{where}); + my ($stmt, @bind); + warnings_are { + ($stmt, @bind) = $sql->where($case->{where}); + } [], "$label gives no warnings"; + is_same_sql_bind( $stmt, \@bind, $case->{stmt}, $case->{bind}, + "$label generates correct SQL and bind", ) || diag_where ( $case->{where} ); } - - is (@w, 0, $case->{test} || 'No warnings within in-between tests') - || diag join "\n", 'Emitted warnings:', @w; } }