X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=rt%2Ft%2Fweb%2Fquery_builder.t;h=3589c381a10259bca2b9d7726132e0c7bb0f6677;hb=ed1f84b4e8f626245995ecda5afcf83092c153b2;hp=fa2c56da8c1b39c4fe3e835ef0b13c3a40c2b66a;hpb=0fb307c305e4bc2c9c27dc25a3308beae3a4d33c;p=freeside.git diff --git a/rt/t/web/query_builder.t b/rt/t/web/query_builder.t index fa2c56da8..3589c381a 100644 --- a/rt/t/web/query_builder.t +++ b/rt/t/web/query_builder.t @@ -1,11 +1,9 @@ -#!/usr/bin/perl - use strict; +use warnings; use HTTP::Request::Common; use HTTP::Cookies; use LWP; -use Encode; -use RT::Test tests => 44; +use RT::Test tests => 70; my $cookie_jar = HTTP::Cookies->new; my ($baseurl, $agent) = RT::Test->started_ok; @@ -22,12 +20,12 @@ ok $queue && $queue->id, 'loaded or created queue'; my $url = $agent->rt_base_url; ok $agent->login, "logged in"; -# {{{ Query Builder tests my $response = $agent->get($url."Search/Build.html"); ok $response->is_success, "Fetched ". $url ."Search/Build.html"; sub getQueryFromForm { + my $agent = shift; $agent->form_name('BuildQuery'); # This pulls out the "hidden input" query from the page my $q = $agent->current_form->find_input("Query")->value; @@ -38,117 +36,117 @@ sub getQueryFromForm { } sub selectedClauses { + my $agent = shift; my @clauses = grep { defined } map { $_->value } $agent->current_form->find_input("clauses"); return [ @clauses ]; } -diag "add the first condition" if $ENV{'TEST_VERBOSE'}; +diag "add the first condition"; { ok $agent->form_name('BuildQuery'), "found the form once"; $agent->field("ActorField", "Owner"); $agent->field("ActorOp", "="); $agent->field("ValueOfActor", "Nobody"); $agent->submit; - is getQueryFromForm, "Owner = 'Nobody'", 'correct query'; + is getQueryFromForm($agent), "Owner = 'Nobody'", 'correct query'; } -diag "set the next condition" if $ENV{'TEST_VERBOSE'}; +diag "set the next condition"; { ok($agent->form_name('BuildQuery'), "found the form again"); $agent->field("QueueOp", "!="); $agent->field("ValueOfQueue", "Regression"); $agent->submit; - is getQueryFromForm, "Owner = 'Nobody' AND Queue != 'Regression'", + is getQueryFromForm($agent), "Owner = 'Nobody' AND Queue != 'Regression'", 'correct query'; } -diag "We're going to delete the owner" if $ENV{'TEST_VERBOSE'}; +diag "We're going to delete the owner"; { $agent->select("clauses", ["0"] ); $agent->click("DeleteClause"); ok $agent->form_name('BuildQuery'), "found the form"; - is getQueryFromForm, "Queue != 'Regression'", 'correct query'; + is getQueryFromForm($agent), "Queue != 'Regression'", 'correct query'; } -diag "add a cond with OR and se number by the way" if $ENV{'TEST_VERBOSE'}; +diag "add a cond with OR and se number by the way"; { $agent->field("AndOr", "OR"); $agent->select("idOp", ">"); $agent->field("ValueOfid" => "1234"); $agent->click("AddClause"); ok $agent->form_name('BuildQuery'), "found the form again"; - is getQueryFromForm, "Queue != 'Regression' OR id > 1234", + is getQueryFromForm($agent), "Queue != 'Regression' OR id > 1234", "added something as OR, and number not quoted"; - is_deeply selectedClauses, ["1"], 'the id that we just entered is still selected'; + is_deeply selectedClauses($agent), ["1"], 'the id that we just entered is still selected'; } -diag "Move the second one up a level" if $ENV{'TEST_VERBOSE'}; +diag "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'; + is getQueryFromForm($agent), "id > 1234 OR Queue != 'Regression'", "moved up one"; + is_deeply selectedClauses($agent), ["0"], 'the one we moved up is selected'; } -diag "Move the second one right" if $ENV{'TEST_VERBOSE'}; +diag "Move the second one right"; { $agent->click("Right"); ok $agent->form_name('BuildQuery'), "found the form again"; - is getQueryFromForm, "Queue != 'Regression' OR ( id > 1234 )", + is getQueryFromForm($agent), "Queue != 'Regression' OR ( id > 1234 )", "moved over to the right (and down)"; - is_deeply selectedClauses, ["2"], 'the one we moved right is selected'; + is_deeply selectedClauses($agent), ["2"], 'the one we moved right is selected'; } -diag "Move the block up" if $ENV{'TEST_VERBOSE'}; +diag "Move the block up"; { $agent->select("clauses", ["1"]); $agent->click("Up"); ok $agent->form_name('BuildQuery'), "found the form again"; - is getQueryFromForm, "( id > 1234 ) OR Queue != 'Regression'", "moved up"; - is_deeply selectedClauses, ["0"], 'the one we moved up is selected'; + is getQueryFromForm($agent), "( id > 1234 ) OR Queue != 'Regression'", "moved up"; + is_deeply selectedClauses($agent), ["0"], 'the one we moved up is selected'; } -diag "Can not move up the top most clause" if $ENV{'TEST_VERBOSE'}; +diag "Can not move up the top most clause"; { $agent->select("clauses", ["0"]); $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"); - is_deeply selectedClauses, ["0"], 'the one we tried to move is selected'; + $agent->content_contains("error: can't move up", "i shouldn't have been able to hit up"); + is_deeply selectedClauses($agent), ["0"], 'the one we tried to move is selected'; } -diag "Can not move left the left most clause" if $ENV{'TEST_VERBOSE'}; +diag "Can not move left the left most clause"; { $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"); - is_deeply selectedClauses, ["0"], 'the one we tried to move is selected'; + $agent->content_contains("error: can't move left", "i shouldn't have been able to hit left"); + is_deeply selectedClauses($agent), ["0"], 'the one we tried to move is selected'; } -diag "Add a condition into a nested block" if $ENV{'TEST_VERBOSE'}; +diag "Add a condition into a nested block"; { $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 only selected'; - is getQueryFromForm, + is_deeply selectedClauses($agent), ["2"], 'the one we added is only selected'; + is getQueryFromForm($agent), "( id > 1234 AND Status = 'stalled' ) OR Queue != 'Regression'", "added new one"; } -diag "click advanced, enter 'C1 OR ( C2 AND C3 )', apply, aggregators should stay the same." - if $ENV{'TEST_VERBOSE'}; +diag "click advanced, enter 'C1 OR ( C2 AND C3 )', apply, aggregators should stay the same."; { my $response = $agent->get($url."Search/Edit.html"); ok( $response->is_success, "Fetched /Search/Edit.html" ); - ok($agent->form_number(3), "found the form"); + ok($agent->form_name('BuildQueryAdvanced'), "found the form"); $agent->field("Query", "Status = 'new' OR ( Status = 'open' AND Subject LIKE 'office' )"); $agent->submit; - is( getQueryFromForm, + is( getQueryFromForm($agent), "Status = 'new' OR ( Status = 'open' AND Subject LIKE 'office' )", "no aggregators change" ); @@ -194,11 +192,10 @@ diag "click advanced, enter 'C1 OR ( C2 AND C3 )', apply, aggregators should sta # - clears entire query # - clears it from the session, too -# }}} # create a custom field with nonascii name and try to add a condition { - my $cf = RT::CustomField->new( $RT::SystemUser ); + my $cf = RT::CustomField->new( RT->SystemUser ); $cf->LoadByName( Name => "\x{442}", Queue => 0 ); if ( $cf->id ) { is($cf->Type, 'Freeform', 'loaded and type is correct'); @@ -217,22 +214,21 @@ diag "click advanced, enter 'C1 OR ( C2 AND C3 )', apply, aggregators should sta ok($agent->form_name('BuildQuery'), "found the form once"); $agent->field("ValueOf'CF.{\x{442}}'", "\x{441}"); $agent->submit(); - is( getQueryFromForm, + is( getQueryFromForm($agent), "'CF.{\x{442}}' LIKE '\x{441}'", "no changes, no duplicate condition with badly encoded text" ); } -diag "input a condition, select (several conditions), click delete" - if $ENV{'TEST_VERBOSE'}; +diag "input a condition, select (several conditions), click delete"; { my $response = $agent->get( $url."Search/Edit.html" ); ok $response->is_success, "Fetched /Search/Edit.html"; - ok $agent->form_number(3), "found the form"; + ok $agent->form_name('BuildQueryAdvanced'), "found the form"; $agent->field("Query", "( Status = 'new' OR Status = 'open' )"); $agent->submit; - is( getQueryFromForm, + is( getQueryFromForm($agent), "( Status = 'new' OR Status = 'open' )", "query is the same" ); @@ -240,7 +236,7 @@ diag "input a condition, select (several conditions), click delete" $agent->field( ValueOfid => 10 ); $agent->click("DeleteClause"); - is( getQueryFromForm, + is( getQueryFromForm($agent), "id < 10", "replaced query successfuly" ); @@ -251,8 +247,80 @@ diag "send query with not quoted negative number"; my $response = $agent->get($url."Search/Build.html?Query=Priority%20>%20-2"); ok( $response->is_success, "Fetched " . $url."Search/Build.html" ); - is( getQueryFromForm, + is( getQueryFromForm($agent), "Priority > -2", "query is the same" ); } + +diag "click advanced, enter an invalid SQL IS restriction, apply and check that we corrected it"; +{ + my $response = $agent->get($url."Search/Edit.html"); + ok( $response->is_success, "Fetched /Search/Edit.html" ); + ok($agent->form_name('BuildQueryAdvanced'), "found the form"); + $agent->field("Query", "Requestor.EmailAddress IS 'FOOBAR'"); + $agent->submit; + is( getQueryFromForm($agent), + "Requestor.EmailAddress IS NULL", + "foobar is replaced by NULL" + ); +} + +diag "click advanced, enter an invalid SQL IS NOT restriction, apply and check that we corrected it"; +{ + my $response = $agent->get($url."Search/Edit.html"); + ok( $response->is_success, "Fetched /Search/Edit.html" ); + ok($agent->form_name('BuildQueryAdvanced'), "found the form"); + $agent->field("Query", "Requestor.EmailAddress IS NOT 'FOOBAR'"); + $agent->submit; + is( getQueryFromForm($agent), + "Requestor.EmailAddress IS NOT NULL", + "foobar is replaced by NULL" + ); +} + +diag "click advanced, enter a valid SQL, but the field is lower cased"; +{ + my $response = $agent->get($url."Search/Edit.html"); + ok( $response->is_success, "Fetched /Search/Edit.html" ); + ok($agent->form_name('BuildQueryAdvanced'), "found the form"); + $agent->field("Query", "status = 'new'"); + $agent->submit; + $agent->content_lacks( 'Unknown field:', 'no "unknown field" warning' ); + is( getQueryFromForm($agent), + "Status = 'new'", + "field's case is corrected" + ); +} + +diag "make sure skipped order by field doesn't break search"; +{ + my $t = RT::Test->create_ticket( Queue => 'General', Subject => 'test' ); + ok $t && $t->id, 'created a ticket'; + + $agent->get_ok($url."Search/Edit.html"); + ok($agent->form_name('BuildQueryAdvanced'), "found the form"); + $agent->field("Query", "id = ". $t->id); + $agent->submit; + + $agent->follow_link_ok({id => 'page-results'}); + ok( $agent->find_link( + text => $t->id, + url_regex => qr{/Ticket/Display\.html}, + ), "link to the ticket" ); + + $agent->follow_link_ok({id => 'page-edit_search'}); + $agent->form_name('BuildQuery'); + $agent->field("OrderBy", 'Requestor.EmailAddress', 3); + $agent->submit; + $agent->form_name('BuildQuery'); + is $agent->value('OrderBy', 1), 'id'; + is $agent->value('OrderBy', 2), ''; + is $agent->value('OrderBy', 3), 'Requestor.EmailAddress'; + + $agent->follow_link_ok({id => 'page-results'}); + ok( $agent->find_link( + text => $t->id, + url_regex => qr{/Ticket/Display\.html}, + ), "link to the ticket" ); +}