Fix for gut-reaching travesty as reported by gbjk
[dbsrgits/DBIx-Class.git] / t / inflate / hri_torture.t
1 use strict;
2 use warnings;
3
4 use Test::More;
5 use Test::Deep;
6 use lib qw(t/lib);
7 use DBICTest;
8
9 # More tests like this in t/prefetch/manual.t
10
11 my $schema = DBICTest->init_schema(no_populate => 1, quote_names => 1);
12 $schema->resultset('Artist')->create({ name => 'JMJ', cds => [{
13   title => 'Magnetic Fields',
14   year => 1981,
15   genre => { name => 'electro' },
16   tracks => [
17     { title => 'm1' },
18     { title => 'm2' },
19     { title => 'm3' },
20     { title => 'm4' },
21   ],
22 } ] });
23
24
25 $schema->resultset('CD')->create({
26   title => 'Equinoxe',
27   year => 1978,
28   artist => { name => 'JMJ' },
29   genre => { name => 'electro' },
30   tracks => [
31     { title => 'e1' },
32     { title => 'e2' },
33     { title => 'e3' },
34   ],
35   single_track => {
36     title => 'o1',
37     cd => {
38       title => 'Oxygene',
39       year => 1976,
40       artist => { name => 'JMJ' },
41       tracks => [
42         { title => 'o2', position => 2},  # the position should not be needed here, bug in MC
43       ],
44     },
45   },
46 });
47
48 for (1,2) {
49   $schema->resultset('CD')->create({ artist => 1, year => 1977, title => "fuzzy_$_" });
50 }
51
52 {
53   package DBICTest::HRI::Subclass;
54   use base 'DBIx::Class::ResultClass::HashRefInflator';
55 }
56
57 {
58   package DBICTest::HRI::Around;
59   use base 'DBIx::Class::ResultClass::HashRefInflator';
60
61   sub inflate_result { shift->next::method(@_) }
62 }
63
64 for my $rs (
65   $schema->resultset('CD')->search_rs({}, { result_class => 'DBIx::Class::ResultClass::HashRefInflator' }),
66   $schema->resultset('CD')->search_rs({}, { result_class => 'DBICTest::HRI::Subclass' }),
67   $schema->resultset('CD')->search_rs({}, { result_class => 'DBICTest::HRI::Around' }),
68 ) {
69
70 cmp_deeply
71   [ $rs->search({}, {
72     columns => {
73       year                          => 'me.year',
74       'single_track.cd.artist.name' => 'artist.name',
75     },
76     join => { single_track => { cd => 'artist' } },
77     order_by => [qw/me.cdid artist.artistid/],
78   })->all ],
79   [
80     { year => 1981, single_track => undef },
81     { year => 1976, single_track => undef },
82     { year => 1978, single_track => {
83       cd => {
84         artist => { name => "JMJ" }
85       },
86     }},
87     { year => 1977, single_track => undef },
88     { year => 1977, single_track => undef },
89
90   ],
91   'plain 1:1 descending chain ' . $rs->result_class
92 ;
93
94 cmp_deeply
95   [ $rs->search({}, {
96     columns => {
97       'artist'                                  => 'me.artist',
98       'title'                                   => 'me.title',
99       'year'                                    => 'me.year',
100       'single_track.cd.artist.artistid'         => 'artist.artistid',
101       'single_track.cd.artist.cds.cdid'         => 'cds.cdid',
102       'single_track.cd.artist.cds.tracks.title' => 'tracks.title',
103     },
104     join => { single_track => { cd => { artist => { cds => 'tracks' } } } },
105     order_by => [qw/me.cdid artist.artistid cds.cdid tracks.trackid/],
106   })->all ],
107   [
108     {
109       artist => 1, title => "Magnetic Fields", year => 1981, single_track => undef,
110     },
111     {
112       artist => 1, title => "Oxygene", year => 1976, single_track => undef,
113     },
114     {
115       artist => 1, title => "Equinoxe", year => 1978, single_track => {
116         cd => {
117           artist => {
118             artistid => 1, cds => {
119               cdid => 1, tracks => {
120                 title => "m1"
121               }
122             }
123           }
124         }
125       },
126     },
127     {
128       artist => 1, title => "Equinoxe", year => 1978, single_track => {
129         cd => {
130           artist => {
131             artistid => 1, cds => {
132               cdid => 1, tracks => {
133                 title => "m2"
134               }
135             }
136           }
137         }
138       },
139     },
140     {
141       artist => 1, title => "Equinoxe", year => 1978, single_track => {
142         cd => {
143           artist => {
144             artistid => 1, cds => {
145               cdid => 1, tracks => {
146                 title => "m3"
147               }
148             }
149           }
150         }
151       },
152     },
153     {
154       artist => 1, title => "Equinoxe", year => 1978, single_track => {
155         cd => {
156           artist => {
157             artistid => 1, cds => {
158               cdid => 1, tracks => {
159                 title => "m4"
160               }
161             }
162           }
163         }
164       },
165     },
166     {
167       artist => 1, title => "Equinoxe", year => 1978, single_track => {
168         cd => {
169           artist => {
170             artistid => 1, cds => {
171               cdid => 2, tracks => {
172                 title => "o2"
173               }
174             }
175           }
176         }
177       },
178     },
179     {
180       artist => 1, title => "Equinoxe", year => 1978, single_track => {
181         cd => {
182           artist => {
183             artistid => 1, cds => {
184               cdid => 2, tracks => {
185                 title => "o1"
186               }
187             }
188           }
189         }
190       },
191     },
192     {
193       artist => 1, title => "Equinoxe", year => 1978, single_track => {
194         cd => {
195           artist => {
196             artistid => 1, cds => {
197               cdid => 3, tracks => {
198                 title => "e1"
199               }
200             }
201           }
202         }
203       },
204     },
205     {
206       artist => 1, title => "Equinoxe", year => 1978, single_track => {
207         cd => {
208           artist => {
209             artistid => 1, cds => {
210               cdid => 3, tracks => {
211                 title => "e2"
212               }
213             }
214           }
215         }
216       },
217     },
218     {
219       artist => 1, title => "Equinoxe", year => 1978, single_track => {
220         cd => {
221           artist => {
222             artistid => 1, cds => {
223               cdid => 3, tracks => {
224                 title => "e3"
225               }
226             }
227           }
228         }
229       },
230     },
231     {
232       artist => 1, title => "Equinoxe", year => 1978, single_track => {
233         cd => {
234           artist => {
235             artistid => 1, cds => {
236               cdid => 4, tracks => undef
237             }
238           }
239         }
240       },
241     },
242     {
243       artist => 1, title => "Equinoxe", year => 1978, single_track => {
244         cd => {
245           artist => {
246             artistid => 1, cds => {
247               cdid => 5, tracks => undef
248             }
249           }
250         }
251       },
252     },
253     {
254       artist => 1, title => "fuzzy_1", year => 1977, single_track => undef,
255     },
256     {
257       artist => 1, title => "fuzzy_2", year => 1977, single_track => undef,
258     }
259   ],
260   'non-collapsing 1:1:1:M:M chain ' . $rs->result_class,
261 ;
262
263 cmp_deeply
264   [ $rs->search({}, {
265     columns => {
266       'artist'                                  => 'me.artist',
267       'title'                                   => 'me.title',
268       'year'                                    => 'me.year',
269       'single_track.cd.artist.artistid'         => 'artist.artistid',
270       'single_track.cd.artist.cds.cdid'         => 'cds.cdid',
271       'single_track.cd.artist.cds.tracks.title' => 'tracks.title',
272     },
273     join => { single_track => { cd => { artist => { cds => 'tracks' } } } },
274     order_by => [qw/me.cdid artist.artistid cds.cdid tracks.trackid/],
275     collapse => 1,
276   })->all ],
277   [
278     {
279       artist => 1, title => "Magnetic Fields", year => 1981, single_track => undef,
280     },
281     {
282       artist => 1, title => "Oxygene", year => 1976, single_track => undef,
283     },
284     {
285       artist => 1, title => "Equinoxe", year => 1978, single_track => {
286         cd => {
287           artist => {
288             artistid => 1, cds => [
289               {
290                 cdid => 1, tracks => [
291                   { title => "m1" },
292                   { title => "m2" },
293                   { title => "m3" },
294                   { title => "m4" },
295                 ]
296               },
297               {
298                 cdid => 2, tracks => [
299                   { title => "o2" },
300                   { title => "o1" },
301                 ]
302               },
303               {
304                 cdid => 3, tracks => [
305                   { title => "e1" },
306                   { title => "e2" },
307                   { title => "e3" },
308                 ]
309               },
310               {
311                 cdid => 4, tracks => [],
312               },
313               {
314                 cdid => 5, tracks => [],
315               }
316             ]
317           }
318         }
319       },
320     },
321     {
322       artist => 1, title => "fuzzy_1", year => 1977, single_track => undef,
323     },
324     {
325       artist => 1, title => "fuzzy_2", year => 1977, single_track => undef,
326     }
327   ],
328   'collapsing 1:1:1:M:M chain ' . $rs->result_class,
329 ;
330
331 }
332
333 done_testing;