Test for restricted prefetch (now passing again after previous commit)
[dbsrgits/DBIx-Class.git] / t / prefetch / manual.t
1 use strict;
2 use warnings;
3
4 use Test::More;
5 use Test::Exception;
6 use lib qw(t/lib);
7 use DBICTest;
8
9 my $schema = DBICTest->init_schema(no_populate => 1);
10
11 $schema->resultset('Artist')->create({ name => 'JMJ', cds => [{
12   title => 'Magnetic Fields',
13   year => 1981,
14   genre => { name => 'electro' },
15   tracks => [
16     { title => 'm1' },
17     { title => 'm2' },
18     { title => 'm3' },
19     { title => 'm4' },
20   ],
21 } ] });
22
23 $schema->resultset('CD')->create({
24   title => 'Equinoxe',
25   year => 1978,
26   artist => { name => 'JMJ' },
27   genre => { name => 'electro' },
28   tracks => [
29     { title => 'e1' },
30     { title => 'e2' },
31     { title => 'e3' },
32   ],
33   single_track => {
34     title => 'o1',
35     cd => {
36       title => 'Oxygene',
37       year => 1976,
38       artist => { name => 'JMJ' },
39       tracks => [
40         { title => 'o2', position => 2},  # the position should not be here, bug in MC
41       ],
42     },
43   },
44 });
45
46 my $rs = $schema->resultset ('CD')->search ({}, {
47   join => [ 'tracks', { single_track => { cd => { artist => { cds => 'tracks' } } } }  ],
48   collapse => 1,
49   columns => [
50     { 'year'                                    => 'me.year' },               # non-unique
51     { 'genreid'                                 => 'me.genreid' },            # nullable
52     { 'tracks.title'                            => 'tracks.title' },          # non-unique (no me.id)
53     { 'single_track.cd.artist.cds.cdid'         => 'cds.cdid' },              # to give uniquiness to ...tracks.title below
54     { 'single_track.cd.artist.artistid'         => 'artist.artistid' },       # uniqufies entire parental chain
55     { 'single_track.cd.artist.cds.year'         => 'cds.year' },              # non-unique
56     { 'single_track.cd.artist.cds.genreid'      => 'cds.genreid' },           # nullable
57     { 'single_track.cd.artist.cds.tracks.title' => 'tracks_2.title' },        # unique when combined with ...cds.cdid above
58     { 'latest_cd'                     => \ "(SELECT MAX(year) FROM cd)" },    # random function
59     { 'title'                                   => 'me.title' },              # uniquiness for me
60     { 'artist'                                  => 'me.artist' },             # uniquiness for me
61   ],
62   order_by => [{ -desc => 'cds.year' }, { -desc => 'me.title'} ],
63 });
64
65 my $hri_rs = $rs->search({}, { result_class => 'DBIx::Class::ResultClass::HashRefInflator' });
66
67 is_deeply (
68   [$hri_rs->all],
69   [
70     {
71       artist => 1,
72       genreid => 1,
73       latest_cd => 1981,
74       single_track => {
75         cd => {
76           artist => {
77             artistid => 1,
78             cds => [
79               {
80                 cdid => 1,
81                 genreid => 1,
82                 tracks => [
83                   {
84                     title => "m1"
85                   },
86                   {
87                     title => "m2"
88                   },
89                   {
90                     title => "m3"
91                   },
92                   {
93                     title => "m4"
94                   }
95                 ],
96                 year => 1981
97               },
98               {
99                 cdid => 3,
100                 genreid => 1,
101                 tracks => [
102                   {
103                     title => "e1"
104                   },
105                   {
106                     title => "e2"
107                   },
108                   {
109                     title => "e3"
110                   }
111                 ],
112                 year => 1978
113               },
114               {
115                 cdid => 2,
116                 genreid => undef,
117                 tracks => [
118                   {
119                     title => "o1"
120                   },
121                   {
122                     title => "o2"
123                   }
124                 ],
125                 year => 1976
126               }
127             ]
128           }
129         }
130       },
131       title => "Equinoxe",
132       tracks => [
133         {
134           title => "e1"
135         },
136         {
137           title => "e2"
138         },
139         {
140           title => "e3"
141         }
142       ],
143       year => 1978
144     },
145     {
146       artist => 1,
147       genreid => undef,
148       latest_cd => 1981,
149       single_track => undef,
150       title => "Oxygene",
151       tracks => [
152         {
153           title => "o1"
154         },
155         {
156           title => "o2"
157         }
158       ],
159       year => 1976
160     },
161     {
162       artist => 1,
163       genreid => 1,
164       latest_cd => 1981,
165       single_track => undef,
166       title => "Magnetic Fields",
167       tracks => [
168         {
169           title => "m1"
170         },
171         {
172           title => "m2"
173         },
174         {
175           title => "m3"
176         },
177         {
178           title => "m4"
179         }
180       ],
181       year => 1981
182     },
183   ],
184   'W00T, manual prefetch with collapse works'
185 );
186
187 my $row = $rs->next;
188
189 TODO: {
190   local $TODO = 'Something is wrong with filter type rels, they throw on incomplete objects >.<';
191
192   lives_ok {
193     is_deeply (
194       { $row->single_track->get_columns },
195       {},
196       'empty intermediate object ok',
197     )
198   } 'no exception';
199 }
200
201 is ($rs->cursor->next, undef, 'cursor exhausted');
202
203 TODO: {
204 local $TODO = 'this does not work at all, need to promote rsattrs to an object on its own';
205 # make sure has_many column redirection does not do weird stuff when collapse is requested
206 for my $pref_args (
207   { prefetch => 'cds'},
208   { collapse => 1 }
209 ) {
210   for my $col_and_join_args (
211     { '+columns' => { 'cd_title' => 'cds_2.title' }, join => [ 'cds', 'cds' ] },
212     { '+columns' => { 'cd_title' => 'cds.title' }, join => 'cds', }
213   ) {
214
215     my $weird_rs = $schema->resultset('Artist')->search({}, {
216       %$col_and_join_args, %$pref_args,
217     });
218
219     for (qw/next all first/) {
220       throws_ok { $weird_rs->$_ } qr/not yet determined exception text/;
221     }
222   }
223 }
224 }
225
226 done_testing;