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