rt 4.2.14 (#13852)
[freeside.git] / rt / t / shredder / 02group_member.t
1
2 use strict;
3 use warnings;
4
5 use Test::Deep;
6 use RT::Test::Shredder tests => 35;
7 my $test = "RT::Test::Shredder";
8
9 ### nested membership check
10 {
11         $test->create_savepoint('clean');
12         my $pgroup = RT::Group->new( RT->SystemUser );
13         my ($pgid) = $pgroup->CreateUserDefinedGroup( Name => 'Parent group' );
14         ok( $pgid, "created parent group" );
15         is( $pgroup->id, $pgid, "id is correct" );
16
17         my $cgroup = RT::Group->new( RT->SystemUser );
18         my ($cgid) = $cgroup->CreateUserDefinedGroup( Name => 'Child group' );
19         ok( $cgid, "created child group" );
20         is( $cgroup->id, $cgid, "id is correct" );
21
22         my ($status, $msg) = $pgroup->AddMember( $cgroup->id );
23         ok( $status, "added child group to parent") or diag "error: $msg";
24
25         $test->create_savepoint('bucreate'); # before user create
26         my $user = RT::User->new( RT->SystemUser );
27         my $uid;
28         ($uid, $msg) = $user->Create( Name => 'new user', Privileged => 1, Disabled => 0 );
29         ok( $uid, "created new user" ) or diag "error: $msg";
30         is( $user->id, $uid, "id is correct" );
31
32         $test->create_savepoint('buadd'); # before group add
33         ($status, $msg) = $cgroup->AddMember( $user->id );
34         ok( $status, "added user to child group") or diag "error: $msg";
35
36         my $members = RT::GroupMembers->new( RT->SystemUser );
37         $members->Limit( FIELD => 'MemberId', VALUE => $uid );
38         $members->Limit( FIELD => 'GroupId', VALUE => $cgid );
39         is( $members->Count, 1, "find membership record" );
40
41         my $transactions = RT::Transactions->new(RT->SystemUser);
42         $transactions->_OpenParen('member');
43         $transactions->Limit( SUBCLAUSE => 'member', FIELD => 'Type', VALUE => 'AddMember');
44         $transactions->Limit( SUBCLAUSE => 'member', FIELD => 'Field', VALUE => $user->PrincipalObj->id, ENTRYAGGREGATOR => 'AND' );
45         $transactions->Limit( SUBCLAUSE => 'member', FIELD => 'ObjectId', VALUE => $cgroup->id, ENTRYAGGREGATOR => 'AND' );
46         $transactions->_CloseParen('member');
47         $transactions->_OpenParen('member');
48         $transactions->Limit( SUBCLAUSE => 'member', FIELD => 'Type', VALUE => 'AddMembership');
49         $transactions->Limit( SUBCLAUSE => 'member', FIELD => 'Field', VALUE => $cgroup->PrincipalObj->id, ENTRYAGGREGATOR => 'AND' );
50         $transactions->Limit( SUBCLAUSE => 'member', FIELD => 'ObjectId', VALUE => $user->id, ENTRYAGGREGATOR => 'AND' );
51         $transactions->_CloseParen('member');
52         is( $transactions->Count, 2, "find membership transaction records" );
53
54         my $shredder = $test->shredder_new();
55         $shredder->PutObjects( Objects => [$members, $transactions] );
56         $shredder->WipeoutAll();
57         $test->db_is_valid;
58         cmp_deeply( $test->dump_current_and_savepoint('buadd'), "current DB equal to savepoint");
59
60         $shredder->PutObjects( Objects => $user );
61         $shredder->WipeoutAll();
62         $test->db_is_valid;
63         cmp_deeply( $test->dump_current_and_savepoint('bucreate'), "current DB equal to savepoint");
64
65         $shredder->PutObjects( Objects => [$pgroup, $cgroup] );
66         $shredder->WipeoutAll();
67         $test->db_is_valid;
68         cmp_deeply( $test->dump_current_and_savepoint('clean'), "current DB equal to savepoint");
69 }
70
71 ### deleting member of the ticket AdminCc role group
72 {
73         $test->restore_savepoint('clean');
74
75         my $user = RT::User->new( RT->SystemUser );
76         my ($uid, $msg) = $user->Create( Name => 'new user', Privileged => 1, Disabled => 0 );
77         ok( $uid, "created new user" ) or diag "error: $msg";
78         is( $user->id, $uid, "id is correct" );
79
80         use RT::Queue;
81         my $queue = RT::Queue->new( RT->SystemUser );
82         $queue->Load('general');
83         ok( $queue->id, "queue loaded succesfully" );
84
85         use RT::Tickets;
86         my $ticket = RT::Ticket->new( RT->SystemUser );
87         my ($id) = $ticket->Create( Subject => 'test', Queue => $queue->id );
88         ok( $id, "created new ticket" );
89         $ticket = RT::Ticket->new( RT->SystemUser );
90         my $status;
91         ($status, $msg) = $ticket->Load( $id );
92         ok( $id, "load ticket" ) or diag( "error: $msg" );
93
94         ($status, $msg) = $ticket->AddWatcher( Type => "AdminCc", PrincipalId => $user->id );
95         ok( $status, "AdminCC successfuly added") or diag( "error: $msg" );
96
97         my $member = $ticket->AdminCc->MembersObj->First;
98         my $shredder = $test->shredder_new();
99         $shredder->PutObjects( Objects => $member );
100         $shredder->WipeoutAll();
101         $test->db_is_valid;
102
103         $shredder->PutObjects( Objects => $user );
104         $shredder->WipeoutAll();
105         $test->db_is_valid;
106 }
107
108 ### deleting member of the ticket Owner role group
109 {
110         $test->restore_savepoint('clean');
111
112         my $user = RT::User->new( RT->SystemUser );
113         my ($uid, $msg) = $user->Create( Name => 'new user', Privileged => 1, Disabled => 0 );
114         ok( $uid, "created new user" ) or diag "error: $msg";
115         is( $user->id, $uid, "id is correct" );
116
117         use RT::Queue;
118         my $queue = RT::Queue->new( RT->SystemUser );
119         $queue->Load('general');
120         ok( $queue->id, "queue loaded succesfully" );
121
122         $user->PrincipalObj->GrantRight( Right => 'OwnTicket', Object => $queue );
123
124         use RT::Tickets;
125         my $ticket = RT::Ticket->new( RT->SystemUser );
126         my ($id) = $ticket->Create( Subject => 'test', Queue => $queue->id );
127         ok( $id, "created new ticket" );
128         $ticket = RT::Ticket->new( RT->SystemUser );
129         my $status;
130         ($status, $msg) = $ticket->Load( $id );
131         ok( $id, "load ticket" ) or diag( "error: $msg" );
132
133         ($status, $msg) = $ticket->SetOwner( $user->id );
134         ok( $status, "owner successfuly set") or diag( "error: $msg" );
135         is( $ticket->Owner, $user->id, "owner successfuly set") or diag( "error: $msg" );
136
137         my $member = $ticket->OwnerGroup->MembersObj->First;
138         my $shredder = $test->shredder_new();
139         $shredder->PutObjects( Objects => $member );
140         $shredder->WipeoutAll();
141         $test->db_is_valid;
142
143         $ticket = RT::Ticket->new( RT->SystemUser );
144         ($status, $msg) = $ticket->Load( $id );
145         ok( $id, "load ticket" ) or diag( "error: $msg" );
146         is( $ticket->Owner, RT->Nobody->id, "owner switched back to nobody" );
147         is( $ticket->OwnerGroup->MembersObj->First->MemberId, RT->Nobody->id, "and owner role group member is nobody");
148 }