diff options
Diffstat (limited to 'rt/lib/t/regression/21query-builder.t')
-rw-r--r-- | rt/lib/t/regression/21query-builder.t | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/rt/lib/t/regression/21query-builder.t b/rt/lib/t/regression/21query-builder.t new file mode 100644 index 000000000..be04599bc --- /dev/null +++ b/rt/lib/t/regression/21query-builder.t @@ -0,0 +1,204 @@ +#!/usr/bin/perl + +use strict; +use Test::More tests => 31; +use Test::WWW::Mechanize; +use HTTP::Request::Common; +use HTTP::Cookies; +use LWP; +use Encode; + +my $cookie_jar = HTTP::Cookies->new; +my $agent = Test::WWW::Mechanize->new(); + +# give the agent a place to stash the cookies + +$agent->cookie_jar($cookie_jar); + +use RT; +RT::LoadConfig; + +# get the top page +my $url = $RT::WebURL; +$agent->get($url); + +is ($agent->{'status'}, 200, "Loaded a page"); + + +# {{{ test a login + +# follow the link marked "Login" + +ok($agent->{form}->find_input('user')); + +ok($agent->{form}->find_input('pass')); +ok ($agent->{'content'} =~ /username:/i); +$agent->field( 'user' => 'root' ); +$agent->field( 'pass' => 'password' ); +# the field isn't named, so we have to click link 0 +$agent->click(0); +is($agent->{'status'}, 200, "Fetched the page ok"); +ok( $agent->{'content'} =~ /Logout/i, "Found a logout link"); + +# }}} + +# {{{ Query Builder tests + +my $response = $agent->get($url."Search/Build.html"); +ok( $response->is_success, "Fetched " . $url."Search/Build.html" ); + +# Adding items + +# set the first value +ok($agent->form_name('BuildQuery'), "found the form once"); +$agent->field("ActorField", "Owner"); +$agent->field("ActorOp", "="); +$agent->field("ValueOfActor", "Nobody"); +$agent->submit(); + +# set the next value +ok($agent->form_name('BuildQuery'), "found the form again"); +$agent->field("QueueOp", "!="); +$agent->field("ValueOfQueue", "Regression"); +$agent->submit(); + +ok($agent->form_name('BuildQuery'), "found the form a third time"); + +sub getQueryFromForm { + # This pulls out the "hidden input" query from the page + my $q = $agent->current_form->find_input("Query")->value; + $q =~ s/^\s+//g; + $q =~ s/\s+$//g; + $q =~ s/\s+/ /g; + return $q; +} + +is (getQueryFromForm, "Owner = 'Nobody' AND Queue != 'Regression'"); + +# We're going to delete the owner + +$agent->select("clauses", ["0"] ); + +$agent->click("DeleteClause"); + +ok($agent->form_name('BuildQuery'), "found the form a fourth time"); + +is (getQueryFromForm, "Queue != 'Regression'"); + +$agent->field("AndOr", "OR"); + +$agent->select("idOp", ">"); + +$agent->field("ValueOfid" => "1234"); + +$agent->click("AddClause"); + +ok($agent->form_name('BuildQuery'), "found the form again"); +TODO: { + local $TODO = "query builder incorrectly quotes numbers"; + is(getQueryFromForm, "Queue != 'Regression' OR id > 1234", "added something as OR, and number not quoted"); +} + +sub selectedClauses { + my @clauses = grep { defined } map { $_->value } $agent->current_form->find_input("clauses"); + return [ @clauses ]; +} + + +is_deeply(selectedClauses, ["1"], 'the id that we just entered is still selected'); + +# Move the second one up a level +$agent->click("Up"); + +ok($agent->form_name('BuildQuery'), "found the form again"); +is(getQueryFromForm, "id > 1234 OR Queue != 'Regression'", "moved up one"); + +is_deeply(selectedClauses, ["0"], 'the one we moved up is selected'); + +$agent->click("Right"); + +ok($agent->form_name('BuildQuery'), "found the form again"); +is(getQueryFromForm, "Queue != 'Regression' OR ( id > 1234 )", "moved over to the right (and down)"); +is_deeply(selectedClauses, ["2"], 'the one we moved right is selected'); + +$agent->select("clauses", ["1"]); + +$agent->click("Up"); + +ok($agent->form_name('BuildQuery'), "found the form again"); +TODO: { + local $TODO = "query builder incorrectly changes OR to AND"; + is(getQueryFromForm, "( id > 1234 ) OR Queue != 'Regression'", "moved up"); +} + +$agent->select("clauses", ["0"]); # this is a null clause + +$agent->click("Up"); + +ok($agent->form_name('BuildQuery'), "found the form again"); + +$agent->content_like(qr/error: can\S+t move up/, "i shouldn't have been able to hit up"); + +$agent->click("Left"); + +ok($agent->form_name('BuildQuery'), "found the form again"); + +$agent->content_like(qr/error: can\S+t move left/, "i shouldn't have been able to hit left"); + +$agent->select("clauses", ["1"]); +$agent->select("ValueOfStatus" => "stalled"); + +$agent->submit; +ok($agent->form_name('BuildQuery'), "found the form again"); +is_deeply(selectedClauses, ["2"], 'the one we added is selected'); +TODO: { + local $TODO = "query builder incorrectly changes OR to AND"; + is(getQueryFromForm, "( id > 1234 AND Status = 'stalled' ) OR Queue != 'Regression'", "added new one"); +} + + + +# - new items go one level down +# - add items at currently selected level +# - if nothing is selected, add at end, one level down +# +# move left +# - error if nothing selected +# - same item should be selected after move +# - can't move left if you're at the top level +# +# move right +# - error if nothing selected +# - same item should be selected after move +# - can always move right (no max depth...should there be?) +# +# move up +# - error if nothing selected +# - same item should be selected after move +# - can't move up if you're first in the list +# +# move down +# - error if nothing selected +# - same item should be selected after move +# - can't move down if you're last in the list +# +# toggle +# - error if nothing selected +# - change all aggregators in the grouping +# - don't change any others +# +# delete +# - error if nothing selected +# - delete currently selected item +# - delete all children of a grouping +# - if delete leaves a node with no children, delete that, too +# - what should be selected? +# +# Clear +# - clears entire query +# - clears it from the session, too + +# }}} + + +1; |