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