added nested, multinew and multicreate tests
[dbsrgits/DBIx-Class.git] / t / row / has_relationship_loaded.t
1 use strict;
2 use warnings;
3
4 use lib qw(t/lib);
5 use Test::More;
6 use Test::Exception;
7 use DBICTest;
8
9 my $schema = DBICTest->init_schema();
10 my $rs = $schema->resultset('CD');
11 my $row = $rs->new_result({});
12
13 dies_ok { $row->has_relationship_loaded() }
14   'has_relationship_loaded needs a relationship name';
15
16 ok !$row->has_relationship_loaded($_), "vanilla row has no loaded relationship '$_'"
17   for $row->result_source->relationships;
18
19 # Prefetch of single belongs_to relationship
20 {
21   my $prefetched_rs = $rs->search_rs(undef, { prefetch => 'artist' });
22   my $cd = $prefetched_rs->find(1);
23   ok $cd->has_relationship_loaded('artist'), 'belongs_to relationship with related row detected by has_relationship_loaded';
24 }
25
26 # Prefetch of single might_have relationship
27 {
28   my $prefetched_rs = $rs->search_rs(undef, { prefetch => 'liner_notes' });
29   my $cd_without_liner_notes = $prefetched_rs->find(1);
30   ok $cd_without_liner_notes->has_relationship_loaded('liner_notes'), 'might_have relationship without related row detected by has_relationship_loaded';
31   my $cd_with_liner_notes = $prefetched_rs->find(2);
32   ok $cd_with_liner_notes->has_relationship_loaded('liner_notes'), 'might_have relationship with related row detected by has_relationship_loaded';
33 }
34
35 # Prefetch of single has_many relationship
36 {
37   my $prefetched_rs = $rs->search_rs(undef, { prefetch => 'tracks' });
38   my $cd_without_tracks = $prefetched_rs->create({
39     artist => 1,
40     title  => 'Empty CD',
41     year   => 2012,
42   });
43   ok $cd_without_tracks->has_relationship_loaded('tracks'), 'has_many relationship without related row detected by has_relationship_loaded';
44   my $cd_with_tracks = $prefetched_rs->find(2);
45   ok $cd_with_tracks->has_relationship_loaded('tracks'), 'has_many relationship with related row detected by has_relationship_loaded';
46 }
47
48 # Prefetch of multiple relationships
49 {
50   my $prefetched = $rs->search_rs(undef, { prefetch => ['artist', 'tracks'] })->find(1);
51   ok $prefetched->has_relationship_loaded('artist'), 'first prefetch detected by has_relationship_loaded';
52   ok $prefetched->has_relationship_loaded('tracks'), 'second prefetch detected by has_relationship_loaded';
53   ok !$prefetched->tracks->first->has_relationship_loaded('single_cd'), 'nested not prefetched rel detected by has_relationship_loaded';
54 }
55
56 # Prefetch of nested relationships
57 {
58   my $prefetched = $schema->resultset('Artist')->search_rs(undef, { prefetch => {'cds' => 'tracks'} })->find(1);
59   ok $prefetched->has_relationship_loaded('cds'), 'direct prefetch detected by has_relationship_loaded';
60   ok $prefetched->cds->first->has_relationship_loaded('tracks'), 'nested prefetch detected by has_relationship_loaded';
61   ok !$prefetched->cds->first->has_relationship_loaded('single_track'), 'nested not prefetched rel detected by has_relationship_loaded';
62 }
63
64 # Multinew
65 {
66   my $cd_with_tracks = $rs->new({
67     artist => 1,
68     title  => 'CD with tracks',
69     year   => 2012,
70     tracks => [
71       {
72         position => 1,
73         title    => 'first track',
74       },
75       {
76         position => 2,
77         title    => 'second track',
78       },
79     ],
80   });
81   ok !$cd_with_tracks->has_relationship_loaded('artist'), 'multinew: not created rel detected by has_relationship_loaded';
82   ok $cd_with_tracks->has_relationship_loaded('tracks'), 'multinew: created rel detected by has_relationship_loaded';
83   # fails because $cd_with_tracks->tracks->first returns undef
84   # ok !$cd_with_tracks->tracks->first->has_relationship_loaded('cd'), 'multinew: nested not created rel detected by has_relationship_loaded';
85 }
86
87 # Multicreate
88 {
89   my $cd_with_tracks = $rs->create({
90     artist => 1,
91     title  => 'CD with tracks',
92     year   => 2012,
93     tracks => [
94       {
95         position => 1,
96         title    => 'first track',
97       },
98       {
99         position => 2,
100         title    => 'second track',
101       },
102     ],
103   });
104   ok !$cd_with_tracks->has_relationship_loaded('artist'), 'multicreate: not created rel detected by has_relationship_loaded';
105   ok $cd_with_tracks->has_relationship_loaded('tracks'), 'multicreate: created rel detected by has_relationship_loaded';
106   ok !$cd_with_tracks->tracks->first->has_relationship_loaded('cd'), 'multicreate: nested not created rel detected by has_relationship_loaded';
107 }
108
109 done_testing;