Add join opt merge tests
[dbsrgits/DBIx-Class.git] / t / 91merge_joinpref_attr.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 # temporary reassign for easier test debug
10 # not adding dependency either - just delete this
11 # block once everything works
12 use Test::Differences;
13 BEGIN {
14   no warnings 'redefine';
15   *is_deeply = \&Test::Differences::eq_or_diff;
16 }
17
18 my $schema = DBICTest->init_schema();
19 my $rs = $schema->resultset( 'CD' );
20
21 {
22   my $a = { artist => { -foo => 1 } };
23   my $b = { artist => { -foo => 1 } };
24   my $expected = [{ artist => { -foo => 1 } }];
25   my $result = $rs->_merge_joinpref_attr($a, $b);
26   is_deeply( $result, $expected );
27 }
28
29 {
30   my $a = [ { artist => { -foo => {} } } ];
31   my $b = [ { artist => { -foo => {} } } ];
32   my $expected = [ { artist => { -foo => {} } } ];
33   my $result = $rs->_merge_joinpref_attr($a, $b);
34   is_deeply( $result, $expected );
35 }
36
37 {
38   my $a = [ { artist => { -foo => 1 } } ];
39   my $b = [ { artist => { -foo => 1 } } ];
40   my $expected = [ { artist => { -foo => 1 } }];
41   my $result = $rs->_merge_joinpref_attr($a, $b);
42   is_deeply( $result, $expected );
43 }
44
45 # no conflicting options
46 {
47   my $a = { artist => { -foo => 1 } };
48   my $b = { artist => { -foo => 2 } };
49   throws_ok { $rs->_merge_joinpref_attr($a, $b) }
50     qr/.|Undetermined exception text/;
51 }
52
53 {
54   my $a = [ { artist => { -foo => 1 } } ];
55   my $b = [ { artist => { -foo => 2 } } ];
56   throws_ok { $rs->_merge_joinpref_attr($a, $b) }
57     qr/.|Undetermined exception text/;
58 }
59
60 {
61   my $a = [ { artist => { -foo => { a => 1 } } } ];
62   my $b = [ { artist => { -foo => { a => 2 } } } ];
63   throws_ok { $rs->_merge_joinpref_attr($a, $b) }
64     qr/.|Undetermined exception text/;
65 }
66
67 # also no option-bag conflicts (options can be specified
68 # only once due to potential problems with conflicting
69 # behaviors - one can only respecify the entire thing
70 # as in the first test above
71 # THIS TEST IS NOT SET IN STONE, BUT IS LIKELY CORRECT
72 {
73   my $a = { artist => { -foo => 1 } };
74   my $b = { artist => { -bar => 2 } };
75   throws_ok { $rs->_merge_joinpref_attr($a, $b) }
76     qr/.|Undetermined exception text/;
77 }
78
79 {
80   my $a = 'artist';
81   my $b = 'cd';
82   my $expected = [ 'artist', 'cd' ];
83   my $result = $rs->_merge_joinpref_attr($a, $b);
84   is_deeply( $result, $expected );
85 }
86
87 {
88   my $a = { artist => { -foo => 1 } };
89   my $b = { cd => { -bar => 2 } };
90   my $expected = [ { artist => { -foo => 1 } }, { cd => { -bar => 2 } } ];
91   my $result = $rs->_merge_joinpref_attr($a, $b);
92   is_deeply( $result, $expected );
93 }
94
95 {
96   my $a = [ 'artist' ];
97   my $b = [ 'cd' ];
98   my $expected = [ 'artist', 'cd' ];
99   my $result = $rs->_merge_joinpref_attr($a, $b);
100   is_deeply( $result, $expected );
101 }
102
103 {
104   my $a = [ 'artist', 'cd' ];
105   my $b = [ 'cd' ];
106   my $expected = [ 'artist', 'cd' ];
107   my $result = $rs->_merge_joinpref_attr($a, $b);
108   is_deeply( $result, $expected );
109 }
110
111 {
112   my $a = [ 'artist', { cd => { -foo => 1 } } ];
113   my $b = [ { cd => { -foo => 1 } } ];
114   my $expected = [ 'artist', { cd => { -foo => 1 } } ];
115   my $result = $rs->_merge_joinpref_attr($a, $b);
116   is_deeply( $result, $expected );
117 }
118
119 {
120   my $a = [ 'artist', 'artist' ];
121   my $b = [ 'artist', 'cd' ];
122   my $expected = [ 'artist', 'artist', 'cd' ];
123   my $result = $rs->_merge_joinpref_attr($a, $b);
124   is_deeply( $result, $expected );
125 }
126
127 {
128   my $a = [ { artist => { -foo => 1 } }, { artist => { -foo => 1 } } ];
129   my $b = [ { artist => { -foo => 1 } }, 'cd' ];
130   my $expected = [ { artist => { -foo => 1 } }, { artist => { -foo => 1 } }, 'cd' ];
131   my $result = $rs->_merge_joinpref_attr($a, $b);
132   is_deeply( $result, $expected );
133 }
134
135 {
136   my $a = [ 'artist', 'cd' ];
137   my $b = [ 'artist', 'artist' ];
138   my $expected = [ 'artist', 'cd', 'artist' ];
139   my $result = $rs->_merge_joinpref_attr($a, $b);
140   is_deeply( $result, $expected );
141 }
142
143 {
144   my $a = [ { artist => { -foo => 1 } }, 'cd' ];
145   my $b = [ { artist => { -foo => 1 } }, { artist => { -foo => 1 } } ];
146   my $expected = [ { artist => { -foo => 1 } }, 'cd', { artist => { -foo => 1 } } ];
147   my $result = $rs->_merge_joinpref_attr($a, $b);
148   is_deeply( $result, $expected );
149 }
150
151 {
152   my $a = [ 'twokeys' ];
153   my $b = [ 'cds', 'cds' ];
154   my $expected = [ 'twokeys', 'cds', 'cds' ];
155   my $result = $rs->_merge_joinpref_attr($a, $b);
156   is_deeply( $result, $expected );
157 }
158
159 {
160   my $a = [ 'twokeys' ];
161   my $b = [ { cds => { -bar => 1 } }, { cds => { -bar => 1 } }];
162   my $expected = [ 'twokeys', { cds => { -bar => 1 } }, { cds => { -bar => 1 } }];
163   my $result = $rs->_merge_joinpref_attr($a, $b);
164   is_deeply( $result, $expected );
165 }
166
167 {
168   my $a = [ 'artist', 'cd', { 'artist' => 'manager' } ];
169   my $b = 'artist';
170   my $expected = [ 'artist', 'cd', { 'artist' => 'manager' } ];
171   my $result = $rs->_merge_joinpref_attr($a, $b);
172   is_deeply( $result, $expected );
173 }
174
175 {
176   my $a = [ { artist => { -baz => 1 } }, 'cd', { 'artist' => 'manager' } ];
177   my $b = { artist => { -baz => 1 } };
178   my $expected = [ { artist => { -baz => 1 } }, 'cd', { 'artist' => 'manager' } ];
179   my $result = $rs->_merge_joinpref_attr($a, $b);
180   is_deeply( $result, $expected );
181 }
182
183 {
184   my $a = [ 'artist', 'cd', { 'artist' => 'manager' } ];
185   my $b = [ 'artist', 'cd' ];
186   my $expected = [ 'artist', 'cd', { 'artist' => 'manager' } ];
187   my $result = $rs->_merge_joinpref_attr($a, $b);
188   is_deeply( $result, $expected );
189 }
190
191 {
192   my $a = [ { artist => { -biff => 1 } }, { cd => { -bong => 2 } }, { 'artist' => 'manager' } ];
193   my $b = [ { artist => { -biff => 1 } }, { cd => { -bong => 2 } }];
194   my $expected = [ { artist => { -biff => 1 } }, { cd => { -bong => 2 } }, { 'artist' => 'manager' }];
195   my $result = $rs->_merge_joinpref_attr($a, $b);
196   is_deeply( $result, $expected );
197 }
198
199 {
200   my $a = [ 'artist', 'cd', { 'artist' => 'manager' } ];
201   my $b = { 'artist' => 'manager' };
202   my $expected = [ 'artist', 'cd', { 'artist' => [ 'manager' ] } ];
203   my $result = $rs->_merge_joinpref_attr($a, $b);
204   is_deeply( $result, $expected );
205 }
206
207 {
208   my $a = [ 'artist', 'cd', { 'artist' => 'manager' } ];
209   my $b = { 'artist' => 'agent' };
210   my $expected = [ { 'artist' => 'agent' }, 'cd', { 'artist' => 'manager' } ];
211   my $result = $rs->_merge_joinpref_attr($a, $b);
212   is_deeply( $result, $expected );
213 }
214
215 {
216   my $a = [{ artist => { -y => 'frew' } }, 'cd', { artist => { -y => 'frew', manager => 1 } } ];
217   my $b = { 'artist' => { -y => 'frew', agent => 1 } };
218   my $expected = [ { artist => { -y => 'frew', 'agent' => 1 } }, 'cd',  { artist => { -y => 'frew', manager => 1 } } ];
219   my $result = $rs->_merge_joinpref_attr($a, $b);
220   is_deeply( $result, $expected );
221 }
222
223 {
224   my $a = [ 'artist', 'cd', { 'artist' => 'manager' } ];
225   my $b = { 'artist' => { 'manager' => 'artist' } };
226   my $expected = [ 'artist', 'cd', { 'artist' => [ { 'manager' => 'artist' } ] } ];
227   my $result = $rs->_merge_joinpref_attr($a, $b);
228   is_deeply( $result, $expected );
229 }
230
231 {
232   my $a = [{ artist => { -yo => 1 } }, 'cd', { artist => [{ -yo => 1 }, 'manager'] } ];
233   my $b = { artist => { -yo => 1, manager => { artist => { -yo => 1 } }} };
234   my $expected = [{ artist => { -yo => 1 } }, 'cd', { artist => [{ -yo => 1 }, { 'manager' => { artist => { -yo => 1 } }} ] } ];
235   my $result = $rs->_merge_joinpref_attr($a, $b);
236   is_deeply( $result, $expected );
237 }
238
239 {
240   my $a = [ 'artist', 'cd', { 'artist' => 'manager' } ];
241   my $b = { 'artist' => { 'manager' => [ 'artist', 'label' ] } };
242   my $expected = [ 'artist', 'cd', { 'artist' => [ { 'manager' => [ 'artist', 'label' ] } ] } ];
243   my $result = $rs->_merge_joinpref_attr($a, $b);
244   is_deeply( $result, $expected );
245 }
246
247 {
248   my $a = [{ artist => { -x => 1 } }, 'cd', { artist => [{ -x => 1 }, 'manager' ] }];
249   my $b = { artist => { -x => 1, 'manager' => [{ artist => { -x => 1 } }, 'label' ] } };
250   my $expected = [{ artist => { -x => 1 } }, 'cd', { artist => { -x => 1, { 'manager' => [{ artist => { -x => 1 } }, 'label' ] } } } ];
251   my $result = $rs->_merge_joinpref_attr($a, $b);
252   is_deeply( $result, $expected );
253 }
254
255 {
256   my $a = [ 'artist', 'cd', { 'artist' => 'manager' } ];
257   my $b = { 'artist' => { 'tour_manager' => [ 'venue', 'roadie' ] } };
258   my $expected = [ { 'artist' => { 'tour_manager' => [ 'venue', 'roadie' ] } }, 'cd', { 'artist' =>  'manager' } ];
259   my $result = $rs->_merge_joinpref_attr($a, $b);
260   is_deeply( $result, $expected );
261 }
262
263 {
264   my $a = [ { artist => { -k => '' } }, 'cd', { artist => [{ -k => '' }, 'manager'] } ];
265   my $b = { artist => { -k => '', tour_manager => [ 'venue', 'roadie' ] } };
266   my $expected = [ { artist => { -k => '', tour_manager => [ 'venue', 'roadie' ] } }, 'cd', { artist => [{ -k => ''}, 'manager'] } ];
267   my $result = $rs->_merge_joinpref_attr($a, $b);
268   is_deeply( $result, $expected );
269 }
270
271 {
272   my $a = [ 'artist', 'cd' ];
273   my $b = { 'artist' => { 'tour_manager' => [ 'venue', 'roadie' ] } };
274   my $expected = [ { 'artist' => { 'tour_manager' => [ 'venue', 'roadie' ] } }, 'cd' ];
275   my $result = $rs->_merge_joinpref_attr($a, $b);
276   is_deeply( $result, $expected );
277 }
278
279 {
280   my $a = [{ artist => { -xyzzy => undef } }, 'cd' ];
281   my $b = { artist => { -xyzzy => undef, 'tour_manager' => [ 'venue', 'roadie' ] } };
282   my $expected = [ { artist => { -xyzzy => undef, 'tour_manager' => [ 'venue', 'roadie' ] } }, 'cd' ];
283   my $result = $rs->_merge_joinpref_attr($a, $b);
284   is_deeply( $result, $expected );
285 }
286
287 {
288   my $a = [ { 'artist' => 'manager' }, 'cd' ];
289   my $b = [ 'artist', { 'artist' => 'manager' } ];
290   my $expected = [ { 'artist' => 'manager' }, 'cd', { 'artist' => 'manager' } ];
291   my $result = $rs->_merge_joinpref_attr($a, $b);
292   is_deeply( $result, $expected );
293 }
294
295 {
296   my $a = [{ artist => [{ -join_type => 123 }, 'manager' ] }, 'cd' ];
297   my $b = [{ artist => { -join_type => 123 } }, { artist => [{ -join_type => 123 }, 'manager'] } ];
298   my $expected = [ { artist => [{ -join_type => 123 }, 'manager'] }, 'cd', { artist => [{ -join_type => 123 }, 'manager'] } ];
299   my $result = $rs->_merge_joinpref_attr($a, $b);
300   is_deeply( $result, $expected );
301 }
302
303 done_testing;