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