Expand annotations to cover all generated methods
[dbsrgits/DBIx-Class.git] / t / prefetch / multiple_hasmany_torture.t
1 BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) }
2
3 use strict;
4 use warnings;
5
6 use Test::More;
7 use Test::Deep;
8 use Test::Exception;
9
10 use DBICTest;
11 use DBIx::Class::_Util 'sigwarn_silencer';
12
13 my $schema = DBICTest->init_schema();
14
15 $schema->resultset('Artist')->create(
16   {
17     name => 'mo',
18     rank => '1337',
19     cds  => [
20       {
21         title  => 'Song of a Foo',
22         year   => '1999',
23         tracks => [
24           { title  => 'Foo Me Baby One More Time' },
25           { title  => 'Foo Me Baby One More Time II' },
26           { title  => 'Foo Me Baby One More Time III' },
27           { title  => 'Foo Me Baby One More Time IV', cd_single => {
28             artist => 1, title => 'MO! Single', year => 2021, tracks => [
29               { title => 'singled out' },
30               { title => 'still alone' },
31             ]
32           } }
33         ],
34         cd_to_producer => [
35           { producer => { name => 'riba' } },
36           { producer => { name => 'sushi' } },
37         ]
38       },
39       {
40         title  => 'Song of a Foo II',
41         year   => '2002',
42         tracks => [
43           { title  => 'Quit Playing Games With My Heart' },
44           { title  => 'Bar Foo' },
45           { title  => 'Foo Bar', cd_single => {
46             artist => 2, title => 'MO! Single', year => 2020, tracks => [
47               { title => 'singled out' },
48               { title => 'still alone' },
49             ]
50           } }
51         ],
52         cd_to_producer => [
53           { producer => { name => 'riba' } },
54           { producer => { name => 'sushi' } },
55         ],
56       }
57     ],
58     artwork_to_artist => [
59       { artwork => { cd_id => 1 } },
60       { artwork => { cd_id => 2 } }
61     ]
62   }
63 );
64
65 my $artist_with_extras = {
66   artistid => 4, charfield => undef, name => 'mo', rank => 1337,
67   artwork_to_artist => [
68     { artist_id => 4, artwork_cd_id => 1, artwork => { cd_id => 1 } },
69     { artist_id => 4, artwork_cd_id => 2, artwork => { cd_id => 2 } },
70   ],
71   cds => [
72     {
73       artist => 4, cdid => 6, title => 'Song of a Foo', genreid => undef, year => 1999, single_track => undef,
74       cd_to_producer => [
75         { attribute => undef, cd => 6, producer => { name => 'riba', producerid => 4 } },
76         { attribute => undef, cd => 6, producer => { name => 'sushi', producerid => 5 } },
77       ],
78       tracks => [
79         { cd => 6, position => 1, trackid => 19, title => 'Foo Me Baby One More Time', last_updated_on => undef, last_updated_at => undef, cd_single => undef },
80         { cd => 6, position => 2, trackid => 20, title => 'Foo Me Baby One More Time II', last_updated_on => undef, last_updated_at => undef, cd_single => undef },
81         { cd => 6, position => 3, trackid => 21, title => 'Foo Me Baby One More Time III', last_updated_on => undef, last_updated_at => undef, cd_single => undef },
82         { cd => 6, position => 4, trackid => 22, title => 'Foo Me Baby One More Time IV', last_updated_on => undef, last_updated_at => undef, cd_single => {
83           single_track => 22, artist => 1, cdid => 7, title => 'MO! Single', genreid => undef, year => 2021, tracks => [
84             { cd => 7, position => 1, title => 'singled out', trackid => '23', last_updated_at => undef, last_updated_on => undef },
85             { cd => 7, position => 2, title => 'still alone', trackid => '24', last_updated_at => undef, last_updated_on => undef },
86           ],
87         } }
88       ],
89     },
90     {
91       artist => 4, cdid => 8, title => 'Song of a Foo II', genreid => undef, year => 2002, single_track => undef,
92       cd_to_producer => [
93         { attribute => undef, cd => 8, producer => { name => 'riba', producerid => 4 } },
94         { attribute => undef, cd => 8, producer => { name => 'sushi', producerid => 5 } },
95       ],
96       tracks => [
97         { cd => 8, position => 1, trackid => 25, title => 'Quit Playing Games With My Heart', last_updated_on => undef, last_updated_at => undef, cd_single => undef },
98         { cd => 8, position => 2, trackid => 26, title => 'Bar Foo', last_updated_on => undef, last_updated_at => undef, cd_single => undef },
99         { cd => 8, position => 3, trackid => 27, title => 'Foo Bar', last_updated_on => undef, last_updated_at => undef, cd_single => {
100           single_track => 27, artist => 2, cdid => 9, title => 'MO! Single', genreid => undef, year => 2020, tracks => [
101             { cd => 9, position => 1, title => 'singled out', trackid => '28', last_updated_at => undef, last_updated_on => undef },
102             { cd => 9, position => 2, title => 'still alone', trackid => '29', last_updated_at => undef, last_updated_on => undef },
103           ],
104         } }
105       ],
106     }
107   ],
108 };
109
110 my $art_rs = $schema->resultset('Artist')->search({ 'me.artistid' => 4 });
111
112
113 my $art_rs_prefetch = $art_rs->search({}, {
114   order_by => [qw/tracks.position tracks.trackid producer.producerid tracks_2.trackid artwork.cd_id/],
115   result_class => 'DBIx::Class::ResultClass::HashRefInflator',
116   prefetch => [
117     {
118       cds => [
119         { tracks => { cd_single => 'tracks' } },
120         { cd_to_producer => 'producer' }
121       ]
122     },
123     { artwork_to_artist => 'artwork' }
124   ],
125 });
126
127 cmp_deeply( $art_rs_prefetch->next, $artist_with_extras );
128
129
130 for my $order (
131   [ [qw( cds.cdid tracks.position )] ],
132
133   [ [qw( artistid tracks.cd tracks.position )],
134     'we need to proxy the knowledge from the collapser that tracks.cd is a stable sorter for CDs' ],
135 ) {
136
137   my $cds_rs_prefetch = $art_rs->related_resultset('cds')->search({}, {
138     order_by => [ $order->[0], qw(producer.name tracks_2.position) ],
139     result_class => 'DBIx::Class::ResultClass::HashRefInflator',
140     prefetch => [
141       { tracks => { cd_single => 'tracks' } },
142       { cd_to_producer => 'producer' },
143     ],
144   });
145
146   local $SIG{__WARN__} = sigwarn_silencer(qr/Unable to properly collapse has_many results/) if $order->[1];
147
148   cmp_deeply( $cds_rs_prefetch->next, $artist_with_extras->{cds}[0], '1st cd structure matches' );
149   cmp_deeply( $cds_rs_prefetch->next, $artist_with_extras->{cds}[1], '2nd cd structure matches' );
150
151   # INTERNALS! (a.k.a boars, gore and whores) DO NOT CARGOCULT!!!
152   local $TODO = $order->[1] if $order->[1];
153   ok( $cds_rs_prefetch->_resolved_attrs->{_ordered_for_collapse}, 'ordered_for_collapse detected properly' );
154 }
155
156
157 done_testing;