Pod/comment fixes
[dbsrgits/DBIx-Class.git] / t / multi_create / torture.t
1 use strict;
2 use warnings;
3
4 use Test::More;
5 use lib qw(t/lib);
6 use DBICTest;
7
8 plan tests => 23;
9
10 # an insane multicreate
11 # (should work, despite the fact that no one will probably use it this way)
12
13 my $schema = DBICTest->init_schema();
14
15 # first count how many rows do we initially have
16 my $counts;
17 $counts->{$_} = $schema->resultset($_)->count for qw/Artist CD Genre Producer Tag/;
18
19 # do the crazy create
20 eval {
21   $schema->resultset('CD')->create ({
22     artist => {
23       name => 'james',
24     },
25     title => 'Greatest hits 1',
26     year => '2012',
27     genre => {
28       name => '"Greatest" collections',
29     },
30     tags => [
31       { tag => 'A' },
32       { tag => 'B' },
33     ],
34     cd_to_producer => [
35       {
36         producer => {
37           name => 'bob',
38           producer_to_cd => [
39             {
40               cd => {
41                 artist => {
42                   name => 'lars',
43                   cds => [
44                     {
45                       title => 'Greatest hits 2',
46                       year => 2012,
47                       genre => {
48                         name => '"Greatest" collections',
49                       },
50                       tags => [
51                         { tag => 'A' },
52                         { tag => 'B' },
53                       ],
54                       # This cd is created via artist so it doesn't know about producers
55                       cd_to_producer => [
56                         { producer => { name => 'bob' } },
57                         { producer => { name => 'paul' } },
58                         { producer => {
59                           name => 'flemming',
60                           producer_to_cd => [
61                             { cd => {
62                               artist => {
63                                 name => 'kirk',
64                                 cds => [
65                                   {
66                                     title => 'Greatest hits 3',
67                                     year => 2012,
68                                     genre => {
69                                       name => '"Greatest" collections',
70                                     },
71                                     tags => [
72                                       { tag => 'A' },
73                                       { tag => 'B' },
74                                     ],
75                                   },
76                                   {
77                                     title => 'Greatest hits 4',
78                                     year => 2012,
79                                     genre => {
80                                       name => '"Greatest" collections2',
81                                     },
82                                     tags => [
83                                       { tag => 'A' },
84                                       { tag => 'B' },
85                                     ],
86                                   },
87                                 ],
88                               },
89                               title => 'Greatest hits 5',
90                               year => 2013,
91                               genre => {
92                                 name => '"Greatest" collections2',
93                               },
94                             }},
95                           ],
96                         }},
97                       ],
98                     },
99                   ],
100                 },
101                 title => 'Greatest hits 6',
102                 year => 2012,
103                 genre => {
104                   name => '"Greatest" collections',
105                 },
106                 tags => [
107                   { tag => 'A' },
108                   { tag => 'B' },
109                 ],
110               },
111             },
112             {
113               cd => {
114                 artist => {
115                   name => 'lars',    # should already exist
116                   # even though the artist 'name' is not uniquely constrained
117                   # find_or_create will arguably DWIM
118                 },
119                 title => 'Greatest hits 7',
120                 year => 2013,
121               },
122             },
123           ],
124         },
125       },
126     ],
127   });
128
129   is ($schema->resultset ('Artist')->count, $counts->{Artist} + 3, '3 new artists created');
130   is ($schema->resultset ('Genre')->count, $counts->{Genre} + 2, '2 additional genres created');
131   is ($schema->resultset ('Producer')->count, $counts->{Producer} + 3, '3 new producer');
132   is ($schema->resultset ('CD')->count, $counts->{CD} + 7, '7 new CDs');
133   is ($schema->resultset ('Tag')->count, $counts->{Tag} + 10, '10 new Tags');
134
135   my $cd_rs = $schema->resultset ('CD')
136     ->search ({ title => { -like => 'Greatest hits %' }}, { order_by => 'title'} );
137   is ($cd_rs->count, 7, '7 greatest hits created');
138
139   my $cds_2012 = $cd_rs->search ({ year => 2012});
140   is ($cds_2012->count, 5, '5 CDs created in 2012');
141
142   is (
143     $cds_2012->search(
144       { 'tags.tag' => { -in => [qw/A B/] } },
145       {
146         join => 'tags',
147         group_by => 'me.cdid',
148         having => 'count(me.cdid) = 2',
149       }
150     ),
151     5,
152     'All 10 tags were pairwise distributed between 5 year-2012 CDs'
153   );
154
155   my $paul_prod = $cd_rs->search (
156     { 'producer.name' => 'paul'},
157     { join => { cd_to_producer => 'producer' } }
158   );
159   is ($paul_prod->count, 1, 'Paul had 1 production');
160   my $pauls_cd = $paul_prod->single;
161   is ($pauls_cd->cd_to_producer->count, 3, 'Paul had two co-producers');
162   is (
163     $pauls_cd->search_related ('cd_to_producer',
164       { 'producer.name' => 'flemming'},
165       { join => 'producer' }
166     )->count,
167     1,
168     'The second producer is flemming',
169   );
170
171   my $kirk_cds = $cd_rs->search ({ 'artist.name' => 'kirk' }, { join => 'artist' });
172   is ($kirk_cds, 3, 'Kirk had 3 CDs');
173   is (
174     $kirk_cds->search (
175       { 'cd_to_producer.cd' => { '!=', undef } },
176       { join => 'cd_to_producer' },
177     ),
178     1,
179     'Kirk had a producer only on one cd',
180   );
181
182   my $lars_cds = $cd_rs->search ({ 'artist.name' => 'lars' }, { join => 'artist' });
183   is ($lars_cds->count, 3, 'Lars had 3 CDs');
184   is (
185     $lars_cds->search (
186       { 'cd_to_producer.cd' => undef },
187       { join => 'cd_to_producer' },
188     ),
189     0,
190     'Lars always had a producer',
191   );
192   is (
193     $lars_cds->search_related ('cd_to_producer',
194       { 'producer.name' => 'flemming'},
195       { join => 'producer' }
196     )->count,
197     1,
198     'Lars produced 1 CD with flemming',
199   );
200   is (
201     $lars_cds->search_related ('cd_to_producer',
202       { 'producer.name' => 'bob'},
203       { join => 'producer' }
204     )->count,
205     3,
206     'Lars produced 3 CDs with bob',
207   );
208
209   my $bob_prod = $cd_rs->search (
210     { 'producer.name' => 'bob'},
211     { join => { cd_to_producer => 'producer' } }
212   );
213   is ($bob_prod->count, 4, 'Bob produced a total of 4 CDs');
214   ok ($bob_prod->find ({ title => 'Greatest hits 1'}), '1st Bob production name correct');
215   ok ($bob_prod->find ({ title => 'Greatest hits 6'}), '2nd Bob production name correct');
216   ok ($bob_prod->find ({ title => 'Greatest hits 2'}), '3rd Bob production name correct');
217   ok ($bob_prod->find ({ title => 'Greatest hits 7'}), '4th Bob production name correct');
218
219   is (
220     $bob_prod->search ({ 'artist.name' => 'james' }, { join => 'artist' })->count,
221     1,
222     "Bob produced james' only CD",
223   );
224 };
225 diag $@ if $@;
226
227 1;