X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fsearch%2Fselect_chains_unbalanced.t;h=471cae2aefa96c0d3bcb7a885bb5c5b15319c895;hb=c8b1011e62b44d8a35b5de0ec8e7ace99879c7af;hp=d6026059ae379bf9c3ca1cd18ab43afd9ec00d95;hpb=36fd7f073078f8f36277b467910ab68676361edf;p=dbsrgits%2FDBIx-Class.git diff --git a/t/search/select_chains_unbalanced.t b/t/search/select_chains_unbalanced.t index d602605..471cae2 100644 --- a/t/search/select_chains_unbalanced.t +++ b/t/search/select_chains_unbalanced.t @@ -1,12 +1,13 @@ +BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) } + use strict; use warnings; use Test::More; +use Test::Exception; -use lib qw(t/lib); -use DBIC::SqlMakerTest; -use DBICTest; +use DBICTest ':DiffSQL'; my $schema = DBICTest->init_schema(); @@ -14,63 +15,77 @@ my $multicol_rs = $schema->resultset('Artist')->search({ artistid => \'1' }, { c my @chain = ( { - select => 'title', - as => 'title', - columns => [ 'cdid' ], + select => 'cdid', + as => 'cd_id', + columns => [ 'title' ], } => 'SELECT - me.cdid, - me.title + me.title, + me.cdid FROM cd me' - => [qw/cdid title/], + => [qw/title cd_id/], { '+select' => \ 'DISTINCT(foo, bar)', '+as' => [qw/foo bar/], } => 'SELECT - me.cdid, me.title, + me.cdid, DISTINCT(foo, bar) FROM cd me' - => [qw/cdid title foo bar/], + => [qw/title cd_id foo bar/], { - '+select' => \'unaliased randomness', + '+select' => [ 'genreid', $multicol_rs->as_query ], + '+as' => [qw/genreid name rank/], } => 'SELECT - me.cdid, me.title, + me.cdid, DISTINCT(foo, bar), - unaliased randomness + me.genreid, + (SELECT me.name, me.rank FROM artist me WHERE ( artistid 1 )) FROM cd me' - => [qw/cdid title foo bar/], + => [qw/title cd_id foo bar genreid name rank/], + { - '+select' => [ 'genreid', $multicol_rs->as_query ], - '+as' => [qw/genreid name rank/], + '+select' => { count => 'me.cdid', -as => 'cnt' }, # lack of 'as' infers from '-as' + '+columns' => { len => { length => 'me.title' } }, } => 'SELECT + me.title, + LENGTH( me.title ), me.cdid, + DISTINCT(foo, bar), + me.genreid, + (SELECT me.name, me.rank FROM artist me WHERE ( artistid 1 )), + COUNT( me.cdid ) AS cnt + FROM cd me' + => [qw/title len cd_id foo bar genreid name rank cnt/], + { + '+select' => \'unaliased randomness', + } => 'SELECT me.title, + LENGTH( me.title ), + me.cdid, DISTINCT(foo, bar), me.genreid, (SELECT me.name, me.rank FROM artist me WHERE ( artistid 1 )), + COUNT( me.cdid ) AS cnt, unaliased randomness FROM cd me' - => [qw/cdid title foo bar genreid name rank/], - + => [qw/title len cd_id foo bar genreid name rank cnt/], { - '+select' => { count => 'me.cdid', -as => 'cnt' }, # lack of 'as' infers from '-as' - '+columns' => { len => { length => 'me.title' } }, + '+select' => \'MOAR unaliased randomness', } => 'SELECT - me.cdid, me.title, LENGTH( me.title ), - COUNT( me.cdid ) AS cnt, + me.cdid, DISTINCT(foo, bar), me.genreid, (SELECT me.name, me.rank FROM artist me WHERE ( artistid 1 )), - unaliased randomness + COUNT( me.cdid ) AS cnt, + unaliased randomness, + MOAR unaliased randomness FROM cd me' - => [qw/cdid title len cnt foo bar genreid name rank/], - - + => [qw/title len cd_id foo bar genreid name rank cnt/], ); my $rs = $schema->resultset('CD'); @@ -99,4 +114,26 @@ while (@chain) { $testno++; } +# make sure proper exceptions are thrown on unbalanced use +{ + my $rs = $schema->resultset('CD')->search({}, { select => \'count(me.cdid)'}); + + lives_ok(sub { + $rs->search({}, { '+select' => 'me.cdid' })->next + }, 'Two dark selectors are ok'); + + throws_ok(sub { + $rs->search({}, { '+select' => 'me.cdid', '+as' => 'cdid' })->next + }, qr/resultset contains an unnamed selector/, 'Unnamed followed by named is not'); + + throws_ok(sub { + $rs->search_rs({}, { prefetch => 'tracks' })->next + }, qr/resultset contains an unnamed selector/, 'Throw on unaliased selector followed by prefetch'); + + throws_ok(sub { + $rs->search_rs({}, { '+select' => 'me.title', '+as' => 'title' })->next + }, qr/resultset contains an unnamed selector/, 'Throw on unaliased selector followed by +select/+as'); +} + + done_testing;