summaryrefslogtreecommitdiff
path: root/rt/t/web/query_builder.t
diff options
context:
space:
mode:
Diffstat (limited to 'rt/t/web/query_builder.t')
-rw-r--r--rt/t/web/query_builder.t249
1 files changed, 249 insertions, 0 deletions
diff --git a/rt/t/web/query_builder.t b/rt/t/web/query_builder.t
new file mode 100644
index 000000000..02ed1297f
--- /dev/null
+++ b/rt/t/web/query_builder.t
@@ -0,0 +1,249 @@
+#!/usr/bin/perl
+
+use strict;
+use HTTP::Request::Common;
+use HTTP::Cookies;
+use LWP;
+use Encode;
+use RT::Test tests => 42;
+
+my $cookie_jar = HTTP::Cookies->new;
+my ($baseurl, $agent) = RT::Test->started_ok;
+
+
+# give the agent a place to stash the cookies
+
+$agent->cookie_jar($cookie_jar);
+
+# create a regression queue if it doesn't exist
+my $queue = RT::Test->load_or_create_queue( Name => 'Regression' );
+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 {
+ $agent->form_name('BuildQuery');
+ # 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;
+}
+
+sub selectedClauses {
+ my @clauses = grep { defined } map { $_->value } $agent->current_form->find_input("clauses");
+ return [ @clauses ];
+}
+
+
+diag "add the first condition" if $ENV{'TEST_VERBOSE'};
+{
+ 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';
+}
+
+diag "set the next condition" if $ENV{'TEST_VERBOSE'};
+{
+ 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'",
+ 'correct query';
+}
+
+diag "We're going to delete the owner" if $ENV{'TEST_VERBOSE'};
+{
+ $agent->select("clauses", ["0"] );
+ $agent->click("DeleteClause");
+ ok $agent->form_name('BuildQuery'), "found the form";
+ is getQueryFromForm, "Queue != 'Regression'", 'correct query';
+}
+
+diag "add a cond with OR and se number by the way" if $ENV{'TEST_VERBOSE'};
+{
+ $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",
+ "added something as OR, and number not quoted";
+ is_deeply selectedClauses, ["1"], 'the id that we just entered is still selected';
+
+}
+
+diag "Move the second one up a level" if $ENV{'TEST_VERBOSE'};
+{
+ $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';
+}
+
+diag "Move the second one right" if $ENV{'TEST_VERBOSE'};
+{
+ $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';
+}
+
+diag "Move the block up" if $ENV{'TEST_VERBOSE'};
+{
+ $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';
+}
+
+
+diag "Can not move up the top most clause" if $ENV{'TEST_VERBOSE'};
+{
+ $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';
+}
+
+diag "Can not move left the left most clause" if $ENV{'TEST_VERBOSE'};
+{
+ $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';
+}
+
+diag "Add a condition into a nested block" if $ENV{'TEST_VERBOSE'};
+{
+ $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,
+ "( 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'};
+{
+ my $response = $agent->get($url."Search/Edit.html");
+ ok( $response->is_success, "Fetched /Search/Edit.html" );
+ ok($agent->form_number(3), "found the form");
+ $agent->field("Query", "Status = 'new' OR ( Status = 'open' AND Subject LIKE 'office' )");
+ $agent->submit;
+ is( getQueryFromForm,
+ "Status = 'new' OR ( Status = 'open' AND Subject LIKE 'office' )",
+ "no aggregators change"
+ );
+}
+
+# - 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
+
+# }}}
+
+# create a custom field with nonascii name and try to add a condition
+{
+ 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');
+ } else {
+ my ($return, $msg) = $cf->Create(
+ Name => "\x{442}",
+ Queue => 0,
+ Type => 'Freeform',
+ );
+ ok($return, 'created CF') or diag "error: $msg";
+ }
+
+ my $response = $agent->get($url."Search/Build.html?NewQuery=1");
+ ok( $response->is_success, "Fetched " . $url."Search/Build.html" );
+
+ ok($agent->form_name('BuildQuery'), "found the form once");
+ $agent->field("ValueOf'CF.{\x{442}}'", "\x{441}");
+ $agent->submit();
+ is( getQueryFromForm,
+ "'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'};
+{
+ my $response = $agent->get( $url."Search/Edit.html" );
+ ok $response->is_success, "Fetched /Search/Edit.html";
+ ok $agent->form_number(3), "found the form";
+ $agent->field("Query", "( Status = 'new' OR Status = 'open' )");
+ $agent->submit;
+ is( getQueryFromForm,
+ "( Status = 'new' OR Status = 'open' )",
+ "query is the same"
+ );
+ $agent->select("clauses", [qw(0 1 2)]);
+ $agent->field( ValueOfid => 10 );
+ $agent->click("DeleteClause");
+
+ is( getQueryFromForm,
+ "id < 10",
+ "replaced query successfuly"
+ );
+}
+
+1;