6 use RT::Test tests => 60;
8 sub load_or_create_group {
12 my $group = RT::Group->new( $RT::SystemUser );
13 $group->LoadUserDefinedGroup( $name );
14 unless ( $group->id ) {
15 my ($id, $msg) = $group->CreateUserDefinedGroup(
18 die "$msg" unless $id;
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;
28 foreach my $new ( @{ $args{Members} } ) {
29 my ($status, $msg) = $group->AddMember(
30 ref($new)? $new->id : $new,
32 die "$msg" unless $status;
39 my $validator_path = "$RT::SbinPath/rt-validator";
41 my %args = (check => 1, resolve => 0, force => 1, @_ );
43 my $cmd = $validator_path;
44 die "Couldn't find $cmd command" unless -f $cmd;
46 while( my ($k,$v) = each %args ) {
53 my ($child_out, $child_in);
54 my $pid = IPC::Open2::open2($child_out, $child_in, $cmd);
57 my $result = do { local $/; <$child_out> };
61 DBIx::SearchBuilder::Record::Cachable->FlushCache
68 my ($ecode, $res) = run_validator();
69 is $res, '', 'empty result';
73 my $group = load_or_create_group('test', Members => [] );
74 ok $group, "loaded or created a group";
76 my ($ecode, $res) = run_validator();
77 is $res, '', 'empty result';
82 my $group1 = load_or_create_group( 'test1', Members => [] );
83 ok $group1, "loaded or created a group";
85 my $group2 = load_or_create_group( 'test2', Members => [ $group1 ]);
86 ok $group2, "loaded or created a group";
88 ok $group2->HasMember( $group1->id ), "has member";
89 ok $group2->HasMemberRecursively( $group1->id ), "has member";
91 my ($ecode, $res) = run_validator();
92 is $res, '', 'empty result';
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";
98 ($ecode, $res) = run_validator(resolve => 1);
100 ok $group2->HasMember( $group1->id ), "has member";
101 ok $group2->HasMemberRecursively( $group1->id ), "has member";
103 ($ecode, $res) = run_validator();
104 is $res, '', 'empty result';
107 # G1 <- G2 <- G3 <- G4 <- G5
111 my $child = @groups? $groups[-1]: undef;
113 my $group = load_or_create_group( 'test'. $_, Members => [ $child? ($child): () ] );
114 ok $group, "loaded or created a group";
116 ok $group->HasMember( $child->id ), "has member"
118 ok $group->HasMemberRecursively( $_->id ), "has member"
121 push @groups, $group;
124 my ($ecode, $res) = run_validator();
125 is $res, '', 'empty result';
127 $RT::Handle->dbh->do("DELETE FROM CachedGroupMembers");
128 DBIx::SearchBuilder::Record::Cachable->FlushCache;
130 ok !$groups[1]->HasMemberRecursively( $groups[0]->id ), "has no member, broken DB";
132 ($ecode, $res) = run_validator(resolve => 1);
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"
140 ($ecode, $res) = run_validator();
141 is $res, '', 'empty result';
144 # G1 <- (G2, G3, G4, G5)
148 my $group = load_or_create_group( 'test'. $_, Members => [] );
149 ok $group, "loaded or created a group";
150 push @groups, $group;
153 my $parent = load_or_create_group( 'test1', Members => \@groups );
154 ok $parent, "loaded or created a group";
156 my ($ecode, $res) = run_validator();
157 is $res, '', 'empty result';
160 # G1 <- (G2, G3, G4) <- G5
162 my $gchild = load_or_create_group( 'test5', Members => [] );
163 ok $gchild, "loaded or created a group";
167 my $group = load_or_create_group( 'test'. $_, Members => [ $gchild ] );
168 ok $group, "loaded or created a group";
169 push @groups, $group;
172 my $parent = load_or_create_group( 'test1', Members => \@groups );
173 ok $parent, "loaded or created a group";
175 my ($ecode, $res) = run_validator();
176 is $res, '', 'empty result';