[Rt-commit] rt branch, 4.4/customrole-merge, created. rt-4.4.1-149-g84cb52c

Shawn Moore shawn at bestpractical.com
Fri Dec 16 13:22:29 EST 2016


The branch, 4.4/customrole-merge has been created
        at  84cb52cf6e3a48c8d9af5bbd4de15fc7fadddbb4 (commit)

- Log -----------------------------------------------------------------
commit 3a27d6c518296264410d47bcab7f6484a0f009f3
Author: Shawn M Moore <shawn at bestpractical.com>
Date:   Fri Dec 16 18:06:55 2016 +0000

    Add failing test for nonexistent role groups + merge
    
    See I#32490

diff --git a/t/customroles/merge.t b/t/customroles/merge.t
new file mode 100644
index 0000000..321de62
--- /dev/null
+++ b/t/customroles/merge.t
@@ -0,0 +1,88 @@
+use strict;
+use warnings;
+
+use RT::Test tests => undef;
+
+my $general = RT::Test->load_or_create_queue( Name => 'General' );
+
+my $linus = RT::Test->load_or_create_user( EmailAddress => 'linus at example.com' );
+my $blake = RT::Test->load_or_create_user( EmailAddress => 'blake at example.com' );
+my $williamson = RT::Test->load_or_create_user( EmailAddress => 'williamson at example.com' );
+
+diag 'create tickets' if $ENV{'TEST_VERBOSE'};
+my ($t1, $t2);
+{
+    $t1 = RT::Test->create_ticket( Queue => 'General', Subject => 'alpha' );
+    ok($t1->Id);
+    $t2 = RT::Test->create_ticket( Queue => 'General', Subject => 'beta' );
+    ok($t2->Id);
+}
+
+diag 'create a multi-member role' if $ENV{'TEST_VERBOSE'};
+my $multi;
+{
+    $multi = RT::CustomRole->new(RT->SystemUser);
+    my ($ok, $msg) = $multi->Create(
+        Name      => 'Multi-' . $$,
+        MaxValues => 0,
+    );
+    ok($ok, "created role: $msg");
+
+    ($ok, $msg) = $multi->AddToObject($general->id);
+    ok($ok, "added role to General: $msg");
+}
+
+diag 'create a single-member role' if $ENV{'TEST_VERBOSE'};
+my $single;
+{
+    $single = RT::CustomRole->new(RT->SystemUser);
+    my ($ok, $msg) = $single->Create(
+        Name      => 'Single-' . $$,
+        MaxValues => 1,
+    );
+    ok($ok, "created role: $msg");
+
+    ($ok, $msg) = $single->AddToObject($general->id);
+    ok($ok, "added role to General: $msg");
+}
+
+diag 'merge tickets [issues.bestpractical.com #32490]' if $ENV{'TEST_VERBOSE'};
+{
+    my ($ok, $msg) = $t2->MergeInto($t1->Id);
+    ok($ok, $msg);
+
+    is($t1->RoleAddresses($multi->GroupType), '', 'no multi members');
+    is($t1->RoleAddresses($single->GroupType), '', 'no single members');
+}
+
+diag 'create tickets specifying roles' if $ENV{'TEST_VERBOSE'};
+my ($t3, $t4);
+{
+    $t3 = RT::Test->create_ticket(
+        Queue => 'General',
+        Subject => 'gamma',
+        $multi->GroupType => [$linus->EmailAddress],
+        $single->GroupType => $linus,
+    );
+    ok($t3->Id);
+
+    $t4 = RT::Test->create_ticket(
+        Queue => 'General',
+        Subject => 'gamma',
+        $multi->GroupType => [$blake->EmailAddress, $williamson->EmailAddress],
+        $single->GroupType => $blake,
+    );
+    ok($t4->Id);
+}
+
+diag 'merge tickets' if $ENV{'TEST_VERBOSE'};
+{
+    my ($ok, $msg) = $t4->MergeInto($t3->Id);
+    ok($ok, $msg);
+
+    is($t3->RoleAddresses($multi->GroupType), (join ', ', sort $blake->EmailAddress, $linus->EmailAddress, $williamson->EmailAddress), 'merged all multi-member addresses');
+    is($t3->RoleAddresses($single->GroupType), $linus->EmailAddress, 'took single-member address from merged-into ticket')
+}
+
+done_testing;
+

commit 84cb52cf6e3a48c8d9af5bbd4de15fc7fadddbb4
Author: Shawn M Moore <shawn at bestpractical.com>
Date:   Fri Dec 16 18:21:06 2016 +0000

    Fix lazily-created custom role groups breaking ticket merge
    
    See test in previous commit
    
    Fixes: T#32490

diff --git a/lib/RT/Ticket.pm b/lib/RT/Ticket.pm
index ff9b8d2..984393f 100644
--- a/lib/RT/Ticket.pm
+++ b/lib/RT/Ticket.pm
@@ -1825,8 +1825,10 @@ sub _MergeInto {
 
     # add all of this ticket's watchers to that ticket.
     for my $role ($self->Roles) {
-        next if $self->RoleGroup($role)->SingleMemberRoleGroup;
-        my $people = $self->RoleGroup($role)->MembersObj;
+        my $group = $self->RoleGroup($role);
+        next unless $group->Id; # e.g. lazily-created custom role groups
+        next if $group->SingleMemberRoleGroup;
+        my $people = $group->MembersObj;
         while ( my $watcher = $people->Next ) {
             my ($val, $msg) =  $MergeInto->AddRoleMember(
                 Type              => $role,

-----------------------------------------------------------------------


More information about the rt-commit mailing list