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