@@ -193,4 +193,50 @@ diag "Shred a user who owns 2 tickets";
193193}
194194cmp_deeply( $test -> dump_current_and_savepoint(' clean' ), " current DB equal to savepoint" );
195195
196+ diag " Shred a user who created an attribute on another user, replacing relations" ;
197+ {
198+ my $user_a = RT::User-> new( RT-> SystemUser );
199+ my ( $uid_a , $msg ) = $user_a -> Create( Name => ' user_attr_owner' , Privileged => 1, Disabled => 0 );
200+ ok( $uid_a , " created user A" ) or diag " error: $msg " ;
201+
202+ my $user_b = RT::User-> new( RT-> SystemUser );
203+ my ($uid_b );
204+ ( $uid_b , $msg ) = $user_b -> Create( Name => ' user_attr_target' , Privileged => 1, Disabled => 0 );
205+ ok( $uid_b , " created user B" ) or diag " error: $msg " ;
206+
207+ # Simulate user_b having an attribute whose Creator is user_a
208+ $user_b -> SetAttribute( Name => ' SomeAttr' , Content => ' value' );
209+ my $attr = $user_b -> FirstAttribute(' SomeAttr' );
210+ ok( $attr , " attribute created on user B" );
211+ $attr -> __Set( Field => ' Creator' , Value => $uid_a );
212+ $attr -> __Set( Field => ' LastUpdatedBy' , Value => $uid_a );
213+ is( $attr -> Creator, $uid_a , " attribute Creator is user A" );
214+
215+ my $plugin = RT::Shredder::Plugin::Users-> new;
216+ my ($status );
217+ ( $status , $msg ) = $plugin -> TestArgs( status => ' any' , name => ' user_attr_owner' , replace_relations => $uid_b );
218+ ok( $status , " plugin arguments ok" ) or diag " error: $msg " ;
219+
220+ my $shredder = $test -> shredder_new();
221+ my @objs ;
222+ ( $status , @objs ) = $plugin -> Run;
223+ ok( $status , " plugin ran ok" ) or diag " error: @objs " ;
224+ @objs = RT::Shredder-> CastObjectsToRecords( Objects => \@objs );
225+
226+ ( $status , $msg ) = $plugin -> SetResolvers( Shredder => $shredder );
227+ ok( $status , " set resolvers" ) or diag " error: $msg " ;
228+
229+ $shredder -> PutObjects( Objects => \@objs );
230+ eval { $shredder -> WipeoutAll };
231+ is( $@ , ' ' , " shredding user who created another user's attribute does not throw" );
232+
233+ $attr -> Load( $attr -> id );
234+ is( $attr -> Creator, $uid_b , " attribute Creator updated to user B" );
235+ is( $attr -> LastUpdatedBy, $uid_b , " attribute LastUpdatedBy updated to user B" );
236+
237+ $shredder -> Wipeout( Object => $user_b );
238+ }
239+ cmp_deeply( $test -> dump_current_and_savepoint(' clean' ),
240+ " current DB equal to savepoint after shredding user who created another's attribute" );
241+
196242done_testing();
0 commit comments