Switch the main dev branch back to 'master'
[dbsrgits/DBIx-Class.git] / t / search / select_chains_unbalanced.t
CommitLineData
00336453 1use strict;
2use warnings;
3
4use Test::More;
f7f53a89 5use Test::Exception;
00336453 6
7use lib qw(t/lib);
a5a7bb73 8use DBICTest ':DiffSQL';
00336453 9
10my $schema = DBICTest->init_schema();
11
12my $multicol_rs = $schema->resultset('Artist')->search({ artistid => \'1' }, { columns => [qw/name rank/] });
13
14my @chain = (
15 {
f7f53a89 16 select => 'cdid',
17 as => 'cd_id',
18 columns => [ 'title' ],
00336453 19 } => 'SELECT
f7f53a89 20 me.title,
21 me.cdid
00336453 22 FROM cd me'
f7f53a89 23 => [qw/title cd_id/],
00336453 24
25 {
26 '+select' => \ 'DISTINCT(foo, bar)',
27 '+as' => [qw/foo bar/],
28 } => 'SELECT
00336453 29 me.title,
f7f53a89 30 me.cdid,
00336453 31 DISTINCT(foo, bar)
32 FROM cd me'
f7f53a89 33 => [qw/title cd_id foo bar/],
00336453 34
35 {
36fd7f07 36 '+select' => [ 'genreid', $multicol_rs->as_query ],
37 '+as' => [qw/genreid name rank/],
00336453 38 } => 'SELECT
00336453 39 me.title,
f7f53a89 40 me.cdid,
00336453 41 DISTINCT(foo, bar),
42 me.genreid,
b19b11ef 43 (SELECT me.name, me.rank FROM artist me WHERE ( artistid 1 ))
00336453 44 FROM cd me'
f7f53a89 45 => [qw/title cd_id foo bar genreid name rank/],
00336453 46
47 {
36fd7f07 48 '+select' => { count => 'me.cdid', -as => 'cnt' }, # lack of 'as' infers from '-as'
49 '+columns' => { len => { length => 'me.title' } },
00336453 50 } => 'SELECT
00336453 51 me.title,
52 LENGTH( me.title ),
f7f53a89 53 me.cdid,
54 DISTINCT(foo, bar),
55 me.genreid,
56 (SELECT me.name, me.rank FROM artist me WHERE ( artistid 1 )),
b19b11ef 57 COUNT( me.cdid ) AS cnt
f7f53a89 58 FROM cd me'
59 => [qw/title len cd_id foo bar genreid name rank cnt/],
60 {
61 '+select' => \'unaliased randomness',
62 } => 'SELECT
63 me.title,
64 LENGTH( me.title ),
65 me.cdid,
00336453 66 DISTINCT(foo, bar),
67 me.genreid,
68 (SELECT me.name, me.rank FROM artist me WHERE ( artistid 1 )),
f7f53a89 69 COUNT( me.cdid ) AS cnt,
00336453 70 unaliased randomness
71 FROM cd me'
f7f53a89 72 => [qw/title len cd_id foo bar genreid name rank cnt/],
73 {
74 '+select' => \'MOAR unaliased randomness',
75 } => 'SELECT
76 me.title,
77 LENGTH( me.title ),
78 me.cdid,
79 DISTINCT(foo, bar),
80 me.genreid,
81 (SELECT me.name, me.rank FROM artist me WHERE ( artistid 1 )),
82 COUNT( me.cdid ) AS cnt,
83 unaliased randomness,
84 MOAR unaliased randomness
85 FROM cd me'
86 => [qw/title len cd_id foo bar genreid name rank cnt/],
00336453 87);
88
89my $rs = $schema->resultset('CD');
90
91my $testno = 1;
92while (@chain) {
93 my $attrs = shift @chain;
94 my $sql = shift @chain;
95 my $as = shift @chain;
96
97 $rs = $rs->search ({}, $attrs);
98
99 is_same_sql_bind (
100 $rs->as_query,
101 "($sql)",
102 [],
103 "Test $testno of SELECT assembly ok",
104 );
105
106 is_deeply(
107 $rs->_resolved_attrs->{as},
108 $as,
36fd7f07 109 "Correct dbic-side aliasing for test $testno",
00336453 110 );
111
112 $testno++;
113}
114
f7f53a89 115# make sure proper exceptions are thrown on unbalanced use
116{
117 my $rs = $schema->resultset('CD')->search({}, { select => \'count(me.cdid)'});
118
119 lives_ok(sub {
120 $rs->search({}, { '+select' => 'me.cdid' })->next
121 }, 'Two dark selectors are ok');
122
123 throws_ok(sub {
124 $rs->search({}, { '+select' => 'me.cdid', '+as' => 'cdid' })->next
125 }, qr/resultset contains an unnamed selector/, 'Unnamed followed by named is not');
126
127 throws_ok(sub {
128 $rs->search_rs({}, { prefetch => 'tracks' })->next
129 }, qr/resultset contains an unnamed selector/, 'Throw on unaliased selector followed by prefetch');
130
131 throws_ok(sub {
132 $rs->search_rs({}, { '+select' => 'me.title', '+as' => 'title' })->next
133 }, qr/resultset contains an unnamed selector/, 'Throw on unaliased selector followed by +select/+as');
134}
135
136
00336453 137done_testing;