[Rt-commit] rt branch, 4.0/apply-scrips-to-multiple-queues, updated. rt-4.0.4-167-gfebe664

Ruslan Zakirov ruz at bestpractical.com
Wed Jan 4 06:44:36 EST 2012


The branch, 4.0/apply-scrips-to-multiple-queues has been updated
       via  febe6646446bde5f21fa2c84b3085e531e4a8297 (commit)
       via  4027e8c534821eda0abcee8e9d2fd774dcc84334 (commit)
       via  9cb9762ef69f2c36df6856be497cafba0035ba1e (commit)
       via  930f96eed816c2e8d2d94c361aabee607b37b815 (commit)
      from  60b8fecb907fd8f217ffba3197df1e672fe0ec17 (commit)

Summary of changes:
 lib/RT/Record/ApplyAndSort.pm |   30 ++++-
 t/api/scrip_order.t           |  241 +++++++++++++++++++++++++++++++++--------
 2 files changed, 219 insertions(+), 52 deletions(-)

- Log -----------------------------------------------------------------
commit 930f96eed816c2e8d2d94c361aabee607b37b815
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Fri Dec 30 01:30:00 2011 +0400

    update tests, scrip order no longer description based

diff --git a/t/api/scrip_order.t b/t/api/scrip_order.t
index 22d3f21..7c68226 100644
--- a/t/api/scrip_order.t
+++ b/t/api/scrip_order.t
@@ -3,51 +3,73 @@
 use strict;
 
 use RT;
-use RT::Test tests => 7;
-
-
-
-my $scrip_queue = RT::Queue->new(RT->SystemUser);
-my ($queue_id, $msg) = $scrip_queue->Create( Name => "ScripOrdering-$$", 
-    Description => 'Test scrip ordering by description' );
-ok($queue_id, "Created scrip-ordering test queue? ".$msg);
-
-my $priority_ten_scrip = RT::Scrip->new(RT->SystemUser);
-(my $id, $msg) = $priority_ten_scrip->Create( 
-    Description => "10 set priority $$",
-    Queue => $queue_id, 
-    ScripCondition => 'On Create',
-    ScripAction => 'User Defined', 
-    CustomPrepareCode => '$RT::Logger->debug("Setting priority to 10..."); return 1;',
-    CustomCommitCode => '$self->TicketObj->SetPriority(10);',
-    Template => 'Blank',
-    Stage => 'TransactionCreate',
-);
-ok($id, "Created priority-10 scrip? ".$msg);
-
-my $priority_five_scrip = RT::Scrip->new(RT->SystemUser);
-($id, $msg) = $priority_ten_scrip->Create( 
-    Description => "05 set priority $$",
-    Queue => $queue_id, 
-    ScripCondition => 'On Create',
-    ScripAction => 'User Defined', 
-    CustomPrepareCode => '$RT::Logger->debug("Setting priority to 5..."); return 1;',
-    CustomCommitCode => '$self->TicketObj->SetPriority(5);', 
-    Template => 'Blank',
-    Stage => 'TransactionCreate',
-);
-ok($id, "Created priority-5 scrip? ".$msg);
-
-my $ticket = RT::Ticket->new(RT->SystemUser);
-($id, $msg) = $ticket->Create( 
-    Queue => $queue_id, 
-    Requestor => 'order at example.com',
-    Subject => "Scrip order test $$",
-);
-ok($ticket->id, "Created ticket? id=$id");
-
-isnt($ticket->Priority , 0, "Ticket shouldn't be priority 0");
-isnt($ticket->Priority , 5, "Ticket shouldn't be priority 5");
-is  ($ticket->Priority , 10, "Ticket should be priority 10");
+use RT::Test tests => 9;
+
+my $queue = RT::Test->load_or_create_queue( Name => 'General' );
+ok $queue && $queue->id, 'loaded or created queue';
+
+{
+    my $ten = main->create_scrip_ok(
+        Description => "Set priority to 10",
+        Queue => $queue->id, 
+        CustomCommitCode => '$self->TicketObj->SetPriority(10);',
+    );
+
+    my $five = main->create_scrip_ok(
+        Description => "Set priority to 5",
+        Queue => $queue->id,
+        CustomCommitCode => '$self->TicketObj->SetPriority(5);', 
+    );
+
+    my $ticket = RT::Ticket->new(RT->SystemUser);
+    my ($id, $msg) = $ticket->Create( 
+        Queue => $queue->id, 
+        Subject => "Scrip order test $$",
+    );
+    ok($ticket->id, "Created ticket? id=$id");
+    is($ticket->Priority , 5, "By default newer scrip is last");
+
+    main->move_scrip_ok( $five, $queue->id, 'up' );
+
+    $ticket = RT::Ticket->new(RT->SystemUser);
+    ($id, $msg) = $ticket->Create(
+        Queue => $queue->id,
+        Subject => "Scrip order test $$",
+    );
+    ok($ticket->id, "Created ticket? id=$id");
+    is($ticket->Priority , 10, "Moved scrip and result is different");
+}
+
+sub create_scrip_ok {
+    my $self = shift;
+    my %args = (
+        ScripCondition => 'On Create',
+        ScripAction => 'User Defined', 
+        CustomPrepareCode => 'return 1',
+        CustomCommitCode => 'return 1', 
+        Template => 'Blank',
+        Stage => 'TransactionCreate',
+        @_
+    );
+
+    my $scrip = RT::Scrip->new( RT->SystemUser );
+    my ($id, $msg) = $scrip->Create( %args );
+    ok($id, "Created scrip") or diag "error: $msg";
+
+    return $scrip;
+}
+
+sub move_scrip_ok {
+    my $self = shift;
+    my ($scrip, $queue, $dir) = @_;
+
+    my $rec = RT::ObjectScrip->new( RT->SystemUser );
+    $rec->LoadByCols( Scrip => $scrip->id, ObjectId => $queue );
+    ok $rec->id, 'found application of the scrip';
+
+    my $method = 'Move'. ucfirst lc $dir;
+    my ($status, $msg) = $rec->$method();
+    ok $status, "moved scrip $dir" or diag "error: $msg";
+}
 
 

