Ensure undef_on_null_fk does not affect non-introspectable custom conds
[dbsrgits/DBIx-Class.git] / t / multi_create / torture.t
CommitLineData
b6678114 1use strict;
2use warnings;
3
4use Test::More;
b6678114 5use lib qw(t/lib);
6use DBICTest;
7
186c7bef 8plan tests => 23;
b6678114 9
8273e845 10# an insane multicreate
b6678114 11# (should work, despite the fact that no one will probably use it this way)
12
13my $schema = DBICTest->init_schema();
14
15# first count how many rows do we initially have
16my $counts;
17$counts->{$_} = $schema->resultset($_)->count for qw/Artist CD Genre Producer Tag/;
18
19# do the crazy create
20eval {
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 {
8273e845 40 cd => {
b6678114 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 => [
186c7bef 56 { producer => { name => 'bob' } },
b6678114 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 {
8273e845 113 cd => {
b6678114 114 artist => {
115 name => 'lars', # should already exist
116 # even though the artist 'name' is not uniquely constrained
8273e845 117 # find_or_create will arguably DWIM
b6678114 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/] } },
2746448f 145 {
146 join => 'tags',
147 group_by => 'me.cdid',
148 having => 'count(me.cdid) = 2',
149 }
b6678114 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;
186c7bef 161 is ($pauls_cd->cd_to_producer->count, 3, 'Paul had two co-producers');
b6678114 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,
186c7bef 205 3,
206 'Lars produced 3 CDs with bob',
b6678114 207 );
208
209 my $bob_prod = $cd_rs->search (
210 { 'producer.name' => 'bob'},
211 { join => { cd_to_producer => 'producer' } }
212 );
186c7bef 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');
b6678114 218
219 is (
220 $bob_prod->search ({ 'artist.name' => 'james' }, { join => 'artist' })->count,
221 1,
222 "Bob produced james' only CD",
223 );
224};
225diag $@ if $@;
226
2271;