RT 4.0.13
[freeside.git] / rt / t / validator / group_members.t
1
2 use strict;
3 use warnings;
4
5 use RT::Test tests => 60;
6
7 sub load_or_create_group {
8     my $name = shift;
9     my %args = (@_);
10
11     my $group = RT::Group->new( RT->SystemUser );
12     $group->LoadUserDefinedGroup( $name );
13     unless ( $group->id ) {
14         my ($id, $msg) = $group->CreateUserDefinedGroup(
15             Name => $name,
16         );
17         die "$msg" unless $id;
18     }
19
20     if ( $args{Members} ) {
21         my $cur = $group->MembersObj;
22         while ( my $entry = $cur->Next ) {
23             my ($status, $msg) = $entry->Delete;
24             die "$msg" unless $status;
25         }
26
27         foreach my $new ( @{ $args{Members} } ) {
28             my ($status, $msg) = $group->AddMember(
29                 ref($new)? $new->id : $new,
30             );
31             die "$msg" unless $status;
32         }
33     }
34     
35     return $group;
36 }
37
38 my $validator_path = "$RT::SbinPath/rt-validator";
39 sub run_validator {
40     my %args = (check => 1, resolve => 0, force => 1, @_ );
41
42     my $cmd = $validator_path;
43     die "Couldn't find $cmd command" unless -f $cmd;
44
45     while( my ($k,$v) = each %args ) {
46         next unless $v;
47         $cmd .= " --$k '$v'";
48     }
49     $cmd .= ' 2>&1';
50
51     require IPC::Open2;
52     my ($child_out, $child_in);
53     my $pid = IPC::Open2::open2($child_out, $child_in, $cmd);
54     close $child_in;
55
56     my $result = do { local $/; <$child_out> };
57     close $child_out;
58     waitpid $pid, 0;
59
60     DBIx::SearchBuilder::Record::Cachable->FlushCache
61         if $args{'resolve'};
62
63     return ($?, $result);
64 }
65
66 {
67     my ($ecode, $res) = run_validator();
68     is $res, '', 'empty result';
69 }
70
71 {
72     my $group = load_or_create_group('test', Members => [] );
73     ok $group, "loaded or created a group";
74
75     my ($ecode, $res) = run_validator();
76     is $res, '', 'empty result';
77 }
78
79 # G1 -> G2
80 {
81     my $group1 = load_or_create_group( 'test1', Members => [] );
82     ok $group1, "loaded or created a group";
83
84     my $group2 = load_or_create_group( 'test2', Members => [ $group1 ]);
85     ok $group2, "loaded or created a group";
86
87     ok $group2->HasMember( $group1->id ), "has member";
88     ok $group2->HasMemberRecursively( $group1->id ), "has member";
89
90     my ($ecode, $res) = run_validator();
91     is $res, '', 'empty result';
92
93     $RT::Handle->dbh->do("DELETE FROM CachedGroupMembers");
94     DBIx::SearchBuilder::Record::Cachable->FlushCache;
95     ok !$group2->HasMemberRecursively( $group1->id ), "has no member, broken DB";
96
97     ($ecode, $res) = run_validator(resolve => 1);
98
99     ok $group2->HasMember( $group1->id ), "has member";
100     ok $group2->HasMemberRecursively( $group1->id ), "has member";
101
102     ($ecode, $res) = run_validator();
103     is $res, '', 'empty result';
104 }
105
106 # G1 <- G2 <- G3 <- G4 <- G5
107 {
108     my @groups;
109     for (1..5) {
110         my $child = @groups? $groups[-1]: undef;
111
112         my $group = load_or_create_group( 'test'. $_, Members => [ $child? ($child): () ] );
113         ok $group, "loaded or created a group";
114
115         ok $group->HasMember( $child->id ), "has member"
116             if $child;
117         ok $group->HasMemberRecursively( $_->id ), "has member"
118             foreach @groups;
119
120         push @groups, $group;
121     }
122
123     my ($ecode, $res) = run_validator();
124     is $res, '', 'empty result';
125
126     $RT::Handle->dbh->do("DELETE FROM CachedGroupMembers");
127     DBIx::SearchBuilder::Record::Cachable->FlushCache;
128
129     ok !$groups[1]->HasMemberRecursively( $groups[0]->id ), "has no member, broken DB";
130
131     ($ecode, $res) = run_validator(resolve => 1);
132
133     for ( my $i = 1; $i < @groups; $i++ ) {
134         ok $groups[$i]->HasMember( $groups[$i-1]->id ), "has member";
135         ok $groups[$i]->HasMemberRecursively( $groups[$_]->id ), "has member"
136             foreach 0..$i-1;
137     }
138
139     ($ecode, $res) = run_validator();
140     is $res, '', 'empty result';
141 }
142
143 # G1 <- (G2, G3, G4, G5)
144 {
145     my @groups;
146     for (2..5) {
147         my $group = load_or_create_group( 'test'. $_, Members => [] );
148         ok $group, "loaded or created a group";
149         push @groups, $group;
150     }
151
152     my $parent = load_or_create_group( 'test1', Members => \@groups );
153     ok $parent, "loaded or created a group";
154
155     my ($ecode, $res) = run_validator();
156     is $res, '', 'empty result';
157 }
158
159 # G1 <- (G2, G3, G4) <- G5
160 {
161     my $gchild = load_or_create_group( 'test5', Members => [] );
162     ok $gchild, "loaded or created a group";
163     
164     my @groups;
165     for (2..4) {
166         my $group = load_or_create_group( 'test'. $_, Members => [ $gchild ] );
167         ok $group, "loaded or created a group";
168         push @groups, $group;
169     }
170
171     my $parent = load_or_create_group( 'test1', Members => \@groups );
172     ok $parent, "loaded or created a group";
173
174     my ($ecode, $res) = run_validator();
175     is $res, '', 'empty result';
176 }
177