5 use RT::Test tests => 60;
7 sub load_or_create_group {
11 my $group = RT::Group->new( RT->SystemUser );
12 $group->LoadUserDefinedGroup( $name );
13 unless ( $group->id ) {
14 my ($id, $msg) = $group->CreateUserDefinedGroup(
17 die "$msg" unless $id;
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;
27 foreach my $new ( @{ $args{Members} } ) {
28 my ($status, $msg) = $group->AddMember(
29 ref($new)? $new->id : $new,
31 die "$msg" unless $status;
38 my $validator_path = "$RT::SbinPath/rt-validator";
40 my %args = (check => 1, resolve => 0, force => 1, @_ );
42 my $cmd = $validator_path;
43 die "Couldn't find $cmd command" unless -f $cmd;
45 while( my ($k,$v) = each %args ) {
52 my ($child_out, $child_in);
53 my $pid = IPC::Open2::open2($child_out, $child_in, $cmd);
56 my $result = do { local $/; <$child_out> };
60 DBIx::SearchBuilder::Record::Cachable->FlushCache
67 my ($ecode, $res) = run_validator();
68 is $res, '', 'empty result';
72 my $group = load_or_create_group('test', Members => [] );
73 ok $group, "loaded or created a group";
75 my ($ecode, $res) = run_validator();
76 is $res, '', 'empty result';
81 my $group1 = load_or_create_group( 'test1', Members => [] );
82 ok $group1, "loaded or created a group";
84 my $group2 = load_or_create_group( 'test2', Members => [ $group1 ]);
85 ok $group2, "loaded or created a group";
87 ok $group2->HasMember( $group1->id ), "has member";
88 ok $group2->HasMemberRecursively( $group1->id ), "has member";
90 my ($ecode, $res) = run_validator();
91 is $res, '', 'empty result';
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";
97 ($ecode, $res) = run_validator(resolve => 1);
99 ok $group2->HasMember( $group1->id ), "has member";
100 ok $group2->HasMemberRecursively( $group1->id ), "has member";
102 ($ecode, $res) = run_validator();
103 is $res, '', 'empty result';
106 # G1 <- G2 <- G3 <- G4 <- G5
110 my $child = @groups? $groups[-1]: undef;
112 my $group = load_or_create_group( 'test'. $_, Members => [ $child? ($child): () ] );
113 ok $group, "loaded or created a group";
115 ok $group->HasMember( $child->id ), "has member"
117 ok $group->HasMemberRecursively( $_->id ), "has member"
120 push @groups, $group;
123 my ($ecode, $res) = run_validator();
124 is $res, '', 'empty result';
126 $RT::Handle->dbh->do("DELETE FROM CachedGroupMembers");
127 DBIx::SearchBuilder::Record::Cachable->FlushCache;
129 ok !$groups[1]->HasMemberRecursively( $groups[0]->id ), "has no member, broken DB";
131 ($ecode, $res) = run_validator(resolve => 1);
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"
139 ($ecode, $res) = run_validator();
140 is $res, '', 'empty result';
143 # G1 <- (G2, G3, G4, G5)
147 my $group = load_or_create_group( 'test'. $_, Members => [] );
148 ok $group, "loaded or created a group";
149 push @groups, $group;
152 my $parent = load_or_create_group( 'test1', Members => \@groups );
153 ok $parent, "loaded or created a group";
155 my ($ecode, $res) = run_validator();
156 is $res, '', 'empty result';
159 # G1 <- (G2, G3, G4) <- G5
161 my $gchild = load_or_create_group( 'test5', Members => [] );
162 ok $gchild, "loaded or created a group";
166 my $group = load_or_create_group( 'test'. $_, Members => [ $gchild ] );
167 ok $group, "loaded or created a group";
168 push @groups, $group;
171 my $parent = load_or_create_group( 'test1', Members => \@groups );
172 ok $parent, "loaded or created a group";
174 my ($ecode, $res) = run_validator();
175 is $res, '', 'empty result';