diff options
Diffstat (limited to 'rt/lib/t/regression')
-rw-r--r-- | rt/lib/t/regression/00-mason-syntax.t | 4 | ||||
-rw-r--r-- | rt/lib/t/regression/12-search.t | 45 | ||||
-rw-r--r-- | rt/lib/t/regression/20-sort-by-queue.t | 103 | ||||
-rw-r--r-- | rt/lib/t/regression/20-sort-by-user.t | 155 | ||||
-rw-r--r-- | rt/lib/t/regression/22search_tix_by_watcher.t | 53 | ||||
-rw-r--r-- | rt/lib/t/regression/23cfsort-freeform-multiple.t | 137 | ||||
-rw-r--r-- | rt/lib/t/regression/23cfsort-freeform-single.t | 191 | ||||
-rw-r--r-- | rt/lib/t/regression/23cfsort.t | 21 | ||||
-rw-r--r-- | rt/lib/t/regression/24-watchers.t | 157 | ||||
-rw-r--r-- | rt/lib/t/regression/26command_line.t | 7 |
10 files changed, 834 insertions, 39 deletions
diff --git a/rt/lib/t/regression/00-mason-syntax.t b/rt/lib/t/regression/00-mason-syntax.t index a94c7efc1..ce692a3b1 100644 --- a/rt/lib/t/regression/00-mason-syntax.t +++ b/rt/lib/t/regression/00-mason-syntax.t @@ -12,10 +12,6 @@ find( { no_chdir => 1, wanted => sub { return if /\.(?:jpe?g|png|gif|rej|\~)$/i; - if (m!/\.svn$!) { - $File::Find::prune = 1; - return; - } return unless -f $_; diag "testing $_" if $ENV{'TEST_VERBOSE'}; eval { compile_file($_) } and return; diff --git a/rt/lib/t/regression/12-search.t b/rt/lib/t/regression/12-search.t index 210d4fe33..c775f9372 100644 --- a/rt/lib/t/regression/12-search.t +++ b/rt/lib/t/regression/12-search.t @@ -142,67 +142,82 @@ ok( $id, $msg ); # we have tickets. start searching my $tix = RT::Tickets->new($RT::SystemUser); $tix->FromSQL("Queue = '$queue'"); -is($tix->Count, 7, "found all the tickets"); +is($tix->Count, 7, "found all the tickets") + or diag "wrong results from SQL:\n". $tix->BuildSelectCountQuery; # very simple searches. both CF and normal $tix = RT::Tickets->new($RT::SystemUser); $tix->FromSQL("Queue = '$queue' AND CF.SearchTest = 'foo1'"); -is($tix->Count, 1, "matched identical subject"); +is($tix->Count, 1, "matched identical subject") + or diag "wrong results from SQL:\n". $tix->BuildSelectCountQuery; $tix = RT::Tickets->new($RT::SystemUser); $tix->FromSQL("Queue = '$queue' AND CF.SearchTest LIKE 'foo1'"); -is($tix->Count, 1, "matched LIKE subject"); +is($tix->Count, 1, "matched LIKE subject") + or diag "wrong results from SQL:\n". $tix->BuildSelectCountQuery; $tix = RT::Tickets->new($RT::SystemUser); $tix->FromSQL("Queue = '$queue' AND CF.SearchTest = 'foo'"); -is($tix->Count, 0, "IS a regexp match"); +is($tix->Count, 0, "IS a regexp match") + or diag "wrong results from SQL:\n". $tix->BuildSelectCountQuery; $tix = RT::Tickets->new($RT::SystemUser); $tix->FromSQL("Queue = '$queue' AND CF.SearchTest LIKE 'foo'"); -is($tix->Count, 5, "matched LIKE subject"); +is($tix->Count, 5, "matched LIKE subject") + or diag "wrong results from SQL:\n". $tix->BuildSelectCountQuery; $tix = RT::Tickets->new($RT::SystemUser); $tix->FromSQL("Queue = '$queue' AND CF.SearchTest IS NULL"); -is($tix->Count, 2, "IS null CF"); +is($tix->Count, 2, "IS null CF") + or diag "wrong results from SQL:\n". $tix->BuildSelectCountQuery; $tix = RT::Tickets->new($RT::SystemUser); $tix->FromSQL("Queue = '$queue' AND Requestors LIKE 'search1'"); -is($tix->Count, 1, "LIKE requestor"); +is($tix->Count, 1, "LIKE requestor") + or diag "wrong results from SQL:\n". $tix->BuildSelectCountQuery; $tix = RT::Tickets->new($RT::SystemUser); $tix->FromSQL("Queue = '$queue' AND Requestors = 'search1\@example.com'"); -is($tix->Count, 1, "IS requestor"); +is($tix->Count, 1, "IS requestor") + or diag "wrong results from SQL:\n". $tix->BuildSelectCountQuery; $tix = RT::Tickets->new($RT::SystemUser); $tix->FromSQL("Queue = '$queue' AND Requestors LIKE 'search'"); -is($tix->Count, 6, "LIKE requestor"); +is($tix->Count, 6, "LIKE requestor") + or diag "wrong results from SQL:\n". $tix->BuildSelectCountQuery; $tix = RT::Tickets->new($RT::SystemUser); $tix->FromSQL("Queue = '$queue' AND Requestors IS NULL"); -is($tix->Count, 1, "Search for no requestor"); +is($tix->Count, 1, "Search for no requestor") + or diag "wrong results from SQL:\n". $tix->BuildSelectCountQuery; $tix = RT::Tickets->new($RT::SystemUser); $tix->FromSQL("Queue = '$queue' AND Subject = 'SearchTest1'"); -is($tix->Count, 1, "IS subject"); +is($tix->Count, 1, "IS subject") + or diag "wrong results from SQL:\n". $tix->BuildSelectCountQuery; $tix = RT::Tickets->new($RT::SystemUser); $tix->FromSQL("Queue = '$queue' AND Subject LIKE 'SearchTest1'"); -is($tix->Count, 1, "LIKE subject"); +is($tix->Count, 1, "LIKE subject") + or diag "wrong results from SQL:\n". $tix->BuildSelectCountQuery; $tix = RT::Tickets->new($RT::SystemUser); $tix->FromSQL("Queue = '$queue' AND Subject = ''"); -is($tix->Count, 1, "found one ticket"); +is($tix->Count, 1, "found one ticket") + or diag "wrong results from SQL:\n". $tix->BuildSelectCountQuery; $tix = RT::Tickets->new($RT::SystemUser); $tix->FromSQL("Queue = '$queue' AND Subject LIKE 'SearchTest'"); -is($tix->Count, 6, "found two ticket"); +is($tix->Count, 6, "found two ticket") + or diag "wrong results from SQL:\n". $tix->BuildSelectCountQuery; $tix = RT::Tickets->new($RT::SystemUser); $tix->FromSQL("Queue = '$queue' AND Subject LIKE 'qwerty'"); -is($tix->Count, 0, "found zero ticket"); +is($tix->Count, 0, "found zero ticket") + or diag "wrong results from SQL:\n". $tix->BuildSelectCountQuery; diff --git a/rt/lib/t/regression/20-sort-by-queue.t b/rt/lib/t/regression/20-sort-by-queue.t new file mode 100644 index 000000000..16eabe91b --- /dev/null +++ b/rt/lib/t/regression/20-sort-by-queue.t @@ -0,0 +1,103 @@ +#!/usr/bin/perl + +use Test::More tests => 8; +use RT; +RT::LoadConfig(); +RT::Init(); + +use strict; +use warnings; + +use RT::Tickets; +use RT::Queue; +use RT::CustomField; + +######################################################### +# Test sorting by Queue, we sort by its name +######################################################### + + +diag "Create queues to test with."; +my @qids; +my @queues; +# create them in reverse order to avoid false positives +foreach my $name ( qw(sort-by-queue-Z sort-by-queue-A) ) { + my $queue = RT::Queue->new( $RT::SystemUser ); + my ($ret, $msg) = $queue->Create( + Name => $name ."-$$", + Description => 'queue to test sorting by queue' + ); + ok($ret, "test queue creation. $msg"); + push @queues, $queue; + push @qids, $queue->id; +} + +my ($total, @data, @tickets, @test) = (0, ()); + +sub add_tix_from_data { + my @res = (); + @data = sort { rand(100) <=> rand(100) } @data; + while (@data) { + my $t = RT::Ticket->new($RT::SystemUser); + my %args = %{ shift(@data) }; + my ( $id, undef, $msg ) = $t->Create( %args ); + ok( $id, "ticket created" ) or diag("error: $msg"); + push @res, $t; + $total++; + } + return @res; +} + +sub run_tests { + my $query_prefix = join ' OR ', map 'id = '. $_->id, @tickets; + foreach my $test ( @test ) { + my $query = join " AND ", map "( $_ )", grep defined && length, + $query_prefix, $test->{'Query'}; + + foreach my $order (qw(ASC DESC)) { + my $error = 0; + my $tix = RT::Tickets->new( $RT::SystemUser ); + $tix->FromSQL( $query ); + $tix->OrderBy( FIELD => $test->{'Order'}, ORDER => $order ); + + ok($tix->Count, "found ticket(s)") + or $error = 1; + + my ($order_ok, $last) = (1, $order eq 'ASC'? '-': 'zzzzzz'); + while ( my $t = $tix->Next ) { + my $tmp; + if ( $order eq 'ASC' ) { + $tmp = ((split( /,/, $last))[0] cmp (split( /,/, $t->Subject))[0]); + } else { + $tmp = -((split( /,/, $last))[-1] cmp (split( /,/, $t->Subject))[-1]); + } + if ( $tmp > 0 ) { + $order_ok = 0; last; + } + $last = $t->Subject; + } + + ok( $order_ok, "$order order of tickets is good" ) + or $error = 1; + + if ( $error ) { + diag "Wrong SQL query:". $tix->BuildSelectQuery; + $tix->GotoFirstItem; + while ( my $t = $tix->Next ) { + diag sprintf "%02d - %s", $t->id, $t->Subject; + } + } + } + } +} + +@data = ( + { Queue => $qids[0], Subject => 'z' }, + { Queue => $qids[1], Subject => 'a' }, +); +@tickets = add_tix_from_data(); +@test = ( + { Order => "Queue" }, +); +run_tests(); + diff --git a/rt/lib/t/regression/20-sort-by-user.t b/rt/lib/t/regression/20-sort-by-user.t new file mode 100644 index 000000000..04bf2e75f --- /dev/null +++ b/rt/lib/t/regression/20-sort-by-user.t @@ -0,0 +1,155 @@ +#!/usr/bin/perl + +use Test::More tests => 32; +use RT; +RT::LoadConfig(); +RT::Init(); + +use strict; +use warnings; + +use RT::Tickets; +use RT::Queue; +use RT::CustomField; + +######################################################### +# Test sorting by Owner, Creator and LastUpdatedBy +# we sort by user name +######################################################### + +diag "Create a queue to test with."; +my $queue_name = "OwnerSortQueue$$"; +my $queue; +{ + $queue = RT::Queue->new( $RT::SystemUser ); + my ($ret, $msg) = $queue->Create( + Name => $queue, + Description => 'queue for custom field sort testing' + ); + ok($ret, "$queue test queue creation. $msg"); +} + +my @uids; +my @users; +# create them in reverse order to avoid false positives +foreach my $u (qw(Z A)) { + my $name = $u ."-user-to-test-ordering-$$"; + my $user = RT::User->new( $RT::SystemUser ); + my ($uid) = $user->Create( + Name => $name, + Privileged => 1, + ); + ok $uid, "created user #$uid"; + + my ($status, $msg) = $user->PrincipalObj->GrantRight( Right => 'OwnTicket', Object => $queue ); + ok $status, "granted right"; + ($status, $msg) = $user->PrincipalObj->GrantRight( Right => 'CreateTicket', Object => $queue ); + ok $status, "granted right"; + + push @users, $user; + push @uids, $user->id; +} + +my ($total, @data, @tickets, @test) = (0, ()); + +sub add_tix_from_data { + my @res = (); + @data = sort { rand(100) <=> rand(100) } @data; + while (@data) { + my $t = RT::Ticket->new($RT::SystemUser); + my %args = %{ shift(@data) }; + + my ( $id, undef, $msg ) = $t->Create( %args, Queue => $queue->id ); + if ( $args{'Owner'} ) { + is $t->Owner, $args{'Owner'}, "owner is correct"; + } + if ( $args{'Creator'} ) { + is $t->Creator, $args{'Creator'}, "creator is correct"; + } + # hackish, but simpler + if ( $args{'LastUpdatedBy'} ) { + $t->__Set( Field => 'LastUpdatedBy', Value => $args{'LastUpdatedBy'} ); + } + ok( $id, "ticket created" ) or diag("error: $msg"); + push @res, $t; + $total++; + } + return @res; +} + +sub run_tests { + my $query_prefix = join ' OR ', map 'id = '. $_->id, @tickets; + foreach my $test ( @test ) { + my $query = join " AND ", map "( $_ )", grep defined && length, + $query_prefix, $test->{'Query'}; + + foreach my $order (qw(ASC DESC)) { + my $error = 0; + my $tix = RT::Tickets->new( $RT::SystemUser ); + $tix->FromSQL( $query ); + $tix->OrderBy( FIELD => $test->{'Order'}, ORDER => $order ); + + ok($tix->Count, "found ticket(s)") + or $error = 1; + + my ($order_ok, $last) = (1, $order eq 'ASC'? '-': 'zzzzzz'); + while ( my $t = $tix->Next ) { + my $tmp; + if ( $order eq 'ASC' ) { + $tmp = ((split( /,/, $last))[0] cmp (split( /,/, $t->Subject))[0]); + } else { + $tmp = -((split( /,/, $last))[-1] cmp (split( /,/, $t->Subject))[-1]); + } + if ( $tmp > 0 ) { + $order_ok = 0; last; + } + $last = $t->Subject; + } + + ok( $order_ok, "$order order of tickets is good" ) + or $error = 1; + + if ( $error ) { + diag "Wrong SQL query:". $tix->BuildSelectQuery; + $tix->GotoFirstItem; + while ( my $t = $tix->Next ) { + diag sprintf "%02d - %s", $t->id, $t->Subject; + } + } + } + } +} + +@data = ( + { Subject => 'Nobody' }, + { Subject => 'Z', Owner => $uids[0] }, + { Subject => 'A', Owner => $uids[1] }, +); +@tickets = add_tix_from_data(); +@test = ( + { Order => "Owner" }, +); +run_tests(); + +@data = ( + { Subject => 'RT' }, + { Subject => 'Z', Creator => $uids[0] }, + { Subject => 'A', Creator => $uids[1] }, +); +@tickets = add_tix_from_data(); +@test = ( + { Order => "Creator" }, +); +run_tests(); + +@data = ( + { Subject => 'RT' }, + { Subject => 'Z', LastUpdatedBy => $uids[0] }, + { Subject => 'A', LastUpdatedBy => $uids[1] }, +); +@tickets = add_tix_from_data(); +@test = ( + { Order => "LastUpdatedBy" }, +); +run_tests(); + diff --git a/rt/lib/t/regression/22search_tix_by_watcher.t b/rt/lib/t/regression/22search_tix_by_watcher.t index 4dd11af1e..204c41c37 100644 --- a/rt/lib/t/regression/22search_tix_by_watcher.t +++ b/rt/lib/t/regression/22search_tix_by_watcher.t @@ -3,7 +3,7 @@ use strict; use warnings; -use Test::More tests => 79; +use Test::More tests => 119; use_ok('RT'); RT::LoadConfig(); RT::Init(); @@ -95,6 +95,56 @@ sub run_tests { } run_tests(); +# mixing searches by watchers with other conditions +# http://rt3.fsck.com/Ticket/Display.html?id=9322 +%test = ( + 'Subject LIKE "x" AND Requestor = "y@example.com"' => + { xy => 1, x => 0, y => 0, '-' => 0, z => 0 }, + 'Subject NOT LIKE "x" AND Requestor = "y@example.com"' => + { xy => 0, x => 0, y => 1, '-' => 0, z => 0 }, + 'Subject LIKE "x" AND Requestor != "y@example.com"' => + { xy => 0, x => 1, y => 0, '-' => 0, z => 0 }, + 'Subject NOT LIKE "x" AND Requestor != "y@example.com"' => + { xy => 0, x => 0, y => 0, '-' => 1, z => 1 }, + + 'Subject LIKE "x" OR Requestor = "y@example.com"' => + { xy => 1, x => 1, y => 1, '-' => 0, z => 0 }, + 'Subject NOT LIKE "x" OR Requestor = "y@example.com"' => + { xy => 1, x => 0, y => 1, '-' => 1, z => 1 }, + 'Subject LIKE "x" OR Requestor != "y@example.com"' => + { xy => 1, x => 1, y => 0, '-' => 1, z => 1 }, + 'Subject NOT LIKE "x" OR Requestor != "y@example.com"' => + { xy => 0, x => 1, y => 1, '-' => 1, z => 1 }, + +# group of cases when user doesn't exist in DB at all + 'Subject LIKE "x" AND Requestor = "not-exist@example.com"' => + { xy => 0, x => 0, y => 0, '-' => 0, z => 0 }, + 'Subject NOT LIKE "x" AND Requestor = "not-exist@example.com"' => + { xy => 0, x => 0, y => 0, '-' => 0, z => 0 }, + 'Subject LIKE "x" AND Requestor != "not-exist@example.com"' => + { xy => 1, x => 1, y => 0, '-' => 0, z => 0 }, + 'Subject NOT LIKE "x" AND Requestor != "not-exist@example.com"' => + { xy => 0, x => 0, y => 1, '-' => 1, z => 1 }, + 'Subject LIKE "x" OR Requestor = "not-exist@example.com"' => + { xy => 1, x => 1, y => 0, '-' => 0, z => 0 }, + 'Subject NOT LIKE "x" OR Requestor = "not-exist@example.com"' => + { xy => 0, x => 0, y => 1, '-' => 1, z => 1 }, + 'Subject LIKE "x" OR Requestor != "not-exist@example.com"' => + { xy => 1, x => 1, y => 1, '-' => 1, z => 1 }, + 'Subject NOT LIKE "x" OR Requestor != "not-exist@example.com"' => + { xy => 1, x => 1, y => 1, '-' => 1, z => 1 }, + + 'Subject LIKE "z" AND (Requestor = "x@example.com" OR Requestor = "y@example.com")' => + { xy => 0, x => 0, y => 0, '-' => 0, z => 0 }, + 'Subject NOT LIKE "z" AND (Requestor = "x@example.com" OR Requestor = "y@example.com")' => + { xy => 1, x => 1, y => 1, '-' => 0, z => 0 }, + 'Subject LIKE "z" OR (Requestor = "x@example.com" OR Requestor = "y@example.com")' => + { xy => 1, x => 1, y => 1, '-' => 0, z => 1 }, + 'Subject NOT LIKE "z" OR (Requestor = "x@example.com" OR Requestor = "y@example.com")' => + { xy => 1, x => 1, y => 1, '-' => 1, z => 0 }, +); +run_tests(); + TODO: { local $TODO = "we can't generate this query yet"; %test = ( @@ -142,6 +192,7 @@ TODO: { } run_tests(); + # owner is special watcher because reference is duplicated in two places, # owner was an ENUM field now it's WATCHERFIELD, but should support old # style ENUM searches for backward compatibility diff --git a/rt/lib/t/regression/23cfsort-freeform-multiple.t b/rt/lib/t/regression/23cfsort-freeform-multiple.t new file mode 100644 index 000000000..453e83cf5 --- /dev/null +++ b/rt/lib/t/regression/23cfsort-freeform-multiple.t @@ -0,0 +1,137 @@ +#!/usr/bin/perl + +use Test::More tests => 24; +use RT; +RT::LoadConfig(); +RT::Init(); + +use strict; +use warnings; + +use RT::Tickets; +use RT::Queue; +use RT::CustomField; + +# Test Sorting by custom fields. + +diag "Create a queue to test with."; +my $queue_name = "CFSortQueue-$$"; +my $queue; +{ + $queue = RT::Queue->new( $RT::SystemUser ); + my ($ret, $msg) = $queue->Create( + Name => $queue_name, + Description => 'queue for custom field sort testing' + ); + ok($ret, "$queue_name - test queue creation. $msg"); +} + +diag "create a CF\n"; +my $cf_name = "Order$$"; +my $cf; +{ + $cf = RT::CustomField->new( $RT::SystemUser ); + my ($ret, $msg) = $cf->Create( + Name => $cf_name, + Queue => $queue->id, + Type => 'FreeformMultiple', + ); + ok($ret, "Custom Field Order created"); +} + +my ($total, @data, @tickets, @test) = (0, ()); + +sub add_tix_from_data { + my @res = (); + @data = sort { rand(100) <=> rand(100) } @data; + while (@data) { + my $t = RT::Ticket->new($RT::SystemUser); + my %args = %{ shift(@data) }; + my @values = (); + if ( exists $args{'CF'} && ref $args{'CF'} ) { + @values = @{ delete $args{'CF'} }; + } elsif ( exists $args{'CF'} ) { + @values = (delete $args{'CF'}); + } + $args{ 'CustomField-'. $cf->id } = \@values + if @values; + my $subject = join(",", sort @values) || '-'; + my ( $id, undef $msg ) = $t->Create( + %args, + Queue => $queue->id, + Subject => $subject, + ); + ok( $id, "ticket created" ) or diag("error: $msg"); + push @res, $t; + $total++; + } + return @res; +} + +sub run_tests { + my $query_prefix = join ' OR ', map 'id = '. $_->id, @tickets; + foreach my $test ( @test ) { + my $query = join " AND ", map "( $_ )", grep defined && length, + $query_prefix, $test->{'Query'}; + + foreach my $order (qw(ASC DESC)) { + my $error = 0; + my $tix = RT::Tickets->new( $RT::SystemUser ); + $tix->FromSQL( $query ); + $tix->OrderBy( FIELD => $test->{'Order'}, ORDER => $order ); + + ok($tix->Count, "found ticket(s)") + or $error = 1; + + my ($order_ok, $last) = (1, $order eq 'ASC'? '-': 'zzzzzz'); + while ( my $t = $tix->Next ) { + my $tmp; + if ( $order eq 'ASC' ) { + $tmp = ((split( /,/, $last))[0] cmp (split( /,/, $t->Subject))[0]); + } else { + $tmp = -((split( /,/, $last))[-1] cmp (split( /,/, $t->Subject))[-1]); + } + if ( $tmp > 0 ) { + $order_ok = 0; last; + } + $last = $t->Subject; + } + + ok( $order_ok, "$order order of tickets is good" ) + or $error = 1; + + if ( $error ) { + diag "Wrong SQL query:". $tix->BuildSelectQuery; + $tix->GotoFirstItem; + while ( my $t = $tix->Next ) { + diag sprintf "%02d - %s", $t->id, $t->Subject; + } + } + } + } +} + +@data = ( + { }, + { CF => ['b', 'd'] }, + { CF => ['a', 'c'] }, +); +@tickets = add_tix_from_data(); +@test = ( + { Order => "CF.{$cf_name}" }, + { Order => "CF.$queue_name.{$cf_name}" }, +); +run_tests(); + +@data = ( + { CF => ['m', 'a'] }, + { CF => ['m'] }, + { CF => ['m', 'o'] }, +); +@tickets = add_tix_from_data(); +@test = ( + { Order => "CF.{$cf_name}", Query => "CF.{$cf_name} = 'm'" }, + { Order => "CF.$queue_name.{$cf_name}", Query => "CF.{$cf_name} = 'm'" }, +); +run_tests(); + diff --git a/rt/lib/t/regression/23cfsort-freeform-single.t b/rt/lib/t/regression/23cfsort-freeform-single.t new file mode 100644 index 000000000..277befe0a --- /dev/null +++ b/rt/lib/t/regression/23cfsort-freeform-single.t @@ -0,0 +1,191 @@ +#!/usr/bin/perl + +use Test::More tests => 57; +use RT; +RT::LoadConfig(); +RT::Init(); + +use strict; +use warnings; + +use RT::Tickets; +use RT::Queue; +use RT::CustomField; + +# Test Sorting by FreeformSingle custom field. + +diag "Create a queue to test with."; +my $queue_name = "CFSortQueue$$"; +my $queue; +{ + $queue = RT::Queue->new( $RT::SystemUser ); + my ($ret, $msg) = $queue->Create( + Name => $queue, + Description => 'queue for custom field sort testing' + ); + ok($ret, "$queue test queue creation. $msg"); +} + +# CFs for testing, later we create another one +my %CF; +my $cf_name; + +diag "create a CF\n"; +{ + $cf_name = $CF{'CF'}{'name'} = "Order$$"; + $CF{'CF'}{'obj'} = RT::CustomField->new( $RT::SystemUser ); + my ($ret, $msg) = $CF{'CF'}{'obj'}->Create( + Name => $CF{'CF'}{'name'}, + Queue => $queue->id, + Type => 'FreeformSingle', + ); + ok($ret, "Custom Field $CF{'CF'}{'name'} created"); +} + +my ($total, @data, @tickets, @test) = (0, ()); + +sub add_tix_from_data { + my @res = (); + @data = sort { rand(100) <=> rand(100) } @data; + while (@data) { + my $t = RT::Ticket->new($RT::SystemUser); + my %args = %{ shift(@data) }; + + my $subject = '-'; + foreach my $e ( grep exists $CF{$_} && defined $CF{$_}, keys %args ) { + my @values = (); + if ( ref $args{ $e } ) { + @values = @{ delete $args{ $e } }; + } else { + @values = (delete $args{ $e }); + } + $args{ 'CustomField-'. $CF{ $e }{'obj'}->id } = \@values + if @values; + $subject = join(",", sort @values) || '-' + if $e eq 'CF'; + } + + my ( $id, undef $msg ) = $t->Create( + %args, + Queue => $queue->id, + Subject => $subject, + ); + ok( $id, "ticket created" ) or diag("error: $msg"); + push @res, $t; + $total++; + } + return @res; +} + +sub run_tests { + my $query_prefix = join ' OR ', map 'id = '. $_->id, @tickets; + foreach my $test ( @test ) { + my $query = join " AND ", map "( $_ )", grep defined && length, + $query_prefix, $test->{'Query'}; + + foreach my $order (qw(ASC DESC)) { + my $error = 0; + my $tix = RT::Tickets->new( $RT::SystemUser ); + $tix->FromSQL( $query ); + $tix->OrderBy( FIELD => $test->{'Order'}, ORDER => $order ); + + ok($tix->Count, "found ticket(s)") + or $error = 1; + + my ($order_ok, $last) = (1, $order eq 'ASC'? '-': 'zzzzzz'); + while ( my $t = $tix->Next ) { + my $tmp; + if ( $order eq 'ASC' ) { + $tmp = ((split( /,/, $last))[0] cmp (split( /,/, $t->Subject))[0]); + } else { + $tmp = -((split( /,/, $last))[-1] cmp (split( /,/, $t->Subject))[-1]); + } + if ( $tmp > 0 ) { + $order_ok = 0; last; + } + $last = $t->Subject; + } + + ok( $order_ok, "$order order of tickets is good" ) + or $error = 1; + + if ( $error ) { + diag "Wrong SQL query:". $tix->BuildSelectQuery; + $tix->GotoFirstItem; + while ( my $t = $tix->Next ) { + diag sprintf "%02d - %s", $t->id, $t->Subject; + } + } + } + } +} + +@data = ( + { }, + { CF => 'a' }, + { CF => 'b' }, +); +@tickets = add_tix_from_data(); +@test = ( + { Order => "CF.{$cf_name}" }, + { Order => "CF.$queue_name.{$cf_name}" }, +); +run_tests(); + +@data = ( + { }, + { CF => 'aa' }, + { CF => 'ab' }, +); +@tickets = add_tix_from_data(); +@test = ( + { Query => "CF.{$cf_name} LIKE 'a'", Order => "CF.{$cf_name}" }, + { Query => "CF.{$cf_name} LIKE 'a'", Order => "CF.$queue_name.{$cf_name}" }, +); +run_tests(); + +@data = ( + { Subject => '-', }, + { Subject => 'a', CF => 'a' }, + { Subject => 'b', CF => 'b' }, + { Subject => 'c', CF => 'c' }, +); +@tickets = add_tix_from_data(); +@test = ( + { Query => "CF.{$cf_name} != 'c'", Order => "CF.{$cf_name}" }, + { Query => "CF.{$cf_name} != 'c'", Order => "CF.$queue_name.{$cf_name}" }, +); +run_tests(); + + + +diag "create another CF\n"; +{ + $CF{'AnotherCF'}{'name'} = "OrderAnother$$"; + $CF{'AnotherCF'}{'obj'} = RT::CustomField->new( $RT::SystemUser ); + my ($ret, $msg) = $CF{'AnotherCF'}{'obj'}->Create( + Name => $CF{'AnotherCF'}{'name'}, + Queue => $queue->id, + Type => 'FreeformSingle', + ); + ok($ret, "Custom Field $CF{'AnotherCF'}{'name'} created"); +} + +# test that order is not affect by other fields (had such problem) +@data = ( + { Subject => '-', }, + { Subject => 'a', CF => 'a', AnotherCF => 'za' }, + { Subject => 'b', CF => 'b', AnotherCF => 'ya' }, + { Subject => 'c', CF => 'c', AnotherCF => 'xa' }, +); +@tickets = add_tix_from_data(); +@test = ( + { Order => "CF.{$cf_name}" }, + { Order => "CF.$queue_name.{$cf_name}" }, + { Query => "CF.{$cf_name} != 'c'", Order => "CF.{$cf_name}" }, + { Query => "CF.{$cf_name} != 'c'", Order => "CF.$queue_name.{$cf_name}" }, +); +run_tests(); + + + diff --git a/rt/lib/t/regression/23cfsort.t b/rt/lib/t/regression/23cfsort.t index 85decc707..ba404f2ba 100644 --- a/rt/lib/t/regression/23cfsort.t +++ b/rt/lib/t/regression/23cfsort.t @@ -16,6 +16,8 @@ my($ret,$msg); # Test Sorting by custom fields. +# TODO: it's hard to read this file, conver to new style, +# for example look at 23cfsort-freeform-single.t # ---- Create a queue to test with. my $queue = "CFSortQueue-$$"; @@ -116,20 +118,14 @@ $tx->FromSQL(qq[queue="$queue"] ); $tx->OrderBy( FIELD => "CF.{Charlie}", ORDER => 'DESC' ); diag $tx->BuildSelectQuery; is($tx->Count,2); -TODO: { - local $TODO = 'order by CF fail'; check_order( $tx, 1, 2); -} $tx = new RT::Tickets( $RT::SystemUser ); $tx->FromSQL(qq[queue="$queue"] ); $tx->OrderBy( FIELD => "CF.{Charlie}", ORDER => 'ASC' ); diag $tx->BuildSelectQuery; is($tx->Count,2); -TODO: { - local $TODO = 'order by CF fail'; check_order( $tx, 2, 1); -} # Add a new ticket, to test sorting on multiple columns. my $t3 = RT::Ticket->new($RT::SystemUser); @@ -148,10 +144,7 @@ $tx->OrderByCols( { FIELD => "CF.${queue}.{Alpha}", ORDER => 'DES' }, ); is($tx->Count,3); -TODO: { - local $TODO = 'order by CF fail'; check_order( $tx, 3, 2, 1); -} $tx = new RT::Tickets( $RT::SystemUser ); $tx->FromSQL(qq[queue="$queue"] ); @@ -160,10 +153,7 @@ $tx->OrderByCols( { FIELD => "CF.${queue}.{Alpha}", ORDER => 'ASC' }, ); is($tx->Count,3); -TODO: { - local $TODO = 'order by CF fail'; check_order( $tx, 1, 2, 3); -} # Reverse the order of the secondary column, which changes the order # of the first two tickets. @@ -174,10 +164,7 @@ $tx->OrderByCols( { FIELD => "CF.${queue}.{Alpha}", ORDER => 'ASC' }, ); is($tx->Count,3); -TODO: { - local $TODO = 'order by CF fail'; check_order( $tx, 2, 3, 1); -} $tx = new RT::Tickets( $RT::SystemUser ); $tx->FromSQL(qq[queue="$queue"] ); @@ -186,7 +173,5 @@ $tx->OrderByCols( { FIELD => "CF.${queue}.{Alpha}", ORDER => 'DES' }, ); is($tx->Count,3); -TODO: { - local $TODO = 'order by CF fail'; check_order( $tx, 1, 3, 2); -} + diff --git a/rt/lib/t/regression/24-watchers.t b/rt/lib/t/regression/24-watchers.t new file mode 100644 index 000000000..69bc8acc6 --- /dev/null +++ b/rt/lib/t/regression/24-watchers.t @@ -0,0 +1,157 @@ +#!/usr/bin/perl -w +# BEGIN BPS TAGGED BLOCK {{{ +# +# COPYRIGHT: +# +# This software is Copyright (c) 1996-2005 Best Practical Solutions, LLC +# <jesse.com> +# +# (Except where explicitly superseded by other copyright notices) +# +# +# LICENSE: +# +# This work is made available to you under the terms of Version 2 of +# the GNU General Public License. A copy of that license should have +# been provided with this software, but in any event can be snarfed +# from www.gnu.org. +# +# This work is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +# +# CONTRIBUTION SUBMISSION POLICY: +# +# (The following paragraph is not intended to limit the rights granted +# to you to modify and distribute this software under the terms of +# the GNU General Public License and is only of importance to you if +# you choose to contribute your changes and enhancements to the +# community by submitting them to Best Practical Solutions, LLC.) +# +# By intentionally submitting any modifications, corrections or +# derivatives to this work, or any other work intended for use with +# Request Tracker, to Best Practical Solutions, LLC, you confirm that +# you are the copyright holder for those contributions and you grant +# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +# royalty-free, perpetual, license to use, copy, create derivative +# works based on those contributions, and sublicense and distribute +# those contributions and any derivatives thereof. +# +# END BPS TAGGED BLOCK }}} + +use Test::More tests => 28; +use RT; +RT::LoadConfig(); +RT::Init(); +use strict; +no warnings 'once'; + +use RT::Queue; +use RT::User; +use RT::Group; +use RT::Ticket; +use RT::CurrentUser; + + +# clear all global right +my $acl = RT::ACL->new($RT::SystemUser); +$acl->Limit( FIELD => 'RightName', OPERATOR => '!=', VALUE => 'SuperUser' ); +$acl->LimitToObject( $RT::System ); +while( my $ace = $acl->Next ) { + $ace->Delete; +} + +# create new queue to be sure we do not mess with rights +my $queue = RT::Queue->new($RT::SystemUser); +my ($queue_id) = $queue->Create( Name => 'watcher tests '.$$); +ok( $queue_id, 'queue created for watcher tests' ); + +# new privileged user to check rights +my $user = RT::User->new( $RT::SystemUser ); +my ($user_id) = $user->Create( Name => 'watcher'.$$, + EmailAddress => "watcher$$".'@localhost', + Privileged => 1, + Password => 'qwe123', + ); +my $cu= RT::CurrentUser->new($user); + +# make sure user can see tickets in the queue +my $principal = $user->PrincipalObj; +ok( $principal, "principal loaded" ); +$principal->GrantRight( Right => 'ShowTicket', Object => $queue ); +$principal->GrantRight( Right => 'SeeQueue' , Object => $queue ); + +ok( $user->HasRight( Right => 'SeeQueue', Object => $queue ), "user can see queue" ); +ok( $user->HasRight( Right => 'ShowTicket', Object => $queue ), "user can show queue tickets" ); +ok( !$user->HasRight( Right => 'ModifyTicket', Object => $queue ), "user can't modify queue tickets" ); +ok( !$user->HasRight( Right => 'Watch', Object => $queue ), "user can't watch queue tickets" ); + +my $ticket = RT::Ticket->new( $RT::SystemUser ); +my ($rv, $msg) = $ticket->Create( Subject => 'watcher tests', Queue => $queue->Name ); +ok( $ticket->id, "ticket created" ); + +my $ticket2 = RT::Ticket->new( $cu ); +$ticket2->Load( $ticket->id ); +ok( $ticket2->Subject, "ticket load by user" ); + +# user can add self to ticket only after getting Watch right +($rv, $msg) = $ticket2->AddWatcher( Type => 'Cc', PrincipalId => $user->PrincipalId ); +ok( !$rv, "user can't add self as Cc" ); +($rv, $msg) = $ticket2->AddWatcher( Type => 'Requestor', PrincipalId => $user->PrincipalId ); +ok( !$rv, "user can't add self as Requestor" ); +$principal->GrantRight( Right => 'Watch' , Object => $queue ); +ok( $user->HasRight( Right => 'Watch', Object => $queue ), "user can watch queue tickets" ); +($rv, $msg) = $ticket2->AddWatcher( Type => 'Cc', PrincipalId => $user->PrincipalId ); +ok( $rv, "user can add self as Cc by PrincipalId" ); +($rv, $msg) = $ticket2->AddWatcher( Type => 'Requestor', PrincipalId => $user->PrincipalId ); +ok( $rv, "user can add self as Requestor by PrincipalId" ); + +# remove user and try adding with Email address +($rv, $msg) = $ticket->DeleteWatcher( Type => 'Cc', PrincipalId => $user->PrincipalId ); +ok( $rv, "watcher removed by PrincipalId" ); +($rv, $msg) = $ticket->DeleteWatcher( Type => 'Requestor', Email => $user->EmailAddress ); +ok( $rv, "watcher removed by Email" ); + +($rv, $msg) = $ticket2->AddWatcher( Type => 'Cc', Email => $user->EmailAddress ); +ok( $rv, "user can add self as Cc by Email" ); +($rv, $msg) = $ticket2->AddWatcher( Type => 'Requestor', Email => $user->EmailAddress ); +ok( $rv, "user can add self as Requestor by Email" ); + +# Queue watcher tests +$principal->RevokeRight( Right => 'Watch' , Object => $queue ); +ok( !$user->HasRight( Right => 'Watch', Object => $queue ), "user queue watch right revoked" ); + +my $queue2 = RT::Queue->new( $cu ); +($rv, $msg) = $queue2->Load( $queue->id ); +ok( $rv, "user loaded queue" ); + +# user can add self to queue only after getting Watch right +($rv, $msg) = $queue2->AddWatcher( Type => 'Cc', PrincipalId => $user->PrincipalId ); +ok( !$rv, "user can't add self as Cc" ); +($rv, $msg) = $queue2->AddWatcher( Type => 'Requestor', PrincipalId => $user->PrincipalId ); +ok( !$rv, "user can't add self as Requestor" ); +$principal->GrantRight( Right => 'Watch' , Object => $queue ); +ok( $user->HasRight( Right => 'Watch', Object => $queue ), "user can watch queue queues" ); +($rv, $msg) = $queue2->AddWatcher( Type => 'Cc', PrincipalId => $user->PrincipalId ); +ok( $rv, "user can add self as Cc by PrincipalId" ); +($rv, $msg) = $queue2->AddWatcher( Type => 'Requestor', PrincipalId => $user->PrincipalId ); +ok( $rv, "user can add self as Requestor by PrincipalId" ); + +# remove user and try adding with Email address +($rv, $msg) = $queue->DeleteWatcher( Type => 'Cc', PrincipalId => $user->PrincipalId ); +ok( $rv, "watcher removed by PrincipalId" ); +($rv, $msg) = $queue->DeleteWatcher( Type => 'Requestor', Email => $user->EmailAddress ); +ok( $rv, "watcher removed by Email" ); + +($rv, $msg) = $queue2->AddWatcher( Type => 'Cc', Email => $user->EmailAddress ); +ok( $rv, "user can add self as Cc by Email" ); +($rv, $msg) = $queue2->AddWatcher( Type => 'Requestor', Email => $user->EmailAddress ); +ok( $rv, "user can add self as Requestor by Email" ); + + diff --git a/rt/lib/t/regression/26command_line.t b/rt/lib/t/regression/26command_line.t index 457c63aa5..702138303 100644 --- a/rt/lib/t/regression/26command_line.t +++ b/rt/lib/t/regression/26command_line.t @@ -3,7 +3,7 @@ use strict; use Test::Expect; #use Test::More qw/no_plan/; -use Test::More tests => 218; +use Test::More tests => 222; use RT; RT::LoadConfig(); @@ -155,6 +155,11 @@ expect_send("edit ticket/$ticket_id set 'CF-myCF$$=VALUE' ", 'Changing CF...'); expect_like(qr/Ticket $ticket_id updated/, 'Changed cf'); expect_send("show ticket/$ticket_id -f CF-myCF$$", 'Checking new value'); expect_like(qr/CF-myCF$$: VALUE/i, 'Verified change'); +# Test setting 0 as value of the custom field +expect_send("edit ticket/$ticket_id set 'CF-myCF$$=0' ", 'Changing CF...'); +expect_like(qr/Ticket $ticket_id updated/, 'Changed cf'); +expect_send("show ticket/$ticket_id -f CF-myCF$$", 'Checking new value'); +expect_like(qr/CF-myCF$$: 0/i, 'Verified change'); # Test reading and setting custom fields with spaces expect_send("show ticket/$ticket_id -f 'CF-my CF$$'", 'Checking initial value'); expect_like(qr/my CF$$:/i, 'Verified change'); |