Retire DBIC/SqlMakerTest.pm now that SQLA::Test provides the same function
[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 ':DiffSQL';
9
10 my $schema = DBICTest->init_schema();
11
12 my $multicol_rs = $schema->resultset('Artist')->search({ artistid => \'1' }, { columns => [qw/name rank/] });
13
14 my @chain = (
15   {
16     select      => 'cdid',
17     as          => 'cd_id',
18     columns     => [ 'title' ],
19   } => 'SELECT
20           me.title,
21           me.cdid
22         FROM cd me'
23     => [qw/title cd_id/],
24
25   {
26     '+select'   => \ 'DISTINCT(foo, bar)',
27     '+as'       => [qw/foo bar/],
28   } => 'SELECT
29           me.title,
30           me.cdid,
31           DISTINCT(foo, bar)
32         FROM cd me'
33     => [qw/title cd_id foo bar/],
34
35   {
36     '+select'   => [ 'genreid', $multicol_rs->as_query ],
37     '+as'       => [qw/genreid name rank/],
38   } => 'SELECT
39           me.title,
40           me.cdid,
41           DISTINCT(foo, bar),
42           me.genreid,
43           (SELECT me.name, me.rank FROM artist me WHERE ( artistid 1 ))
44         FROM cd me'
45     => [qw/title cd_id foo bar genreid name rank/],
46
47   {
48     '+select'   => { count => 'me.cdid', -as => 'cnt' },  # lack of 'as' infers from '-as'
49     '+columns'  => { len => { length => 'me.title' } },
50   } => 'SELECT
51           me.title,
52           LENGTH( me.title ),
53           me.cdid,
54           DISTINCT(foo, bar),
55           me.genreid,
56           (SELECT me.name, me.rank FROM artist me WHERE ( artistid 1 )),
57           COUNT( me.cdid ) AS cnt
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,
66           DISTINCT(foo, bar),
67           me.genreid,
68           (SELECT me.name, me.rank FROM artist me WHERE ( artistid 1 )),
69           COUNT( me.cdid ) AS cnt,
70           unaliased randomness
71         FROM cd me'
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/],
87 );
88
89 my $rs = $schema->resultset('CD');
90
91 my $testno = 1;
92 while (@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,
109     "Correct dbic-side aliasing for test $testno",
110   );
111
112   $testno++;
113 }
114
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
137 done_testing;