rt 4.0.20 (RT#13852)
[freeside.git] / rt / t / validator / group_members.t
1
2 use strict;
3 use warnings;
4
5 use RT::Test tests => 63;
6
7 {
8     my ($ecode, $res) = RT::Test->run_validator();
9     is $res, '', 'empty result';
10 }
11
12 {
13     my $group = RT::Test->load_or_create_group('test', Members => [] );
14     ok $group, "loaded or created a group";
15
16     my ($ecode, $res) = RT::Test->run_validator();
17     is $res, '', 'empty result';
18 }
19
20 # G1 -> G2
21 {
22     my $group1 = RT::Test->load_or_create_group( 'test1', Members => [] );
23     ok $group1, "loaded or created a group";
24
25     my $group2 = RT::Test->load_or_create_group( 'test2', Members => [ $group1 ]);
26     ok $group2, "loaded or created a group";
27
28     ok $group2->HasMember( $group1->id ), "has member";
29     ok $group2->HasMemberRecursively( $group1->id ), "has member";
30
31     my ($ecode, $res) = RT::Test->run_validator();
32     is $res, '', 'empty result';
33
34     $RT::Handle->dbh->do("DELETE FROM CachedGroupMembers");
35     DBIx::SearchBuilder::Record::Cachable->FlushCache;
36     ok !$group2->HasMemberRecursively( $group1->id ), "has no member, broken DB";
37
38     ($ecode, $res) = RT::Test->run_validator(resolve => 1);
39
40     ok $group2->HasMember( $group1->id ), "has member";
41     ok $group2->HasMemberRecursively( $group1->id ), "has member";
42
43     ($ecode, $res) = RT::Test->run_validator();
44     is $res, '', 'empty result';
45 }
46
47 # G1 <- G2 <- G3 <- G4 <- G5
48 {
49     my @groups;
50     for (1..5) {
51         my $child = @groups? $groups[-1]: undef;
52
53         my $group = RT::Test->load_or_create_group( 'test'. $_, Members => [ $child? ($child): () ] );
54         ok $group, "loaded or created a group";
55
56         ok $group->HasMember( $child->id ), "has member"
57             if $child;
58         ok $group->HasMemberRecursively( $_->id ), "has member"
59             foreach @groups;
60
61         push @groups, $group;
62     }
63
64     my ($ecode, $res) = RT::Test->run_validator();
65     is $res, '', 'empty result';
66
67     $RT::Handle->dbh->do("DELETE FROM CachedGroupMembers");
68     DBIx::SearchBuilder::Record::Cachable->FlushCache;
69
70     ok !$groups[1]->HasMemberRecursively( $groups[0]->id ), "has no member, broken DB";
71
72     ($ecode, $res) = RT::Test->run_validator(resolve => 1);
73
74     for ( my $i = 1; $i < @groups; $i++ ) {
75         ok $groups[$i]->HasMember( $groups[$i-1]->id ), "has member";
76         ok $groups[$i]->HasMemberRecursively( $groups[$_]->id ), "has member"
77             foreach 0..$i-1;
78     }
79
80     ($ecode, $res) = RT::Test->run_validator();
81     is $res, '', 'empty result';
82 }
83
84 # G1 <- (G2, G3, G4, G5)
85 {
86     my @groups;
87     for (2..5) {
88         my $group = RT::Test->load_or_create_group( 'test'. $_, Members => [] );
89         ok $group, "loaded or created a group";
90         push @groups, $group;
91     }
92
93     my $parent = RT::Test->load_or_create_group( 'test1', Members => \@groups );
94     ok $parent, "loaded or created a group";
95
96     my ($ecode, $res) = RT::Test->run_validator();
97     is $res, '', 'empty result';
98 }
99
100 # G1 <- (G2, G3, G4) <- G5
101 {
102     my $gchild = RT::Test->load_or_create_group( 'test5', Members => [] );
103     ok $gchild, "loaded or created a group";
104     
105     my @groups;
106     for (2..4) {
107         my $group = RT::Test->load_or_create_group( 'test'. $_, Members => [ $gchild ] );
108         ok $group, "loaded or created a group";
109         push @groups, $group;
110     }
111
112     my $parent = RT::Test->load_or_create_group( 'test1', Members => \@groups );
113     ok $parent, "loaded or created a group";
114
115     my ($ecode, $res) = RT::Test->run_validator();
116     is $res, '', 'empty result';
117 }
118
119 # group without principal record and cgm records
120 # was causing infinite loop as principal was not created
121 {
122     my $group = RT::Test->load_or_create_group('Test');
123     ok $group && $group->id, 'loaded or created group';
124
125     my $dbh = $group->_Handle->dbh;
126     $dbh->do('DELETE FROM Principals WHERE id = ?', {RaiseError => 1}, $group->id);
127     $dbh->do('DELETE FROM CachedGroupMembers WHERE GroupId = ?', {RaiseError => 1}, $group->id);
128     DBIx::SearchBuilder::Record::Cachable->FlushCache;
129
130     my ($ecode, $res) = RT::Test->run_validator(resolve => 1, timeout => 30);
131     ok $res;
132
133     ($ecode, $res) = RT::Test->run_validator();
134     is $res, '', 'empty result';
135 }