import rt 3.6.4
[freeside.git] / rt / lib / t / regression / 21query-builder.t
index be04599..7f9990a 100644 (file)
@@ -1,7 +1,7 @@
 #!/usr/bin/perl
 
 use strict;
-use Test::More tests => 31;
+use Test::More tests => 39;
 use Test::WWW::Mechanize;
 use HTTP::Request::Common;
 use HTTP::Cookies;
@@ -16,7 +16,20 @@ my $agent = Test::WWW::Mechanize->new();
 $agent->cookie_jar($cookie_jar);
 
 use RT;
-RT::LoadConfig;
+RT::LoadConfig();
+RT::Init();
+
+# create a regression queue if it doesn't exist
+{
+    my $queue = RT::Queue->new( $RT::SystemUser );
+    $queue->Load( 'Regression' );
+    if ( $queue->id ) {
+        ok(1, "queue 'Regression' exists");
+    } else {
+        $queue->Create( Name => 'Regression' );
+        ok($queue->id, "created queue 'Regression'");
+    }
+}
 
 # get the top page
 my $url = $RT::WebURL;
@@ -65,6 +78,7 @@ $agent->submit();
 ok($agent->form_name('BuildQuery'), "found the form a third time");
 
 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;
@@ -126,38 +140,37 @@ $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");
-}
+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");
+is( getQueryFromForm, "( id > 1234 AND Status = 'stalled' ) OR Queue != 'Regression'", "added new one" );
+
+# 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");
+    $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
@@ -200,5 +213,32 @@ TODO: {
 
 # }}}
 
+# 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.{\321\202}'", "\321\201");
+    $agent->submit();
+    is( getQueryFromForm,
+        "'CF.{\321\202}' LIKE '\321\201'",
+        "no changes, no duplicate condition with badly encoded text"
+    );
+
+}
 
 1;