commit 9cb9762ef69f2c36df6856be497cafba0035ba1e
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Wed Jan 4 15:29:50 2012 +0400

    more tests for scrips ordering

diff --git a/t/api/scrip_order.t b/t/api/scrip_order.t
index 7c68226..44d9da9 100644
--- a/t/api/scrip_order.t
+++ b/t/api/scrip_order.t
@@ -3,11 +3,12 @@
 use strict;
 
 use RT;
-use RT::Test tests => 9;
+use RT::Test tests => 110;
 
 my $queue = RT::Test->load_or_create_queue( Name => 'General' );
 ok $queue && $queue->id, 'loaded or created queue';
 
+note "check that execution order reflects sort order";
 {
     my $ten = main->create_scrip_ok(
         Description => "Set priority to 10",
@@ -40,6 +41,83 @@ ok $queue && $queue->id, 'loaded or created queue';
     is($ticket->Priority , 10, "Moved scrip and result is different");
 }
 
+my $queue_B = RT::Test->load_or_create_queue( Name => 'Other' );
+ok $queue_B && $queue_B->id, 'loaded or created queue';
+
+note "move around two local scrips";
+{
+    main->delete_all_scrips();
+
+    my @scrips;
+    push @scrips, main->create_scrip_ok( Queue => $queue->id );
+    push @scrips, main->create_scrip_ok( Queue => $queue->id );
+    main->check_scrips_order(\@scrips, [$queue]);
+
+    main->move_scrip_ok( $scrips[0], $queue->id, 'down' );
+    @scrips = @scrips[1, 0];
+    main->check_scrips_order(\@scrips, [$queue]);
+
+    main->move_scrip_ok( $scrips[0], $queue->id, 'down' );
+    @scrips = @scrips[1, 0];
+    main->check_scrips_order(\@scrips, [$queue]);
+
+    main->move_scrip_ok( $scrips[1], $queue->id, 'up' );
+    @scrips = @scrips[1, 0];
+    main->check_scrips_order(\@scrips, [$queue]);
+
+    main->move_scrip_ok( $scrips[1], $queue->id, 'up' );
+    @scrips = @scrips[1, 0];
+    main->check_scrips_order(\@scrips, [$queue]);
+}
+
+note "move local scrip below global";
+{
+    main->delete_all_scrips();
+    my @scrips;
+    push @scrips, main->create_scrip_ok( Queue => $queue->id );
+    push @scrips, main->create_scrip_ok( Queue => $queue_B->id );
+    push @scrips, main->create_scrip_ok( Queue => 0 );
+    push @scrips, main->create_scrip_ok( Queue => $queue_B->id );
+
+    main->move_scrip_ok( $scrips[0], $queue->id, 'down' );
+    @scrips = @scrips[1, 2, 0, 3];
+    main->check_scrips_order(\@scrips, [$queue, $queue_B]);
+}
+
+note "move global scrip";
+{
+    main->delete_all_scrips();
+    my @scrips;
+    push @scrips, main->create_scrip_ok( Queue => 0 );
+    push @scrips, main->create_scrip_ok( Queue => $queue_B->id );
+    push @scrips, main->create_scrip_ok( Queue => $queue->id );
+    push @scrips, main->create_scrip_ok( Queue => 0 );
+    push @scrips, main->create_scrip_ok( Queue => $queue->id );
+
+    main->move_scrip_ok( $scrips[0], 0, 'down' );
+    @scrips = @scrips[1, 2, 3, 0, 4];
+    main->check_scrips_order(\@scrips, [$queue, $queue_B]);
+}
+
+note "delete scrips one by one";
+{
+    main->delete_all_scrips();
+    my @scrips;
+    push @scrips, main->create_scrip_ok( Queue => $queue->id );
+    push @scrips, main->create_scrip_ok( Queue => $queue_B->id );
+    push @scrips, main->create_scrip_ok( Queue => 0 );
+    push @scrips, main->create_scrip_ok( Queue => $queue_B->id );
+    push @scrips, main->create_scrip_ok( Queue => $queue->id );
+    push @scrips, main->create_scrip_ok( Queue => 0 );
+
+    main->check_scrips_order(\@scrips, [$queue, $queue_B]);
+
+    foreach my $idx (3, 2, 0 ) {
+        $_->Delete foreach splice @scrips, $idx, 1;
+        main->check_scrips_order(\@scrips, [$queue, $queue_B]);
+    }
+}
+
 sub create_scrip_ok {
     my $self = shift;
     my %args = (
@@ -59,6 +137,13 @@ sub create_scrip_ok {
     return $scrip;
 }
 
+sub delete_all_scrips {
+    my $self = shift;
+    my $scrips = RT::Scrips->new( RT->SystemUser );
+    $scrips->UnLimit;
+    $_->Delete foreach @{ $scrips->ItemsArrayRef };
+}
+
 sub move_scrip_ok {
     my $self = shift;
     my ($scrip, $queue, $dir) = @_;
@@ -72,4 +157,46 @@ sub move_scrip_ok {
     ok $status, "moved scrip $dir" or diag "error: $msg";
 }
 
+sub check_scrips_order {
+    my $self = shift;
+    my $scrips = shift;
+    my $queues = shift;
+
+    foreach my $qid ( 0, map $_->id, @$queues ) {
+        my $list = RT::Scrips->new( RT->SystemUser );
+        $list->LimitToGlobal;
+        $list->LimitToQueue( $qid ) if $qid;
+        $list->ApplySortOrder;
+        is_deeply(
+            [map $_->id, @{ $list->ItemsArrayRef } ],
+            [map $_->id, grep $_->IsAdded( $qid ) || $_->IsAdded( 0 ), @$scrips],
+            'list of scrips match expected'
+        )
+    }
+
+    foreach my $qid ( map $_->id, @$queues ) {
+        my $list = RT::ObjectScrips->new( RT->SystemUser );
+        $list->LimitToObjectId( 0 );
+        $list->LimitToObjectId( $qid );
+
+        my %so;
+        $so{ $_->SortOrder }++ foreach @{ $list->ItemsArrayRef };
+        ok( !grep( {$_ != 1} values %so), 'no dublicate order' );
+    }
+    {
+        my $list = RT::ObjectScrips->new( RT->SystemUser );
+        $list->UnLimit;
+        $list->OrderBy( FIELD => 'SortOrder', ORDER => 'ASC' );
+
+        my $prev;
+        foreach my $rec ( @{ $list->ItemsArrayRef } ) {
+            my $so = $rec->SortOrder;
+            do { $prev = $so; next } unless defined $prev;
+
+            ok $so == $prev || $so == $prev+1, "sequential order";
+            $prev = $so;
+        }
+    }
+}
+
 

commit 4027e8c534821eda0abcee8e9d2fd774dcc84334
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Wed Jan 4 15:31:44 2012 +0400

    fix NextSortOrder result for global records
    
    when global records are added we were checking only
    other global records, but there can be a local record
    with bigger sort order number than the last applied
    global. Fix it by checking every neighbor for a new
    global application.
    
    It's ok to ignore neighbors for local applications
    as those can share sort order.

diff --git a/lib/RT/Record/ApplyAndSort.pm b/lib/RT/Record/ApplyAndSort.pm
index ed3298b..6361dd1 100644
--- a/lib/RT/Record/ApplyAndSort.pm
+++ b/lib/RT/Record/ApplyAndSort.pm
@@ -348,9 +348,21 @@ sub MoveDown {
 
 sub NextSortOrder {
     my $self = shift;
-    my $siblings = $self->Siblings( @_ );
-    $siblings->OrderBy( FIELD => 'SortOrder', ORDER => 'DESC' );
-    return 0 unless my $first = $siblings->First;
+    my %args = (@_);
+
+    my $oid = $args{'ObjectId'};
+    $oid = $self->ObjectId unless defined $oid;
+    $oid ||= 0;
+
+    my $neighbors = $self->Neighbors( %args );
+    if ( $oid ) {
+        $neighbors->LimitToObjectId( $oid );
+        $neighbors->LimitToObjectId( 0 );
+    } elsif ( !$neighbors->_isLimited ) {
+        $neighbors->UnLimit;
+    }
+    $neighbors->OrderBy( FIELD => 'SortOrder', ORDER => 'DESC' );
+    return 0 unless my $first = $neighbors->First;
     return $first->SortOrder + 1;
 }
 

commit febe6646446bde5f21fa2c84b3085e531e4a8297
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Wed Jan 4 15:41:16 2012 +0400

    don't always move applications when we delete
    
    when we delete a record that shares sort order
    with other record(s), we shouldn't move anything

diff --git a/lib/RT/Record/ApplyAndSort.pm b/lib/RT/Record/ApplyAndSort.pm
index 6361dd1..989efb1 100644
--- a/lib/RT/Record/ApplyAndSort.pm
+++ b/lib/RT/Record/ApplyAndSort.pm
@@ -181,12 +181,18 @@ sub Delete {
     my $self = shift;
 
     my $siblings = $self->Neighbors;
-    $siblings->LimitToObjectId( $self->ObjectId );
-    $siblings->Limit( FIELD => 'SortOrder', OPERATOR => '>', VALUE => $self->SortOrder );
+    $siblings->Limit( FIELD => 'SortOrder', OPERATOR => '>=', VALUE => $self->SortOrder );
+    $siblings->OrderBy( FIELD => 'SortOrder', ORDER => 'ASC' );
 
-    # Move everything below us up
     my $sort_order = $self->SortOrder;
     while (my $record = $siblings->Next) {
+        next if $record->id == $self->id;
+        return $self->SUPER::Delete if $self->SortOrder == $record->SortOrder;
+        last;
+    }
+
+    # Move everything below us up
+    foreach my $record ( @{ $siblings->ItemsArrayRef } ) {
         $record->SetSortOrder($record->SortOrder - 1);
     }
 

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


More information about the Rt-commit mailing list