diff options
author | Perl Tidy <perltidy@bugzilla.org> | 2018-12-05 21:38:52 +0100 |
---|---|---|
committer | Dylan William Hardison <dylan@hardison.net> | 2018-12-05 23:49:08 +0100 |
commit | 8ec8da0491ad89604700b3e29a227966f6d84ba1 (patch) | |
tree | 9d270f173330ca19700e0ba9f2ee931300646de1 /qa/t | |
parent | a7bb5a65b71644d9efce5fed783ed545b9336548 (diff) | |
download | bugzilla-8ec8da0491ad89604700b3e29a227966f6d84ba1.tar.gz bugzilla-8ec8da0491ad89604700b3e29a227966f6d84ba1.tar.xz |
no bug - reformat all the code using the new perltidy rules
Diffstat (limited to 'qa/t')
72 files changed, 6387 insertions, 4644 deletions
diff --git a/qa/t/archived/test_email_preferences.t b/qa/t/archived/test_email_preferences.t index cc314ea2c..fe51ee140 100644 --- a/qa/t/archived/test_email_preferences.t +++ b/qa/t/archived/test_email_preferences.t @@ -59,76 +59,86 @@ $sel->click_ok("link=Email Preferences"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok("Email Preferences"); $sel->click_ok("//input[\@value='Disable All Bugmail']"); -$sel->click_ok("email-0-1", undef, 'Set "I\'m added to or removed from this capacity" for Assignee role'); -$sel->click_ok("email-0-5", undef, 'Set "The priority, status, severity, or milestone changes" for Assignee role'); -$sel->click_ok("email-0-2", undef, 'Set "New comments are added" for Assignee role'); -$sel->click_ok("email-0-0", undef, 'Set "Any field not mentioned above changes" for Assignee role'); +$sel->click_ok("email-0-1", undef, + 'Set "I\'m added to or removed from this capacity" for Assignee role'); +$sel->click_ok("email-0-5", undef, + 'Set "The priority, status, severity, or milestone changes" for Assignee role'); +$sel->click_ok("email-0-2", undef, + 'Set "New comments are added" for Assignee role'); +$sel->click_ok("email-0-0", undef, + 'Set "Any field not mentioned above changes" for Assignee role'); $sel->click_ok("email-3-8", undef, 'Set "The CC field changes" for CCed role'); -$sel->click_ok("email-1-10", undef, 'Set "A new bug is created" for QA Contact role'); -$sel->click_ok("email-100-101", undef, 'Set "Email me when someone sets a flag I asked for" global option'); +$sel->click_ok("email-1-10", undef, + 'Set "A new bug is created" for QA Contact role'); +$sel->click_ok("email-100-101", undef, + 'Set "Email me when someone sets a flag I asked for" global option'); + # Restore the old 4.2 behavior for 'Disable All Mail'. -foreach my $col (0..3) { - foreach my $row (50..51) { - $sel->click_ok("neg-email-$col-$row"); - } +foreach my $col (0 .. 3) { + foreach my $row (50 .. 51) { + $sel->click_ok("neg-email-$col-$row"); + } } -$sel->value_is("email-0-1", "on"); -$sel->value_is("email-0-10", "off"); -$sel->value_is("email-0-6", "off"); -$sel->value_is("email-0-5", "on"); -$sel->value_is("email-0-2", "on"); -$sel->value_is("email-0-3", "off"); -$sel->value_is("email-0-4", "off"); -$sel->value_is("email-0-7", "off"); -$sel->value_is("email-0-8", "off"); -$sel->value_is("email-0-9", "off"); -$sel->value_is("email-0-0", "on"); +$sel->value_is("email-0-1", "on"); +$sel->value_is("email-0-10", "off"); +$sel->value_is("email-0-6", "off"); +$sel->value_is("email-0-5", "on"); +$sel->value_is("email-0-2", "on"); +$sel->value_is("email-0-3", "off"); +$sel->value_is("email-0-4", "off"); +$sel->value_is("email-0-7", "off"); +$sel->value_is("email-0-8", "off"); +$sel->value_is("email-0-9", "off"); +$sel->value_is("email-0-0", "on"); $sel->value_is("neg-email-0-50", "off"); $sel->value_is("neg-email-0-51", "off"); -$sel->value_is("email-1-1", "off"); -$sel->value_is("email-1-10", "on"); -$sel->value_is("email-1-6", "off"); -$sel->value_is("email-1-5", "off"); -$sel->value_is("email-1-2", "off"); -$sel->value_is("email-1-3", "off"); -$sel->value_is("email-1-4", "off"); -$sel->value_is("email-1-7", "off"); -$sel->value_is("email-1-8", "off"); -$sel->value_is("email-1-9", "off"); -$sel->value_is("email-1-0", "off"); +$sel->value_is("email-1-1", "off"); +$sel->value_is("email-1-10", "on"); +$sel->value_is("email-1-6", "off"); +$sel->value_is("email-1-5", "off"); +$sel->value_is("email-1-2", "off"); +$sel->value_is("email-1-3", "off"); +$sel->value_is("email-1-4", "off"); +$sel->value_is("email-1-7", "off"); +$sel->value_is("email-1-8", "off"); +$sel->value_is("email-1-9", "off"); +$sel->value_is("email-1-0", "off"); $sel->value_is("neg-email-1-50", "off"); $sel->value_is("neg-email-1-51", "off"); -ok(!$sel->is_editable("email-2-1"), 'The "I\'m added to or removed from this capacity" for Reporter role is disabled'); -$sel->value_is("email-2-10", "off"); -$sel->value_is("email-2-6", "off"); -$sel->value_is("email-2-5", "off"); -$sel->value_is("email-2-2", "off"); -$sel->value_is("email-2-3", "off"); -$sel->value_is("email-2-4", "off"); -$sel->value_is("email-2-7", "off"); -$sel->value_is("email-2-8", "off"); -$sel->value_is("email-2-9", "off"); -$sel->value_is("email-2-0", "off"); +ok(!$sel->is_editable("email-2-1"), + 'The "I\'m added to or removed from this capacity" for Reporter role is disabled' +); +$sel->value_is("email-2-10", "off"); +$sel->value_is("email-2-6", "off"); +$sel->value_is("email-2-5", "off"); +$sel->value_is("email-2-2", "off"); +$sel->value_is("email-2-3", "off"); +$sel->value_is("email-2-4", "off"); +$sel->value_is("email-2-7", "off"); +$sel->value_is("email-2-8", "off"); +$sel->value_is("email-2-9", "off"); +$sel->value_is("email-2-0", "off"); $sel->value_is("neg-email-2-50", "off"); $sel->value_is("neg-email-2-51", "off"); -$sel->value_is("email-3-1", "off"); -$sel->value_is("email-3-10", "off"); -$sel->value_is("email-3-6", "off"); -$sel->value_is("email-3-5", "off"); -$sel->value_is("email-3-2", "off"); -$sel->value_is("email-3-3", "off"); -$sel->value_is("email-3-4", "off"); -$sel->value_is("email-3-7", "off"); -$sel->value_is("email-3-8", "on"); -$sel->value_is("email-3-9", "off"); -$sel->value_is("email-3-0", "off"); +$sel->value_is("email-3-1", "off"); +$sel->value_is("email-3-10", "off"); +$sel->value_is("email-3-6", "off"); +$sel->value_is("email-3-5", "off"); +$sel->value_is("email-3-2", "off"); +$sel->value_is("email-3-3", "off"); +$sel->value_is("email-3-4", "off"); +$sel->value_is("email-3-7", "off"); +$sel->value_is("email-3-8", "on"); +$sel->value_is("email-3-9", "off"); +$sel->value_is("email-3-0", "off"); $sel->value_is("neg-email-3-50", "off"); $sel->value_is("neg-email-3-51", "off"); -$sel->value_is("email-100-100", "off"); -$sel->value_is("email-100-101", "on"); +$sel->value_is("email-100-100", "off"); +$sel->value_is("email-100-101", "on"); $sel->click_ok("update", undef, "Submit modified admin email preferences"); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->is_text_present_ok("The changes to your email preferences have been saved."); +$sel->is_text_present_ok( + "The changes to your email preferences have been saved."); # Set "After changing a bug" default preference to "Show the updated bug" # This simplifies bug changes below @@ -148,95 +158,120 @@ log_in($sel, $config, 'editbugs'); $sel->open_ok("$config->{bugzilla_installation}/userprefs.cgi?tab=email"); $sel->is_text_present_ok("Email Preferences"); $sel->click_ok("//input[\@value='Enable All Bugmail']"); -$sel->click_ok("email-3-1", undef, 'Clear "I\'m added to or removed from this capacity" for CCed role'); -$sel->click_ok("email-3-5", undef, 'Clear "The priority, status, severity, or milestone changes" for CCed role'); -$sel->click_ok("email-2-2", undef, 'Clear "New comments are added" for Reporter role'); -$sel->click_ok("email-3-2", undef, 'Clear "New comments are added" for CCed role'); -$sel->click_ok("email-2-8", undef, 'Clear "The CC field changes" for Reporter role'); -$sel->click_ok("email-3-8", undef, 'Clear "The CC field changes" for CCed role'); -$sel->click_ok("email-2-0", undef, 'Clear "Any field not mentioned above changes" for Reporter role'); -$sel->click_ok("email-3-0", undef, 'Clear "Any field not mentioned above changes" for CCed role'); -$sel->click_ok("neg-email-0-51", undef, 'Set "Change was made by me" override for Assignee role'); -$sel->click_ok("email-100-101", undef, 'Clear "Email me when someone sets a flag I asked for" global option'); -$sel->value_is("email-0-1", "on"); -$sel->value_is("email-0-10", "on"); -$sel->value_is("email-0-6", "on"); -$sel->value_is("email-0-5", "on"); -$sel->value_is("email-0-2", "on"); -$sel->value_is("email-0-3", "on"); -$sel->value_is("email-0-4", "on"); -$sel->value_is("email-0-7", "on"); -$sel->value_is("email-0-8", "on"); -$sel->value_is("email-0-9", "on"); -$sel->value_is("email-0-0", "on"); +$sel->click_ok("email-3-1", undef, + 'Clear "I\'m added to or removed from this capacity" for CCed role'); +$sel->click_ok("email-3-5", undef, + 'Clear "The priority, status, severity, or milestone changes" for CCed role'); +$sel->click_ok("email-2-2", undef, + 'Clear "New comments are added" for Reporter role'); +$sel->click_ok("email-3-2", undef, + 'Clear "New comments are added" for CCed role'); +$sel->click_ok("email-2-8", undef, + 'Clear "The CC field changes" for Reporter role'); +$sel->click_ok("email-3-8", undef, + 'Clear "The CC field changes" for CCed role'); +$sel->click_ok("email-2-0", undef, + 'Clear "Any field not mentioned above changes" for Reporter role'); +$sel->click_ok("email-3-0", undef, + 'Clear "Any field not mentioned above changes" for CCed role'); +$sel->click_ok("neg-email-0-51", undef, + 'Set "Change was made by me" override for Assignee role'); +$sel->click_ok("email-100-101", undef, + 'Clear "Email me when someone sets a flag I asked for" global option'); +$sel->value_is("email-0-1", "on"); +$sel->value_is("email-0-10", "on"); +$sel->value_is("email-0-6", "on"); +$sel->value_is("email-0-5", "on"); +$sel->value_is("email-0-2", "on"); +$sel->value_is("email-0-3", "on"); +$sel->value_is("email-0-4", "on"); +$sel->value_is("email-0-7", "on"); +$sel->value_is("email-0-8", "on"); +$sel->value_is("email-0-9", "on"); +$sel->value_is("email-0-0", "on"); $sel->value_is("neg-email-0-50", "off"); $sel->value_is("neg-email-0-51", "on"); -$sel->value_is("email-1-1", "on"); -$sel->value_is("email-1-10", "on"); -$sel->value_is("email-1-6", "on"); -$sel->value_is("email-1-5", "on"); -$sel->value_is("email-1-2", "on"); -$sel->value_is("email-1-3", "on"); -$sel->value_is("email-1-4", "on"); -$sel->value_is("email-1-7", "on"); -$sel->value_is("email-1-8", "on"); -$sel->value_is("email-1-9", "on"); -$sel->value_is("email-1-0", "on"); +$sel->value_is("email-1-1", "on"); +$sel->value_is("email-1-10", "on"); +$sel->value_is("email-1-6", "on"); +$sel->value_is("email-1-5", "on"); +$sel->value_is("email-1-2", "on"); +$sel->value_is("email-1-3", "on"); +$sel->value_is("email-1-4", "on"); +$sel->value_is("email-1-7", "on"); +$sel->value_is("email-1-8", "on"); +$sel->value_is("email-1-9", "on"); +$sel->value_is("email-1-0", "on"); $sel->value_is("neg-email-1-50", "off"); $sel->value_is("neg-email-1-51", "off"); -ok(!$sel->is_editable("email-2-1"), 'The "I\'m added to or removed from this capacity" for Reporter role is disabled'); -$sel->value_is("email-2-10", "on"); -$sel->value_is("email-2-6", "on"); -$sel->value_is("email-2-5", "on"); -$sel->value_is("email-2-2", "off"); -$sel->value_is("email-2-3", "on"); -$sel->value_is("email-2-4", "on"); -$sel->value_is("email-2-7", "on"); -$sel->value_is("email-2-8", "off"); -$sel->value_is("email-2-9", "on"); -$sel->value_is("email-2-0", "off"); +ok(!$sel->is_editable("email-2-1"), + 'The "I\'m added to or removed from this capacity" for Reporter role is disabled' +); +$sel->value_is("email-2-10", "on"); +$sel->value_is("email-2-6", "on"); +$sel->value_is("email-2-5", "on"); +$sel->value_is("email-2-2", "off"); +$sel->value_is("email-2-3", "on"); +$sel->value_is("email-2-4", "on"); +$sel->value_is("email-2-7", "on"); +$sel->value_is("email-2-8", "off"); +$sel->value_is("email-2-9", "on"); +$sel->value_is("email-2-0", "off"); $sel->value_is("neg-email-2-50", "off"); $sel->value_is("neg-email-2-51", "off"); -$sel->value_is("email-3-1", "off"); -$sel->value_is("email-3-10", "on"); -$sel->value_is("email-3-6", "on"); -$sel->value_is("email-3-5", "off"); -$sel->value_is("email-3-2", "off"); -$sel->value_is("email-3-3", "on"); -$sel->value_is("email-3-4", "on"); -$sel->value_is("email-3-7", "on"); -$sel->value_is("email-3-8", "off"); -$sel->value_is("email-3-9", "on"); -$sel->value_is("email-3-0", "off"); +$sel->value_is("email-3-1", "off"); +$sel->value_is("email-3-10", "on"); +$sel->value_is("email-3-6", "on"); +$sel->value_is("email-3-5", "off"); +$sel->value_is("email-3-2", "off"); +$sel->value_is("email-3-3", "on"); +$sel->value_is("email-3-4", "on"); +$sel->value_is("email-3-7", "on"); +$sel->value_is("email-3-8", "off"); +$sel->value_is("email-3-9", "on"); +$sel->value_is("email-3-0", "off"); $sel->value_is("neg-email-3-50", "off"); $sel->value_is("neg-email-3-51", "off"); -$sel->value_is("email-100-100", "on"); -$sel->value_is("email-100-101", "off"); -$sel->click_ok("update", undef, "Submit modified normal user email preferences"); +$sel->value_is("email-100-100", "on"); +$sel->value_is("email-100-101", "off"); +$sel->click_ok("update", undef, + "Submit modified normal user email preferences"); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->is_text_present_ok("The changes to your email preferences have been saved."); +$sel->is_text_present_ok( + "The changes to your email preferences have been saved."); # Always show email recipients -ok($sel->create_cookie('show_bugmail_recipients=1'), 'Always show recipient list'); +ok($sel->create_cookie('show_bugmail_recipients=1'), + 'Always show recipient list'); # Create a test bug (bugmail to both normal user and admin) file_bug_in_product($sel, "Another Product"); $sel->select_ok("component", "label=c1"); -$sel->type_ok("short_desc", "Selenium Email Preference test bug", "Enter bug summary"); -$sel->type_ok("comment", "Created by Selenium to test Email Preferences", "Enter bug description"); +$sel->type_ok( + "short_desc", + "Selenium Email Preference test bug", + "Enter bug summary" +); +$sel->type_ok( + "comment", + "Created by Selenium to test Email Preferences", + "Enter bug description" +); $sel->type_ok("assigned_to", $config->{editbugs_user_login}); -$sel->type_ok("qa_contact", $config->{admin_user_login}); -$sel->type_ok("cc", $config->{admin_user_login}); +$sel->type_ok("qa_contact", $config->{admin_user_login}); +$sel->type_ok("cc", $config->{admin_user_login}); $sel->click_ok("commit"); $sel->wait_for_page_to_load(WAIT_TIME); my $bug1_id = $sel->get_value("//input[\@name='id' and \@type='hidden']"); -$sel->is_text_present_ok('has been added to the database', "Bug $bug1_id created"); +$sel->is_text_present_ok('has been added to the database', + "Bug $bug1_id created"); my @email_sentto = get_email_sentto($sel); is_deeply(\@email_sentto, \@email_both, "Admin and normal user got bugmail"); # Make normal user changes (first pass) # go_to_bug($sel, $bug1_id); + # Severity change (bugmail to normal user but not admin) $sel->select_ok("bug_severity", "label=blocker"); $sel->selected_label_is("bug_severity", "blocker"); @@ -245,14 +280,20 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); @email_sentto = get_email_sentto($sel); is_deeply(\@email_sentto, \@email_normal, "Normal user got bugmail"); + # Add a comment (bugmail to no one) -$sel->type_ok("comment", "This is a Selenium generated normal user test comment 1 of 2. (No bugmail should be generated for this.)"); -$sel->value_is("comment", "This is a Selenium generated normal user test comment 1 of 2. (No bugmail should be generated for this.)"); +$sel->type_ok("comment", + "This is a Selenium generated normal user test comment 1 of 2. (No bugmail should be generated for this.)" +); +$sel->value_is("comment", + "This is a Selenium generated normal user test comment 1 of 2. (No bugmail should be generated for this.)" +); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); @email_sentto = get_email_sentto($sel); ok($email_sentto[0] eq "no one", "No bugmail sent"); + # Add normal user to CC list (bugmail to admin but not normal user) $sel->type_ok("newcc", $config->{editbugs_user_login}); $sel->value_is("newcc", $config->{editbugs_user_login}); @@ -261,6 +302,7 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); @email_sentto = get_email_sentto($sel); is_deeply(\@email_sentto, \@email_admin, "Admin got bugmail"); + # Request a flag from admin (bugmail to no one, request mail to no one) $sel->select_ok("flag_type-4", "label=?"); $sel->type_ok("requestee_type-4", $config->{admin_user_login}); @@ -276,6 +318,7 @@ ok($email_sentto[0] eq "no one", "No bugmail sent"); logout($sel); log_in($sel, $config, 'admin'); go_to_bug($sel, $bug1_id); + # Severity change (bugmail to normal user but not admin) $sel->select_ok("bug_severity", "label=trivial"); $sel->selected_label_is("bug_severity", "trivial"); @@ -284,14 +327,20 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); @email_sentto = get_email_sentto($sel); is_deeply(\@email_sentto, \@email_normal, "Normal user got bugmail"); + # Add a comment (bugmail to normal user but not admin) -$sel->type_ok("comment", "This is a Selenium generated admin user test comment. (Only normal user should get bugmail for this.)"); -$sel->value_is("comment", "This is a Selenium generated admin user test comment. (Only normal user should get bugmail for this.)"); +$sel->type_ok("comment", + "This is a Selenium generated admin user test comment. (Only normal user should get bugmail for this.)" +); +$sel->value_is("comment", + "This is a Selenium generated admin user test comment. (Only normal user should get bugmail for this.)" +); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); @email_sentto = get_email_sentto($sel); is_deeply(\@email_sentto, \@email_normal, "Normal user got bugmail"); + # Remove normal user from CC list (bugmail to both normal user and admin) $sel->click_ok("removecc"); $sel->add_selection_ok("cc", "label=$config->{editbugs_user_login}"); @@ -302,6 +351,7 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); @email_sentto = get_email_sentto($sel); is_deeply(\@email_sentto, \@email_both, "Admin and normal user got bugmail"); + # Reassign bug to admin user (bugmail to both normal user and admin) $sel->type_ok("assigned_to", $config->{admin_user_login}); $sel->value_is("assigned_to", $config->{admin_user_login}); @@ -310,6 +360,7 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); @email_sentto = get_email_sentto($sel); is_deeply(\@email_sentto, \@email_both, "Admin and normal user got bugmail"); + # Request a flag from normal user (bugmail to admin but not normal user and request mail to admin) $sel->select_ok("flag_type-4", "label=?"); $sel->type_ok("requestee_type-4", $config->{editbugs_user_login}); @@ -318,6 +369,7 @@ $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @email_sentto = get_email_sentto($sel); is_deeply(\@email_sentto, \@email_admin, "Admin got bugmail"); + # Grant a normal user flag request (bugmail to admin but not normal user and request mail to no one) my $flag1_id = set_flag($sel, $config->{admin_user_login}, "?", "+"); $sel->click_ok("commit"); @@ -330,6 +382,7 @@ is_deeply(\@email_sentto, \@email_admin, "Admin got bugmail"); logout($sel); log_in($sel, $config, 'editbugs'); go_to_bug($sel, $bug1_id); + # Severity change (bugmail to both admin and normal user) $sel->select_ok("bug_severity", "label=normal"); $sel->selected_label_is("bug_severity", "normal"); @@ -338,14 +391,20 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); @email_sentto = get_email_sentto($sel); is_deeply(\@email_sentto, \@email_both, "Admin and normal user got bugmail"); + # Add a comment (bugmail to admin but not normal user) -$sel->type_ok("comment", "This is a Selenium generated normal user test comment 2 of 2. (Only admin should get bugmail for this.)"); -$sel->value_is("comment", "This is a Selenium generated normal user test comment 2 of 2. (Only admin should get bugmail for this.)"); +$sel->type_ok("comment", + "This is a Selenium generated normal user test comment 2 of 2. (Only admin should get bugmail for this.)" +); +$sel->value_is("comment", + "This is a Selenium generated normal user test comment 2 of 2. (Only admin should get bugmail for this.)" +); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); @email_sentto = get_email_sentto($sel); is_deeply(\@email_sentto, \@email_admin, "Admin got bugmail"); + # Reassign to normal user (bugmail to admin but not normal user) $sel->type_ok("assigned_to", $config->{editbugs_user_login}); $sel->value_is("assigned_to", $config->{editbugs_user_login}); @@ -353,12 +412,14 @@ $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @email_sentto = get_email_sentto($sel); is_deeply(\@email_sentto, \@email_admin, "Admin got bugmail"); + # Deny a flag requested by admin (bugmail to no one and request mail to admin) my $flag2_id = set_flag($sel, $config->{editbugs_user_login}, "?", "-"); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @email_sentto = get_email_sentto($sel); ok($email_sentto[0] eq "no one", "No bugmail sent"); + # Cancel both flags (bugmail and request mail to no one) set_flag($sel, undef, "+", "X", $flag1_id); set_flag($sel, undef, "-", "X", $flag2_id); @@ -370,31 +431,41 @@ logout($sel); # Help functions sub get_email_sentto { - my ($sel) = @_; - my @email_sentto; - my $index = 1; - while ($sel->is_element_present("//dt[text()='Email sent to:']/following-sibling::dd/code[$index]")) { - push(@email_sentto, - $sel->get_text("//dt[text()='Email sent to:']/following-sibling::dd/code[$index]")); - $index++; - } - return ("no one") if !@email_sentto; - return sort @email_sentto; + my ($sel) = @_; + my @email_sentto; + my $index = 1; + while ($sel->is_element_present( + "//dt[text()='Email sent to:']/following-sibling::dd/code[$index]")) + { + push( + @email_sentto, + $sel->get_text( + "//dt[text()='Email sent to:']/following-sibling::dd/code[$index]") + ); + $index++; + } + return ("no one") if !@email_sentto; + return sort @email_sentto; } sub set_flag { - my ($sel, $login, $curval, $newval, $prev_id) = @_; + my ($sel, $login, $curval, $newval, $prev_id) = @_; - # Retrieve flag id for the flag to be set - my $flag_id = $prev_id; - if (defined $login) { - my $flag_name = $sel->get_attribute("//table[\@id='flags']//input[\@value='$login']\@name"); - $flag_name =~ /^requestee-(\d+)$/; - $flag_id = $1; - } + # Retrieve flag id for the flag to be set + my $flag_id = $prev_id; + if (defined $login) { + my $flag_name + = $sel->get_attribute("//table[\@id='flags']//input[\@value='$login']\@name"); + $flag_name =~ /^requestee-(\d+)$/; + $flag_id = $1; + } - # Set new value for the flag (verifies current value) - $sel->select_ok("//select[\@id=\"flag-$flag_id\"]/option[\@value=\"$curval\" and \@selected]/..", "value=$newval", "Set flag ID $flag_id to $newval from $curval"); + # Set new value for the flag (verifies current value) + $sel->select_ok( + "//select[\@id=\"flag-$flag_id\"]/option[\@value=\"$curval\" and \@selected]/..", + "value=$newval", + "Set flag ID $flag_id to $newval from $curval" + ); - return $flag_id; + return $flag_id; } diff --git a/qa/t/lib/QA/REST.pm b/qa/t/lib/QA/REST.pm index f900cc352..3d37e2277 100644 --- a/qa/t/lib/QA/REST.pm +++ b/qa/t/lib/QA/REST.pm @@ -19,43 +19,46 @@ use QA::Util; use parent qw(LWP::UserAgent Exporter); @QA::REST::EXPORT = qw( - MUST_FAIL - get_rest_client + MUST_FAIL + get_rest_client ); use constant MUST_FAIL => 1; sub get_rest_client { - my $rest_client = LWP::UserAgent->new( ssl_opts => { verify_hostname => 0 } ); - bless($rest_client, 'QA::REST'); - my $config = $rest_client->{bz_config} = get_config(); - $rest_client->{bz_url} = $config->{browser_url} . '/' . $config->{bugzilla_installation} . '/rest/'; - $rest_client->{bz_default_headers} = {'Accept' => 'application/json', 'Content-Type' => 'application/json'}; - return $rest_client; + my $rest_client = LWP::UserAgent->new(ssl_opts => {verify_hostname => 0}); + bless($rest_client, 'QA::REST'); + my $config = $rest_client->{bz_config} = get_config(); + $rest_client->{bz_url} + = $config->{browser_url} . '/' . $config->{bugzilla_installation} . '/rest/'; + $rest_client->{bz_default_headers} + = {'Accept' => 'application/json', 'Content-Type' => 'application/json'}; + return $rest_client; } sub bz_config { return $_[0]->{bz_config}; } sub call { - my ($self, $method, $data, $http_verb, $expect_to_fail) = @_; - $http_verb = lc($http_verb || 'GET'); - $data //= {}; - - my %args = %{ $self->{bz_default_headers} }; - # We do not pass the API key in the URL, so that it's not logged by the web server. - if ($http_verb eq 'get' && $data->{api_key}) { - $args{'X-BUGZILLA-API-KEY'} = $data->{api_key}; - } - elsif ($http_verb ne 'get') { - $args{Content} = encode_json($data); - } - - my $response = $self->$http_verb($self->{bz_url} . $method, %args); - my $res = decode_json($response->decoded_content); - if ($response->is_success xor $expect_to_fail) { - return $res; - } - else { - die 'error ' . $res->{code} . ': ' . $res->{message} . "\n"; - } + my ($self, $method, $data, $http_verb, $expect_to_fail) = @_; + $http_verb = lc($http_verb || 'GET'); + $data //= {}; + + my %args = %{$self->{bz_default_headers}}; + +# We do not pass the API key in the URL, so that it's not logged by the web server. + if ($http_verb eq 'get' && $data->{api_key}) { + $args{'X-BUGZILLA-API-KEY'} = $data->{api_key}; + } + elsif ($http_verb ne 'get') { + $args{Content} = encode_json($data); + } + + my $response = $self->$http_verb($self->{bz_url} . $method, %args); + my $res = decode_json($response->decoded_content); + if ($response->is_success xor $expect_to_fail) { + return $res; + } + else { + die 'error ' . $res->{code} . ': ' . $res->{message} . "\n"; + } } diff --git a/qa/t/lib/QA/RPC.pm b/qa/t/lib/QA/RPC.pm index 4053c4dfe..f1b44eea8 100644 --- a/qa/t/lib/QA/RPC.pm +++ b/qa/t/lib/QA/RPC.pm @@ -16,9 +16,9 @@ use Storable qw(dclone); use Test::More; sub bz_config { - my $self = shift; - $self->{bz_config} ||= QA::Util::get_config(); - return $self->{bz_config}; + my $self = shift; + $self->{bz_config} ||= QA::Util::get_config(); + return $self->{bz_config}; } # True if we're doing calls over GET instead of POST. @@ -29,12 +29,12 @@ sub bz_get_mode { return 0 } # and Bugzilla_password with every future call until User.logout is called # (which actually just calls _bz_clear_credentials, under GET). sub _bz_credentials { - my ($self, $user, $pass) = @_; - if (@_ == 3) { - $self->{_bz_credentials}->{user} = $user; - $self->{_bz_credentials}->{pass} = $pass; - } - return $self->{_bz_credentials}; + my ($self, $user, $pass) = @_; + if (@_ == 3) { + $self->{_bz_credentials}->{user} = $user; + $self->{_bz_credentials}->{pass} = $pass; + } + return $self->{_bz_credentials}; } sub _bz_clear_credentials { delete $_[0]->{_bz_credentials} } @@ -43,240 +43,258 @@ sub _bz_clear_credentials { delete $_[0]->{_bz_credentials} } ################################ sub bz_log_in { - my ($self, $user) = @_; - my $username = $self->bz_config->{"${user}_user_login"}; - my $password = $self->bz_config->{"${user}_user_passwd"}; - - if ($self->bz_get_mode) { - $self->_bz_credentials($username, $password); - return; - } - - my $call = $self->bz_call_success( - 'User.login', { login => $username, password => $password }); - cmp_ok($call->result->{id}, 'gt', 0, $self->TYPE . ": Logged in as $user"); - $self->{_bz_credentials}->{token} = $call->result->{token}; + my ($self, $user) = @_; + my $username = $self->bz_config->{"${user}_user_login"}; + my $password = $self->bz_config->{"${user}_user_passwd"}; + + if ($self->bz_get_mode) { + $self->_bz_credentials($username, $password); + return; + } + + my $call = $self->bz_call_success('User.login', + {login => $username, password => $password}); + cmp_ok($call->result->{id}, 'gt', 0, $self->TYPE . ": Logged in as $user"); + $self->{_bz_credentials}->{token} = $call->result->{token}; } sub bz_call_success { - my ($self, $method, $orig_args, $test_name) = @_; - my $args = $orig_args ? dclone($orig_args) : {}; - - if ($self->bz_get_mode and $method eq 'User.logout') { - $self->_bz_clear_credentials(); - return; - } - - my $call; - # Under XMLRPC::Lite, if we pass undef as the second argument, - # it sends a single param <value />, which shows up as an - # empty string on the Bugzilla side. - if ($self->{_bz_credentials}->{token}) { - $args->{Bugzilla_token} = $self->{_bz_credentials}->{token}; - } - - if (scalar keys %$args) { - $call = $self->call($method, $args); - } - else { - $call = $self->call($method); - } - $test_name ||= "$method returned successfully"; - $self->_handle_undef_response($test_name) if !$call; - ok(!$call->fault, $self->TYPE . ": $test_name") - or diag($call->faultstring); - - if ($method eq 'User.logout') { - delete $self->{_bz_credentials}->{token}; - } - return $call; + my ($self, $method, $orig_args, $test_name) = @_; + my $args = $orig_args ? dclone($orig_args) : {}; + + if ($self->bz_get_mode and $method eq 'User.logout') { + $self->_bz_clear_credentials(); + return; + } + + my $call; + + # Under XMLRPC::Lite, if we pass undef as the second argument, + # it sends a single param <value />, which shows up as an + # empty string on the Bugzilla side. + if ($self->{_bz_credentials}->{token}) { + $args->{Bugzilla_token} = $self->{_bz_credentials}->{token}; + } + + if (scalar keys %$args) { + $call = $self->call($method, $args); + } + else { + $call = $self->call($method); + } + $test_name ||= "$method returned successfully"; + $self->_handle_undef_response($test_name) if !$call; + ok(!$call->fault, $self->TYPE . ": $test_name") or diag($call->faultstring); + + if ($method eq 'User.logout') { + delete $self->{_bz_credentials}->{token}; + } + return $call; } sub bz_call_fail { - my ($self, $method, $orig_args, $faultstring, $test_name) = @_; - my $args = $orig_args ? dclone($orig_args) : {}; - - if ($self->{_bz_credentials}->{token}) { - $args->{Bugzilla_token} = $self->{_bz_credentials}->{token}; - } - - $test_name ||= "$method failed (as intended)"; - my $call = $self->call($method, $args); - $self->_handle_undef_response($test_name) if !$call; - ok($call->fault, $self->TYPE . ": $test_name") - or diag("Returned: " . Dumper($call->result)); - if (defined $faultstring) { - cmp_ok(trim($call->faultstring), '=~', $faultstring, - $self->TYPE . ": Got correct fault for $method"); - } - ok($call->faultcode - && (($call->faultcode < 32000 && $call->faultcode > -32000) - # Fault codes 32610 and above are OK because they are errors - # that we expect and test for sometimes. - || $call->faultcode >= 32610), - $self->TYPE . ': Fault code is set properly') - or diag("Code: " . $call->faultcode - . " Message: " . $call->faultstring); - - return $call; + my ($self, $method, $orig_args, $faultstring, $test_name) = @_; + my $args = $orig_args ? dclone($orig_args) : {}; + + if ($self->{_bz_credentials}->{token}) { + $args->{Bugzilla_token} = $self->{_bz_credentials}->{token}; + } + + $test_name ||= "$method failed (as intended)"; + my $call = $self->call($method, $args); + $self->_handle_undef_response($test_name) if !$call; + ok($call->fault, $self->TYPE . ": $test_name") + or diag("Returned: " . Dumper($call->result)); + if (defined $faultstring) { + cmp_ok(trim($call->faultstring), + '=~', $faultstring, $self->TYPE . ": Got correct fault for $method"); + } + ok( + $call->faultcode && ( + ($call->faultcode < 32000 && $call->faultcode > -32000) + + # Fault codes 32610 and above are OK because they are errors + # that we expect and test for sometimes. + || $call->faultcode >= 32610 + ), + $self->TYPE . ': Fault code is set properly' + ) or diag("Code: " . $call->faultcode . " Message: " . $call->faultstring); + + return $call; } sub _handle_undef_response { - my ($self, $test_name) = @_; - my $response = $self->transport->http_response; - die "$test_name:\n", $response->as_string; + my ($self, $test_name) = @_; + my $response = $self->transport->http_response; + die "$test_name:\n", $response->as_string; } sub bz_get_products { - my ($self) = @_; - $self->bz_log_in('QA_Selenium_TEST'); - - my $accessible = $self->bz_call_success('Product.get_accessible_products'); - my $prod_call = $self->bz_call_success('Product.get', $accessible->result); - my %products; - foreach my $prod (@{ $prod_call->result->{products} }) { - $products{$prod->{name}} = $prod->{id}; - } - - $self->bz_call_success('User.logout'); - return \%products; + my ($self) = @_; + $self->bz_log_in('QA_Selenium_TEST'); + + my $accessible = $self->bz_call_success('Product.get_accessible_products'); + my $prod_call = $self->bz_call_success('Product.get', $accessible->result); + my %products; + foreach my $prod (@{$prod_call->result->{products}}) { + $products{$prod->{name}} = $prod->{id}; + } + + $self->bz_call_success('User.logout'); + return \%products; } -sub _string_array { map { random_string() } (1..$_[0]) } +sub _string_array { + map { random_string() } (1 .. $_[0]); +} sub bz_create_test_bugs { - my ($self, $second_private) = @_; - my $config = $self->bz_config; - - my @whiteboard_strings = _string_array(3); - my @summary_strings = _string_array(3); - - my $public_bug = create_bug_fields($config); - $public_bug->{alias} = random_string(40); - $public_bug->{whiteboard} = join(' ', @whiteboard_strings); - $public_bug->{summary} = join(' ', @summary_strings); - - my $private_bug = dclone($public_bug); - $private_bug->{alias} = random_string(40); - if ($second_private) { - $private_bug->{product} = 'QA-Selenium-TEST'; - $private_bug->{component} = 'QA-Selenium-TEST'; - $private_bug->{target_milestone} = 'QAMilestone'; - $private_bug->{version} = 'QAVersion'; - # Although we don't directly use this, this helps some tests that - # depend on the values in $private_bug. - $private_bug->{creator} = $config->{PRIVATE_BUG_USER . '_user_login'}; - } - - my @create_bugs = ( - { user => 'editbugs', - args => $public_bug, - test => 'Create a public bug' }, - { user => $second_private ? PRIVATE_BUG_USER : 'editbugs', - args => $private_bug, - test => $second_private ? 'Create a private bug' - : 'Create a second public bug' }, - ); - - my $post_success = sub { - my ($call, $t) = @_; - my $id = $call->result->{id}; - $t->{args}->{id} = $id; - }; - - # Creating the bugs isn't really a test, it's just preliminary work - # for the tests. So we just run it with one of the RPC clients. - $self->bz_run_tests(tests => \@create_bugs, method => 'Bug.create', - post_success => $post_success); - - return ($public_bug, $private_bug); + my ($self, $second_private) = @_; + my $config = $self->bz_config; + + my @whiteboard_strings = _string_array(3); + my @summary_strings = _string_array(3); + + my $public_bug = create_bug_fields($config); + $public_bug->{alias} = random_string(40); + $public_bug->{whiteboard} = join(' ', @whiteboard_strings); + $public_bug->{summary} = join(' ', @summary_strings); + + my $private_bug = dclone($public_bug); + $private_bug->{alias} = random_string(40); + if ($second_private) { + $private_bug->{product} = 'QA-Selenium-TEST'; + $private_bug->{component} = 'QA-Selenium-TEST'; + $private_bug->{target_milestone} = 'QAMilestone'; + $private_bug->{version} = 'QAVersion'; + + # Although we don't directly use this, this helps some tests that + # depend on the values in $private_bug. + $private_bug->{creator} = $config->{PRIVATE_BUG_USER . '_user_login'}; + } + + my @create_bugs = ( + {user => 'editbugs', args => $public_bug, test => 'Create a public bug'}, + { + user => $second_private ? PRIVATE_BUG_USER : 'editbugs', + args => $private_bug, + test => $second_private ? 'Create a private bug' : 'Create a second public bug' + }, + ); + + my $post_success = sub { + my ($call, $t) = @_; + my $id = $call->result->{id}; + $t->{args}->{id} = $id; + }; + + # Creating the bugs isn't really a test, it's just preliminary work + # for the tests. So we just run it with one of the RPC clients. + $self->bz_run_tests( + tests => \@create_bugs, + method => 'Bug.create', + post_success => $post_success + ); + + return ($public_bug, $private_bug); } sub bz_run_tests { - my ($self, %params) = @_; - # Required params - my $config = $self->bz_config; - my $tests = $params{tests}; - my $method = $params{method}; - - # Optional params - my $post_success = $params{post_success}; - my $pre_call = $params{pre_call}; - - my $former_user = ''; - foreach my $t (@$tests) { - # Only logout/login if the user has changed since the last test - # (this saves us LOTS of needless logins). - my $user = $t->{user} || ''; - if ($former_user ne $user) { - $self->bz_call_success('User.logout') if $former_user; - $self->bz_log_in($user) if $user; - $former_user = $user; - } - - $pre_call->($t, $self) if $pre_call; - - if ($t->{error}) { - $self->bz_call_fail($method, $t->{args}, $t->{error}, $t->{test}); - } - else { - my $call = $self->bz_call_success($method, $t->{args}, $t->{test}); - if ($call->result && $post_success) { - $post_success->($call, $t, $self); - } - } + my ($self, %params) = @_; + + # Required params + my $config = $self->bz_config; + my $tests = $params{tests}; + my $method = $params{method}; + + # Optional params + my $post_success = $params{post_success}; + my $pre_call = $params{pre_call}; + + my $former_user = ''; + foreach my $t (@$tests) { + + # Only logout/login if the user has changed since the last test + # (this saves us LOTS of needless logins). + my $user = $t->{user} || ''; + if ($former_user ne $user) { + $self->bz_call_success('User.logout') if $former_user; + $self->bz_log_in($user) if $user; + $former_user = $user; + } + + $pre_call->($t, $self) if $pre_call; + + if ($t->{error}) { + $self->bz_call_fail($method, $t->{args}, $t->{error}, $t->{test}); + } + else { + my $call = $self->bz_call_success($method, $t->{args}, $t->{test}); + if ($call->result && $post_success) { + $post_success->($call, $t, $self); + } } + } - $self->bz_call_success('User.logout') if $former_user; + $self->bz_call_success('User.logout') if $former_user; } sub bz_test_bug { - my ($self, $fields, $bug, $expect, $t, $creation_time) = @_; - - foreach my $field (sort @$fields) { - # "description" is used by Bug.create but comments are not returned - # by Bug.get or Bug.search. - next if $field eq 'description'; - - my @include = @{ $t->{args}->{include_fields} || [] }; - my @exclude = @{ $t->{args}->{exclude_fields} || [] }; - if ( (@include and !grep($_ eq $field, @include)) - or (@exclude and grep($_ eq $field, @exclude)) ) - { - ok(!exists $bug->{$field}, "$field is not included") - or diag Dumper($bug); - next; - } - - if ($field =~ /^is_/) { - ok(defined $bug->{$field}, $self->TYPE . ": $field is not null"); - is($bug->{$field} ? 1 : 0, $expect->{$field} ? 1 : 0, - $self->TYPE . ": $field has the right boolean value"); - } - elsif ($field eq 'cc') { - foreach my $cc_item (@{ $expect->{cc} || [] }) { - ok(grep($_ eq $cc_item, @{ $bug->{cc} }), - $self->TYPE . ": $field contains $cc_item"); - } - } - elsif ($field eq 'creation_time' or $field eq 'last_change_time') { - my $creation_day; - # XML-RPC and JSON-RPC have different date formats. - if ($self->isa('QA::RPC::XMLRPC')) { - $creation_day = $creation_time->ymd(''); - } - else { - $creation_day = $creation_time->ymd; - } - - like($bug->{$field}, qr/^\Q${creation_day}\ET\d\d:\d\d:\d\d/, - $self->TYPE . ": $field has the right format"); - } - else { - is_deeply($bug->{$field}, $expect->{$field}, - $self->TYPE . ": $field value is correct"); - } + my ($self, $fields, $bug, $expect, $t, $creation_time) = @_; + + foreach my $field (sort @$fields) { + + # "description" is used by Bug.create but comments are not returned + # by Bug.get or Bug.search. + next if $field eq 'description'; + + my @include = @{$t->{args}->{include_fields} || []}; + my @exclude = @{$t->{args}->{exclude_fields} || []}; + if ( (@include and !grep($_ eq $field, @include)) + or (@exclude and grep($_ eq $field, @exclude))) + { + ok(!exists $bug->{$field}, "$field is not included") or diag Dumper($bug); + next; + } + + if ($field =~ /^is_/) { + ok(defined $bug->{$field}, $self->TYPE . ": $field is not null"); + is( + $bug->{$field} ? 1 : 0, + $expect->{$field} ? 1 : 0, + $self->TYPE . ": $field has the right boolean value" + ); + } + elsif ($field eq 'cc') { + foreach my $cc_item (@{$expect->{cc} || []}) { + ok( + grep($_ eq $cc_item, @{$bug->{cc}}), + $self->TYPE . ": $field contains $cc_item" + ); + } + } + elsif ($field eq 'creation_time' or $field eq 'last_change_time') { + my $creation_day; + + # XML-RPC and JSON-RPC have different date formats. + if ($self->isa('QA::RPC::XMLRPC')) { + $creation_day = $creation_time->ymd(''); + } + else { + $creation_day = $creation_time->ymd; + } + + like( + $bug->{$field}, + qr/^\Q${creation_day}\ET\d\d:\d\d:\d\d/, + $self->TYPE . ": $field has the right format" + ); + } + else { + is_deeply($bug->{$field}, $expect->{$field}, + $self->TYPE . ": $field value is correct"); } + } } 1; diff --git a/qa/t/lib/QA/RPC/JSONRPC.pm b/qa/t/lib/QA/RPC/JSONRPC.pm index 4175b10fc..1e43e9eaf 100644 --- a/qa/t/lib/QA/RPC/JSONRPC.pm +++ b/qa/t/lib/QA/RPC/JSONRPC.pm @@ -11,24 +11,26 @@ package QA::RPC::JSONRPC; use strict; use QA::RPC; -BEGIN { - our @ISA = qw(QA::RPC); - if (eval { require JSON::RPC::Client }) { - push(@ISA, 'JSON::RPC::Client'); - } - else { - require JSON::RPC::Legacy::Client; - push(@ISA, 'JSON::RPC::Legacy::Client'); - } +BEGIN { + our @ISA = qw(QA::RPC); + + if (eval { require JSON::RPC::Client }) { + push(@ISA, 'JSON::RPC::Client'); + } + else { + require JSON::RPC::Legacy::Client; + push(@ISA, 'JSON::RPC::Legacy::Client'); + } } use URI::Escape; use constant DATETIME_REGEX => qr/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\dZ$/; + sub TYPE { - my ($self) = @_; - return $self->bz_get_mode ? 'JSON-RPC GET' : 'JSON-RPC'; + my ($self) = @_; + return $self->bz_get_mode ? 'JSON-RPC GET' : 'JSON-RPC'; } ################################# @@ -36,85 +38,88 @@ sub TYPE { ################################# sub ua { - my $self = shift; - if ($self->{ua} and not $self->{ua}->isa('QA::RPC::UserAgent')) { - bless $self->{ua}, 'QA::RPC::UserAgent'; - } - return $self->SUPER::ua(@_); + my $self = shift; + if ($self->{ua} and not $self->{ua}->isa('QA::RPC::UserAgent')) { + bless $self->{ua}, 'QA::RPC::UserAgent'; + } + return $self->SUPER::ua(@_); } sub transport { $_[0]->ua } sub bz_get_mode { - my ($self, $value) = @_; - $self->{bz_get_mode} = $value if @_ > 1; - return $self->{bz_get_mode}; + my ($self, $value) = @_; + $self->{bz_get_mode} = $value if @_ > 1; + return $self->{bz_get_mode}; } sub _bz_callback { - my ($self, $value) = @_; - $self->{bz_callback} = $value if @_ > 1; - return $self->{bz_callback}; + my ($self, $value) = @_; + $self->{bz_callback} = $value if @_ > 1; + return $self->{bz_callback}; } sub call { - my $self = shift; - my ($method, $args) = @_; - my %params = ( method => $method ); - $params{params} = $args ? [$args] : []; - - my $config = $self->bz_config; - my $url = $config->{browser_url} . "/" - . $config->{bugzilla_installation} . "/jsonrpc.cgi"; - my $result; - if ($self->bz_get_mode) { - my $method_escaped = uri_escape($method); - $url .= "?method=$method_escaped"; - if (my $cred = $self->_bz_credentials) { - $args->{Bugzilla_login} = $cred->{user} - if !exists $args->{Bugzilla_login}; - $args->{Bugzilla_password} = $cred->{pass} - if !exists $args->{Bugzilla_password}; - } - if ($args) { - my $params_json = $self->json->encode($args); - my $params_escaped = uri_escape($params_json); - $url .= "¶ms=$params_escaped"; - } - if ($self->version eq '1.1') { - $url .= "&version=1.1"; - } - my $callback = delete $args->{callback}; - if (defined $callback) { - $self->_bz_callback($callback); - $url .= "&callback=" . uri_escape($callback); - } - $result = $self->SUPER::call($url); + my $self = shift; + my ($method, $args) = @_; + my %params = (method => $method); + $params{params} = $args ? [$args] : []; + + my $config = $self->bz_config; + my $url + = $config->{browser_url} . "/" + . $config->{bugzilla_installation} + . "/jsonrpc.cgi"; + my $result; + if ($self->bz_get_mode) { + my $method_escaped = uri_escape($method); + $url .= "?method=$method_escaped"; + if (my $cred = $self->_bz_credentials) { + $args->{Bugzilla_login} = $cred->{user} if !exists $args->{Bugzilla_login}; + $args->{Bugzilla_password} = $cred->{pass} + if !exists $args->{Bugzilla_password}; } - else { - $result = $self->SUPER::call($url, \%params); + if ($args) { + my $params_json = $self->json->encode($args); + my $params_escaped = uri_escape($params_json); + $url .= "¶ms=$params_escaped"; } - - if ($result) { - bless $result, 'QA::RPC::JSONRPC::ReturnObject'; + if ($self->version eq '1.1') { + $url .= "&version=1.1"; + } + my $callback = delete $args->{callback}; + if (defined $callback) { + $self->_bz_callback($callback); + $url .= "&callback=" . uri_escape($callback); } - return $result; + $result = $self->SUPER::call($url); + } + else { + $result = $self->SUPER::call($url, \%params); + } + + if ($result) { + bless $result, 'QA::RPC::JSONRPC::ReturnObject'; + } + return $result; } sub _get { - my $self = shift; - my $result = $self->SUPER::_get(@_); - # Simple JSONP support for tests. We just remove the callback from - # the return value. - my $callback = $self->_bz_callback; - if (defined $callback and $result->is_success) { - my $content = $result->content; - $content =~ s/^(?:\/\*\*\/)?\Q$callback(\E(.*)\)$/$1/s; - $result->content($content); - # We don't need this anymore, and we don't want it to affect - # future calls. - delete $self->{bz_callback}; - } - return $result; + my $self = shift; + my $result = $self->SUPER::_get(@_); + + # Simple JSONP support for tests. We just remove the callback from + # the return value. + my $callback = $self->_bz_callback; + if (defined $callback and $result->is_success) { + my $content = $result->content; + $content =~ s/^(?:\/\*\*\/)?\Q$callback(\E(.*)\)$/$1/s; + $result->content($content); + + # We don't need this anymore, and we don't want it to affect + # future calls. + delete $self->{bz_callback}; + } + return $result; } 1; @@ -123,13 +128,13 @@ package QA::RPC::JSONRPC::ReturnObject; use strict; BEGIN { - if (eval { require JSON::RPC::Client }) { - our @ISA = qw(JSON::RPC::ReturnObject); - } - else { - require JSON::RPC::Legacy::Client; - our @ISA = qw(JSON::RPC::Legacy::ReturnObject); - } + if (eval { require JSON::RPC::Client }) { + our @ISA = qw(JSON::RPC::ReturnObject); + } + else { + require JSON::RPC::Legacy::Client; + our @ISA = qw(JSON::RPC::Legacy::ReturnObject); + } } ################################# @@ -137,8 +142,8 @@ BEGIN { ################################# sub faultstring { $_[0]->{content}->{error}->{message} } -sub faultcode { $_[0]->{content}->{error}->{code} } -sub fault { $_[0]->is_error } +sub faultcode { $_[0]->{content}->{error}->{code} } +sub fault { $_[0]->is_error } 1; @@ -151,18 +156,19 @@ use base qw(LWP::UserAgent); ######################################## sub send_request { - my $self = shift; - my $response = $self->SUPER::send_request(@_); - $self->http_response($response); - # JSON::RPC::Client can't handle 500 responses, even though - # they're required by the JSON-RPC spec. - $response->code(200); - return $response; + my $self = shift; + my $response = $self->SUPER::send_request(@_); + $self->http_response($response); + + # JSON::RPC::Client can't handle 500 responses, even though + # they're required by the JSON-RPC spec. + $response->code(200); + return $response; } # Copied directly from SOAP::Lite::Transport::HTTP. sub http_response { - my $self = shift; - if (@_) { $self->{'_http_response'} = shift; return $self } - return $self->{'_http_response'}; + my $self = shift; + if (@_) { $self->{'_http_response'} = shift; return $self } + return $self->{'_http_response'}; } diff --git a/qa/t/lib/QA/RPC/XMLRPC.pm b/qa/t/lib/QA/RPC/XMLRPC.pm index d88d4092e..6e63852eb 100644 --- a/qa/t/lib/QA/RPC/XMLRPC.pm +++ b/qa/t/lib/QA/RPC/XMLRPC.pm @@ -11,7 +11,7 @@ package QA::RPC::XMLRPC; use strict; use base qw(QA::RPC XMLRPC::Lite); -use constant TYPE => 'XML-RPC'; +use constant TYPE => 'XML-RPC'; use constant DATETIME_REGEX => qr/^\d{8}T\d\d:\d\d:\d\d$/; 1; diff --git a/qa/t/lib/QA/Tests.pm b/qa/t/lib/QA/Tests.pm index 86fc06ad1..3d53cefcc 100644 --- a/qa/t/lib/QA/Tests.pm +++ b/qa/t/lib/QA/Tests.pm @@ -11,96 +11,108 @@ package QA::Tests; use strict; use base qw(Exporter); our @EXPORT_OK = qw( - PRIVATE_BUG_USER - STANDARD_BUG_TESTS - bug_tests - create_bug_fields + PRIVATE_BUG_USER + STANDARD_BUG_TESTS + bug_tests + create_bug_fields ); -use constant INVALID_BUG_ID => -1; +use constant INVALID_BUG_ID => -1; use constant INVALID_BUG_ALIAS => 'aaaaaaa12345'; -use constant PRIVATE_BUG_USER => 'QA_Selenium_TEST'; +use constant PRIVATE_BUG_USER => 'QA_Selenium_TEST'; use constant CREATE_BUG => { - 'priority' => 'Highest', - 'status' => 'CONFIRMED', - 'version' => 'unspecified', - 'creator' => 'editbugs', - 'description' => '-- Comment Created By Bugzilla XML-RPC Tests --', - 'cc' => ['unprivileged'], - 'component' => 'c1', - 'platform' => 'PC', - # It's necessary to assign the bug to somebody who isn't in the - # timetracking group, for the Bug.update tests. - 'assigned_to' => PRIVATE_BUG_USER, - 'summary' => 'WebService Test Bug', - 'product' => 'Another Product', - 'op_sys' => 'Linux', - 'severity' => 'normal', - 'qa_contact' => 'canconfirm', - version => 'Another1', - url => 'https://www.bugzilla.org/', - target_milestone => 'AnotherMS1', + 'priority' => 'Highest', + 'status' => 'CONFIRMED', + 'version' => 'unspecified', + 'creator' => 'editbugs', + 'description' => '-- Comment Created By Bugzilla XML-RPC Tests --', + 'cc' => ['unprivileged'], + 'component' => 'c1', + 'platform' => 'PC', + + # It's necessary to assign the bug to somebody who isn't in the + # timetracking group, for the Bug.update tests. + 'assigned_to' => PRIVATE_BUG_USER, + 'summary' => 'WebService Test Bug', + 'product' => 'Another Product', + 'op_sys' => 'Linux', + 'severity' => 'normal', + 'qa_contact' => 'canconfirm', + version => 'Another1', + url => 'https://www.bugzilla.org/', + target_milestone => 'AnotherMS1', }; sub create_bug_fields { - my ($config) = @_; - my %bug = %{ CREATE_BUG() }; - foreach my $field (qw(creator assigned_to qa_contact)) { - my $value = $bug{$field}; - $bug{$field} = $config->{"${value}_user_login"}; - } - $bug{cc} = [map { $config->{$_ . "_user_login"} } @{ $bug{cc} }]; - return \%bug; + my ($config) = @_; + my %bug = %{CREATE_BUG()}; + foreach my $field (qw(creator assigned_to qa_contact)) { + my $value = $bug{$field}; + $bug{$field} = $config->{"${value}_user_login"}; + } + $bug{cc} = [map { $config->{$_ . "_user_login"} } @{$bug{cc}}]; + return \%bug; } sub bug_tests { - my ($public_id, $private_id) = @_; - return [ - { args => { ids => [$private_id] }, + my ($public_id, $private_id) = @_; + return [ + { + args => {ids => [$private_id]}, error => "You are not authorized to access", test => 'Logged-out user cannot access a private bug', }, - { args => { ids => [$public_id] }, + { + args => {ids => [$public_id]}, test => 'Logged-out user can access a public bug.', }, - { args => { ids => [INVALID_BUG_ID] }, + { + args => {ids => [INVALID_BUG_ID]}, error => "It does not seem like bug number", test => 'Passing invalid bug id returns error "Invalid Bug ID"', }, - { args => { ids => [undef] }, + { + args => {ids => [undef]}, error => "You must enter a valid bug number", test => 'Passing undef as bug id param returns error "Invalid Bug ID"', }, - { args => { ids => [INVALID_BUG_ALIAS] }, + { + args => {ids => [INVALID_BUG_ALIAS]}, error => "nor an alias to a bug", test => 'Passing invalid bug alias returns error "Invalid Bug Alias"', }, - { user => 'editbugs', - args => { ids => [$private_id] }, + { + user => 'editbugs', + args => {ids => [$private_id]}, error => "You are not authorized to access", test => 'Access to a private bug is denied to a user without privs', }, - { user => 'unprivileged', - args => { ids => [$public_id] }, + { + user => 'unprivileged', + args => {ids => [$public_id]}, test => 'User without privs can access a public bug', }, - { user => 'admin', - args => { ids => [$public_id] }, + { + user => 'admin', + args => {ids => [$public_id]}, test => 'Admin can access a public bug.', }, - { user => PRIVATE_BUG_USER, - args => { ids => [$private_id] }, + { + user => PRIVATE_BUG_USER, + args => {ids => [$private_id]}, test => 'User with privs can successfully access a private bug', }, + # This helps webservice_bug_attachment get private attachment ids # from the public bug, and doesn't hurt for the other tests. - { user => PRIVATE_BUG_USER, - args => { ids => [$public_id] }, + { + user => PRIVATE_BUG_USER, + args => {ids => [$public_id]}, test => 'User with privs can also access the public bug', }, - ]; + ]; } use constant STANDARD_BUG_TESTS => bug_tests('public_bug', 'private_bug'); diff --git a/qa/t/lib/QA/Util.pm b/qa/t/lib/QA/Util.pm index bf9151fee..fd584975a 100644 --- a/qa/t/lib/QA/Util.pm +++ b/qa/t/lib/QA/Util.pm @@ -22,72 +22,74 @@ use URI::QueryParam; # Fixes wide character warnings BEGIN { - my $builder = Test::More->builder; - binmode $builder->output, ":encoding(utf8)"; - binmode $builder->failure_output, ":encoding(utf8)"; - binmode $builder->todo_output, ":encoding(utf8)"; + my $builder = Test::More->builder; + binmode $builder->output, ":encoding(utf8)"; + binmode $builder->failure_output, ":encoding(utf8)"; + binmode $builder->todo_output, ":encoding(utf8)"; } use base qw(Exporter); @QA::Util::EXPORT = qw( - trim - url_quote - random_string - - log_in - logout - file_bug_in_product - create_bug - edit_bug - edit_bug_and_return - go_to_bug - go_to_home - go_to_admin - edit_product - add_product - open_advanced_search_page - set_parameters - screenshot_page - - get_selenium - get_rpc_clients - check_page_load - - WAIT_TIME - CHROME_MODE + trim + url_quote + random_string + + log_in + logout + file_bug_in_product + create_bug + edit_bug + edit_bug_and_return + go_to_bug + go_to_home + go_to_admin + edit_product + add_product + open_advanced_search_page + set_parameters + screenshot_page + + get_selenium + get_rpc_clients + check_page_load + + WAIT_TIME + CHROME_MODE ); # How long we wait for pages to load. use constant WAIT_TIME => 60000; -use constant CONF_FILE => $ENV{BZ_QA_CONF_FILE} // "../config/selenium_test.conf"; +use constant CONF_FILE => $ENV{BZ_QA_CONF_FILE} + // "../config/selenium_test.conf"; use constant CHROME_MODE => 1; -use constant NDASH => chr(0x2013); +use constant NDASH => chr(0x2013); ##################### # Utility Functions # ##################### sub random_string { - my $size = shift || 30; # default to 30 chars if nothing specified - return join("", map{ ('0'..'9','a'..'z','A'..'Z')[rand 62] } (1..$size)); + my $size = shift || 30; # default to 30 chars if nothing specified + return + join("", map { ('0' .. '9', 'a' .. 'z', 'A' .. 'Z')[rand 62] } (1 .. $size)); } # Remove consecutive as well as leading and trailing whitespaces. sub trim { - my ($str) = @_; - if ($str) { - $str =~ s/[\r\n\t\s]+/ /g; - $str =~ s/^\s+//g; - $str =~ s/\s+$//g; - } - return $str; + my ($str) = @_; + if ($str) { + $str =~ s/[\r\n\t\s]+/ /g; + $str =~ s/^\s+//g; + $str =~ s/\s+$//g; + } + return $str; } # This originally came from CGI.pm, by Lincoln D. Stein sub url_quote { - my ($toencode) = (@_); - $toencode =~ s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg; - return $toencode; + my ($toencode) = (@_); + $toencode =~ s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg; + return $toencode; } ################### @@ -95,67 +97,73 @@ sub url_quote { ################### sub get_config { - # read the test configuration file - my $conf_file = CONF_FILE; - my $config = do($conf_file) - or die "can't read configuration '$conf_file': $!$@"; - my $uri = URI->new($config->{browser_url}); - if (my $ip_packed = gethostbyname($uri->host)) { - my $ip = inet_ntoa($ip_packed); - $uri->host($ip); - $config->{browser_ip_url} = "$uri"; - } - else { - die "unable to find ip for $config->{browser_url}\n"; - } - return $config; + + # read the test configuration file + my $conf_file = CONF_FILE; + my $config = do($conf_file) + or die "can't read configuration '$conf_file': $!$@"; + my $uri = URI->new($config->{browser_url}); + if (my $ip_packed = gethostbyname($uri->host)) { + my $ip = inet_ntoa($ip_packed); + $uri->host($ip); + $config->{browser_ip_url} = "$uri"; + } + else { + die "unable to find ip for $config->{browser_url}\n"; + } + return $config; } sub get_selenium { - my $chrome_mode = shift; - my $config = get_config(); - - if (!server_is_running) { - die "Selenium Server isn't running!"; - } - - my $sel = Test::WWW::Selenium->new( - host => $config->{host}, - port => $config->{port}, - browser => $chrome_mode ? $config->{experimental_browser_launcher} : $config->{browser}, - browser_url => $config->{browser_url} - ); - - return ($sel, $config); + my $chrome_mode = shift; + my $config = get_config(); + + if (!server_is_running) { + die "Selenium Server isn't running!"; + } + + my $sel = Test::WWW::Selenium->new( + host => $config->{host}, + port => $config->{port}, + browser => $chrome_mode + ? $config->{experimental_browser_launcher} + : $config->{browser}, + browser_url => $config->{browser_url} + ); + + return ($sel, $config); } sub get_xmlrpc_client { - my $config = get_config(); - my $xmlrpc_url = $config->{browser_url} . "/" . - $config->{bugzilla_installation} . "/xmlrpc.cgi"; - - require QA::RPC::XMLRPC; - my $rpc = new QA::RPC::XMLRPC(proxy => $xmlrpc_url); - return ($rpc, $config); + my $config = get_config(); + my $xmlrpc_url + = $config->{browser_url} . "/" + . $config->{bugzilla_installation} + . "/xmlrpc.cgi"; + + require QA::RPC::XMLRPC; + my $rpc = new QA::RPC::XMLRPC(proxy => $xmlrpc_url); + return ($rpc, $config); } sub get_jsonrpc_client { - my ($get_mode) = @_; - require QA::RPC::JSONRPC; - my $rpc = new QA::RPC::JSONRPC(); - # If we don't set a long timeout, then the Bug.add_comment test - # where we add a too-large comment fails. - $rpc->transport->timeout(180); - $rpc->version($get_mode ? '1.1' : '1.0'); - $rpc->bz_get_mode($get_mode); - return $rpc; + my ($get_mode) = @_; + require QA::RPC::JSONRPC; + my $rpc = new QA::RPC::JSONRPC(); + + # If we don't set a long timeout, then the Bug.add_comment test + # where we add a too-large comment fails. + $rpc->transport->timeout(180); + $rpc->version($get_mode ? '1.1' : '1.0'); + $rpc->bz_get_mode($get_mode); + return $rpc; } sub get_rpc_clients { - my ($xmlrpc, $config) = get_xmlrpc_client(); - my $jsonrpc = get_jsonrpc_client(); - my $jsonrpc_get = get_jsonrpc_client('GET'); - return ($config, $xmlrpc, $jsonrpc, $jsonrpc_get); + my ($xmlrpc, $config) = get_xmlrpc_client(); + my $jsonrpc = get_jsonrpc_client(); + my $jsonrpc_get = get_jsonrpc_client('GET'); + return ($config, $xmlrpc, $jsonrpc, $jsonrpc_get); } ################################ @@ -163,182 +171,210 @@ sub get_rpc_clients { ################################ sub go_to_home { - my ($sel, $config) = @_; - $sel->open_ok("/$config->{bugzilla_installation}/", undef, "Go to the home page"); - $sel->set_speed(500); - $sel->title_is("Bugzilla Main Page"); + my ($sel, $config) = @_; + $sel->open_ok("/$config->{bugzilla_installation}/", + undef, "Go to the home page"); + $sel->set_speed(500); + $sel->title_is("Bugzilla Main Page"); } sub screenshot_page { - my ($sel, $filename) = @_; - open my $fh, '>:raw', $filename or die "unable to write $filename: $!"; - binmode $fh; - print $fh decode_base64($sel->capture_entire_page_screenshot_to_string()); - close $fh; + my ($sel, $filename) = @_; + open my $fh, '>:raw', $filename or die "unable to write $filename: $!"; + binmode $fh; + print $fh decode_base64($sel->capture_entire_page_screenshot_to_string()); + close $fh; } # Go to the home/login page and log in. sub log_in { - my ($sel, $config, $user) = @_; - - $sel->open_ok("/$config->{bugzilla_installation}/login", undef, "Go to the home page"); - $sel->title_is("Log in to Bugzilla"); - $sel->type_ok("Bugzilla_login", $config->{"${user}_user_login"}, "Enter $user login name"); - $sel->type_ok("Bugzilla_password", $config->{"${user}_user_passwd"}, "Enter $user password"); - $sel->click_ok("log_in", undef, "Submit credentials"); - $sel->wait_for_page_to_load(WAIT_TIME); - $sel->title_is("Bugzilla Main Page", "User is logged in"); + my ($sel, $config, $user) = @_; + + $sel->open_ok("/$config->{bugzilla_installation}/login", + undef, "Go to the home page"); + $sel->title_is("Log in to Bugzilla"); + $sel->type_ok( + "Bugzilla_login", + $config->{"${user}_user_login"}, + "Enter $user login name" + ); + $sel->type_ok( + "Bugzilla_password", + $config->{"${user}_user_passwd"}, + "Enter $user password" + ); + $sel->click_ok("log_in", undef, "Submit credentials"); + $sel->wait_for_page_to_load(WAIT_TIME); + $sel->title_is("Bugzilla Main Page", "User is logged in"); } # Log out. Will fail if you are not logged in. sub logout { - my $sel = shift; + my $sel = shift; - $sel->click_ok("link=Log out", undef, "Logout"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Logged Out"); + $sel->click_ok("link=Log out", undef, "Logout"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Logged Out"); } # Display the bug form to enter a bug in the given product. sub file_bug_in_product { - my ($sel, $product, $classification) = @_; - my $config = get_config(); - - $classification ||= "Unclassified"; - $sel->click_ok('//*[@class="link-file"]//a', undef, "Go create a new bug"); + my ($sel, $product, $classification) = @_; + my $config = get_config(); + + $classification ||= "Unclassified"; + $sel->click_ok('//*[@class="link-file"]//a', undef, "Go create a new bug"); + $sel->wait_for_page_to_load(WAIT_TIME); + my $title = $sel->get_title(); + if ($sel->is_text_present("Select Classification")) { + ok(1, + "More than one enterable classification available. Display them in a list"); + $sel->click_ok("link=$classification", undef, "Choose $classification"); $sel->wait_for_page_to_load(WAIT_TIME); - my $title = $sel->get_title(); - if ($sel->is_text_present("Select Classification")) { - ok(1, "More than one enterable classification available. Display them in a list"); - $sel->click_ok("link=$classification", undef, "Choose $classification"); - $sel->wait_for_page_to_load(WAIT_TIME); - $title = $sel->get_title(); - } - if ($sel->is_text_present("Which product is affected by the problem")) { - ok(1, "Which product is affected by the problem"); - $sel->click_ok("link=Other Products", undef, "Choose full product list"); - $sel->wait_for_page_to_load(WAIT_TIME); - $title = $sel->get_title(); - } - if ($sel->is_text_present($product)) { - ok(1, "Display the list of enterable products"); - $sel->open_ok("/" . $config->{bugzilla_installation} . "/enter_bug.cgi?product=$product&format=__default__", undef, "Choose product $product"); - $sel->wait_for_page_to_load(WAIT_TIME); - } - else { - ok(1, "Only one product available in $classification. Skipping the 'Choose product' page.") - } - $sel->title_is("Enter Bug: $product", "Display form to enter bug data"); - # Always make sure all fields are visible - if ($sel->is_element_present('//input[@value="Show Advanced Fields"]')) { - $sel->click_ok('//input[@value="Show Advanced Fields"]'); - } + $title = $sel->get_title(); + } + if ($sel->is_text_present("Which product is affected by the problem")) { + ok(1, "Which product is affected by the problem"); + $sel->click_ok("link=Other Products", undef, "Choose full product list"); + $sel->wait_for_page_to_load(WAIT_TIME); + $title = $sel->get_title(); + } + if ($sel->is_text_present($product)) { + ok(1, "Display the list of enterable products"); + $sel->open_ok( + "/" + . $config->{bugzilla_installation} + . "/enter_bug.cgi?product=$product&format=__default__", + undef, + "Choose product $product" + ); + $sel->wait_for_page_to_load(WAIT_TIME); + } + else { + ok(1, + "Only one product available in $classification. Skipping the 'Choose product' page." + ); + } + $sel->title_is("Enter Bug: $product", "Display form to enter bug data"); + + # Always make sure all fields are visible + if ($sel->is_element_present('//input[@value="Show Advanced Fields"]')) { + $sel->click_ok('//input[@value="Show Advanced Fields"]'); + } } sub create_bug { - my ($sel, $bug_summary) = @_; - my $ndash = NDASH; - - $sel->click_ok('commit'); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - my $bug_id = $sel->get_value('//input[@name="id" and @type="hidden"]'); - $sel->title_like(qr/$bug_id $ndash( \(.*\))? $bug_summary/, "Bug $bug_id created with summary '$bug_summary'"); - return $bug_id; + my ($sel, $bug_summary) = @_; + my $ndash = NDASH; + + $sel->click_ok('commit'); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + my $bug_id = $sel->get_value('//input[@name="id" and @type="hidden"]'); + $sel->title_like( + qr/$bug_id $ndash( \(.*\))? $bug_summary/, + "Bug $bug_id created with summary '$bug_summary'" + ); + return $bug_id; } sub edit_bug { - my ($sel, $bug_id, $bug_summary, $options) = @_; - my $btn_id = $options ? $options->{id} : 'commit'; - $sel->click_ok($btn_id); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->is_text_present_ok("Changes submitted for bug $bug_id"); + my ($sel, $bug_id, $bug_summary, $options) = @_; + my $btn_id = $options ? $options->{id} : 'commit'; + $sel->click_ok($btn_id); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->is_text_present_ok("Changes submitted for bug $bug_id"); } sub edit_bug_and_return { - my ($sel, $bug_id, $bug_summary, $options) = @_; - my $ndash = NDASH; - edit_bug($sel, $bug_id, $bug_summary, $options); - $sel->click_ok("//a[contains(\@href, 'show_bug.cgi?id=$bug_id')]"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("$bug_id $ndash $bug_summary", "Returning back to bug $bug_id"); + my ($sel, $bug_id, $bug_summary, $options) = @_; + my $ndash = NDASH; + edit_bug($sel, $bug_id, $bug_summary, $options); + $sel->click_ok("//a[contains(\@href, 'show_bug.cgi?id=$bug_id')]"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("$bug_id $ndash $bug_summary", "Returning back to bug $bug_id"); } # Go to show_bug.cgi. sub go_to_bug { - my ($sel, $bug_id) = @_; - - $sel->type_ok("quicksearch_top", $bug_id); - $sel->submit("header-search"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - my $bug_title = $sel->get_title(); - utf8::encode($bug_title) if utf8::is_utf8($bug_title); - $sel->title_like(qr/^$bug_id /, $bug_title); + my ($sel, $bug_id) = @_; + + $sel->type_ok("quicksearch_top", $bug_id); + $sel->submit("header-search"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + my $bug_title = $sel->get_title(); + utf8::encode($bug_title) if utf8::is_utf8($bug_title); + $sel->title_like(qr/^$bug_id /, $bug_title); } # Go to admin.cgi. sub go_to_admin { - my $sel = shift; + my $sel = shift; - $sel->click_ok("link=Administration", undef, "Go to the Admin page"); - $sel->wait_for_page_to_load(WAIT_TIME); - $sel->title_like(qr/^Administer your installation/, "Display admin.cgi"); + $sel->click_ok("link=Administration", undef, "Go to the Admin page"); + $sel->wait_for_page_to_load(WAIT_TIME); + $sel->title_like(qr/^Administer your installation/, "Display admin.cgi"); } # Go to editproducts.cgi and display the given product. sub edit_product { - my ($sel, $product, $classification) = @_; - - $classification ||= "Unclassified"; - go_to_admin($sel); - $sel->click_ok("link=Products", undef, "Go to the Products page"); + my ($sel, $product, $classification) = @_; + + $classification ||= "Unclassified"; + go_to_admin($sel); + $sel->click_ok("link=Products", undef, "Go to the Products page"); + $sel->wait_for_page_to_load(WAIT_TIME); + my $title = $sel->get_title(); + if ($title eq "Select Classification") { + ok(1, + "More than one enterable classification available. Display them in a list"); + $sel->click_ok("link=$classification", undef, "Choose $classification"); $sel->wait_for_page_to_load(WAIT_TIME); - my $title = $sel->get_title(); - if ($title eq "Select Classification") { - ok(1, "More than one enterable classification available. Display them in a list"); - $sel->click_ok("link=$classification", undef, "Choose $classification"); - $sel->wait_for_page_to_load(WAIT_TIME); - } - else { - $sel->title_is("Select product", "Display the list of enterable products"); - } - $sel->click_ok("link=$product", undef, "Choose $product"); - $sel->wait_for_page_to_load(WAIT_TIME); - $sel->title_is("Edit Product '$product'", "Display properties of $product"); + } + else { + $sel->title_is("Select product", "Display the list of enterable products"); + } + $sel->click_ok("link=$product", undef, "Choose $product"); + $sel->wait_for_page_to_load(WAIT_TIME); + $sel->title_is("Edit Product '$product'", "Display properties of $product"); } sub add_product { - my ($sel, $classification) = @_; - - $classification ||= "Unclassified"; - go_to_admin($sel); - $sel->click_ok("link=Products", undef, "Go to the Products page"); - $sel->wait_for_page_to_load(WAIT_TIME); - my $title = $sel->get_title(); - if ($title eq "Select Classification") { - ok(1, "More than one enterable classification available. Display them in a list"); - $sel->click_ok("//a[contains(\@href, 'editproducts.cgi?action=add&classification=$classification')]", - undef, "Add product to $classification"); - } - else { - $sel->title_is("Select product", "Display the list of enterable products"); - $sel->click_ok("link=Add", undef, "Add a new product"); - } - $sel->wait_for_page_to_load(WAIT_TIME); - $sel->title_is("Add Product", "Display the new product form"); + my ($sel, $classification) = @_; + + $classification ||= "Unclassified"; + go_to_admin($sel); + $sel->click_ok("link=Products", undef, "Go to the Products page"); + $sel->wait_for_page_to_load(WAIT_TIME); + my $title = $sel->get_title(); + if ($title eq "Select Classification") { + ok(1, + "More than one enterable classification available. Display them in a list"); + $sel->click_ok( + "//a[contains(\@href, 'editproducts.cgi?action=add&classification=$classification')]", + undef, + "Add product to $classification" + ); + } + else { + $sel->title_is("Select product", "Display the list of enterable products"); + $sel->click_ok("link=Add", undef, "Add a new product"); + } + $sel->wait_for_page_to_load(WAIT_TIME); + $sel->title_is("Add Product", "Display the new product form"); } sub open_advanced_search_page { - my $sel = shift; - - $sel->click_ok('//*[@class="link-search"]//a'); + my $sel = shift; + + $sel->click_ok('//*[@class="link-search"]//a'); + $sel->wait_for_page_to_load(WAIT_TIME); + my $title = $sel->get_title(); + if ($title eq "Simple Search") { + ok(1, "Display the simple search form"); + $sel->click_ok("link=Advanced Search"); $sel->wait_for_page_to_load(WAIT_TIME); - my $title = $sel->get_title(); - if ($title eq "Simple Search") { - ok(1, "Display the simple search form"); - $sel->click_ok("link=Advanced Search"); - $sel->wait_for_page_to_load(WAIT_TIME); - } - $sel->title_is("Search for bugs", "Display the Advanced search form"); + } + $sel->title_is("Search for bugs", "Display the Advanced search form"); } # $params is a hashref of the form: @@ -354,74 +390,75 @@ sub open_advanced_search_page { # undef is for radio buttons (in which case the parameter must be the ID of the radio button) # value => 'foo' is the value of the parameter (either text or label) sub set_parameters { - my ($sel, $params) = @_; - - go_to_admin($sel); - $sel->click_ok("link=Parameters", undef, "Go to the Config Parameters page"); - $sel->wait_for_page_to_load(WAIT_TIME); - $sel->title_is("Configuration: General"); - my $last_section = "General"; - - foreach my $section (keys %$params) { - if ($section ne $last_section) { - $sel->click_ok("link=$section"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Configuration: $section"); - $last_section = $section; + my ($sel, $params) = @_; + + go_to_admin($sel); + $sel->click_ok("link=Parameters", undef, "Go to the Config Parameters page"); + $sel->wait_for_page_to_load(WAIT_TIME); + $sel->title_is("Configuration: General"); + my $last_section = "General"; + + foreach my $section (keys %$params) { + if ($section ne $last_section) { + $sel->click_ok("link=$section"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Configuration: $section"); + $last_section = $section; + } + my $param_list = $params->{$section}; + foreach my $param (keys %$param_list) { + my $data = $param_list->{$param}; + if (defined $data) { + my $type = $data->{type}; + my $value = $data->{value}; + + if ($type eq 'text') { + $sel->type_ok($param, $value); + } + elsif ($type eq 'select') { + $sel->select_ok($param, "label=$value"); } - my $param_list = $params->{$section}; - foreach my $param (keys %$param_list) { - my $data = $param_list->{$param}; - if (defined $data) { - my $type = $data->{type}; - my $value = $data->{value}; - - if ($type eq 'text') { - $sel->type_ok($param, $value); - } - elsif ($type eq 'select') { - $sel->select_ok($param, "label=$value"); - } - else { - ok(0, "Unknown parameter type: $type"); - } - } - else { - # If the value is undefined, then the param name is - # the ID of the radio button. - $sel->click_ok($param); - } + else { + ok(0, "Unknown parameter type: $type"); } - $sel->click_ok('//input[@type="submit" and @value="Save Changes"]', undef, "Save Changes"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Parameters Updated"); + } + else { + # If the value is undefined, then the param name is + # the ID of the radio button. + $sel->click_ok($param); + } } + $sel->click_ok('//input[@type="submit" and @value="Save Changes"]', + undef, "Save Changes"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Parameters Updated"); + } } my @ANY_KEYS = qw( t token ); sub check_page_load { - my ($sel, $wait, $expected) = @_; - my $expected_uri = URI->new($expected); - $sel->wait_for_page_to_load_ok($wait); - my $uri = URI->new($sel->get_location); - - foreach my $u ($expected_uri, $uri) { - $u->host('HOSTNAME'); - foreach my $any_key (@ANY_KEYS) { - if ($u->query_param($any_key)) { - $u->query_param($any_key => '__ANYTHING__'); - } - } + my ($sel, $wait, $expected) = @_; + my $expected_uri = URI->new($expected); + $sel->wait_for_page_to_load_ok($wait); + my $uri = URI->new($sel->get_location); + + foreach my $u ($expected_uri, $uri) { + $u->host('HOSTNAME'); + foreach my $any_key (@ANY_KEYS) { + if ($u->query_param($any_key)) { + $u->query_param($any_key => '__ANYTHING__'); + } } + } - if ($expected_uri->query_param('id')) { - if ($expected_uri->query_param('id') eq '__BUG_ID__') { - $uri->query_param('id' => '__BUG_ID__'); - } + if ($expected_uri->query_param('id')) { + if ($expected_uri->query_param('id') eq '__BUG_ID__') { + $uri->query_param('id' => '__BUG_ID__'); } - my ($pkg, $file, $line) = caller; - is($uri, $expected_uri, "checking location on $file line $line"); + } + my ($pkg, $file, $line) = caller; + is($uri, $expected_uri, "checking location on $file line $line"); } 1; diff --git a/qa/t/rest_bugzilla.t b/qa/t/rest_bugzilla.t index 01ee6af65..b4185d000 100644 --- a/qa/t/rest_bugzilla.t +++ b/qa/t/rest_bugzilla.t @@ -17,7 +17,7 @@ use lib qw(lib ../../lib ../../local/lib/perl5); use Test::More tests => 11; use QA::REST; -my $rest = get_rest_client(); +my $rest = get_rest_client(); my $config = $rest->bz_config; my $version = $rest->call('version')->{version}; @@ -26,31 +26,42 @@ ok($version, "GET /rest/version returns $version"); my $extensions = $rest->call('extensions')->{extensions}; isa_ok($extensions, 'HASH', 'GET /rest/extensions'); my @ext_names = sort keys %$extensions; + # There is always at least the QA extension enabled. -ok(scalar(@ext_names), scalar(@ext_names) . ' extension(s) found: ' . join(', ', @ext_names)); -ok($extensions->{QA}, 'The QA extension is enabled, with version ' . $extensions->{QA}->{version}); +ok(scalar(@ext_names), + scalar(@ext_names) . ' extension(s) found: ' . join(', ', @ext_names)); +ok($extensions->{QA}, + 'The QA extension is enabled, with version ' . $extensions->{QA}->{version}); my $timezone = $rest->call('timezone')->{timezone}; ok($timezone, "GET /rest/timezone retuns $timezone"); my $time = $rest->call('time'); foreach my $type (qw(db_time web_time)) { - ok($time->{$type}, "GET /rest/time returns $type = " . $time->{$type}); + ok($time->{$type}, "GET /rest/time returns $type = " . $time->{$type}); } # Logged-out users can only access the maintainer and requirelogin parameters. -my $params = $rest->call('parameters')->{parameters}; +my $params = $rest->call('parameters')->{parameters}; my @param_names = sort keys %$params; -ok(@param_names == 2 && defined $params->{maintainer} && defined $params->{requirelogin}, - 'Only 2 parameters accessible to logged-out users: ' . join(', ', @param_names)); +ok( + @param_names == 2 + && defined $params->{maintainer} + && defined $params->{requirelogin}, + 'Only 2 parameters accessible to logged-out users: ' . join(', ', @param_names) +); # Powerless users can access much more parameters. -$params = $rest->call('parameters', { api_key => $config->{unprivileged_user_api_key} })->{parameters}; +$params + = $rest->call('parameters', {api_key => $config->{unprivileged_user_api_key}}) + ->{parameters}; @param_names = sort keys %$params; -ok(@param_names > 2, scalar(@param_names) . ' parameters accessible to powerless users'); +ok(@param_names > 2, + scalar(@param_names) . ' parameters accessible to powerless users'); # Admins can access all parameters. -$params = $rest->call('parameters', { api_key => $config->{admin_user_api_key} })->{parameters}; +$params = $rest->call('parameters', {api_key => $config->{admin_user_api_key}}) + ->{parameters}; @param_names = sort keys %$params; ok(@param_names > 2, scalar(@param_names) . ' parameters accessible to admins'); diff --git a/qa/t/rest_classification.t b/qa/t/rest_classification.t index f5485de2b..e1083e98a 100644 --- a/qa/t/rest_classification.t +++ b/qa/t/rest_classification.t @@ -17,43 +17,67 @@ use lib qw(lib ../../lib ../../local/lib/perl5); use Test::More tests => 7; use QA::REST; -my $rest = get_rest_client(); +my $rest = get_rest_client(); my $config = $rest->bz_config; -my $args = { api_key => $config->{admin_user_api_key} }; +my $args = {api_key => $config->{admin_user_api_key}}; my $params = $rest->call('parameters', $args)->{parameters}; my $use_class = $params->{useclassification}; -ok(defined($use_class), 'Classifications are ' . ($use_class ? 'enabled' : 'disabled')); +ok(defined($use_class), + 'Classifications are ' . ($use_class ? 'enabled' : 'disabled')); # Admins can always access classifications, even when they are disabled. my $class = $rest->call('classification/1', $args)->{classifications}->[0]; -ok($class->{id}, "Admin found classification '" . $class->{name} . "' with the description '" . $class->{description} . "'"); -my @products = sort map { $_->{name} } @{ $class->{products} }; -ok(scalar(@products), scalar(@products) . ' product(s) found: ' . join(', ', @products)); +ok($class->{id}, + "Admin found classification '" + . $class->{name} + . "' with the description '" + . $class->{description} + . "'"); +my @products = sort map { $_->{name} } @{$class->{products}}; +ok(scalar(@products), + scalar(@products) . ' product(s) found: ' . join(', ', @products)); $class = $rest->call('classification/Class2_QA', $args)->{classifications}->[0]; -ok($class->{id}, "Admin found classification '" . $class->{name} . "' with the description '" . $class->{description} . "'"); -@products = sort map { $_->{name} } @{ $class->{products} }; -ok(scalar(@products), scalar(@products) . ' product(s) found: ' . join(', ', @products)); +ok($class->{id}, + "Admin found classification '" + . $class->{name} + . "' with the description '" + . $class->{description} + . "'"); +@products = sort map { $_->{name} } @{$class->{products}}; +ok(scalar(@products), + scalar(@products) . ' product(s) found: ' . join(', ', @products)); if ($use_class) { - # When classifications are enabled, everybody can query classifications... - # ... including logged-out users. - $class = $rest->call('classification/1')->{classifications}->[0]; - ok($class->{id}, 'Logged-out users can access classification ' . $class->{name}); - # ... and non-admins. - $class = $rest->call('classification/1', { api_key => $config->{editbugs_user_api_key} })->{classifications}->[0]; - ok($class->{id}, 'Non-admins can access classification ' . $class->{name}); + + # When classifications are enabled, everybody can query classifications... + # ... including logged-out users. + $class = $rest->call('classification/1')->{classifications}->[0]; + ok($class->{id}, + 'Logged-out users can access classification ' . $class->{name}); + + # ... and non-admins. + $class = $rest->call('classification/1', + {api_key => $config->{editbugs_user_api_key}})->{classifications}->[0]; + ok($class->{id}, 'Non-admins can access classification ' . $class->{name}); } else { - # When classifications are disabled, only users in the 'editclassifications' - # group can access this method... - # ... logged-out users get an error. - my $error = $rest->call('classification/1', undef, undef, MUST_FAIL); - ok($error->{error} && $error->{code} == 900, - 'Logged-out users cannot query classifications when disabled: ' . $error->{message}); - # ... as well as non-admins. - $error = $rest->call('classification/1', { api_key => $config->{editbugs_user_api_key} }, undef, MUST_FAIL); - ok($error->{error} && $error->{code} == 900, - 'Non-admins cannot query classifications when disabled: ' . $error->{message}); + # When classifications are disabled, only users in the 'editclassifications' + # group can access this method... + # ... logged-out users get an error. + my $error = $rest->call('classification/1', undef, undef, MUST_FAIL); + ok( + $error->{error} && $error->{code} == 900, + 'Logged-out users cannot query classifications when disabled: ' + . $error->{message} + ); + + # ... as well as non-admins. + $error + = $rest->call('classification/1', + {api_key => $config->{editbugs_user_api_key}}, + undef, MUST_FAIL); + ok($error->{error} && $error->{code} == 900, + 'Non-admins cannot query classifications when disabled: ' . $error->{message}); } diff --git a/qa/t/selenium_server_start.t b/qa/t/selenium_server_start.t index c08db293c..e70216433 100644 --- a/qa/t/selenium_server_start.t +++ b/qa/t/selenium_server_start.t @@ -9,9 +9,11 @@ use strict; use warnings; use constant DISPLAY => 99; + #use constant DISPLAY => 0; use Test::More tests => 12; + #use Test::More tests => 4; my $pid; @@ -21,63 +23,63 @@ $pid = xserver_start(); ok($pid, "X Server started with PID $pid on display " . DISPLAY); ok(open(XPID, ">testing.x.pid"), "Opening testing.x.pid"); ok((print XPID $pid), "Writing testing.x.pid"); -ok(close(XPID), "Closing testing.x.pid"); +ok(close(XPID), "Closing testing.x.pid"); # Start the VNC service second ok($pid = vnc_start(), "VNC desktop started with PID $pid"); ok(open(VNCPID, ">testing.vnc.pid"), "Opening testing.vnc.pid"); ok((print VNCPID $pid), "Writing testing.vnc.pid"); -ok(close(VNCPID), "Closing testing.vnc.pid"); +ok(close(VNCPID), "Closing testing.vnc.pid"); # Start the selenium server third ok($pid = selenium_start(), "Selenium RC server started with PID $pid"); ok(open(SPID, ">testing.selenium.pid"), "Opening testing.selenium.pid"); ok((print SPID $pid), "Writing testing.selenium.pid"); -ok(close(SPID), "Closing testing.selenium.pid"); +ok(close(SPID), "Closing testing.selenium.pid"); sleep(10); # Subroutines sub xserver_start { - my $pid; - my @x_cmd = qw(Xvfb -ac -screen 0 1600x1200x24 -fbdir /tmp); - push(@x_cmd, ":" . DISPLAY); - $pid = fork(); - if (!$pid) { - open(STDOUT, ">/dev/null"); - open(STDERR, ">/dev/null"); - exec(@x_cmd) || die "unable to execute: $!"; - } - else { - return $pid; - } - return 0; + my $pid; + my @x_cmd = qw(Xvfb -ac -screen 0 1600x1200x24 -fbdir /tmp); + push(@x_cmd, ":" . DISPLAY); + $pid = fork(); + if (!$pid) { + open(STDOUT, ">/dev/null"); + open(STDERR, ">/dev/null"); + exec(@x_cmd) || die "unable to execute: $!"; + } + else { + return $pid; + } + return 0; } sub vnc_start { - my @vnc_cmd = qw(x11vnc -viewonly -forever -nopw -quiet -display); - push(@vnc_cmd, ":" . DISPLAY); - my $pid = fork(); - if (!$pid) { - open(STDOUT, ">/dev/null"); - open(STDERR, ">/dev/null"); - exec(@vnc_cmd) || die "unabled to execute: $!"; - } - return $pid; + my @vnc_cmd = qw(x11vnc -viewonly -forever -nopw -quiet -display); + push(@vnc_cmd, ":" . DISPLAY); + my $pid = fork(); + if (!$pid) { + open(STDOUT, ">/dev/null"); + open(STDERR, ">/dev/null"); + exec(@vnc_cmd) || die "unabled to execute: $!"; + } + return $pid; } sub selenium_start { - my @selenium_cmd = qw(java -jar ../config/selenium-server-standalone.jar - -firefoxProfileTemplate ../config/firefox - -log ../config/selenium.log - -singlewindow); - unshift(@selenium_cmd, "env", "DISPLAY=:" . DISPLAY); - my $pid = fork(); - if (!$pid) { - open(STDOUT, ">/dev/null"); - open(STDERR, ">/dev/null"); - exec(@selenium_cmd) || die "unable to execute: $!"; - } - return $pid; + my @selenium_cmd = qw(java -jar ../config/selenium-server-standalone.jar + -firefoxProfileTemplate ../config/firefox + -log ../config/selenium.log + -singlewindow); + unshift(@selenium_cmd, "env", "DISPLAY=:" . DISPLAY); + my $pid = fork(); + if (!$pid) { + open(STDOUT, ">/dev/null"); + open(STDERR, ">/dev/null"); + exec(@selenium_cmd) || die "unable to execute: $!"; + } + return $pid; } diff --git a/qa/t/selenium_server_stop.t b/qa/t/selenium_server_stop.t index 62a29f38c..7633e57d7 100644 --- a/qa/t/selenium_server_stop.t +++ b/qa/t/selenium_server_stop.t @@ -29,6 +29,6 @@ ok(unlink("testing.vnc.pid"), "Removing testing.vnc.pid"); # Stop the Xvfb server third ok(open(XPID, "<testing.x.pid"), "Opening testing.x.pid"); ok(($pid = <XPID>), "Reading testing.x.pid"); -ok(close(XPID), "Closing testing.x.pid"); +ok(close(XPID), "Closing testing.x.pid"); ok(kill(9, $pid), "Killing process $pid"); ok(unlink("testing.x.pid"), "Removing testing.x.pid"); diff --git a/qa/t/test_bmo_autolinkification.t b/qa/t/test_bmo_autolinkification.t index af61f09a4..a8bce05cd 100644 --- a/qa/t/test_bmo_autolinkification.t +++ b/qa/t/test_bmo_autolinkification.t @@ -19,7 +19,7 @@ log_in($sel, $config, 'unprivileged'); file_bug_in_product($sel, 'TestProduct'); my $bug_summary = "linkification test bug"; $sel->type_ok("short_desc", $bug_summary); -$sel->type_ok("comment", "linkification test"); +$sel->type_ok("comment", "linkification test"); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/\d+ \S $bug_summary/, "Bug created"); @@ -31,7 +31,9 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/\d+ \S $bug_summary/, "crash report added"); $sel->click_ok("link=bug $bug_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->attribute_is('link=bp-63f096f7-253b-4ee2-ae3d-8bb782090824@href', 'https://crash-stats.mozilla.com/report/index/63f096f7-253b-4ee2-ae3d-8bb782090824'); +$sel->attribute_is('link=bp-63f096f7-253b-4ee2-ae3d-8bb782090824@href', + 'https://crash-stats.mozilla.com/report/index/63f096f7-253b-4ee2-ae3d-8bb782090824' +); $sel->type_ok("comment", "CVE-2010-2884"); $sel->click_ok("commit"); @@ -39,7 +41,8 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/\d+ \S $bug_summary/, "cve added"); $sel->click_ok("link=bug $bug_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->attribute_is('link=CVE-2010-2884@href', 'https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-2884'); +$sel->attribute_is('link=CVE-2010-2884@href', + 'https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-2884'); $sel->type_ok("comment", "r12345"); $sel->click_ok("commit"); @@ -47,7 +50,8 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/\d+ \S $bug_summary/, "svn revision added"); $sel->click_ok("link=bug $bug_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->attribute_is('link=r12345@href', 'https://viewvc.svn.mozilla.org/vc?view=rev&revision=12345'); +$sel->attribute_is('link=r12345@href', + 'https://viewvc.svn.mozilla.org/vc?view=rev&revision=12345'); logout($sel); diff --git a/qa/t/test_bmo_enter_new_bug.t b/qa/t/test_bmo_enter_new_bug.t index 5f015ab64..bdf01a625 100644 --- a/qa/t/test_bmo_enter_new_bug.t +++ b/qa/t/test_bmo_enter_new_bug.t @@ -23,7 +23,7 @@ use QA::Util; my ($sel, $config) = get_selenium(); log_in($sel, $config, 'admin'); -set_parameters($sel, { "Bug Fields" => {"useclassification-off" => undef} }); +set_parameters($sel, {"Bug Fields" => {"useclassification-off" => undef}}); # mktgevent and swag are dependent so we create the mktgevent bug first so # we can provide the bug id to swag @@ -90,15 +90,23 @@ _check_product('Marketing'); _check_component('Marketing', 'Trademark Permissions'); _check_group('marketing-private'); -$sel->open_ok("/$config->{bugzilla_installation}/enter_bug.cgi?product=Marketing&format=trademark"); +$sel->open_ok( + "/$config->{bugzilla_installation}/enter_bug.cgi?product=Marketing&format=trademark" +); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->title_is("Trademark Usage Requests", "Open custom bug entry form - trademark"); +$sel->title_is("Trademark Usage Requests", + "Open custom bug entry form - trademark"); $sel->type_ok("short_desc", "Bug created by Selenium", "Enter bug summary"); -$sel->type_ok("comment", "--- Bug created by Selenium ---", "Enter bug description"); +$sel->type_ok( + "comment", + "--- Bug created by Selenium ---", + "Enter bug description" +); $sel->click_ok("commit", undef, "Submit bug data to post_bug.cgi"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok('has been added to the database', 'Bug created'); -my $trademark_bug_id = $sel->get_value('//input[@name="id" and @type="hidden"]'); +my $trademark_bug_id + = $sel->get_value('//input[@name="id" and @type="hidden"]'); # itrequest @@ -173,14 +181,25 @@ _check_component('mozilla.org', 'Discussion Forums'); _check_version('mozilla.org', 'other'); _check_component('mozilla.org', 'Discussion Forums'); -$sel->open_ok("/$config->{bugzilla_installation}/enter_bug.cgi?product=mozilla.org&format=mozlist"); +$sel->open_ok( + "/$config->{bugzilla_installation}/enter_bug.cgi?product=mozilla.org&format=mozlist" +); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->title_is("Mozilla Discussion Forum", "Open custom bug entry form - mozlist"); +$sel->title_is("Mozilla Discussion Forum", + "Open custom bug entry form - mozlist"); $sel->type_ok("listName", "test-list", "Enter name for mailing list"); -$sel->type_ok("listAdmin", $config->{'admin_user_login'}, "Enter list administator"); +$sel->type_ok( + "listAdmin", + $config->{'admin_user_login'}, + "Enter list administator" +); $sel->type_ok("cc", $config->{'unprivileged_user_login'}, "Enter cc address"); $sel->check_ok("name=groups", "value=infra", "Select private group"); -$sel->type_ok("comment", "--- Bug created by Selenium ---", "Enter bug description"); +$sel->type_ok( + "comment", + "--- Bug created by Selenium ---", + "Enter bug description" +); $sel->click_ok("commit", undef, "Submit bug data to post_bug.cgi"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok('has been added to the database', 'Bug created'); @@ -214,15 +233,25 @@ _check_product('Legal'); _check_component('Legal', 'Contract Request'); _check_group('mozilla-employee-confidential'); -$sel->open_ok("/$config->{bugzilla_installation}/enter_bug.cgi?product=Legal&format=legal"); +$sel->open_ok( + "/$config->{bugzilla_installation}/enter_bug.cgi?product=Legal&format=legal"); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->title_is("Mozilla Corporation Legal Requests", "Open custom bug entry form - legal"); +$sel->title_is("Mozilla Corporation Legal Requests", + "Open custom bug entry form - legal"); $sel->select_ok("component", "value=Contract Request", "Select request type"); -$sel->select_ok("business_unit", "value=Connected Devices", "Select business unit"); +$sel->select_ok( + "business_unit", + "value=Connected Devices", + "Select business unit" +); $sel->type_ok("short_desc", "Bug created by Selenium", "Enter request summary"); $sel->type_ok("cc", $config->{'unprivileged_user_login'}, "Enter cc address"); $sel->type_ok("important_dates", "Important dates", "Enter important dates"); -$sel->type_ok("comment", "--- Bug created by Selenium ---", "Enter request description"); +$sel->type_ok( + "comment", + "--- Bug created by Selenium ---", + "Enter request description" +); $sel->click_ok("commit", undef, "Submit bug data to post_bug.cgi"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok('has been added to the database', 'Bug created'); @@ -234,189 +263,210 @@ _check_product('Websites', 'other'); _check_component('Websites', 'www.mozilla.org'); _check_user('liz@mozilla.com'); -$sel->open_ok("/$config->{bugzilla_installation}/enter_bug.cgi?product=Websites&format=poweredby"); +$sel->open_ok( + "/$config->{bugzilla_installation}/enter_bug.cgi?product=Websites&format=poweredby" +); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->title_is("Powered by Mozilla Logo Requests", "Open custom bug entry form - poweredby"); +$sel->title_is("Powered by Mozilla Logo Requests", + "Open custom bug entry form - poweredby"); $sel->type_ok("short_desc", "Bug created by Selenium", "Enter bug summary"); -$sel->type_ok("comment", "--- Bug created by Selenium ---", "Enter bug description"); +$sel->type_ok( + "comment", + "--- Bug created by Selenium ---", + "Enter bug description" +); $sel->click_ok("commit", undef, "Submit bug data to post_bug.cgi"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok('has been added to the database', 'Bug created'); -my $poweredby_bug_id = $sel->get_value('//input[@name="id" and @type="hidden"]'); +my $poweredby_bug_id + = $sel->get_value('//input[@name="id" and @type="hidden"]'); -set_parameters($sel, { "Bug Fields" => {"useclassification-on" => undef} }); +set_parameters($sel, {"Bug Fields" => {"useclassification-on" => undef}}); logout($sel); sub _check_product { - my ($product, $version) = @_; - - go_to_admin($sel); - $sel->click_ok("link=Products"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Select product"); - - my $product_description = "$product Description"; - - my $text = trim($sel->get_text("bugzilla-body")); - if ($text =~ /$product_description/) { - # Product exists already - return 1; - } - - $sel->click_ok("link=Add"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Add Product"); - $sel->type_ok("product", $product); - $sel->type_ok("description", $product_description); - $sel->type_ok("version", $version) if $version; - $sel->select_ok("security_group_id", "label=core-security"); - $sel->select_ok("default_op_sys_id", "Unspecified"); - $sel->select_ok("default_platform_id", "Unspecified"); - $sel->click_ok('//input[@type="submit" and @value="Add"]'); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $text = trim($sel->get_text("message")); - ok($text =~ /You will need to add at least one component before anyone can enter bugs against this product/, - "Display a reminder about missing components"); + my ($product, $version) = @_; + go_to_admin($sel); + $sel->click_ok("link=Products"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Select product"); + + my $product_description = "$product Description"; + + my $text = trim($sel->get_text("bugzilla-body")); + if ($text =~ /$product_description/) { + + # Product exists already return 1; + } + + $sel->click_ok("link=Add"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Add Product"); + $sel->type_ok("product", $product); + $sel->type_ok("description", $product_description); + $sel->type_ok("version", $version) if $version; + $sel->select_ok("security_group_id", "label=core-security"); + $sel->select_ok("default_op_sys_id", "Unspecified"); + $sel->select_ok("default_platform_id", "Unspecified"); + $sel->click_ok('//input[@type="submit" and @value="Add"]'); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $text = trim($sel->get_text("message")); + ok( + $text + =~ /You will need to add at least one component before anyone can enter bugs against this product/, + "Display a reminder about missing components" + ); + + return 1; } sub _check_component { - my ($product, $component) = @_; - - go_to_admin($sel); - $sel->click_ok("link=components"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Edit components for which product?"); - - $sel->click_ok("//*[\@id='bugzilla-body']//a[normalize-space(text())='$product']"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Select component of product '$product'"); - - my $component_description = "$component Description"; - - my $text = trim($sel->get_text("bugzilla-body")); - if ($text =~ /$component_description/) { - # Component exists already - return 1; - } - - # Add the watch user for component watching - my $watch_user = lc $component . "@" . lc $product . ".bugs"; - $watch_user =~ s/ & /-/; - $watch_user =~ s/\s+/\-/g; - $watch_user =~ s/://g; - - go_to_admin($sel); - $sel->click_ok("link=components"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Edit components for which product?"); - $sel->click_ok("//*[\@id='bugzilla-body']//a[normalize-space(text())='$product']"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Select component of product '$product'"); - $sel->click_ok("link=Add"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Add component to the $product product"); - $sel->type_ok("component", $component); - $sel->type_ok("description", $component_description); - $sel->type_ok("initialowner", $config->{'admin_user_login'}); - $sel->uncheck_ok("watch_user_auto"); - $sel->type_ok("watch_user", $watch_user); - $sel->check_ok("watch_user_auto"); - $sel->click_ok('//input[@type="submit" and @value="Add"]'); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Component Created"); - $text = trim($sel->get_text("message")); - ok($text eq "The component $component has been created.", "Component successfully created"); + my ($product, $component) = @_; + + go_to_admin($sel); + $sel->click_ok("link=components"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Edit components for which product?"); + $sel->click_ok( + "//*[\@id='bugzilla-body']//a[normalize-space(text())='$product']"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Select component of product '$product'"); + + my $component_description = "$component Description"; + + my $text = trim($sel->get_text("bugzilla-body")); + if ($text =~ /$component_description/) { + + # Component exists already return 1; + } + + # Add the watch user for component watching + my $watch_user = lc $component . "@" . lc $product . ".bugs"; + $watch_user =~ s/ & /-/; + $watch_user =~ s/\s+/\-/g; + $watch_user =~ s/://g; + + go_to_admin($sel); + $sel->click_ok("link=components"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Edit components for which product?"); + $sel->click_ok( + "//*[\@id='bugzilla-body']//a[normalize-space(text())='$product']"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Select component of product '$product'"); + $sel->click_ok("link=Add"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Add component to the $product product"); + $sel->type_ok("component", $component); + $sel->type_ok("description", $component_description); + $sel->type_ok("initialowner", $config->{'admin_user_login'}); + $sel->uncheck_ok("watch_user_auto"); + $sel->type_ok("watch_user", $watch_user); + $sel->check_ok("watch_user_auto"); + $sel->click_ok('//input[@type="submit" and @value="Add"]'); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Component Created"); + $text = trim($sel->get_text("message")); + ok($text eq "The component $component has been created.", + "Component successfully created"); + + return 1; } sub _check_group { - my ($group) = @_; - - go_to_admin($sel); - $sel->click_ok("link=Groups"); - $sel->wait_for_page_to_load(WAIT_TIME); - $sel->title_is("Edit Groups"); - - my $group_description = "$group Description"; - - my $text = trim($sel->get_text("bugzilla-body")); - if ($text =~ /$group_description/) { - # Group exists already - return 1; - } - - $sel->title_is("Edit Groups"); - $sel->click_ok("link=Add Group"); - $sel->wait_for_page_to_load(WAIT_TIME); - $sel->title_is("Add group"); - $sel->type_ok("name", $group); - $sel->type_ok("desc", $group_description); - $sel->type_ok("owner", $config->{'admin_user_login'}); - $sel->check_ok("isactive"); - $sel->check_ok("insertnew"); - $sel->click_ok("create"); - $sel->wait_for_page_to_load(WAIT_TIME); - $sel->title_is("New Group Created"); - my $group_id = $sel->get_value("group_id"); + my ($group) = @_; + + go_to_admin($sel); + $sel->click_ok("link=Groups"); + $sel->wait_for_page_to_load(WAIT_TIME); + $sel->title_is("Edit Groups"); + my $group_description = "$group Description"; + + my $text = trim($sel->get_text("bugzilla-body")); + if ($text =~ /$group_description/) { + + # Group exists already return 1; + } + + $sel->title_is("Edit Groups"); + $sel->click_ok("link=Add Group"); + $sel->wait_for_page_to_load(WAIT_TIME); + $sel->title_is("Add group"); + $sel->type_ok("name", $group); + $sel->type_ok("desc", $group_description); + $sel->type_ok("owner", $config->{'admin_user_login'}); + $sel->check_ok("isactive"); + $sel->check_ok("insertnew"); + $sel->click_ok("create"); + $sel->wait_for_page_to_load(WAIT_TIME); + $sel->title_is("New Group Created"); + my $group_id = $sel->get_value("group_id"); + + return 1; } sub _check_version { - my ($product, $version) = @_; - - go_to_admin($sel); - $sel->click_ok("link=versions"); - $sel->wait_for_page_to_load(WAIT_TIME); - $sel->title_is("Edit versions for which product?"); - $sel->click_ok("//*[\@id='bugzilla-body']//a[normalize-space(text())='$product']"); - $sel->wait_for_page_to_load(WAIT_TIME); - - my $text = trim($sel->get_text("bugzilla-body")); - if ($text =~ /$version/) { - # Version exists already - return 1; - } - - $sel->click_ok("link=Add"); - $sel->wait_for_page_to_load(WAIT_TIME); - $sel->title_like(qr/^Add Version to Product/); - $sel->type_ok("version", $version); - $sel->click_ok("create"); - $sel->wait_for_page_to_load(WAIT_TIME); - $sel->title_is("Version Created"); + my ($product, $version) = @_; + + go_to_admin($sel); + $sel->click_ok("link=versions"); + $sel->wait_for_page_to_load(WAIT_TIME); + $sel->title_is("Edit versions for which product?"); + $sel->click_ok( + "//*[\@id='bugzilla-body']//a[normalize-space(text())='$product']"); + $sel->wait_for_page_to_load(WAIT_TIME); + + my $text = trim($sel->get_text("bugzilla-body")); + if ($text =~ /$version/) { + # Version exists already return 1; + } + + $sel->click_ok("link=Add"); + $sel->wait_for_page_to_load(WAIT_TIME); + $sel->title_like(qr/^Add Version to Product/); + $sel->type_ok("version", $version); + $sel->click_ok("create"); + $sel->wait_for_page_to_load(WAIT_TIME); + $sel->title_is("Version Created"); + + return 1; } sub _check_user { - my ($user) = @_; - - go_to_admin($sel); - $sel->click_ok("link=Users"); - $sel->wait_for_page_to_load(WAIT_TIME); - $sel->title_is("Search users"); - $sel->type_ok("matchstr", $user); - $sel->click_ok("search"); - $sel->wait_for_page_to_load(WAIT_TIME); - - my $text = trim($sel->get_text("bugzilla-body")); - if ($text =~ /$user/) { - # User exists already - return 1; - } - - $sel->click_ok("link=add a new user"); - $sel->wait_for_page_to_load(WAIT_TIME); - $sel->title_is('Add user'); - $sel->type_ok('login', $user); - $sel->type_ok('password', 'icohF1io2ohw'); - $sel->click_ok("add"); - $sel->wait_for_page_to_load(WAIT_TIME); - $sel->is_text_present('regexp:The user account .* has been created successfully'); + my ($user) = @_; + + go_to_admin($sel); + $sel->click_ok("link=Users"); + $sel->wait_for_page_to_load(WAIT_TIME); + $sel->title_is("Search users"); + $sel->type_ok("matchstr", $user); + $sel->click_ok("search"); + $sel->wait_for_page_to_load(WAIT_TIME); + + my $text = trim($sel->get_text("bugzilla-body")); + if ($text =~ /$user/) { + # User exists already return 1; + } + + $sel->click_ok("link=add a new user"); + $sel->wait_for_page_to_load(WAIT_TIME); + $sel->title_is('Add user'); + $sel->type_ok('login', $user); + $sel->type_ok('password', 'icohF1io2ohw'); + $sel->click_ok("add"); + $sel->wait_for_page_to_load(WAIT_TIME); + $sel->is_text_present( + 'regexp:The user account .* has been created successfully'); + + return 1; } diff --git a/qa/t/test_bmo_retire_values.t b/qa/t/test_bmo_retire_values.t index 3a74e8966..a0bfff483 100644 --- a/qa/t/test_bmo_retire_values.t +++ b/qa/t/test_bmo_retire_values.t @@ -19,21 +19,26 @@ my ($text, $bug_id); my $admin_user_login = $config->{admin_user_login}; log_in($sel, $config, 'admin'); -set_parameters($sel, { "Bug Fields" => {"useclassification-off" => undef, - "usetargetmilestone-on" => undef}, - "Administrative Policies" => {"allowbugdeletion-on" => undef}, - }); +set_parameters( + $sel, + { + "Bug Fields" => + {"useclassification-off" => undef, "usetargetmilestone-on" => undef}, + "Administrative Policies" => {"allowbugdeletion-on" => undef}, + } +); # create a clean bug file_bug_in_product($sel, "TestProduct"); $sel->select_ok("component", "label=TestComponent"); $sel->type_ok("short_desc", "testing testComponent"); -$sel->type_ok("comment", "testing"); +$sel->type_ok("comment", "testing"); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); my $clean_bug_id = $sel->get_value("//input[\@name='id' and \@type='hidden']"); -$sel->is_text_present_ok('has been added to the database', "Bug $clean_bug_id created"); +$sel->is_text_present_ok('has been added to the database', + "Bug $clean_bug_id created"); # # component @@ -51,19 +56,22 @@ $sel->click_ok("link=Edit components:"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Select component of product 'TestProduct'"); $text = trim($sel->get_text("bugzilla-body")); + if ($text =~ /TempComponent/) { - $sel->click_ok("//a[contains(\@href, 'editcomponents.cgi?action=del&product=TestProduct&component=TempComponent')]"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Delete component 'TempComponent' from 'TestProduct' product"); - $sel->click_ok("delete"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Component Deleted"); + $sel->click_ok( + "//a[contains(\@href, 'editcomponents.cgi?action=del&product=TestProduct&component=TempComponent')]" + ); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Delete component 'TempComponent' from 'TestProduct' product"); + $sel->click_ok("delete"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Component Deleted"); } $sel->click_ok("link=Add"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Add component to the TestProduct product"); -$sel->type_ok("component", "TempComponent"); -$sel->type_ok("description", "Temp component"); +$sel->type_ok("component", "TempComponent"); +$sel->type_ok("description", "Temp component"); $sel->type_ok("initialowner", $admin_user_login); $sel->uncheck_ok("watch_user_auto"); $sel->type_ok("watch_user", 'tempcomponent@testproduct.bugs'); @@ -77,11 +85,12 @@ $sel->title_is("Component Created"); file_bug_in_product($sel, "TestProduct"); $sel->select_ok("component", "label=TempComponent"); $sel->type_ok("short_desc", "testing tempComponent"); -$sel->type_ok("comment", "testing"); +$sel->type_ok("comment", "testing"); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $bug_id = $sel->get_value("//input[\@name='id' and \@type='hidden']"); -$sel->is_text_present_ok('has been added to the database', "Bug $bug_id created"); +$sel->is_text_present_ok('has been added to the database', + "Bug $bug_id created"); # disable TestProduct:TestComponent for bug entry @@ -108,30 +117,37 @@ ok($text =~ /Disabled for bugs/, "Component deactivation confirmed"); # update bug TempComponent bug go_to_bug($sel, $bug_id); + # make sure the component is still tempcomponent $sel->selected_label_is("component", 'TempComponent'); + # update $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok("Changes submitted for bug $bug_id"); $sel->click_ok("link=bug $bug_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); + # make sure the component is still tempcomponent ok($sel->get_selected_labels("component"), 'TempComponent'); # try creating new bug with TempComponent file_bug_in_product($sel, "TestProduct"); -ok(!$sel->is_element_present( +ok( + !$sel->is_element_present( q#//select[@id='component']/option[@value='TempComponent']#), - 'TempComponent is missing from create'); + 'TempComponent is missing from create' +); # try changing compoent of existing bug to TempComponent go_to_bug($sel, $clean_bug_id); -ok(!$sel->is_element_present( +ok( + !$sel->is_element_present( q#//select[@id='component']/option[@value='TempComponent']#), - 'TempComponent is missing from update'); + 'TempComponent is missing from update' +); # delete TempComponent @@ -144,7 +160,9 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Edit Product 'TestProduct'"); $sel->click_ok("link=Edit components:"); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->click_ok("//a[contains(\@href, 'editcomponents.cgi?action=del&product=TestProduct&component=TempComponent')]"); +$sel->click_ok( + "//a[contains(\@href, 'editcomponents.cgi?action=del&product=TestProduct&component=TempComponent')]" +); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Delete component 'TempComponent' from 'TestProduct' product"); $sel->click_ok("delete"); @@ -168,13 +186,16 @@ $sel->click_ok("link=Edit versions:"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Select version of product 'TestProduct'"); $text = trim($sel->get_text("bugzilla-body")); + if ($text =~ /TempVersion/) { - $sel->click_ok("//a[contains(\@href, 'editversions.cgi?action=del&product=TestProduct&version=TempVersion')]"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Delete Version of Product 'TestProduct'"); - $sel->click_ok("delete"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Version Deleted"); + $sel->click_ok( + "//a[contains(\@href, 'editversions.cgi?action=del&product=TestProduct&version=TempVersion')]" + ); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Delete Version of Product 'TestProduct'"); + $sel->click_ok("delete"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Version Deleted"); } $sel->click_ok("link=Add"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -189,11 +210,12 @@ $sel->title_is("Version Created"); file_bug_in_product($sel, "TestProduct"); $sel->select_ok("version", "label=TempVersion"); $sel->type_ok("short_desc", "testing tempVersion"); -$sel->type_ok("comment", "testing"); +$sel->type_ok("comment", "testing"); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $bug_id = $sel->get_value("//input[\@name='id' and \@type='hidden']"); -$sel->is_text_present_ok('has been added to the database', "Bug $bug_id created"); +$sel->is_text_present_ok('has been added to the database', + "Bug $bug_id created"); # disable new version for bug entry @@ -220,16 +242,20 @@ ok($text =~ /Disabled for bugs/, "Version deactivation confirmed"); # update new version bug go_to_bug($sel, $bug_id); + # make sure the version is still tempversion $sel->selected_label_is("version", 'TempVersion'); + # update $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok("Changes submitted for bug $bug_id"); $sel->click_ok("link=bug $bug_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); + # make sure the version is still tempversion $sel->selected_label_is("version", 'TempVersion'); + # change the version so it can be deleted $sel->select_ok("version", "label=unspecified"); $sel->click_ok("commit"); @@ -239,16 +265,20 @@ $sel->is_text_present_ok("Changes submitted for bug $bug_id"); # try creating new bug with new version file_bug_in_product($sel, "TestProduct"); -ok(!$sel->is_element_present( +ok( + !$sel->is_element_present( q#//select[@id='version']/option[@value='TempVersion']#), - 'TempVersion is missing from create'); + 'TempVersion is missing from create' +); # try changing existing bug to new version go_to_bug($sel, $clean_bug_id); -ok(!$sel->is_element_present( +ok( + !$sel->is_element_present( q#//select[@id='version']/option[@value='TempVersion']#), - 'TempVersion is missing from update'); + 'TempVersion is missing from update' +); # delete new version @@ -263,7 +293,9 @@ $sel->click_ok("link=Edit versions:"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Select version of product 'TestProduct'"); $text = trim($sel->get_text("bugzilla-body")); -$sel->click_ok("//a[contains(\@href, 'editversions.cgi?action=del&product=TestProduct&version=TempVersion')]"); +$sel->click_ok( + "//a[contains(\@href, 'editversions.cgi?action=del&product=TestProduct&version=TempVersion')]" +); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Delete Version of Product 'TestProduct'"); $sel->click_ok("delete"); @@ -287,19 +319,22 @@ $sel->click_ok("link=Edit milestones:"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Select milestone of product 'TestProduct'"); $text = trim($sel->get_text("bugzilla-body")); + if ($text =~ /TempMilestone/) { - $sel->click_ok("//a[contains(\@href, 'editmilestones.cgi?action=del&product=TestProduct&milestone=TempMilestone')]"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Delete Milestone of Product 'TestProduct'"); - $sel->click_ok("delete"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Milestone Deleted"); + $sel->click_ok( + "//a[contains(\@href, 'editmilestones.cgi?action=del&product=TestProduct&milestone=TempMilestone')]" + ); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Delete Milestone of Product 'TestProduct'"); + $sel->click_ok("delete"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Milestone Deleted"); } $sel->click_ok("link=Add"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Add Milestone to Product 'TestProduct'"); $sel->type_ok("milestone", "TempMilestone"); -$sel->type_ok("sortkey", "999"); +$sel->type_ok("sortkey", "999"); $sel->click_ok("create"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Milestone Created"); @@ -309,11 +344,12 @@ $sel->title_is("Milestone Created"); file_bug_in_product($sel, "TestProduct"); $sel->select_ok("target_milestone", "label=TempMilestone"); $sel->type_ok("short_desc", "testing tempMilestone"); -$sel->type_ok("comment", "testing"); +$sel->type_ok("comment", "testing"); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $bug_id = $sel->get_value("//input[\@name='id' and \@type='hidden']"); -$sel->is_text_present_ok('has been added to the database', "Bug $bug_id created"); +$sel->is_text_present_ok('has been added to the database', + "Bug $bug_id created"); # disable milestone for bug entry @@ -340,30 +376,37 @@ ok($text =~ /Disabled for bugs/, "Milestone deactivation confirmed"); # update milestone bug go_to_bug($sel, $bug_id); + # make sure the milestone is still tempmilestone $sel->selected_label_is("target_milestone", 'TempMilestone'); + # update $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok("Changes submitted for bug $bug_id"); $sel->click_ok("link=bug $bug_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); + # make sure the milestone is still tempmilestone $sel->selected_label_is("target_milestone", 'TempMilestone'); # try creating new bug with milestone file_bug_in_product($sel, "TestProduct"); -ok(!$sel->is_element_present( +ok( + !$sel->is_element_present( q#//select[@id='target_milestone']/option[@value='TempMilestone']#), - 'TempMilestone is missing from create'); + 'TempMilestone is missing from create' +); # try changing existing bug to milestone go_to_bug($sel, $clean_bug_id); -ok(!$sel->is_element_present( +ok( + !$sel->is_element_present( q#//select[@id='target_milestone']/option[@value='TempMilestone']#), - 'TempMilestone is missing from update'); + 'TempMilestone is missing from update' +); # delete milestone @@ -378,7 +421,9 @@ $sel->click_ok("link=Edit milestones:"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Select milestone of product 'TestProduct'"); $text = trim($sel->get_text("bugzilla-body")); -$sel->click_ok("//a[contains(\@href, 'editmilestones.cgi?action=del&product=TestProduct&milestone=TempMilestone')]"); +$sel->click_ok( + "//a[contains(\@href, 'editmilestones.cgi?action=del&product=TestProduct&milestone=TempMilestone')]" +); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Delete Milestone of Product 'TestProduct'"); $sel->click_ok("delete"); diff --git a/qa/t/test_bug_edit.t b/qa/t/test_bug_edit.t index 01037aa1e..b1d800f67 100644 --- a/qa/t/test_bug_edit.t +++ b/qa/t/test_bug_edit.t @@ -16,17 +16,17 @@ use QA::Util; my ($sel, $config) = get_selenium(); log_in($sel, $config, 'admin'); -set_parameters($sel, { "Bug Fields" => {"usestatuswhiteboard-on" => undef} }); +set_parameters($sel, {"Bug Fields" => {"usestatuswhiteboard-on" => undef}}); # Clear the saved search, in case this test didn't complete previously. if ($sel->is_text_present("My bugs from QA_Selenium")) { - $sel->click_ok("link=My bugs from QA_Selenium"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Bug List: My bugs from QA_Selenium"); - $sel->click_ok("link=Forget Search 'My bugs from QA_Selenium'"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Search is gone"); - $sel->is_text_present_ok("OK, the My bugs from QA_Selenium search is gone"); + $sel->click_ok("link=My bugs from QA_Selenium"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Bug List: My bugs from QA_Selenium"); + $sel->click_ok("link=Forget Search 'My bugs from QA_Selenium'"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Search is gone"); + $sel->is_text_present_ok("OK, the My bugs from QA_Selenium search is gone"); } # Just in case the test failed before completion previously, reset the CANEDIT bit. @@ -35,7 +35,8 @@ $sel->click_ok("link=Groups"); check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/editgroups.cgi}); $sel->title_is("Edit Groups"); $sel->click_ok("link=Master"); -check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/editgroups.cgi?action=changeform&group=26}); +check_page_load($sel, WAIT_TIME, + q{http://HOSTNAME:8000/bmo/editgroups.cgi?action=changeform&group=26}); $sel->title_is("Change Group: Master"); my $group_url = $sel->get_location(); $group_url =~ /group=(\d+)$/; @@ -50,30 +51,34 @@ log_in($sel, $config, 'QA_Selenium_TEST'); file_bug_in_product($sel, 'TestProduct'); $sel->select_ok("bug_severity", "label=critical"); $sel->type_ok("short_desc", "Test bug editing"); -$sel->type_ok("comment", "ploc"); +$sel->type_ok("comment", "ploc"); $sel->click_ok("commit"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=__BUG_ID__}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=__BUG_ID__}); my $bug1_id = $sel->get_value('//input[@name="id" and @type="hidden"]'); -$sel->is_text_present_ok('has been added to the database', "Bug $bug1_id created"); +$sel->is_text_present_ok('has been added to the database', + "Bug $bug1_id created"); # Now edit field values of the bug you just filed. $sel->select_ok("rep_platform", "label=Other"); -$sel->select_ok("op_sys", "label=Other"); -$sel->select_ok("priority", "label=Highest"); +$sel->select_ok("op_sys", "label=Other"); +$sel->select_ok("priority", "label=Highest"); $sel->select_ok("bug_severity", "label=blocker"); -$sel->type_ok("bug_file_loc", "foo.cgi?action=bar"); +$sel->type_ok("bug_file_loc", "foo.cgi?action=bar"); $sel->type_ok("status_whiteboard", "[Selenium was here]"); -$sel->type_ok("comment", "new comment from me :)"); +$sel->type_ok("comment", "new comment from me :)"); $sel->select_ok("bug_status", "label=RESOLVED"); $sel->click_ok("commit"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); # Now move the bug into another product, which has a mandatory group. $sel->click_ok("link=bug $bug1_id"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); $sel->title_like(qr/^$bug1_id /); $sel->select_ok("product", "label=QA-Selenium-TEST"); $sel->type_ok("comment", "moving to QA-Selenium-TEST"); @@ -81,34 +86,49 @@ $sel->click_ok("commit"); check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/process_bug.cgi}); $sel->title_is("Verify New Product Details..."); $sel->select_ok("component", "label=QA-Selenium-TEST"); -$sel->is_element_present_ok('//input[@type="checkbox" and @name="groups" and @value="QA-Selenium-TEST"]'); -ok(!$sel->is_editable('//input[@type="checkbox" and @name="groups" and @value="QA-Selenium-TEST"]'), "QA-Selenium-TEST group not editable"); -$sel->is_checked_ok('//input[@type="checkbox" and @name="groups" and @value="QA-Selenium-TEST"]', "QA-Selenium-TEST group is selected"); +$sel->is_element_present_ok( + '//input[@type="checkbox" and @name="groups" and @value="QA-Selenium-TEST"]'); +ok( + !$sel->is_editable( + '//input[@type="checkbox" and @name="groups" and @value="QA-Selenium-TEST"]'), + "QA-Selenium-TEST group not editable" +); +$sel->is_checked_ok( + '//input[@type="checkbox" and @name="groups" and @value="QA-Selenium-TEST"]', + "QA-Selenium-TEST group is selected"); $sel->click_ok("change_product"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); $sel->click_ok("link=bug $bug1_id"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); $sel->title_like(qr/^$bug1_id /); $sel->select_ok("bug_severity", "label=normal"); -$sel->select_ok("priority", "label=High"); +$sel->select_ok("priority", "label=High"); $sel->select_ok("rep_platform", "label=All"); -$sel->select_ok("op_sys", "label=All"); +$sel->select_ok("op_sys", "label=All"); $sel->click_ok("cc_edit_area_showhide"); -$sel->type_ok("newcc", $config->{admin_user_login}); +$sel->type_ok("newcc", $config->{admin_user_login}); $sel->type_ok("comment", "Unchecking the reporter_accessible checkbox"); + # This checkbox is checked by default. $sel->click_ok("reporter_accessible"); $sel->select_ok("bug_status", "label=VERIFIED"); $sel->click_ok("commit"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); $sel->click_ok("link=bug $bug1_id"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); $sel->title_like(qr/^$bug1_id /); -$sel->type_ok("comment", "I am the reporter, but I can see the bug anyway as I belong to the mandatory group"); +$sel->type_ok("comment", + "I am the reporter, but I can see the bug anyway as I belong to the mandatory group" +); $sel->click_ok("commit"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); logout($sel); @@ -118,23 +138,26 @@ logout($sel); log_in($sel, $config, 'admin'); go_to_bug($sel, $bug1_id); $sel->select_ok("bug_severity", "label=blocker"); -$sel->select_ok("priority", "label=Highest"); +$sel->select_ok("priority", "label=Highest"); $sel->type_ok("status_whiteboard", "[Selenium was here][admin too]"); $sel->select_ok("bug_status", "label=CONFIRMED"); $sel->click_ok("bz_assignee_edit_action"); $sel->type_ok("assigned_to", $config->{admin_user_login}); -$sel->type_ok("comment", "I have editbugs privs. Taking!"); +$sel->type_ok("comment", "I have editbugs privs. Taking!"); $sel->click_ok("commit"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); $sel->click_ok("link=bug $bug1_id"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); $sel->title_like(qr/^$bug1_id /); $sel->click_ok("cc_edit_area_showhide"); $sel->type_ok("newcc", $config->{unprivileged_user_login}); $sel->click_ok("commit"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); logout($sel); @@ -151,9 +174,12 @@ logout($sel); log_in($sel, $config, 'admin'); go_to_bug($sel, $bug1_id); $sel->click_ok("cclist_accessible"); -$sel->type_ok("comment", "I am allowed to turn off cclist_accessible despite not being in the mandatory group"); +$sel->type_ok("comment", + "I am allowed to turn off cclist_accessible despite not being in the mandatory group" +); $sel->click_ok("commit"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); logout($sel); @@ -162,7 +188,8 @@ logout($sel); log_in($sel, $config, 'unprivileged'); $sel->type_ok("quicksearch_top", $bug1_id); $sel->submit("header-search"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); $sel->title_is("Access Denied"); $sel->is_text_present_ok("You are not authorized to access bug $bug1_id"); logout($sel); @@ -172,6 +199,7 @@ logout($sel); log_in($sel, $config, 'admin'); go_to_bug($sel, $bug1_id); $sel->select_ok("product", "label=TestProduct"); + # When selecting a new product, Bugzilla tries to reassign the bug by default, # so we have to uncheck it. $sel->click_ok("set_default_assignee"); @@ -181,23 +209,46 @@ $sel->click_ok("commit"); check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/process_bug.cgi}); $sel->title_is("Verify New Product Details..."); $sel->select_ok("component", "label=TestComponent"); -$sel->is_text_present_ok("These groups are not legal for the 'TestProduct' product or you are not allowed to restrict bugs to these groups"); -$sel->is_element_present_ok('//input[@type="checkbox" and @name="groups" and @value="QA-Selenium-TEST"]'); -ok(!$sel->is_editable('//input[@type="checkbox" and @name="groups" and @value="QA-Selenium-TEST"]'), "QA-Selenium-TEST group not editable"); -ok(!$sel->is_checked('//input[@type="checkbox" and @name="groups" and @value="QA-Selenium-TEST"]'), "QA-Selenium-TEST group not selected"); -$sel->is_element_present_ok('//input[@type="checkbox" and @name="groups" and @value="Master"]'); -$sel->is_editable_ok('//input[@type="checkbox" and @name="groups" and @value="Master"]', "Master group is editable"); -ok(!$sel->is_checked('//input[@type="checkbox" and @name="groups" and @value="Master"]'), "Master group not selected by default"); +$sel->is_text_present_ok( + "These groups are not legal for the 'TestProduct' product or you are not allowed to restrict bugs to these groups" +); +$sel->is_element_present_ok( + '//input[@type="checkbox" and @name="groups" and @value="QA-Selenium-TEST"]'); +ok( + !$sel->is_editable( + '//input[@type="checkbox" and @name="groups" and @value="QA-Selenium-TEST"]'), + "QA-Selenium-TEST group not editable" +); +ok( + !$sel->is_checked( + '//input[@type="checkbox" and @name="groups" and @value="QA-Selenium-TEST"]'), + "QA-Selenium-TEST group not selected" +); +$sel->is_element_present_ok( + '//input[@type="checkbox" and @name="groups" and @value="Master"]'); +$sel->is_editable_ok( + '//input[@type="checkbox" and @name="groups" and @value="Master"]', + "Master group is editable"); +ok( + !$sel->is_checked( + '//input[@type="checkbox" and @name="groups" and @value="Master"]'), + "Master group not selected by default" +); $sel->click_ok("change_product"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); $sel->click_ok("link=bug $bug1_id"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); $sel->title_like(qr/^$bug1_id /); $sel->click_ok("cclist_accessible"); -$sel->type_ok("comment", "I am allowed to turn off cclist_accessible despite not being in the mandatory group"); +$sel->type_ok("comment", + "I am allowed to turn off cclist_accessible despite not being in the mandatory group" +); $sel->click_ok("commit"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); logout($sel); @@ -206,17 +257,24 @@ logout($sel); log_in($sel, $config, 'unprivileged'); go_to_bug($sel, $bug1_id); -$sel->type_ok("comment", "I have no privs, I can only comment (and remove people from the CC list)"); -ok(!$sel->is_element_present('//select[@name="product"]'), "Product field not editable"); -ok(!$sel->is_element_present('//select[@name="bug_severity"]'), "Severity field not editable"); -ok(!$sel->is_element_present('//select[@name="priority"]'), "Priority field not editable"); -ok(!$sel->is_element_present('//select[@name="op_sys"]'), "OS field not editable"); -ok(!$sel->is_element_present('//select[@name="rep_platform"]'), "Hardware field not editable"); +$sel->type_ok("comment", + "I have no privs, I can only comment (and remove people from the CC list)"); +ok(!$sel->is_element_present('//select[@name="product"]'), + "Product field not editable"); +ok(!$sel->is_element_present('//select[@name="bug_severity"]'), + "Severity field not editable"); +ok(!$sel->is_element_present('//select[@name="priority"]'), + "Priority field not editable"); +ok(!$sel->is_element_present('//select[@name="op_sys"]'), + "OS field not editable"); +ok(!$sel->is_element_present('//select[@name="rep_platform"]'), + "Hardware field not editable"); $sel->click_ok("cc_edit_area_showhide"); $sel->add_selection_ok("cc", "label=" . $config->{admin_user_login}); $sel->click_ok("removecc"); $sel->click_ok("commit"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); logout($sel); @@ -225,7 +283,9 @@ logout($sel); log_in($sel, $config, 'admin'); edit_product($sel, "TestProduct"); $sel->click_ok("link=Edit Group Access Controls:"); -check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/editproducts.cgi?action=editgroupcontrols&product=TestProduct}); +check_page_load($sel, WAIT_TIME, + q{http://HOSTNAME:8000/bmo/editproducts.cgi?action=editgroupcontrols&product=TestProduct} +); $sel->title_is("Edit Group Controls for TestProduct"); $sel->check_ok("canedit_$master_gid"); $sel->click_ok("submit"); @@ -237,7 +297,8 @@ $sel->title_is("Update group access controls for TestProduct"); go_to_bug($sel, $bug1_id); $sel->type_ok("comment", "Do nothing except adding a comment..."); $sel->click_ok("commit"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); logout($sel); @@ -249,7 +310,8 @@ $sel->type_ok("comment", "Just a comment too..."); $sel->click_ok("commit"); check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/process_bug.cgi}); $sel->title_is("Product Edit Access Denied"); -$sel->is_text_present_ok("You are not permitted to edit bugs in product TestProduct."); +$sel->is_text_present_ok( + "You are not permitted to edit bugs in product TestProduct."); logout($sel); # Test searches and "format for printing". @@ -272,24 +334,32 @@ $sel->select_ok("emailtype2", "label=is"); $sel->type_ok("email2", $config->{QA_Selenium_TEST_user_login}); screenshot_page($sel, '/app/artifacts/line271.png'); $sel->click_ok("Search"); -check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/buglist.cgi?emailreporter2=1&emailtype2=exact&order=Importance&list_id=15&emailtype1=exact&emailcc2=1&query_format=advanced&emailassigned_to1=1&emailqa_contact2=1&email2=QA-Selenium-TEST%40mozilla.test&email1=admin%40mozilla.test&emailassigned_to2=1&product=TestProduct}); +check_page_load($sel, WAIT_TIME, + q{http://HOSTNAME:8000/bmo/buglist.cgi?emailreporter2=1&emailtype2=exact&order=Importance&list_id=15&emailtype1=exact&emailcc2=1&query_format=advanced&emailassigned_to1=1&emailqa_contact2=1&email2=QA-Selenium-TEST%40mozilla.test&email1=admin%40mozilla.test&emailassigned_to2=1&product=TestProduct} +); $sel->title_is("Bug List"); screenshot_page($sel, '/app/artifacts/line275.png'); $sel->is_text_present_ok("One bug found."); $sel->type_ok("save_newqueryname", "My bugs from QA_Selenium"); $sel->click_ok("remember"); -check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/buglist.cgi?newquery=email1%3Dadmin%2540mozilla.test%26email2%3DQA-Selenium-TEST%2540mozilla.test%26emailassigned_to1%3D1%26emailassigned_to2%3D1%26emailcc2%3D1%26emailqa_contact2%3D1%26emailreporter2%3D1%26emailtype1%3Dexact%26emailtype2%3Dexact%26list_id%3D15%26product%3DTestProduct%26query_format%3Dadvanced%26order%3Dpriority%252Cbug_severity&cmdtype=doit&remtype=asnamed&token=1531926552-dc69995d79c786af046436ec6717000b&newqueryname=My%20bugs%20from%20QA_Selenium&list_id=16}); +check_page_load($sel, WAIT_TIME, + q{http://HOSTNAME:8000/bmo/buglist.cgi?newquery=email1%3Dadmin%2540mozilla.test%26email2%3DQA-Selenium-TEST%2540mozilla.test%26emailassigned_to1%3D1%26emailassigned_to2%3D1%26emailcc2%3D1%26emailqa_contact2%3D1%26emailreporter2%3D1%26emailtype1%3Dexact%26emailtype2%3Dexact%26list_id%3D15%26product%3DTestProduct%26query_format%3Dadvanced%26order%3Dpriority%252Cbug_severity&cmdtype=doit&remtype=asnamed&token=1531926552-dc69995d79c786af046436ec6717000b&newqueryname=My%20bugs%20from%20QA_Selenium&list_id=16} +); $sel->title_is("Search created"); -$sel->is_text_present_ok("OK, you have a new search named My bugs from QA_Selenium."); +$sel->is_text_present_ok( + "OK, you have a new search named My bugs from QA_Selenium."); $sel->click_ok("link=My bugs from QA_Selenium"); -check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/buglist.cgi?cmdtype=runnamed&namedcmd=My%20bugs%20from%20QA_Selenium&list_id=17}); +check_page_load($sel, WAIT_TIME, + q{http://HOSTNAME:8000/bmo/buglist.cgi?cmdtype=runnamed&namedcmd=My%20bugs%20from%20QA_Selenium&list_id=17} +); $sel->title_is("Bug List: My bugs from QA_Selenium"); $sel->click_ok("long_format"); check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/show_bug.cgi}); $sel->title_is("Full Text Bug Listing"); $sel->is_text_present_ok("Bug $bug1_id"); $sel->is_text_present_ok("Status: CONFIRMED"); -$sel->is_text_present_ok("Reporter: QA-Selenium-TEST <$config->{QA_Selenium_TEST_user_login}>"); +$sel->is_text_present_ok( + "Reporter: QA-Selenium-TEST <$config->{QA_Selenium_TEST_user_login}>"); $sel->is_text_present_ok("Assignee: QA Admin <$config->{admin_user_login}>"); $sel->is_text_present_ok("Severity: blocker"); $sel->is_text_present_ok("Priority: Highest"); @@ -303,30 +373,37 @@ log_in($sel, $config, 'QA_Selenium_TEST'); file_bug_in_product($sel, 'TestProduct'); $sel->select_ok("bug_severity", "label=blocker"); $sel->type_ok("short_desc", "New bug from me"); + # We turned on the CANEDIT bit for TestProduct. $sel->type_ok("comment", "I can enter a new bug, but not edit it, right?"); $sel->click_ok("commit"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=__BUG_ID__}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=__BUG_ID__}); my $bug2_id = $sel->get_value('//input[@name="id" and @type="hidden"]'); -$sel->is_text_present_ok('has been added to the database', "Bug $bug2_id created"); +$sel->is_text_present_ok('has been added to the database', + "Bug $bug2_id created"); # Clicking the "Back" button and resubmitting the form again should trigger a suspicous action error. $sel->go_back_ok(); -check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/enter_bug.cgi?product=TestProduct&format=__default__}); +check_page_load($sel, WAIT_TIME, + q{http://HOSTNAME:8000/bmo/enter_bug.cgi?product=TestProduct&format=__default__} +); $sel->title_is("Enter Bug: TestProduct"); $sel->click_ok("commit"); check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/post_bug.cgi}); $sel->title_is("Suspicious Action"); $sel->is_text_present_ok("you have no valid token for the create_bug action"); $sel->click_ok('//input[@value="Confirm Changes"]'); -check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/show_bug.cgi?id=15}); +check_page_load($sel, WAIT_TIME, + q{http://HOSTNAME:8000/bmo/show_bug.cgi?id=15}); $sel->is_text_present_ok('has been added to the database', 'Bug created'); $sel->type_ok("comment", "New comment not allowed"); $sel->click_ok("commit"); check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/process_bug.cgi}); $sel->title_is("Product Edit Access Denied"); -$sel->is_text_present_ok("You are not permitted to edit bugs in product TestProduct."); +$sel->is_text_present_ok( + "You are not permitted to edit bugs in product TestProduct."); logout($sel); # Reassign the newly created bug to the admin. @@ -335,23 +412,28 @@ log_in($sel, $config, 'admin'); go_to_bug($sel, $bug2_id); $sel->click_ok("bz_assignee_edit_action"); $sel->type_ok("assigned_to", $config->{admin_user_login}); -$sel->type_ok("comment", "Taking!"); +$sel->type_ok("comment", "Taking!"); $sel->click_ok("commit"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug2_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug2_id}); $sel->is_text_present_ok("Changes submitted for bug $bug2_id"); # Test mass-change. $sel->click_ok("link=My bugs from QA_Selenium"); screenshot_page($sel, '/app/artifacts/line344.png'); -check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/buglist.cgi?cmdtype=runnamed&namedcmd=My%20bugs%20from%20QA_Selenium&list_id=19}); +check_page_load($sel, WAIT_TIME, + q{http://HOSTNAME:8000/bmo/buglist.cgi?cmdtype=runnamed&namedcmd=My%20bugs%20from%20QA_Selenium&list_id=19} +); screenshot_page($sel, '/app/artifacts/line346.png'); $sel->title_is("Bug List: My bugs from QA_Selenium"); screenshot_page($sel, '/app/artifacts/line348.png'); $sel->is_text_present_ok("2 bugs found"); screenshot_page($sel, '/app/artifacts/line350.png'); $sel->click_ok("link=Change Several Bugs at Once"); -check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/buglist.cgi?email1=admin%40mozilla.test&email2=QA-Selenium-TEST%40mozilla.test&emailassigned_to1=1&emailassigned_to2=1&emailcc2=1&emailqa_contact2=1&emailreporter2=1&emailtype1=exact&emailtype2=exact&product=TestProduct&query_format=advanced&order=priority%2Cbug_severity&tweak=1&list_id=20}); +check_page_load($sel, WAIT_TIME, + q{http://HOSTNAME:8000/bmo/buglist.cgi?email1=admin%40mozilla.test&email2=QA-Selenium-TEST%40mozilla.test&emailassigned_to1=1&emailassigned_to2=1&emailcc2=1&emailqa_contact2=1&emailreporter2=1&emailtype1=exact&emailtype2=exact&product=TestProduct&query_format=advanced&order=priority%2Cbug_severity&tweak=1&list_id=20} +); $sel->title_is("Bug List"); $sel->click_ok("check_all"); $sel->type_ok("comment", 'Mass change"'); @@ -362,25 +444,30 @@ check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/process_bug.cgi}); $sel->title_is("Bugs processed"); $sel->click_ok("link=bug $bug1_id"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); $sel->title_like(qr/$bug1_id /); $sel->selected_label_is("resolution", "WORKSFORME"); $sel->select_ok("resolution", "label=INVALID"); $sel->click_ok("commit"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); $sel->click_ok("link=bug $bug1_id"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); $sel->title_like(qr/$bug1_id /); $sel->selected_label_is("resolution", "INVALID"); $sel->click_ok("link=History"); -check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_activity.cgi?id=$bug1_id}); +check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_activity.cgi?id=$bug1_id}); $sel->title_is("Changes made to bug $bug1_id"); $sel->is_text_present_ok("URL foo.cgi?action=bar"); $sel->is_text_present_ok("Severity critical blocker"); -$sel->is_text_present_ok("Whiteboard [Selenium was here] [Selenium was here][admin too]"); +$sel->is_text_present_ok( + "Whiteboard [Selenium was here] [Selenium was here][admin too]"); $sel->is_text_present_ok("Product QA-Selenium-TEST TestProduct"); $sel->is_text_present_ok("Status CONFIRMED RESOLVED"); @@ -431,53 +518,68 @@ $sel->is_text_present_ok("Status CONFIRMED RESOLVED"); # Make sure token checks are working correctly for single bug editing and mass change, # first with no token, then with an invalid token. -foreach my $params (["no_token_single_bug", ""], ["invalid_token_single_bug", "&token=1"]) { - my ($comment, $token) = @$params; - $sel->open_ok("/$config->{bugzilla_installation}/process_bug.cgi?id=$bug1_id&comment=$comment$token", - undef, "Edit a single bug with " . ($token ? "an invalid" : "no") . " token"); - $sel->title_is("Suspicious Action"); - $sel->is_text_present_ok($token ? "an invalid token" : "web browser directly"); - $sel->click_ok("confirm"); - check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); - $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); - $sel->click_ok("link=bug $bug1_id"); - check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); - $sel->title_like(qr/^$bug1_id /); - $sel->is_text_present_ok($comment); +foreach my $params (["no_token_single_bug", ""], + ["invalid_token_single_bug", "&token=1"]) +{ + my ($comment, $token) = @$params; + $sel->open_ok( + "/$config->{bugzilla_installation}/process_bug.cgi?id=$bug1_id&comment=$comment$token", + undef, "Edit a single bug with " . ($token ? "an invalid" : "no") . " token" + ); + $sel->title_is("Suspicious Action"); + $sel->is_text_present_ok($token ? "an invalid token" : "web browser directly"); + $sel->click_ok("confirm"); + check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); + $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); + $sel->click_ok("link=bug $bug1_id"); + check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug1_id}); + $sel->title_like(qr/^$bug1_id /); + $sel->is_text_present_ok($comment); } -foreach my $params (["no_token_mass_change", ""], ["invalid_token_mass_change", "&token=1"]) { - my ($comment, $token) = @$params; - $sel->open_ok("/$config->{bugzilla_installation}/process_bug.cgi?id_$bug1_id=1&id_$bug2_id=1&comment=$comment$token", - undef, "Mass change with " . ($token ? "an invalid" : "no") . " token"); - $sel->title_is("Suspicious Action"); - $sel->is_text_present_ok("no valid token for the buglist_mass_change action"); - $sel->click_ok("confirm"); +foreach my $params (["no_token_mass_change", ""], + ["invalid_token_mass_change", "&token=1"]) +{ + my ($comment, $token) = @$params; + $sel->open_ok( + "/$config->{bugzilla_installation}/process_bug.cgi?id_$bug1_id=1&id_$bug2_id=1&comment=$comment$token", + undef, "Mass change with " . ($token ? "an invalid" : "no") . " token" + ); + $sel->title_is("Suspicious Action"); + $sel->is_text_present_ok("no valid token for the buglist_mass_change action"); + $sel->click_ok("confirm"); + check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/process_bug.cgi}); + $sel->title_is("Bugs processed"); + foreach my $bug_id ($bug1_id, $bug2_id) { + $sel->click_ok("link=bug $bug_id"); + check_page_load($sel, WAIT_TIME, + qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug_id}); + $sel->title_like(qr/^$bug_id /); + $sel->is_text_present_ok($comment); + next if $bug_id == $bug2_id; + $sel->go_back_ok(); check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/process_bug.cgi}); $sel->title_is("Bugs processed"); - foreach my $bug_id ($bug1_id, $bug2_id) { - $sel->click_ok("link=bug $bug_id"); - check_page_load($sel, WAIT_TIME, qq{http://HOSTNAME:8000/bmo/show_bug.cgi?id=$bug_id}); - $sel->title_like(qr/^$bug_id /); - $sel->is_text_present_ok($comment); - next if $bug_id == $bug2_id; - $sel->go_back_ok(); - check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/process_bug.cgi}); - $sel->title_is("Bugs processed"); - } + } } # Now move these bugs out of our radar. $sel->click_ok("link=My bugs from QA_Selenium"); -check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/buglist.cgi?cmdtype=runnamed&namedcmd=My%20bugs%20from%20QA_Selenium&list_id=21}); +check_page_load($sel, WAIT_TIME, + q{http://HOSTNAME:8000/bmo/buglist.cgi?cmdtype=runnamed&namedcmd=My%20bugs%20from%20QA_Selenium&list_id=21} +); $sel->title_is("Bug List: My bugs from QA_Selenium"); $sel->is_text_present_ok("2 bugs found"); $sel->click_ok("link=Change Several Bugs at Once"); -check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/buglist.cgi?email1=admin%40mozilla.test&email2=QA-Selenium-TEST%40mozilla.test&emailassigned_to1=1&emailassigned_to2=1&emailcc2=1&emailqa_contact2=1&emailreporter2=1&emailtype1=exact&emailtype2=exact&product=TestProduct&query_format=advanced&order=priority%2Cbug_severity&tweak=1&list_id=22}); +check_page_load($sel, WAIT_TIME, + q{http://HOSTNAME:8000/bmo/buglist.cgi?email1=admin%40mozilla.test&email2=QA-Selenium-TEST%40mozilla.test&emailassigned_to1=1&emailassigned_to2=1&emailcc2=1&emailqa_contact2=1&emailreporter2=1&emailtype1=exact&emailtype2=exact&product=TestProduct&query_format=advanced&order=priority%2Cbug_severity&tweak=1&list_id=22} +); $sel->title_is("Bug List"); $sel->click_ok("check_all"); -$sel->type_ok("comment", "Reassigning to the reporter"); +$sel->type_ok("comment", "Reassigning to the reporter"); $sel->type_ok("assigned_to", $config->{QA_Selenium_TEST_user_login}); $sel->click_ok("commit"); check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/process_bug.cgi}); @@ -486,10 +588,14 @@ $sel->title_is("Bugs processed"); # Now delete the saved search. $sel->click_ok("link=My bugs from QA_Selenium"); -check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/buglist.cgi?cmdtype=runnamed&namedcmd=My%20bugs%20from%20QA_Selenium&list_id=23}); +check_page_load($sel, WAIT_TIME, + q{http://HOSTNAME:8000/bmo/buglist.cgi?cmdtype=runnamed&namedcmd=My%20bugs%20from%20QA_Selenium&list_id=23} +); $sel->title_is("Bug List: My bugs from QA_Selenium"); $sel->click_ok("link=Forget Search 'My bugs from QA_Selenium'"); -check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/buglist.cgi?cmdtype=dorem&remaction=forget&namedcmd=My%20bugs%20from%20QA_Selenium&token=1531926582-f228fa8ebc2f2b3970f2a791e54534ec&list_id=24}); +check_page_load($sel, WAIT_TIME, + q{http://HOSTNAME:8000/bmo/buglist.cgi?cmdtype=dorem&remaction=forget&namedcmd=My%20bugs%20from%20QA_Selenium&token=1531926582-f228fa8ebc2f2b3970f2a791e54534ec&list_id=24} +); $sel->title_is("Search is gone"); $sel->is_text_present_ok("OK, the My bugs from QA_Selenium search is gone"); @@ -498,14 +604,16 @@ clear_canedit_on_testproduct($sel, $master_gid); logout($sel); sub clear_canedit_on_testproduct { - my ($sel, $master_gid) = @_; - - edit_product($sel, "TestProduct"); - $sel->click_ok("link=Edit Group Access Controls:"); -check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/editproducts.cgi?action=editgroupcontrols&product=TestProduct}); - $sel->title_is("Edit Group Controls for TestProduct"); - $sel->uncheck_ok("canedit_$master_gid"); - $sel->click_ok("submit"); -check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/editproducts.cgi}); - $sel->title_is("Update group access controls for TestProduct"); + my ($sel, $master_gid) = @_; + + edit_product($sel, "TestProduct"); + $sel->click_ok("link=Edit Group Access Controls:"); + check_page_load($sel, WAIT_TIME, + q{http://HOSTNAME:8000/bmo/editproducts.cgi?action=editgroupcontrols&product=TestProduct} + ); + $sel->title_is("Edit Group Controls for TestProduct"); + $sel->uncheck_ok("canedit_$master_gid"); + $sel->click_ok("submit"); + check_page_load($sel, WAIT_TIME, q{http://HOSTNAME:8000/bmo/editproducts.cgi}); + $sel->title_is("Update group access controls for TestProduct"); } diff --git a/qa/t/test_choose_priority.t b/qa/t/test_choose_priority.t index 95f401e66..6320df652 100644 --- a/qa/t/test_choose_priority.t +++ b/qa/t/test_choose_priority.t @@ -16,11 +16,14 @@ use QA::Util; my ($sel, $config) = get_selenium(); log_in($sel, $config, 'admin'); -set_parameters($sel, { "Bug Change Policies" => {"letsubmitterchoosepriority-off" => undef} }); +set_parameters($sel, + {"Bug Change Policies" => {"letsubmitterchoosepriority-off" => undef}}); file_bug_in_product($sel, "TestProduct"); ok(!$sel->is_text_present("Priority"), "The Priority label is not present"); -ok(!$sel->is_element_present("//select[\@name='priority']"), "The Priority drop-down menu is not present"); -set_parameters($sel, { "Bug Change Policies" => {"letsubmitterchoosepriority-on" => undef} }); +ok(!$sel->is_element_present("//select[\@name='priority']"), + "The Priority drop-down menu is not present"); +set_parameters($sel, + {"Bug Change Policies" => {"letsubmitterchoosepriority-on" => undef}}); file_bug_in_product($sel, "TestProduct"); $sel->is_text_present_ok("Priority"); $sel->is_element_present_ok("//select[\@name='priority']"); diff --git a/qa/t/test_classifications.t b/qa/t/test_classifications.t index a30e72018..a2e8c93b6 100644 --- a/qa/t/test_classifications.t +++ b/qa/t/test_classifications.t @@ -18,7 +18,7 @@ my ($sel, $config) = get_selenium(); # Enable classifications log_in($sel, $config, 'admin'); -set_parameters($sel, { "Bug Fields" => {"useclassification-on" => undef} }); +set_parameters($sel, {"Bug Fields" => {"useclassification-on" => undef}}); # Create a new classification. @@ -31,25 +31,29 @@ $sel->title_is("Select classification"); # Accessing action=delete directly must 1) trigger the security check page, # and 2) automatically reclassify products in this classification. if ($sel->is_text_present("cone")) { - $sel->open_ok("/$config->{bugzilla_installation}/editclassifications.cgi?action=delete&classification=cone"); - $sel->title_is("Suspicious Action"); - $sel->click_ok("confirm"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Classification Deleted"); + $sel->open_ok( + "/$config->{bugzilla_installation}/editclassifications.cgi?action=delete&classification=cone" + ); + $sel->title_is("Suspicious Action"); + $sel->click_ok("confirm"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Classification Deleted"); } if ($sel->is_text_present("ctwo")) { - $sel->open_ok("/$config->{bugzilla_installation}/editclassifications.cgi?action=delete&classification=ctwo"); - $sel->title_is("Suspicious Action"); - $sel->click_ok("confirm"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Classification Deleted"); + $sel->open_ok( + "/$config->{bugzilla_installation}/editclassifications.cgi?action=delete&classification=ctwo" + ); + $sel->title_is("Suspicious Action"); + $sel->click_ok("confirm"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Classification Deleted"); } $sel->click_ok("link=Add"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Add new classification"); $sel->type_ok("classification", "cone"); -$sel->type_ok("description", "Classification number 1"); +$sel->type_ok("description", "Classification number 1"); $sel->click_ok('//input[@type="submit" and @value="Add"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("New Classification Created"); @@ -62,7 +66,8 @@ $sel->click_ok("add_products"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Reclassify products"); my @products = $sel->get_select_options("myprodlist"); -ok(scalar @products == 1 && $products[0] eq 'TestProduct', "TestProduct successfully added to 'cone'"); +ok(scalar @products == 1 && $products[0] eq 'TestProduct', + "TestProduct successfully added to 'cone'"); # Create a new bug in this product/classification. @@ -72,7 +77,8 @@ $sel->type_ok("comment", "Created by Selenium with classifications turned on"); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); my $bug1_id = $sel->get_value('//input[@name="id" and @type="hidden"]'); -$sel->is_text_present_ok('has been added to the database', "Bug $bug1_id created"); +$sel->is_text_present_ok('has been added to the database', + "Bug $bug1_id created"); # Rename 'cone' to 'Unclassified', which must be rejected as it already exists, # then to 'ctwo', which is not yet in use. Should work fine, even with products @@ -109,18 +115,21 @@ go_to_admin($sel); $sel->click_ok("link=Classifications"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Select classification"); -$sel->click_ok('//a[@href="editclassifications.cgi?action=del&classification=ctwo"]'); +$sel->click_ok( + '//a[@href="editclassifications.cgi?action=del&classification=ctwo"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Error"); my $error = trim($sel->get_text("error_msg")); -ok($error =~ /there are products for this classification/, "Reject classification deletion"); +ok($error =~ /there are products for this classification/, + "Reject classification deletion"); # Reclassify the product before deleting the classification. $sel->go_back_ok(); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Select classification"); -$sel->click_ok('//a[@href="editclassifications.cgi?action=reclassify&classification=ctwo"]'); +$sel->click_ok( + '//a[@href="editclassifications.cgi?action=reclassify&classification=ctwo"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Reclassify products"); $sel->add_selection_ok("myprodlist", "label=TestProduct"); @@ -130,7 +139,8 @@ $sel->title_is("Reclassify products"); $sel->click_ok("link=edit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Select classification"); -$sel->click_ok('//a[@href="editclassifications.cgi?action=del&classification=ctwo"]'); +$sel->click_ok( + '//a[@href="editclassifications.cgi?action=del&classification=ctwo"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Delete classification"); $sel->is_text_present_ok("Do you really want to delete this classification?"); @@ -140,7 +150,7 @@ $sel->title_is("Classification Deleted"); # Disable classifications and make sure you cannot edit them anymore. -set_parameters($sel, { "Bug Fields" => {"useclassification-off" => undef} }); +set_parameters($sel, {"Bug Fields" => {"useclassification-off" => undef}}); $sel->open_ok("/$config->{bugzilla_installation}/editclassifications.cgi"); $sel->title_is("Classification Not Enabled"); logout($sel); diff --git a/qa/t/test_config.t b/qa/t/test_config.t index ef1d8d898..7ad97190a 100644 --- a/qa/t/test_config.t +++ b/qa/t/test_config.t @@ -18,12 +18,13 @@ my ($sel, $config) = get_selenium(); # Turn on 'requirelogin' and log out. log_in($sel, $config, 'admin'); -set_parameters($sel, { "User Authentication" => {"requirelogin-on" => undef} }); +set_parameters($sel, {"User Authentication" => {"requirelogin-on" => undef}}); logout($sel); # Accessing config.cgi should display no sensitive data. -$sel->open_ok("/$config->{bugzilla_installation}/config.cgi", undef, "Go to config.cgi (JS format)"); +$sel->open_ok("/$config->{bugzilla_installation}/config.cgi", + undef, "Go to config.cgi (JS format)"); $sel->is_text_present_ok("var status = [ ];"); $sel->is_text_present_ok("var status_open = [ ];"); $sel->is_text_present_ok("var status_closed = [ ];"); @@ -33,13 +34,14 @@ $sel->is_text_present_ok("var platform = [ ];"); $sel->is_text_present_ok("var severity = [ ];"); $sel->is_text_present_ok("var field = [\n];"); -ok(!$sel->is_text_present("cf_"), "No custom field displayed"); +ok(!$sel->is_text_present("cf_"), "No custom field displayed"); ok(!$sel->is_text_present("component["), "No component displayed"); -ok(!$sel->is_text_present("version["), "No version displayed"); -ok(!$sel->is_text_present("target_milestone["), "No target milestone displayed"); +ok(!$sel->is_text_present("version["), "No version displayed"); +ok(!$sel->is_text_present("target_milestone["), + "No target milestone displayed"); # Turn on 'requirelogin' and log out. log_in($sel, $config, 'admin'); -set_parameters($sel, { "User Authentication" => {"requirelogin-off" => undef} }); +set_parameters($sel, {"User Authentication" => {"requirelogin-off" => undef}}); logout($sel); diff --git a/qa/t/test_create_user_accounts.t b/qa/t/test_create_user_accounts.t index ba0f39671..25f93ba65 100644 --- a/qa/t/test_create_user_accounts.t +++ b/qa/t/test_create_user_accounts.t @@ -18,7 +18,13 @@ my ($sel, $config) = get_selenium(); # Set the email regexp for new bugzilla accounts to end with @bugzilla.test. log_in($sel, $config, 'admin'); -set_parameters($sel, { "User Authentication" => {"createemailregexp" => {type => "text", value => '[^@]+@bugzilla\.test$'}} }); +set_parameters( + $sel, + { + "User Authentication" => + {"createemailregexp" => {type => "text", value => '[^@]+@bugzilla\.test$'}} + } +); logout($sel); # Create a valid account. We need to randomize the login address, because a request @@ -50,58 +56,69 @@ $sel->click_ok('//input[@value="Create Account"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Too Soon For New Token"); my $error_msg = trim($sel->get_text("error_msg")); -ok($error_msg =~ /Please wait a while and try again/, "Too soon for this account"); +ok($error_msg =~ /Please wait a while and try again/, + "Too soon for this account"); # These accounts do not pass the regexp. -my @accounts = ('test@yahoo.com', 'test@bugzilla.net', 'test@bugzilla.test.com'); +my @accounts + = ('test@yahoo.com', 'test@bugzilla.net', 'test@bugzilla.test.com'); foreach my $account (@accounts) { - $sel->click_ok("link=New Account"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Create a new Bugzilla account"); - $sel->type_ok("login", $account); - $sel->check_ok("etiquette", "Agree to abide by code of conduct"); - $sel->click_ok('//input[@value="Create Account"]'); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Account Creation Restricted"); - $sel->is_text_present_ok("User account creation has been restricted."); + $sel->click_ok("link=New Account"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Create a new Bugzilla account"); + $sel->type_ok("login", $account); + $sel->check_ok("etiquette", "Agree to abide by code of conduct"); + $sel->click_ok('//input[@value="Create Account"]'); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Account Creation Restricted"); + $sel->is_text_present_ok("User account creation has been restricted."); } # These accounts are illegal and should cause a javascript alert. @accounts = qw( - test\bugzilla@bugzilla.test - testbugzilla.test - test@bugzilla - test@bugzilla. - 'test'@bugzilla.test - test&test@bugzilla.test - [test]@bugzilla.test + test\bugzilla@bugzilla.test + testbugzilla.test + test@bugzilla + test@bugzilla. + 'test'@bugzilla.test + test&test@bugzilla.test + [test]@bugzilla.test ); + foreach my $account (@accounts) { - $sel->click_ok("link=New Account"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Create a new Bugzilla account"); - $sel->type_ok("login", $account); - $sel->check_ok("etiquette", "Agree to abide by code of conduct"); - $sel->click_ok('//input[@value="Create Account"]'); - ok($sel->get_alert() =~ /The e-mail address doesn't pass our syntax checking for a legal email address/, - 'Invalid email address detected'); + $sel->click_ok("link=New Account"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Create a new Bugzilla account"); + $sel->type_ok("login", $account); + $sel->check_ok("etiquette", "Agree to abide by code of conduct"); + $sel->click_ok('//input[@value="Create Account"]'); + ok( + $sel->get_alert() + =~ /The e-mail address doesn't pass our syntax checking for a legal email address/, + 'Invalid email address detected' + ); } # These accounts are illegal but do not cause a javascript alert @accounts = ('test@bugzilla.org@bugzilla.test', 'test@bugzilla..test'); + # Logins larger than 127 characters must be rejected, for security reasons. push @accounts, 'selenium-' . random_string(110) . '@bugzilla.test'; foreach my $account (@accounts) { - $sel->click_ok("link=New Account"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Create a new Bugzilla account"); - $sel->type_ok("login", $account); - $sel->check_ok("etiquette", "Agree to abide by code of conduct"); - $sel->click_ok('//input[@value="Create Account"]'); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Invalid Email Address"); - my $error_msg = trim($sel->get_text("error_msg")); - ok($error_msg =~ /^The e-mail address you entered (\S+) didn't pass our syntax checking/, "Invalid email address detected"); + $sel->click_ok("link=New Account"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Create a new Bugzilla account"); + $sel->type_ok("login", $account); + $sel->check_ok("etiquette", "Agree to abide by code of conduct"); + $sel->click_ok('//input[@value="Create Account"]'); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Invalid Email Address"); + my $error_msg = trim($sel->get_text("error_msg")); + ok( + $error_msg + =~ /^The e-mail address you entered (\S+) didn't pass our syntax checking/, + "Invalid email address detected" + ); } # This account already exists. @@ -114,11 +131,20 @@ $sel->click_ok('//input[@value="Create Account"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Account Already Exists"); $error_msg = trim($sel->get_text("error_msg")); -ok($error_msg eq "There is already an account with the login name $config->{admin_user_login}.", "Account already exists"); +ok( + $error_msg eq + "There is already an account with the login name $config->{admin_user_login}.", + "Account already exists" +); # Turn off user account creation. log_in($sel, $config, 'admin'); -set_parameters($sel, { "User Authentication" => {"createemailregexp" => {type => "text", value => ''}} }); +set_parameters( + $sel, + { + "User Authentication" => {"createemailregexp" => {type => "text", value => ''}} + } +); logout($sel); # Make sure that links pointing to createaccount.cgi are all deactivated. @@ -132,13 +158,22 @@ ok(!$sel->is_text_present("New Account"), "No link named 'New Account'"); $sel->open_ok("/$config->{bugzilla_installation}/createaccount.cgi"); $sel->title_is("Account Creation Disabled"); $error_msg = trim($sel->get_text("error_msg")); -ok($error_msg =~ /^User account creation has been disabled. New accounts must be created by an administrator/, - "User account creation disabled"); +ok( + $error_msg + =~ /^User account creation has been disabled. New accounts must be created by an administrator/, + "User account creation disabled" +); # Re-enable user account creation. log_in($sel, $config, 'admin'); -set_parameters($sel, { "User Authentication" => {"createemailregexp" => {type => "text", value => '.*'}} }); +set_parameters( + $sel, + { + "User Authentication" => + {"createemailregexp" => {type => "text", value => '.*'}} + } +); # Make sure selenium-<random_string>@bugzilla.test has not be added to the DB yet. go_to_admin($sel); diff --git a/qa/t/test_custom_fields.t b/qa/t/test_custom_fields.t index bd2074585..ed65a6f0f 100644 --- a/qa/t/test_custom_fields.t +++ b/qa/t/test_custom_fields.t @@ -21,7 +21,8 @@ log_in($sel, $config, 'admin'); file_bug_in_product($sel, 'TestProduct'); my $bug_summary = "What's your ID?"; $sel->type_ok("short_desc", $bug_summary); -$sel->type_ok("comment", "Use the ID of this bug to generate a unique custom field name."); +$sel->type_ok("comment", + "Use the ID of this bug to generate a unique custom field name."); $sel->type_ok("bug_severity", "label=normal"); my $bug1_id = create_bug($sel, $bug_summary); @@ -38,13 +39,16 @@ $sel->type_ok("name", "cf_qa_freetext_$bug1_id"); $sel->type_ok("desc", "Freetext$bug1_id"); $sel->select_ok("type", "label=Free Text"); $sel->type_ok("sortkey", $bug1_id); + # These values are off by default. $sel->value_is("enter_bug", "off"); -$sel->value_is("obsolete", "off"); +$sel->value_is("obsolete", "off"); $sel->click_ok("create"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Custom Field Created"); -$sel->is_text_present_ok("The new custom field 'cf_qa_freetext_$bug1_id' has been successfully created."); +$sel->is_text_present_ok( + "The new custom field 'cf_qa_freetext_$bug1_id' has been successfully created." +); $sel->click_ok("link=Add a new custom field"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -58,11 +62,12 @@ $sel->value_is("enter_bug", "on"); $sel->click_ok("new_bugmail"); sleep 10; $sel->value_is("new_bugmail", "on"); -$sel->value_is("obsolete", "off"); +$sel->value_is("obsolete", "off"); $sel->click_ok("create"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Custom Field Created"); -$sel->is_text_present_ok("The new custom field 'cf_qa_list_$bug1_id' has been successfully created."); +$sel->is_text_present_ok( + "The new custom field 'cf_qa_list_$bug1_id' has been successfully created."); $sel->click_ok("link=Add a new custom field"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -70,15 +75,16 @@ $sel->title_is("Add a new Custom Field"); $sel->type_ok("name", "cf_qa_bugid_$bug1_id"); $sel->type_ok("desc", "Reference$bug1_id"); $sel->select_ok("type", "label=Bug ID"); -$sel->type_ok("sortkey", $bug1_id); +$sel->type_ok("sortkey", $bug1_id); $sel->type_ok("reverse_desc", "IsRef$bug1_id"); $sel->click_ok("enter_bug"); $sel->value_is("enter_bug", "on"); -$sel->value_is("obsolete", "off"); +$sel->value_is("obsolete", "off"); $sel->click_ok("create"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Custom Field Created"); -$sel->is_text_present_ok("The new custom field 'cf_qa_bugid_$bug1_id' has been successfully created."); +$sel->is_text_present_ok( + "The new custom field 'cf_qa_bugid_$bug1_id' has been successfully created."); # Add values to the custom fields. @@ -87,27 +93,32 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Edit the Custom Field 'cf_qa_list_$bug1_id' (List$bug1_id)"); $sel->click_ok("link=Edit legal values for this field"); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->title_is("Select value for the 'List$bug1_id' (cf_qa_list_$bug1_id) field"); +$sel->title_is( + "Select value for the 'List$bug1_id' (cf_qa_list_$bug1_id) field"); $sel->click_ok("link=Add"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Add Value for the 'List$bug1_id' (cf_qa_list_$bug1_id) field"); -$sel->type_ok("value", "have fun?"); +$sel->type_ok("value", "have fun?"); $sel->type_ok("sortkey", "805"); $sel->click_ok("create"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("New Field Value Created"); -$sel->is_text_present_ok("The value have fun? has been added as a valid choice for the List$bug1_id (cf_qa_list_$bug1_id) field."); +$sel->is_text_present_ok( + "The value have fun? has been added as a valid choice for the List$bug1_id (cf_qa_list_$bug1_id) field." +); $sel->click_ok("link=Add"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Add Value for the 'List$bug1_id' (cf_qa_list_$bug1_id) field"); -$sel->type_ok("value", "storage"); +$sel->type_ok("value", "storage"); $sel->type_ok("sortkey", "49"); $sel->click_ok("create"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("New Field Value Created"); -$sel->is_text_present_ok("The value storage has been added as a valid choice for the List$bug1_id (cf_qa_list_$bug1_id) field."); +$sel->is_text_present_ok( + "The value storage has been added as a valid choice for the List$bug1_id (cf_qa_list_$bug1_id) field." +); # Also create a new bug status and a new resolution. @@ -121,7 +132,7 @@ $sel->title_is("Select value for the 'Resolution' (resolution) field"); $sel->click_ok("link=Add"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Add Value for the 'Resolution' (resolution) field"); -$sel->type_ok("value", "UPSTREAM"); +$sel->type_ok("value", "UPSTREAM"); $sel->type_ok("sortkey", 450); $sel->click_ok("create"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -137,7 +148,7 @@ $sel->title_is("Select value for the 'Status' (bug_status) field"); $sel->click_ok("link=Add"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Add Value for the 'Status' (bug_status) field"); -$sel->type_ok("value", "SUSPENDED"); +$sel->type_ok("value", "SUSPENDED"); $sel->type_ok("sortkey", 250); $sel->click_ok("open_status"); $sel->click_ok("create"); @@ -147,7 +158,7 @@ $sel->title_is("New Field Value Created"); $sel->click_ok("link=Add"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Add Value for the 'Status' (bug_status) field"); -$sel->type_ok("value", "IN_QA"); +$sel->type_ok("value", "IN_QA"); $sel->type_ok("sortkey", 550); $sel->click_ok("closed_status"); $sel->click_ok("create"); @@ -157,13 +168,20 @@ $sel->title_is("New Field Value Created"); $sel->click_ok("link=status workflow page"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Edit Workflow"); -$sel->click_ok('//td[@title="From UNCONFIRMED to SUSPENDED"]//input[@type="checkbox"]'); -$sel->click_ok('//td[@title="From CONFIRMED to SUSPENDED"]//input[@type="checkbox"]'); -$sel->click_ok('//td[@title="From SUSPENDED to CONFIRMED"]//input[@type="checkbox"]'); -$sel->click_ok('//td[@title="From SUSPENDED to IN_PROGRESS"]//input[@type="checkbox"]'); -$sel->click_ok('//td[@title="From RESOLVED to IN_QA"]//input[@type="checkbox"]'); -$sel->click_ok('//td[@title="From IN_QA to VERIFIED"]//input[@type="checkbox"]'); -$sel->click_ok('//td[@title="From IN_QA to CONFIRMED"]//input[@type="checkbox"]'); +$sel->click_ok( + '//td[@title="From UNCONFIRMED to SUSPENDED"]//input[@type="checkbox"]'); +$sel->click_ok( + '//td[@title="From CONFIRMED to SUSPENDED"]//input[@type="checkbox"]'); +$sel->click_ok( + '//td[@title="From SUSPENDED to CONFIRMED"]//input[@type="checkbox"]'); +$sel->click_ok( + '//td[@title="From SUSPENDED to IN_PROGRESS"]//input[@type="checkbox"]'); +$sel->click_ok( + '//td[@title="From RESOLVED to IN_QA"]//input[@type="checkbox"]'); +$sel->click_ok( + '//td[@title="From IN_QA to VERIFIED"]//input[@type="checkbox"]'); +$sel->click_ok( + '//td[@title="From IN_QA to CONFIRMED"]//input[@type="checkbox"]'); $sel->click_ok('//input[@value="Commit Changes"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Edit Workflow"); @@ -175,13 +193,19 @@ $sel->is_text_present_ok("List$bug1_id:"); $sel->is_element_present_ok("cf_qa_list_$bug1_id"); $sel->is_text_present_ok("Reference$bug1_id:"); $sel->is_element_present_ok("cf_qa_bugid_$bug1_id"); -ok(!$sel->is_text_present("Freetext$bug1_id:"), "Freetext$bug1_id is not displayed"); -ok(!$sel->is_element_present("cf_qa_freetext_$bug1_id"), "cf_qa_freetext_$bug1_id is not available"); +ok( + !$sel->is_text_present("Freetext$bug1_id:"), + "Freetext$bug1_id is not displayed" +); +ok( + !$sel->is_element_present("cf_qa_freetext_$bug1_id"), + "cf_qa_freetext_$bug1_id is not available" +); my $bug_summary2 = "Et de un"; $sel->type_ok("short_desc", $bug_summary2); $sel->select_ok("bug_severity", "critical"); $sel->type_ok("cf_qa_bugid_$bug1_id", $bug1_id); -$sel->type_ok("comment", "hops!"); +$sel->type_ok("comment", "hops!"); my $bug2_id = create_bug($sel, $bug_summary2); # Both fields are editable. @@ -257,27 +281,32 @@ $sel->click_ok("link=cf_qa_list_$bug1_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Edit the Custom Field 'cf_qa_list_$bug1_id' (List$bug1_id)"); $sel->select_ok("visibility_field_id", "label=Severity (bug_severity)"); -$sel->select_ok("visibility_values", "label=critical"); +$sel->select_ok("visibility_values", "label=critical"); $sel->click_ok("edit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Custom Field Updated"); go_to_bug($sel, $bug1_id); -$sel->is_element_present_ok("cf_qa_list_$bug1_id", "List$bug1_id is in the DOM of the page..."); -ok(!$sel->is_visible("cf_qa_list_$bug1_id"), "... but is not displayed with severity = 'normal'"); +$sel->is_element_present_ok("cf_qa_list_$bug1_id", + "List$bug1_id is in the DOM of the page..."); +ok(!$sel->is_visible("cf_qa_list_$bug1_id"), + "... but is not displayed with severity = 'normal'"); $sel->select_ok("bug_severity", "major"); ok(!$sel->is_visible("cf_qa_list_$bug1_id"), "... nor with severity = 'major'"); $sel->select_ok("bug_severity", "critical"); -$sel->is_visible_ok("cf_qa_list_$bug1_id", "... but is visible with severity = 'critical'"); +$sel->is_visible_ok("cf_qa_list_$bug1_id", + "... but is visible with severity = 'critical'"); edit_bug_and_return($sel, $bug1_id, $bug_summary); $sel->is_visible_ok("cf_qa_list_$bug1_id"); go_to_bug($sel, $bug2_id); $sel->is_visible_ok("cf_qa_list_$bug1_id"); $sel->select_ok("bug_severity", "minor"); -ok(!$sel->is_visible("cf_qa_list_$bug1_id"), "List$bug1_id is not displayed with severity = 'minor'"); +ok(!$sel->is_visible("cf_qa_list_$bug1_id"), + "List$bug1_id is not displayed with severity = 'minor'"); edit_bug_and_return($sel, $bug2_id, $bug_summary2); -ok(!$sel->is_visible("cf_qa_list_$bug1_id"), "List$bug1_id is not displayed with severity = 'minor'"); +ok(!$sel->is_visible("cf_qa_list_$bug1_id"), + "List$bug1_id is not displayed with severity = 'minor'"); # Add a new value which is only listed under some condition. @@ -297,11 +326,12 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Edit the Custom Field 'cf_qa_list_$bug1_id' (List$bug1_id)"); $sel->click_ok("link=Edit legal values for this field"); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->title_is("Select value for the 'List$bug1_id' (cf_qa_list_$bug1_id) field"); +$sel->title_is( + "Select value for the 'List$bug1_id' (cf_qa_list_$bug1_id) field"); $sel->click_ok("link=Add"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Add Value for the 'List$bug1_id' (cf_qa_list_$bug1_id) field"); -$sel->type_ok("value", "ghost"); +$sel->type_ok("value", "ghost"); $sel->type_ok("sortkey", "500"); $sel->select_ok("visibility_value_id", "label=FIXED"); $sel->click_ok("id=create"); @@ -313,8 +343,8 @@ my @labels = $sel->get_select_options("cf_qa_list_$bug1_id"); ok(grep(/^ghost$/, @labels), "ghost is in the DOM of the page..."); my $disabled = $sel->get_attribute("v4_cf_qa_list_$bug1_id\@disabled"); ok($disabled, "... but is not available for selection by default"); -$sel->select_ok("bug_status", "label=RESOLVED"); -$sel->select_ok("resolution", "label=FIXED"); +$sel->select_ok("bug_status", "label=RESOLVED"); +$sel->select_ok("resolution", "label=FIXED"); $sel->select_ok("cf_qa_list_$bug1_id", "label=ghost"); edit_bug_and_return($sel, $bug1_id, $bug_summary); $sel->selected_label_is("cf_qa_list_$bug1_id", "ghost"); @@ -327,10 +357,14 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Edit values for which field?"); $sel->click_ok("link=List$bug1_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->title_is("Select value for the 'List$bug1_id' (cf_qa_list_$bug1_id) field"); -$sel->click_ok("//a[contains(\@href, 'editvalues.cgi?action=del&field=cf_qa_list_$bug1_id&value=have%20fun%3F')]"); +$sel->title_is( + "Select value for the 'List$bug1_id' (cf_qa_list_$bug1_id) field"); +$sel->click_ok( + "//a[contains(\@href, 'editvalues.cgi?action=del&field=cf_qa_list_$bug1_id&value=have%20fun%3F')]" +); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->title_is("Delete Value 'have fun?' from the 'List$bug1_id' (cf_qa_list_$bug1_id) field"); +$sel->title_is( + "Delete Value 'have fun?' from the 'List$bug1_id' (cf_qa_list_$bug1_id) field"); $sel->is_text_present_ok("Do you really want to delete this value?"); $sel->click_ok("delete"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -338,9 +372,12 @@ $sel->title_is("Field Value Deleted"); # This value cannot be deleted as it's in use. -$sel->click_ok("//a[contains(\@href, 'editvalues.cgi?action=del&field=cf_qa_list_$bug1_id&value=storage')]"); +$sel->click_ok( + "//a[contains(\@href, 'editvalues.cgi?action=del&field=cf_qa_list_$bug1_id&value=storage')]" +); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->title_is("Delete Value 'storage' from the 'List$bug1_id' (cf_qa_list_$bug1_id) field"); +$sel->title_is( + "Delete Value 'storage' from the 'List$bug1_id' (cf_qa_list_$bug1_id) field"); $sel->is_text_present_ok("There is 1 bug with this field value"); # Mark the <select> field as obsolete, making it unavailable in bug reports. @@ -359,7 +396,8 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Custom Field Updated"); go_to_bug($sel, $bug1_id); $sel->value_is("cf_qa_freetext_$bug1_id", "thanks"); -ok(!$sel->is_element_present("cf_qa_list_$bug1_id"), "The custom list is not visible"); +ok(!$sel->is_element_present("cf_qa_list_$bug1_id"), + "The custom list is not visible"); # Custom fields are also viewable by logged out users. @@ -387,7 +425,8 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Custom Fields"); $sel->click_ok("link=cf_qa_freetext_$bug1_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->title_is("Edit the Custom Field 'cf_qa_freetext_$bug1_id' (Freetext$bug1_id)"); +$sel->title_is( + "Edit the Custom Field 'cf_qa_freetext_$bug1_id' (Freetext$bug1_id)"); $sel->click_ok("obsolete"); $sel->value_is("obsolete", "on"); $sel->click_ok("edit"); @@ -403,7 +442,8 @@ $sel->title_is("Edit values for which field?"); $sel->click_ok("link=Status"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Select value for the 'Status' (bug_status) field"); -$sel->click_ok('//a[@href="editvalues.cgi?action=del&field=bug_status&value=SUSPENDED"]'); +$sel->click_ok( + '//a[@href="editvalues.cgi?action=del&field=bug_status&value=SUSPENDED"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Delete Value 'SUSPENDED' from the 'Status' (bug_status) field"); $sel->is_text_present_ok("Sorry, but the 'SUSPENDED' value cannot be deleted"); @@ -426,21 +466,25 @@ $sel->title_is("Edit values for which field?"); $sel->click_ok("link=Status"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Select value for the 'Status' (bug_status) field"); -$sel->click_ok('//a[@href="editvalues.cgi?action=del&field=bug_status&value=SUSPENDED"]'); +$sel->click_ok( + '//a[@href="editvalues.cgi?action=del&field=bug_status&value=SUSPENDED"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Delete Value 'SUSPENDED' from the 'Status' (bug_status) field"); $sel->click_ok("delete"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Field Value Deleted"); -$sel->is_text_present_ok("The value SUSPENDED of the Status (bug_status) field has been deleted"); +$sel->is_text_present_ok( + "The value SUSPENDED of the Status (bug_status) field has been deleted"); -$sel->click_ok('//a[@href="editvalues.cgi?action=del&field=bug_status&value=IN_QA"]'); +$sel->click_ok( + '//a[@href="editvalues.cgi?action=del&field=bug_status&value=IN_QA"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Delete Value 'IN_QA' from the 'Status' (bug_status) field"); $sel->click_ok("delete"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Field Value Deleted"); -$sel->is_text_present_ok("The value IN_QA of the Status (bug_status) field has been deleted"); +$sel->is_text_present_ok( + "The value IN_QA of the Status (bug_status) field has been deleted"); go_to_admin($sel); $sel->click_ok("link=Field Values"); @@ -449,12 +493,15 @@ $sel->title_is("Edit values for which field?"); $sel->click_ok("link=Resolution"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Select value for the 'Resolution' (resolution) field"); -$sel->click_ok('//a[@href="editvalues.cgi?action=del&field=resolution&value=UPSTREAM"]'); +$sel->click_ok( + '//a[@href="editvalues.cgi?action=del&field=resolution&value=UPSTREAM"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->title_is("Delete Value 'UPSTREAM' from the 'Resolution' (resolution) field"); +$sel->title_is( + "Delete Value 'UPSTREAM' from the 'Resolution' (resolution) field"); $sel->click_ok("delete"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Field Value Deleted"); -$sel->is_text_present_ok("The value UPSTREAM of the Resolution (resolution) field has been deleted"); +$sel->is_text_present_ok( + "The value UPSTREAM of the Resolution (resolution) field has been deleted"); logout($sel); diff --git a/qa/t/test_custom_fields_admin.t b/qa/t/test_custom_fields_admin.t index 81fcfe7cb..6ca5c62bf 100644 --- a/qa/t/test_custom_fields_admin.t +++ b/qa/t/test_custom_fields_admin.t @@ -24,30 +24,33 @@ $sel->click_ok("link=Custom Fields"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Custom Fields"); -my @types = ("Bug ID", "Large Text Box", "Free Text", "Multiple-Selection Box", - "Drop Down", "Date/Time"); +my @types = ( + "Bug ID", "Large Text Box", + "Free Text", "Multiple-Selection Box", + "Drop Down", "Date/Time" +); my $counter = int(rand(10000)); foreach my $type (@types) { - my $fname = "cf_field" . ++$counter; - my $fdesc = "Field" . $counter; - - $sel->click_ok("link=Add a new custom field"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Add a new Custom Field"); - $sel->type_ok("name", $fname); - $sel->type_ok("desc", $fdesc); - $sel->select_ok("type", "label=$type"); - $sel->click_ok("obsolete"); - $sel->click_ok("create"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Custom Field Created"); - $sel->click_ok("//a[\@href='editfields.cgi?action=del&name=$fname']"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Delete the Custom Field '$fname' ($fdesc)"); - $sel->click_ok("link=Delete field '$fdesc'"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Custom Field Deleted"); + my $fname = "cf_field" . ++$counter; + my $fdesc = "Field" . $counter; + + $sel->click_ok("link=Add a new custom field"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Add a new Custom Field"); + $sel->type_ok("name", $fname); + $sel->type_ok("desc", $fdesc); + $sel->select_ok("type", "label=$type"); + $sel->click_ok("obsolete"); + $sel->click_ok("create"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Custom Field Created"); + $sel->click_ok("//a[\@href='editfields.cgi?action=del&name=$fname']"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Delete the Custom Field '$fname' ($fdesc)"); + $sel->click_ok("link=Delete field '$fdesc'"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Custom Field Deleted"); } logout($sel); diff --git a/qa/t/test_default_groups.t b/qa/t/test_default_groups.t index b163e2222..4598d4ddf 100644 --- a/qa/t/test_default_groups.t +++ b/qa/t/test_default_groups.t @@ -19,12 +19,12 @@ my ($sel, $config) = get_selenium(); # it has automatically a group created for it with the same name. log_in($sel, $config, 'admin'); -set_parameters($sel, { "Group Security" => {"makeproductgroups-on" => undef} }); +set_parameters($sel, {"Group Security" => {"makeproductgroups-on" => undef}}); add_product($sel); -$sel->type_ok("product", "ready_to_die"); +$sel->type_ok("product", "ready_to_die"); $sel->type_ok("description", "will die"); -$sel->select_ok("security_group_id", "label=core-security"); -$sel->select_ok("default_op_sys_id", "Unspecified"); +$sel->select_ok("security_group_id", "label=core-security"); +$sel->select_ok("default_op_sys_id", "Unspecified"); $sel->select_ok("default_platform_id", "Unspecified"); $sel->click_ok('//input[@value="Add"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -43,7 +43,8 @@ $sel->value_is("desc", "Access to bugs in the ready_to_die product"); my @groups = $sel->get_select_options("members_remove"); ok((grep { $_ eq 'admin' } @groups), "'admin' inherits group membership"); @groups = $sel->get_select_options("bless_from_remove"); -ok((grep { $_ eq 'admin' } @groups), "'admin' inherits can bless group membership"); +ok((grep { $_ eq 'admin' } @groups), + "'admin' inherits can bless group membership"); $sel->is_checked_ok("isactive"); # Check that the automatically created product group has the membercontrol @@ -53,10 +54,10 @@ edit_product($sel, "ready_to_die"); $sel->click_ok("link=Edit Group Access Controls:"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Edit Group Controls for ready_to_die"); -$sel->value_is("entry_$group1_id", "off"); +$sel->value_is("entry_$group1_id", "off"); $sel->value_is("canedit_$group1_id", "off"); $sel->selected_label_is("membercontrol_$group1_id", "Default"); -$sel->selected_label_is("othercontrol_$group1_id", "NA"); +$sel->selected_label_is("othercontrol_$group1_id", "NA"); edit_product($sel, "ready_to_die"); $sel->go_back_ok(); @@ -80,10 +81,10 @@ $sel->is_text_present_ok("Access to bugs in the ready_to_die product"); # a new "ready_to_die_" one must be created. add_product($sel); -$sel->type_ok("product", "ready_to_die"); +$sel->type_ok("product", "ready_to_die"); $sel->type_ok("description", "will die"); -$sel->select_ok("security_group_id", "label=core-security"); -$sel->select_ok("default_op_sys_id", "Unspecified"); +$sel->select_ok("security_group_id", "label=core-security"); +$sel->select_ok("default_op_sys_id", "Unspecified"); $sel->select_ok("default_platform_id", "Unspecified"); $sel->click_ok('//input[@value="Add"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -103,7 +104,8 @@ $sel->value_is("desc", "Access to bugs in the ready_to_die product"); @groups = $sel->get_select_options("members_remove"); ok((grep { $_ eq 'admin' } @groups), "'admin' inherits group membership"); @groups = $sel->get_select_options("bless_from_remove"); -ok((grep { $_ eq 'admin' } @groups), "'admin' inherits can bless group membership"); +ok((grep { $_ eq 'admin' } @groups), + "'admin' inherits can bless group membership"); $sel->value_is("isactive", "on"); # Check group settings. The old 'ready_to_die' group has no relationship @@ -113,14 +115,14 @@ edit_product($sel, "ready_to_die"); $sel->click_ok("link=Edit Group Access Controls:"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Edit Group Controls for ready_to_die"); -$sel->value_is("entry_$group1_id", "off"); -$sel->value_is("entry_$group2_id", "off"); +$sel->value_is("entry_$group1_id", "off"); +$sel->value_is("entry_$group2_id", "off"); $sel->value_is("canedit_$group1_id", "off"); $sel->value_is("canedit_$group2_id", "off"); $sel->selected_label_is("membercontrol_$group1_id", "NA"); -$sel->selected_label_is("othercontrol_$group1_id", "NA"); +$sel->selected_label_is("othercontrol_$group1_id", "NA"); $sel->selected_label_is("membercontrol_$group2_id", "Default"); -$sel->selected_label_is("othercontrol_$group2_id", "NA"); +$sel->selected_label_is("othercontrol_$group2_id", "NA"); # Delete the ready_to_die_ group. It's bound to the ready_to_die product, # so the deletion requires explicit agreement from the admin. @@ -129,7 +131,8 @@ go_to_admin($sel); $sel->click_ok("link=Groups"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Edit Groups"); -$sel->click_ok("//a[contains(\@href, 'editgroups.cgi?action=del&group=$group2_id')]"); +$sel->click_ok( + "//a[contains(\@href, 'editgroups.cgi?action=del&group=$group2_id')]"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Delete group"); $sel->is_text_present_ok("This group is tied to the following products"); @@ -137,8 +140,10 @@ $sel->click_ok("delete"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Cannot Delete Group"); my $text = trim($sel->get_text("error_msg")); -ok($text =~ qr/All references to this group must be removed/, - "Group ready_to_die_ cannot be deleted as it is bound to a product"); +ok( + $text =~ qr/All references to this group must be removed/, + "Group ready_to_die_ cannot be deleted as it is bound to a product" +); $sel->go_back_ok(); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Delete group"); @@ -147,7 +152,8 @@ $sel->click_ok("delete"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Group Deleted"); $text = trim($sel->get_text("message")); -ok($text =~ qr/The group ready_to_die_ has been deleted/, "Group ready_to_die_ has been deleted"); +ok($text =~ qr/The group ready_to_die_ has been deleted/, + "Group ready_to_die_ has been deleted"); edit_product($sel, "ready_to_die"); $sel->go_back_ok(); @@ -162,12 +168,12 @@ $sel->title_is("Product Deleted"); # Reset the makeproductgroups parameter. Now creating a new product must # not create a new group, nor bind any group with it. -set_parameters($sel, { "Group Security" => {"makeproductgroups-off" => undef} }); +set_parameters($sel, {"Group Security" => {"makeproductgroups-off" => undef}}); add_product($sel); -$sel->type_ok("product", "ready_to_die"); +$sel->type_ok("product", "ready_to_die"); $sel->type_ok("description", "will die"); -$sel->select_ok("security_group_id", "label=core-security"); -$sel->select_ok("default_op_sys_id", "Unspecified"); +$sel->select_ok("security_group_id", "label=core-security"); +$sel->select_ok("default_op_sys_id", "Unspecified"); $sel->select_ok("default_platform_id", "Unspecified"); $sel->click_ok('//input[@value="Add"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -180,10 +186,10 @@ $sel->title_is("Edit Product 'ready_to_die'"); $sel->click_ok("link=Edit Group Access Controls:"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Edit Group Controls for ready_to_die"); -$sel->value_is("entry_$group1_id", "off"); +$sel->value_is("entry_$group1_id", "off"); $sel->value_is("canedit_$group1_id", "off"); $sel->selected_label_is("membercontrol_$group1_id", "NA"); -$sel->selected_label_is("othercontrol_$group1_id", "NA"); +$sel->selected_label_is("othercontrol_$group1_id", "NA"); # Delete remaining groups and products. @@ -192,14 +198,16 @@ $sel->click_ok("link=Groups"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Edit Groups"); ok(!$sel->is_text_present('ready_to_die__'), 'No ready_to_die__ group created'); -$sel->click_ok("//a[contains(\@href, 'editgroups.cgi?action=del&group=$group1_id')]"); +$sel->click_ok( + "//a[contains(\@href, 'editgroups.cgi?action=del&group=$group1_id')]"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Delete group"); $sel->click_ok("delete"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Group Deleted"); $text = trim($sel->get_text("message")); -ok($text =~ /The group ready_to_die has been deleted/, "Group ready_to_die has been deleted"); +ok($text =~ /The group ready_to_die has been deleted/, + "Group ready_to_die has been deleted"); edit_product($sel, "ready_to_die"); $sel->go_back_ok(); diff --git a/qa/t/test_dependencies.t b/qa/t/test_dependencies.t index c054a4d08..1deefb84e 100644 --- a/qa/t/test_dependencies.t +++ b/qa/t/test_dependencies.t @@ -21,15 +21,15 @@ log_in($sel, $config, 'admin'); file_bug_in_product($sel, "TestProduct"); my $bug_summary = "Dependency Checks"; $sel->type_ok("short_desc", $bug_summary); -$sel->type_ok("comment", "This bug is public"); +$sel->type_ok("comment", "This bug is public"); my $bug1_id = create_bug($sel, $bug_summary); file_bug_in_product($sel, "TestProduct"); $sel->type_ok("alias", "secret_qa_bug_$bug1_id+1"); my $bug_summary2 = "Big Ben"; $sel->type_ok("short_desc", $bug_summary2); -$sel->type_ok("comment", "This bug is private"); -$sel->type_ok("dependson", $bug1_id); +$sel->type_ok("comment", "This bug is private"); +$sel->type_ok("dependson", $bug1_id); $sel->check_ok('//input[@name="groups" and @value="Master"]'); my $bug2_id = create_bug($sel, $bug_summary2); @@ -45,8 +45,11 @@ logout($sel); log_in($sel, $config, 'editbugs'); go_to_bug($sel, $bug1_id); -ok(!$sel->is_text_present("secret_qa_bug_$bug1_id+1"), "The alias of the private bug is not visible"); -$sel->select_ok("priority", "label=High"); +ok( + !$sel->is_text_present("secret_qa_bug_$bug1_id+1"), + "The alias of the private bug is not visible" +); +$sel->select_ok("priority", "label=High"); $sel->select_ok("bug_status", "VERIFIED"); $sel->type_ok("comment", "Can I still edit this bug?"); edit_bug($sel, $bug1_id); diff --git a/qa/t/test_edit_products_properties.t b/qa/t/test_edit_products_properties.t index b62e71061..848f81c63 100644 --- a/qa/t/test_edit_products_properties.t +++ b/qa/t/test_edit_products_properties.t @@ -15,15 +15,19 @@ use QA::Util; my ($sel, $config) = get_selenium(); -my $admin_user_login = $config->{admin_user_login}; +my $admin_user_login = $config->{admin_user_login}; my $unprivileged_user_login = $config->{unprivileged_user_login}; -my $permanent_user = $config->{permanent_user}; +my $permanent_user = $config->{permanent_user}; log_in($sel, $config, 'admin'); -set_parameters($sel, { "Bug Fields" => {"useclassification-off" => undef, - "usetargetmilestone-on" => undef}, - "Administrative Policies" => {"allowbugdeletion-on" => undef} - }); +set_parameters( + $sel, + { + "Bug Fields" => + {"useclassification-off" => undef, "usetargetmilestone-on" => undef}, + "Administrative Policies" => {"allowbugdeletion-on" => undef} + } +); # Create a product and add components to it. Do some cleanup first # if the script failed during a previous run. @@ -31,47 +35,54 @@ set_parameters($sel, { "Bug Fields" => {"useclassification-off" => go_to_admin($sel); $sel->click_ok("link=Products"); $sel->wait_for_page_to_load_ok(WAIT_TIME); + # No risk to get the "Select classification" page. We turned off useclassification. $sel->title_is("Select product"); my $text = trim($sel->get_text("bugzilla-body")); if ($text =~ /(Kill me!|Kill me nicely)/) { - my $product = $1; - my $escaped_product = url_quote($product); - $sel->click_ok("//a[\@href='editproducts.cgi?action=del&product=$escaped_product']"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Delete Product '$product'"); - $sel->click_ok("delete"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Product Deleted"); + my $product = $1; + my $escaped_product = url_quote($product); + $sel->click_ok( + "//a[\@href='editproducts.cgi?action=del&product=$escaped_product']"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Delete Product '$product'"); + $sel->click_ok("delete"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Product Deleted"); } $sel->click_ok("link=Add"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Add Product"); $sel->type_ok("product", "Kill me!"); -$sel->type_ok("description", "I will disappear very soon. Do not add bugs to it."); +$sel->type_ok("description", + "I will disappear very soon. Do not add bugs to it."); $sel->type_ok("defaultmilestone", "0.1a"); + # Since Bugzilla 4.0, the voting system is in an extension. if ($config->{test_extensions}) { - $sel->type_ok("votesperuser", "1"); - $sel->type_ok("maxvotesperbug", "1"); - $sel->type_ok("votestoconfirm", "10"); + $sel->type_ok("votesperuser", "1"); + $sel->type_ok("maxvotesperbug", "1"); + $sel->type_ok("votestoconfirm", "10"); } $sel->type_ok("version", "0.1a"); -$sel->select_ok("security_group_id", "label=core-security"); -$sel->select_ok("default_op_sys_id", "Unspecified"); +$sel->select_ok("security_group_id", "label=core-security"); +$sel->select_ok("default_op_sys_id", "Unspecified"); $sel->select_ok("default_platform_id", "Unspecified"); $sel->click_ok('//input[@type="submit" and @value="Add"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $text = trim($sel->get_text("message")); -ok($text =~ /You will need to add at least one component before anyone can enter bugs against this product/, - "Display a reminder about missing components"); +ok( + $text + =~ /You will need to add at least one component before anyone can enter bugs against this product/, + "Display a reminder about missing components" +); $sel->click_ok("link=add at least one component"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Add component to the Kill me! product"); -$sel->type_ok("component", "first comp"); -$sel->type_ok("description", "comp 1"); +$sel->type_ok("component", "first comp"); +$sel->type_ok("description", "comp 1"); $sel->type_ok("initialowner", $admin_user_login); $sel->uncheck_ok("watch_user_auto"); $sel->type_ok("watch_user", "first-comp\@kill-me.bugs"); @@ -80,15 +91,16 @@ $sel->click_ok("create"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Component Created"); $text = trim($sel->get_text("message")); -ok($text eq 'The component first comp has been created.', "Component successfully created"); +ok($text eq 'The component first comp has been created.', + "Component successfully created"); # Try creating a second component with the same name. $sel->click_ok("link=Add"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Add component to the Kill me! product"); -$sel->type_ok("component", "first comp"); -$sel->type_ok("description", "comp 2"); +$sel->type_ok("component", "first comp"); +$sel->type_ok("description", "comp 2"); $sel->type_ok("initialowner", $admin_user_login); $sel->uncheck_ok("watch_user_auto"); $sel->type_ok("watch_user", "first-comp\@kill-me.bugs"); @@ -102,9 +114,10 @@ $sel->title_is("Component Already Exists"); $sel->go_back_ok(); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->type_ok("component", "second comp"); + # FIXME - Re-enter the default assignee (regression due to bug 577574) $sel->type_ok("initialowner", $admin_user_login); -$sel->type_ok("initialcc", $permanent_user); +$sel->type_ok("initialcc", $permanent_user); $sel->uncheck_ok("watch_user_auto"); $sel->type_ok("watch_user", "second-comp\@kill-me.bugs"); $sel->check_ok("watch_user_auto"); @@ -137,7 +150,7 @@ $sel->click_ok("link=Add"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Add Milestone to Product 'Kill me!'"); $sel->type_ok("milestone", "0.2"); -$sel->type_ok("sortkey", "2"); +$sel->type_ok("sortkey", "2"); $sel->click_ok("create"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Milestone Created"); @@ -148,6 +161,7 @@ $sel->click_ok("link=Add"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Add Milestone to Product 'Kill me!'"); $sel->type_ok("milestone", "0.1a"); + # Negative sortkeys are valid for milestones. $sel->type_ok("sortkey", "-2"); $sel->click_ok("create"); @@ -163,33 +177,39 @@ $sel->title_is("Milestone Created"); # Now create an UNCONFIRMED bug and add it to the newly created product. file_bug_in_product($sel, "Kill me!"); -$sel->select_ok("version", "label=0.1a"); +$sel->select_ok("version", "label=0.1a"); $sel->select_ok("component", "label=first comp"); + # UNCONFIRMED must be present. $sel->select_ok("bug_status", "label=UNCONFIRMED"); -$sel->type_ok("cc", $unprivileged_user_login); +$sel->type_ok("cc", $unprivileged_user_login); $sel->type_ok("bug_file_loc", "http://www.test.com"); -$sel->type_ok("short_desc", "test create/edit product properties"); -$sel->type_ok("comment", "this bug will soon be dead"); +$sel->type_ok("short_desc", "test create/edit product properties"); +$sel->type_ok("comment", "this bug will soon be dead"); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok('has been added to the database', 'Bug created'); my $bug1_id = $sel->get_value("//input[\@name='id' and \@type='hidden']"); my @cc_list = $sel->get_select_options("cc"); -ok(grep($_ eq $unprivileged_user_login, @cc_list), "$unprivileged_user_login correctly added to the CC list"); -ok(!grep($_ eq $permanent_user, @cc_list), "$permanent_user not in the CC list for 'first comp' by default"); +ok( + grep($_ eq $unprivileged_user_login, @cc_list), + "$unprivileged_user_login correctly added to the CC list" +); +ok(!grep($_ eq $permanent_user, @cc_list), + "$permanent_user not in the CC list for 'first comp' by default"); # File a second bug, and make sure users in the default CC list are added. file_bug_in_product($sel, "Kill me!"); -$sel->select_ok("version", "label=0.1a"); +$sel->select_ok("version", "label=0.1a"); $sel->select_ok("component", "label=second comp"); $sel->type_ok("short_desc", "check default CC list"); -$sel->type_ok("comment", "is the CC list populated correctly?"); +$sel->type_ok("comment", "is the CC list populated correctly?"); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok('has been added to the database', 'Bug created'); @cc_list = $sel->get_select_options("cc"); -ok(grep($_ eq $permanent_user, @cc_list), "$permanent_user in the CC list for 'second comp' by default"); +ok(grep($_ eq $permanent_user, @cc_list), + "$permanent_user in the CC list for 'second comp' by default"); # Edit product properties and set votes_to_confirm to 0, which has # the side-effect to disable auto-confirmation (new behavior compared @@ -197,67 +217,78 @@ ok(grep($_ eq $permanent_user, @cc_list), "$permanent_user in the CC list for 's edit_product($sel, "Kill me!"); $sel->type_ok("product", "Kill me nicely"); -$sel->type_ok("description", "I will disappear very soon. Do not add bugs to it (except for testing)."); +$sel->type_ok("description", + "I will disappear very soon. Do not add bugs to it (except for testing)."); $sel->select_ok("defaultmilestone", "label=0.2"); if ($config->{test_extensions}) { - $sel->type_ok("votesperuser", "2"); - $sel->type_ok("maxvotesperbug", 5); - $sel->type_ok("votestoconfirm", "0"); + $sel->type_ok("votesperuser", "2"); + $sel->type_ok("maxvotesperbug", 5); + $sel->type_ok("votestoconfirm", "0"); } $sel->click_ok('//input[@type="submit" and @value="Save Changes"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Updating Product 'Kill me nicely'"); -$sel->is_text_present_ok("Updated product name from 'Kill me!' to 'Kill me nicely'"); +$sel->is_text_present_ok( + "Updated product name from 'Kill me!' to 'Kill me nicely'"); $sel->is_text_present_ok("Updated description"); $sel->is_text_present_ok("Updated default milestone"); if ($config->{test_extensions}) { - $sel->is_text_present_ok("Updated votes per user"); - $sel->is_text_present_ok("Updated maximum votes per bug"); - $sel->is_text_present_ok("Updated number of votes needed to confirm a bug"); - $text = trim($sel->get_text("bugzilla-body")); - # We use .{1} in place of the right arrow character, which fails otherwise. - ok($text =~ /Checking unconfirmed bugs in this product for any which now have sufficient votes\.{3} .{1}there were none/, - "No bugs confirmed by popular votes (votestoconfirm = 0 disables auto-confirmation)"); - - # Now set votestoconfirm to 2, vote for a bug, and then set - # this attribute back to 1, to trigger auto-confirmation. - - $sel->click_ok("link=Kill me nicely"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Edit Product 'Kill me nicely'", "Display properties of Kill me nicely"); - $sel->type_ok("votestoconfirm", 2); - $sel->click_ok('//input[@type="submit" and @value="Save Changes"]'); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Updating Product 'Kill me nicely'"); - $sel->is_text_present_ok("Updated number of votes needed to confirm a bug"); - - go_to_bug($sel, $bug1_id); - $sel->click_ok("link=vote"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Change Votes"); - $sel->type_ok("bug_$bug1_id", 1); - $sel->click_ok("change"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Change Votes"); - $sel->is_text_present_ok("The changes to your votes have been saved"); - - edit_product($sel, "Kill me nicely"); - $sel->type_ok("votestoconfirm", 1); - $sel->click_ok('//input[@type="submit" and @value="Save Changes"]'); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Updating Product 'Kill me nicely'"); - $sel->is_text_present_ok("Updated number of votes needed to confirm a bug"); - $text = trim($sel->get_text("bugzilla-body")); - ok($text =~ /Bug $bug1_id confirmed by number of votes/, "Bug $bug1_id is confirmed by popular votes"); + $sel->is_text_present_ok("Updated votes per user"); + $sel->is_text_present_ok("Updated maximum votes per bug"); + $sel->is_text_present_ok("Updated number of votes needed to confirm a bug"); + $text = trim($sel->get_text("bugzilla-body")); + + # We use .{1} in place of the right arrow character, which fails otherwise. + ok( + $text + =~ /Checking unconfirmed bugs in this product for any which now have sufficient votes\.{3} .{1}there were none/, + "No bugs confirmed by popular votes (votestoconfirm = 0 disables auto-confirmation)" + ); + + # Now set votestoconfirm to 2, vote for a bug, and then set + # this attribute back to 1, to trigger auto-confirmation. + + $sel->click_ok("link=Kill me nicely"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Edit Product 'Kill me nicely'", + "Display properties of Kill me nicely"); + $sel->type_ok("votestoconfirm", 2); + $sel->click_ok('//input[@type="submit" and @value="Save Changes"]'); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Updating Product 'Kill me nicely'"); + $sel->is_text_present_ok("Updated number of votes needed to confirm a bug"); + + go_to_bug($sel, $bug1_id); + $sel->click_ok("link=vote"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Change Votes"); + $sel->type_ok("bug_$bug1_id", 1); + $sel->click_ok("change"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Change Votes"); + $sel->is_text_present_ok("The changes to your votes have been saved"); + + edit_product($sel, "Kill me nicely"); + $sel->type_ok("votestoconfirm", 1); + $sel->click_ok('//input[@type="submit" and @value="Save Changes"]'); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Updating Product 'Kill me nicely'"); + $sel->is_text_present_ok("Updated number of votes needed to confirm a bug"); + $text = trim($sel->get_text("bugzilla-body")); + ok( + $text =~ /Bug $bug1_id confirmed by number of votes/, + "Bug $bug1_id is confirmed by popular votes" + ); } # Edit the bug. go_to_bug($sel, $bug1_id); -$sel->selected_label_is("product", "Kill me nicely"); -$sel->selected_label_is("bug_status", "CONFIRMED") if $config->{test_extensions}; +$sel->selected_label_is("product", "Kill me nicely"); +$sel->selected_label_is("bug_status", "CONFIRMED") + if $config->{test_extensions}; $sel->select_ok("target_milestone", "label=pre-0.1"); -$sel->select_ok("component", "label=second comp"); +$sel->select_ok("component", "label=second comp"); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); @@ -265,7 +296,8 @@ $sel->click_ok("link=bug $bug1_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/$bug1_id /); @cc_list = $sel->get_select_options("cc"); -ok(grep($_ eq $permanent_user, @cc_list), "User $permanent_user automatically added to the CC list"); +ok(grep($_ eq $permanent_user, @cc_list), + "User $permanent_user automatically added to the CC list"); # Delete the milestone the bug belongs to. This should retarget the bug # to the default milestone. @@ -274,17 +306,24 @@ edit_product($sel, "Kill me nicely"); $sel->click_ok("link=Edit milestones:"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Select milestone of product 'Kill me nicely'"); -$sel->click_ok('//a[@href="editmilestones.cgi?action=del&product=Kill%20me%20nicely&milestone=pre-0.1"]'); +$sel->click_ok( + '//a[@href="editmilestones.cgi?action=del&product=Kill%20me%20nicely&milestone=pre-0.1"]' +); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Delete Milestone of Product 'Kill me nicely'"); $text = trim($sel->get_text("bugzilla-body")); ok($text =~ /There is 1 bug entered for this milestone/, "Warning displayed"); -ok($text =~ /Do you really want to delete this milestone\?/, "Requesting confirmation"); +ok($text =~ /Do you really want to delete this milestone\?/, + "Requesting confirmation"); $sel->click_ok("delete"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Milestone Deleted"); $text = trim($sel->get_text("message")); -ok($text =~ /Bugs targetted to this milestone have been retargetted to the default milestone/, "Bug retargetted"); +ok( + $text + =~ /Bugs targetted to this milestone have been retargetted to the default milestone/, + "Bug retargetted" +); # Try deleting the version used by the bug. This action must be rejected. @@ -294,21 +333,27 @@ $sel->title_is("Edit Product 'Kill me nicely'"); $sel->click_ok("//a[contains(text(),'Edit\nversions:')]"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Select version of product 'Kill me nicely'"); -$sel->click_ok("//a[contains(\@href, 'editversions.cgi?action=del&product=Kill%20me%20nicely&version=0.1a')]"); +$sel->click_ok( + "//a[contains(\@href, 'editversions.cgi?action=del&product=Kill%20me%20nicely&version=0.1a')]" +); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Delete Version of Product 'Kill me nicely'"); $text = trim($sel->get_text("bugzilla-body")); -ok($text =~ /Sorry, there are 2 bugs outstanding for this version/, "Rejecting version deletion"); +ok($text =~ /Sorry, there are 2 bugs outstanding for this version/, + "Rejecting version deletion"); $sel->go_back_ok(); $sel->wait_for_page_to_load_ok(WAIT_TIME); # Delete an unused version. The action must succeed. -$sel->click_ok('//a[@href="editversions.cgi?action=del&product=Kill%20me%20nicely&version=0.1"]'); +$sel->click_ok( + '//a[@href="editversions.cgi?action=del&product=Kill%20me%20nicely&version=0.1"]' +); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Delete Version of Product 'Kill me nicely'"); $text = trim($sel->get_text("bugzilla-body")); -ok($text =~ /Do you really want to delete this version\?/, "Requesting confirmation"); +ok($text =~ /Do you really want to delete this version\?/, + "Requesting confirmation"); $sel->click_ok("delete"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Version Deleted"); @@ -321,26 +366,33 @@ $sel->title_is("Edit Product 'Kill me nicely'"); $sel->click_ok("link=Edit components:"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Select component of product 'Kill me nicely'"); -$sel->click_ok("//a[contains(\@href, 'editcomponents.cgi?action=del&product=Kill%20me%20nicely&component=second%20comp')]"); +$sel->click_ok( + "//a[contains(\@href, 'editcomponents.cgi?action=del&product=Kill%20me%20nicely&component=second%20comp')]" +); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Delete component 'second comp' from 'Kill me nicely' product"); $text = trim($sel->get_text("bugzilla-body")); ok($text =~ /There are 2 bugs entered for this component/, "Warning displayed"); -ok($text =~ /Do you really want to delete this component\?/, "Requesting confirmation"); +ok($text =~ /Do you really want to delete this component\?/, + "Requesting confirmation"); $sel->click_ok("delete"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Component Deleted"); $text = trim($sel->get_text("bugzilla-body")); -ok($text =~ /The component second comp has been deleted/, "Component deletion confirmed"); -ok($text =~ /All bugs being in this component and all references to them have also been deleted/, - "Bug deletion confirmed"); +ok($text =~ /The component second comp has been deleted/, + "Component deletion confirmed"); +ok( + $text + =~ /All bugs being in this component and all references to them have also been deleted/, + "Bug deletion confirmed" +); # Only one value for component, version and milestone available. They should # be selected by default. file_bug_in_product($sel, "Kill me nicely"); $sel->type_ok("short_desc", "bye bye everybody!"); -$sel->type_ok("comment", "I'm dead :("); +$sel->type_ok("comment", "I'm dead :("); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -350,12 +402,14 @@ go_to_admin($sel); $sel->click_ok("link=Products"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Select product"); -$sel->click_ok("//a[\@href='editproducts.cgi?action=del&product=Kill%20me%20nicely']"); +$sel->click_ok( + "//a[\@href='editproducts.cgi?action=del&product=Kill%20me%20nicely']"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Delete Product 'Kill me nicely'"); $text = trim($sel->get_text("bugzilla-body")); ok($text =~ /There is 1 bug entered for this product/, "Warning displayed"); -ok($text =~ /Do you really want to delete this product\?/, "Confirmation request displayed"); +ok($text =~ /Do you really want to delete this product\?/, + "Confirmation request displayed"); $sel->click_ok("delete"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Product Deleted"); diff --git a/qa/t/test_enter_new_bug.t b/qa/t/test_enter_new_bug.t index ae527b32a..0c67f65c9 100644 --- a/qa/t/test_enter_new_bug.t +++ b/qa/t/test_enter_new_bug.t @@ -22,14 +22,16 @@ my ($sel, $config) = get_selenium(); # one could not be improved a bit. foreach my $user (qw(admin unprivileged canconfirm)) { - log_in($sel, $config, $user); - file_bug_in_product($sel, "TestProduct"); - $sel->type_ok("short_desc", "Bug created by Selenium", - "Enter bug summary"); - $sel->type_ok("comment", "--- Bug created by Selenium ---", - "Enter bug description"); - $sel->click_ok("commit", undef, "Submit bug data to post_bug.cgi"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->is_text_present_ok('has been added to the database', 'Bug created'); - logout($sel); + log_in($sel, $config, $user); + file_bug_in_product($sel, "TestProduct"); + $sel->type_ok("short_desc", "Bug created by Selenium", "Enter bug summary"); + $sel->type_ok( + "comment", + "--- Bug created by Selenium ---", + "Enter bug description" + ); + $sel->click_ok("commit", undef, "Submit bug data to post_bug.cgi"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->is_text_present_ok('has been added to the database', 'Bug created'); + logout($sel); } diff --git a/qa/t/test_flags.t b/qa/t/test_flags.t index de05f50a2..5c0e9c1e3 100644 --- a/qa/t/test_flags.t +++ b/qa/t/test_flags.t @@ -27,7 +27,7 @@ $sel->title_is("Administer Flag Types"); $sel->click_ok("link=Create Flag Type for Bugs"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Create Flag Type for Bugs"); -$sel->type_ok("name", "SeleniumBugFlag1Test"); +$sel->type_ok("name", "SeleniumBugFlag1Test"); $sel->type_ok("description", "bugflag1"); $sel->select_ok("product", "label=TestProduct"); $sel->click_ok("categoryAction-include"); @@ -48,23 +48,33 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Create Flag Type for Bugs"); my @inclusion = $sel->get_select_options("inclusion_to_remove"); ok(scalar @inclusion == 2, "The inclusion list contains 2 elements"); -ok(grep($_ eq "QA-Selenium-TEST:__Any__", @inclusion), "QA-Selenium-TEST:__Any__ is in the inclusion list"); -ok(grep($_ eq "TestProduct:__Any__", @inclusion), "TestProduct:__Any__ is in the inclusion list"); +ok( + grep($_ eq "QA-Selenium-TEST:__Any__", @inclusion), + "QA-Selenium-TEST:__Any__ is in the inclusion list" +); +ok( + grep($_ eq "TestProduct:__Any__", @inclusion), + "TestProduct:__Any__ is in the inclusion list" +); my @exclusion = $sel->get_select_options("exclusion_to_remove"); ok(scalar @exclusion == 1, "The exclusion list contains 1 element"); -ok($exclusion[0] eq "QA-Selenium-TEST:__Any__", "QA-Selenium-TEST:__Any__ is in the exclusion list"); +ok( + $exclusion[0] eq "QA-Selenium-TEST:__Any__", + "QA-Selenium-TEST:__Any__ is in the exclusion list" +); $sel->type_ok("sortkey", "900"); -$sel->value_is("cc_list", ""); -$sel->value_is("is_active", "on"); -$sel->value_is("is_requestable", "on"); -$sel->value_is("is_requesteeble", "on"); +$sel->value_is("cc_list", ""); +$sel->value_is("is_active", "on"); +$sel->value_is("is_requestable", "on"); +$sel->value_is("is_requesteeble", "on"); $sel->value_is("is_multiplicable", "on"); -$sel->select_ok("grant_group", "label=admin"); +$sel->select_ok("grant_group", "label=admin"); $sel->select_ok("request_group", "label=(no group)"); $sel->click_ok("save"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Flag Type 'SeleniumBugFlag1Test' Created"); -$sel->is_text_present_ok("The flag type SeleniumBugFlag1Test has been created."); +$sel->is_text_present_ok( + "The flag type SeleniumBugFlag1Test has been created."); my $flagtype_url = $sel->get_attribute('link=SeleniumBugFlag1Test@href'); $flagtype_url =~ /id=(\d+)$/; my $flagtype1_id = $1; @@ -74,19 +84,28 @@ my $flagtype1_id = $1; $sel->click_ok("//a[\@href='editflagtypes.cgi?action=copy&id=$flagtype1_id']"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Create Flag Type for Bugs Based on SeleniumBugFlag1Test"); -$sel->type_ok("name", "SeleniumBugFlag2Test"); +$sel->type_ok("name", "SeleniumBugFlag2Test"); $sel->type_ok("description", "bugflag2"); @inclusion = $sel->get_select_options("inclusion_to_remove"); ok(scalar @inclusion == 2, "The inclusion list contains 2 elements"); -ok(grep($_ eq "QA-Selenium-TEST:__Any__", @inclusion), "QA-Selenium-TEST:__Any__ is in the inclusion list"); -ok(grep($_ eq "TestProduct:__Any__", @inclusion), "TestProduct:__Any__ is in the inclusion list"); +ok( + grep($_ eq "QA-Selenium-TEST:__Any__", @inclusion), + "QA-Selenium-TEST:__Any__ is in the inclusion list" +); +ok( + grep($_ eq "TestProduct:__Any__", @inclusion), + "TestProduct:__Any__ is in the inclusion list" +); @exclusion = $sel->get_select_options("exclusion_to_remove"); ok(scalar @exclusion == 1, "The exclusion list contains 1 element"); -ok($exclusion[0] eq "QA-Selenium-TEST:__Any__", "QA-Selenium-TEST:__Any__ is in the exclusion list"); +ok( + $exclusion[0] eq "QA-Selenium-TEST:__Any__", + "QA-Selenium-TEST:__Any__ is in the exclusion list" +); $sel->type_ok("sortkey", "950"); -$sel->value_is("is_active", "on"); -$sel->value_is("is_requestable", "on"); -$sel->value_is("is_requesteeble", "on"); +$sel->value_is("is_active", "on"); +$sel->value_is("is_requestable", "on"); +$sel->value_is("is_requesteeble", "on"); $sel->value_is("is_multiplicable", "on"); $sel->type_ok("cc_list", $config->{canconfirm_user_login}); $sel->selected_label_is("grant_group", "admin"); @@ -94,7 +113,8 @@ $sel->select_ok("request_group", "label=editbugs"); $sel->click_ok("save"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Flag Type 'SeleniumBugFlag2Test' Created"); -$sel->is_text_present_ok("The flag type SeleniumBugFlag2Test has been created."); +$sel->is_text_present_ok( + "The flag type SeleniumBugFlag2Test has been created."); $flagtype_url = $sel->get_attribute('link=SeleniumBugFlag2Test@href'); $flagtype_url =~ /id=(\d+)$/; my $flagtype2_id = $1; @@ -104,10 +124,10 @@ my $flagtype2_id = $1; $sel->click_ok("//a[\@href='editflagtypes.cgi?action=copy&id=$flagtype1_id']"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Create Flag Type for Bugs Based on SeleniumBugFlag1Test"); -$sel->type_ok("name", "SeleniumBugFlag3Test"); +$sel->type_ok("name", "SeleniumBugFlag3Test"); $sel->type_ok("description", "bugflag3"); -$sel->type_ok("sortkey", "980"); -$sel->value_is("is_active", "on"); +$sel->type_ok("sortkey", "980"); +$sel->value_is("is_active", "on"); $sel->value_is("is_requestable", "on"); $sel->uncheck_ok("is_requesteeble"); $sel->uncheck_ok("is_multiplicable"); @@ -117,7 +137,8 @@ $sel->selected_label_is("request_group", "(no group)"); $sel->click_ok("save"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Flag Type 'SeleniumBugFlag3Test' Created"); -$sel->is_text_present_ok("The flag type SeleniumBugFlag3Test has been created."); +$sel->is_text_present_ok( + "The flag type SeleniumBugFlag3Test has been created."); $flagtype_url = $sel->get_attribute('link=SeleniumBugFlag3Test@href'); $flagtype_url =~ /id=(\d+)$/; my $flagtype3_id = $1; @@ -127,7 +148,7 @@ my $flagtype3_id = $1; $sel->click_ok("link=Create Flag Type For Attachments"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Create Flag Type for Attachments"); -$sel->type_ok("name", "SeleniumAttachmentFlag1Test"); +$sel->type_ok("name", "SeleniumAttachmentFlag1Test"); $sel->type_ok("description", "attachmentflag1"); $sel->select_ok("product", "label=TestProduct"); $sel->click_ok("categoryAction-include"); @@ -140,15 +161,19 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Create Flag Type for Attachments"); @inclusion = $sel->get_select_options("inclusion_to_remove"); ok(scalar @inclusion == 1, "The inclusion list contains 1 element"); -ok($inclusion[0] eq "TestProduct:__Any__", "TestProduct:__Any__ is in the exclusion list"); +ok( + $inclusion[0] eq "TestProduct:__Any__", + "TestProduct:__Any__ is in the exclusion list" +); $sel->type_ok("sortkey", "700"); $sel->value_is("cc_list", ""); -$sel->select_ok("grant_group", "label=editbugs"); +$sel->select_ok("grant_group", "label=editbugs"); $sel->select_ok("request_group", "label=canconfirm"); $sel->click_ok("save"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Flag Type 'SeleniumAttachmentFlag1Test' Created"); -$sel->is_text_present_ok("The flag type SeleniumAttachmentFlag1Test has been created."); +$sel->is_text_present_ok( + "The flag type SeleniumAttachmentFlag1Test has been created."); $flagtype_url = $sel->get_attribute('link=SeleniumAttachmentFlag1Test@href'); $flagtype_url =~ /id=(\d+)$/; my $aflagtype1_id = $1; @@ -157,21 +182,26 @@ my $aflagtype1_id = $1; $sel->click_ok("//a[\@href='editflagtypes.cgi?action=copy&id=$aflagtype1_id']"); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->title_is("Create Flag Type for Attachments Based on SeleniumAttachmentFlag1Test"); -$sel->type_ok("name", "SeleniumAttachmentFlag2Test"); +$sel->title_is( + "Create Flag Type for Attachments Based on SeleniumAttachmentFlag1Test"); +$sel->type_ok("name", "SeleniumAttachmentFlag2Test"); $sel->type_ok("description", "attachmentflag2"); @inclusion = $sel->get_select_options("inclusion_to_remove"); ok(scalar @inclusion == 1, "The inclusion list contains 1 element"); -ok($inclusion[0] eq "TestProduct:__Any__", "TestProduct:__Any__ is in the exclusion list"); +ok( + $inclusion[0] eq "TestProduct:__Any__", + "TestProduct:__Any__ is in the exclusion list" +); $sel->type_ok("sortkey", "750"); $sel->type_ok("cc_list", $config->{admin_user_login}); $sel->uncheck_ok("is_multiplicable"); -$sel->select_ok("grant_group", "label=(no group)"); +$sel->select_ok("grant_group", "label=(no group)"); $sel->select_ok("request_group", "label=(no group)"); $sel->click_ok("save"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Flag Type 'SeleniumAttachmentFlag2Test' Created"); -$sel->is_text_present_ok("The flag type SeleniumAttachmentFlag2Test has been created."); +$sel->is_text_present_ok( + "The flag type SeleniumAttachmentFlag2Test has been created."); $flagtype_url = $sel->get_attribute('link=SeleniumAttachmentFlag2Test@href'); $flagtype_url =~ /id=(\d+)$/; my $aflagtype2_id = $1; @@ -180,15 +210,17 @@ my $aflagtype2_id = $1; $sel->click_ok("//a[\@href='editflagtypes.cgi?action=copy&id=$aflagtype1_id']"); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->title_is("Create Flag Type for Attachments Based on SeleniumAttachmentFlag1Test"); -$sel->type_ok("name", "SeleniumAttachmentFlag3Test"); +$sel->title_is( + "Create Flag Type for Attachments Based on SeleniumAttachmentFlag1Test"); +$sel->type_ok("name", "SeleniumAttachmentFlag3Test"); $sel->type_ok("description", "attachmentflag3"); -$sel->type_ok("sortkey", "800"); +$sel->type_ok("sortkey", "800"); $sel->uncheck_ok("is_active"); $sel->click_ok("save"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Flag Type 'SeleniumAttachmentFlag3Test' Created"); -$sel->is_text_present_ok("The flag type SeleniumAttachmentFlag3Test has been created."); +$sel->is_text_present_ok( + "The flag type SeleniumAttachmentFlag3Test has been created."); $flagtype_url = $sel->get_attribute('link=SeleniumAttachmentFlag3Test@href'); $flagtype_url =~ /id=(\d+)$/; my $aflagtype3_id = $1; @@ -197,13 +229,15 @@ my $aflagtype3_id = $1; file_bug_in_product($sel, 'TestProduct'); $sel->type_ok("short_desc", "test flags"); -$sel->type_ok("comment", "this bug is used by Selenium to test flags"); +$sel->type_ok("comment", "this bug is used by Selenium to test flags"); + # Restrict the bug to the Master group. That's important for subsequent tests! $sel->check_ok('//input[@name="groups" and @value="Master"]'); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); my $bug1_id = $sel->get_value('//input[@name="id" and @type="hidden"]'); -$sel->is_text_present_ok('has been added to the database', "Bug $bug1_id created"); +$sel->is_text_present_ok('has been added to the database', + "Bug $bug1_id created"); # All 3 bug flag types must be available; we are in the TestProduct product. @@ -211,16 +245,21 @@ $sel->click_ok("link=Bug $bug1_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^$bug1_id .* test flags/); $sel->is_text_present_ok("SeleniumBugFlag1Test"); + # We specify //select or //input, just to be sure. This is not required, though. $sel->is_element_present_ok("//select[\@id='flag_type-$flagtype1_id']"); $sel->is_element_present_ok("//input[\@id='requestee_type-$flagtype1_id']"); + # If fields are of the correct type above, we assume this is still true below. $sel->is_text_present_ok("SeleniumBugFlag2Test"); $sel->is_element_present_ok("flag_type-$flagtype2_id"); $sel->is_element_present_ok("requestee_type-$flagtype2_id"); $sel->is_text_present_ok("SeleniumBugFlag3Test"); $sel->is_element_present_ok("flag_type-$flagtype3_id"); -ok(!$sel->is_element_present("requestee_type-$flagtype3_id"), "SeleniumBugFlag3Test is not specifically requestable"); +ok( + !$sel->is_element_present("requestee_type-$flagtype3_id"), + "SeleniumBugFlag3Test is not specifically requestable" +); # This is intentional to generate "flagmail". Some flags have a CC list # associated with them, some others don't. This is to catch crashes due to @@ -251,7 +290,10 @@ $flag3_1_id =~ s/flag-//; $sel->is_text_present_ok("addl. SeleniumBugFlag1Test"); $sel->is_text_present_ok("addl. SeleniumBugFlag2Test"); -ok(!$sel->is_text_present("addl. SeleniumBugFlag3Test"), "SeleniumBugFlag3Test is not multiplicable"); +ok( + !$sel->is_text_present("addl. SeleniumBugFlag3Test"), + "SeleniumBugFlag3Test is not multiplicable" +); $sel->select_ok("flag_type-$flagtype1_id", "label=+"); $sel->select_ok("flag_type-$flagtype2_id", "label=-"); $sel->click_ok("commit"); @@ -267,7 +309,8 @@ $sel->title_like(qr/^$bug1_id /); $sel->select_ok("flag_type-$flagtype1_id", "label=?"); $sel->type_ok("requestee_type-$flagtype1_id", $config->{admin_user_login}); $sel->select_ok("flag_type-$flagtype2_id", "label=?"); -$sel->type_ok("requestee_type-$flagtype2_id", $config->{unprivileged_user_login}); +$sel->type_ok("requestee_type-$flagtype2_id", + $config->{unprivileged_user_login}); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Flag Requestee Not Authorized"); @@ -304,7 +347,10 @@ $sel->type_ok('//input[@name="description"]', "patch, v1"); $sel->check_ok('//input[@name="ispatch"]'); $sel->is_text_present_ok("SeleniumAttachmentFlag1Test"); $sel->is_text_present_ok("SeleniumAttachmentFlag2Test"); -ok(!$sel->is_text_present("SeleniumAttachmentFlag3Test"), "Inactive SeleniumAttachmentFlag3Test flag type not displayed"); +ok( + !$sel->is_text_present("SeleniumAttachmentFlag3Test"), + "Inactive SeleniumAttachmentFlag3Test flag type not displayed" +); # Let's generate some "flagmail", first with no requestee. @@ -323,20 +369,24 @@ my $attachment1_id = $1; # Now create another attachment, and set requestees. -$sel->click_ok("//a[contains(text(),'Create\n Another Attachment to Bug $bug1_id')]"); +$sel->click_ok( + "//a[contains(text(),'Create\n Another Attachment to Bug $bug1_id')]"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Create New Attachment for Bug #$bug1_id"); $sel->attach_file('//input[@name="data"]', $config->{attachment_file}); $sel->type_ok('//input[@name="description"]', "patch, v2"); $sel->check_ok('//input[@name="ispatch"]'); + # Mark the previous attachment as obsolete. $sel->check_ok($attachment1_id); $sel->select_ok("flag_type-$aflagtype1_id", "label=?"); $sel->type_ok("requestee_type-$aflagtype1_id", $config->{admin_user_login}); $sel->select_ok("flag_type-$aflagtype2_id", "label=?"); + # The requestee is not in the Master group, and so he cannot view the bug. # He must be silently skipped from the requestee field. -$sel->type_ok("requestee_type-$aflagtype2_id", $config->{unprivileged_user_login}); +$sel->type_ok("requestee_type-$aflagtype2_id", + $config->{unprivileged_user_login}); $sel->type_ok("comment", "second patch, with requestee"); $sel->click_ok("create"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -347,13 +397,15 @@ my $attachment2_id = $1; # Create a third attachment, but we now set the MIME type manually. -$sel->click_ok("//a[contains(text(),'Create\n Another Attachment to Bug $bug1_id')]"); +$sel->click_ok( + "//a[contains(text(),'Create\n Another Attachment to Bug $bug1_id')]"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Create New Attachment for Bug #$bug1_id"); $sel->attach_file('//input[@name="data"]', $config->{attachment_file}); $sel->type_ok('//input[@name="description"]', "patch, v3"); $sel->click_ok('//input[@name="contenttypemethod" and @value="list"]'); -$sel->select_ok('//select[@name="contenttypeselection"]', "label=plain text (text/plain)"); +$sel->select_ok('//select[@name="contenttypeselection"]', + "label=plain text (text/plain)"); $sel->select_ok("flag_type-$aflagtype1_id", "label=+"); $sel->type_ok("comment", "one +, the other one blank"); $sel->click_ok("create"); @@ -368,9 +420,14 @@ my $attachment3_id = $1; $sel->click_ok("link=bug $bug1_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^$bug1_id /); -$sel->is_text_present_ok("$config->{admin_user_nick}: SeleniumAttachmentFlag1Test? ($config->{admin_user_nick})"); -$sel->is_text_present_ok("$config->{admin_user_nick}: SeleniumAttachmentFlag2Test?"); -$sel->is_text_present_ok("$config->{admin_user_nick}: SeleniumAttachmentFlag1Test+"); +$sel->is_text_present_ok( + "$config->{admin_user_nick}: SeleniumAttachmentFlag1Test? ($config->{admin_user_nick})" +); +$sel->is_text_present_ok( + "$config->{admin_user_nick}: SeleniumAttachmentFlag2Test?"); +$sel->is_text_present_ok( + "$config->{admin_user_nick}: SeleniumAttachmentFlag1Test+"); + # We marked the first attachment as obsolete, so it should have no flag on it. $sel->is_text_present_ok("no flags"); @@ -386,6 +443,7 @@ logout($sel); log_in($sel, $config, 'unprivileged'); go_to_bug($sel, $bug1_id); + # No privs are required to clear this flag. $sel->select_ok("flag-$flag3_1_id", "value=X"); $sel->click_ok("commit"); @@ -399,7 +457,8 @@ $sel->title_like(qr/^$bug1_id /); # should be displayed besides the currently set "+". my @flag_states = $sel->get_select_options("flag-$flag2_1_id"); -ok(scalar(@flag_states) == 1 && $flag_states[0] eq '+', "Single flag state '+' available"); +ok(scalar(@flag_states) == 1 && $flag_states[0] eq '+', + "Single flag state '+' available"); # Powerless users cannot set the flag to +, but setting it to ? is allowed. @@ -412,8 +471,10 @@ ok(grep($_ eq '?', @flag_states), "Flag state '?' available"); $sel->click_ok("//a[\@href='attachment.cgi?id=$attachment2_id&action=edit']"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^Attachment $attachment2_id Details for Bug $bug1_id/); -$sel->is_element_present_ok('//select[@title="attachmentflag2"][@disabled]', - "Attachment flags are not editable by a powerless user"); +$sel->is_element_present_ok( + '//select[@title="attachmentflag2"][@disabled]', + "Attachment flags are not editable by a powerless user" +); # Add an attachment and set flags on it. @@ -425,12 +486,16 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Create New Attachment for Bug #$bug1_id"); $sel->attach_file('//input[@name="data"]', $config->{attachment_file}); $sel->type_ok('//input[@name="description"]', "patch, v4"); + # This somehow fails with the current script but works when testing manually # $sel->value_is('//input[@name="ispatch"]', "on"); # canconfirm/editbugs privs are required to edit this flag. -ok(!$sel->is_editable("flag_type-$aflagtype1_id"), "Flag type non editable by powerless users"); +ok( + !$sel->is_editable("flag_type-$aflagtype1_id"), + "Flag type non editable by powerless users" +); # No privs are required to edit this flag. @@ -442,7 +507,8 @@ $sel->is_text_present_ok('regexp:Attachment #\d+ to bug \d+ created'); $sel->click_ok("link=bug $bug1_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^$bug1_id/); -$sel->is_text_present_ok("$config->{unprivileged_user_nick}: SeleniumAttachmentFlag2Test+"); +$sel->is_text_present_ok( + "$config->{unprivileged_user_nick}: SeleniumAttachmentFlag2Test+"); logout($sel); # Final tests as an admin. He has editbugs privs, so he can edit @@ -456,7 +522,8 @@ $sel->title_like(qr/^Attachment $attachment3_id Details for Bug $bug1_id/); $sel->select_ok('//select[@title="attachmentflag1"]', "label=+"); $sel->click_ok("update"); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->is_text_present_ok("Changes to attachment $attachment3_id of bug $bug1_id submitted"); +$sel->is_text_present_ok( + "Changes to attachment $attachment3_id of bug $bug1_id submitted"); # It's time to delete all created flag types. @@ -465,19 +532,26 @@ $sel->click_ok("link=Flags"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Administer Flag Types"); -foreach my $flagtype ([$flagtype1_id, "SeleniumBugFlag1Test"], [$flagtype2_id, "SeleniumBugFlag2Test"], - [$flagtype3_id, "SeleniumBugFlag3Test"], [$aflagtype1_id, "SeleniumAttachmentFlag1Test"], - [$aflagtype2_id, "SeleniumAttachmentFlag2Test"], [$aflagtype3_id, "SeleniumAttachmentFlag3Test"]) +foreach my $flagtype ( + [$flagtype1_id, "SeleniumBugFlag1Test"], + [$flagtype2_id, "SeleniumBugFlag2Test"], + [$flagtype3_id, "SeleniumBugFlag3Test"], + [$aflagtype1_id, "SeleniumAttachmentFlag1Test"], + [$aflagtype2_id, "SeleniumAttachmentFlag2Test"], + [$aflagtype3_id, "SeleniumAttachmentFlag3Test"] + ) { - my $flag_id = $flagtype->[0]; - my $flag_name = $flagtype->[1]; - $sel->click_ok("//a[\@href='editflagtypes.cgi?action=confirmdelete&id=$flag_id']"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Confirm Deletion of Flag Type '$flag_name'"); - $sel->click_ok("link=Yes, delete"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Flag Type '$flag_name' Deleted"); - my $msg = trim($sel->get_text("message")); - ok($msg eq "The flag type $flag_name has been deleted.", "Flag type $flag_name deleted"); + my $flag_id = $flagtype->[0]; + my $flag_name = $flagtype->[1]; + $sel->click_ok( + "//a[\@href='editflagtypes.cgi?action=confirmdelete&id=$flag_id']"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Confirm Deletion of Flag Type '$flag_name'"); + $sel->click_ok("link=Yes, delete"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Flag Type '$flag_name' Deleted"); + my $msg = trim($sel->get_text("message")); + ok($msg eq "The flag type $flag_name has been deleted.", + "Flag type $flag_name deleted"); } logout($sel); diff --git a/qa/t/test_flags2.t b/qa/t/test_flags2.t index 380246c9d..b2c2b58ca 100644 --- a/qa/t/test_flags2.t +++ b/qa/t/test_flags2.t @@ -32,7 +32,7 @@ $sel->title_is("Administer Flag Types"); $sel->click_ok("link=Create Flag Type for Bugs"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Create Flag Type for Bugs"); -$sel->type_ok("name", "selenium"); +$sel->type_ok("name", "selenium"); $sel->type_ok("description", "Available in TestProduct and Another Product/c1"); $sel->add_selection_ok("inclusion_to_remove", "label=__Any__:__Any__"); $sel->click_ok("categoryAction-removeInclusion"); @@ -43,7 +43,7 @@ $sel->selected_label_is("component", "__Any__"); $sel->click_ok("categoryAction-include"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Create Flag Type for Bugs"); -$sel->select_ok("product", "label=Another Product"); +$sel->select_ok("product", "label=Another Product"); $sel->select_ok("component", "label=c1"); $sel->click_ok("categoryAction-include"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -55,11 +55,11 @@ $sel->title_is("Create Flag Type for Bugs"); # catch it, not this one (which will be unique for now, so no worry to find it). $sel->type_ok("sortkey", 100); -$sel->value_is("is_active", "on"); +$sel->value_is("is_active", "on"); $sel->value_is("is_requestable", "on"); $sel->click_ok("is_multiplicable"); $sel->value_is("is_multiplicable", "off"); -$sel->select_ok("grant_group", "label=editbugs"); +$sel->select_ok("grant_group", "label=editbugs"); $sel->select_ok("request_group", "label=canconfirm"); $sel->click_ok("save"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -81,7 +81,7 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->click_ok("link=Create Flag Type For Attachments"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Create Flag Type for Attachments"); -$sel->type_ok("name", "selenium_review"); +$sel->type_ok("name", "selenium_review"); $sel->type_ok("description", "Review flag used by Selenium"); $sel->add_selection_ok("inclusion_to_remove", "label=__Any__:__Any__"); $sel->click_ok("categoryAction-removeInclusion"); @@ -92,11 +92,11 @@ $sel->click_ok("categoryAction-include"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Create Flag Type for Attachments"); $sel->type_ok("sortkey", 100); -$sel->value_is("is_active", "on"); +$sel->value_is("is_active", "on"); $sel->value_is("is_requestable", "on"); $sel->click_ok("is_multiplicable"); $sel->value_is("is_multiplicable", "off"); -$sel->selected_label_is("grant_group", "(no group)"); +$sel->selected_label_is("grant_group", "(no group)"); $sel->selected_label_is("request_group", "(no group)"); $sel->click_ok("save"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -118,17 +118,17 @@ $sel->go_back_ok(); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->click_ok("link=Create Flag Type For Attachments"); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->type_ok("name", "selenium_review"); +$sel->type_ok("name", "selenium_review"); $sel->type_ok("description", "Another review flag used by Selenium"); $sel->select_ok("product", "label=Another Product"); $sel->click_ok("categoryAction-include"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Create Flag Type for Attachments"); $sel->type_ok("sortkey", 50); -$sel->value_is("is_active", "on"); -$sel->value_is("is_requestable", "on"); +$sel->value_is("is_active", "on"); +$sel->value_is("is_requestable", "on"); $sel->value_is("is_multiplicable", "on"); -$sel->select_ok("grant_group", "label=editbugs"); +$sel->select_ok("grant_group", "label=editbugs"); $sel->select_ok("request_group", "label=canconfirm"); $sel->click_ok("save"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -147,14 +147,19 @@ my $aflagtype2_id = $1; file_bug_in_product($sel, 'TestProduct'); $sel->click_ok('//input[@value="Set bug flags"]'); $sel->select_ok("flag_type-$flagtype1_id", "label=+"); -$sel->type_ok("short_desc", "The selenium flag should be kept on product change"); +$sel->type_ok("short_desc", + "The selenium flag should be kept on product change"); $sel->type_ok("comment", "pom"); $sel->click_ok('//input[@value="Add an attachment"]'); $sel->attach_file('//input[@name="data"]', $config->{attachment_file}); $sel->type_ok('//input[@name="description"]', "small patch"); + # This somehow fails with the current script but works when testing manually # $sel->value_is('//input[@name="ispatch"]', "on"); -ok(!$sel->is_element_present("flag_type-$aflagtype1_id"), "Flag type $aflagtype1_id not available in TestProduct"); +ok( + !$sel->is_element_present("flag_type-$aflagtype1_id"), + "Flag type $aflagtype1_id not available in TestProduct" +); $sel->select_ok("flag_type-$aflagtype2_id", "label=-"); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -167,7 +172,8 @@ $sel->click_ok("link=Bug $bug1_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^$bug1_id /); $sel->is_text_present_ok("$config->{admin_user_nick}: selenium"); -my $flag1_id = $sel->get_attribute('//select[@title="Available in TestProduct and Another Product/c1"]@id'); +my $flag1_id = $sel->get_attribute( + '//select[@title="Available in TestProduct and Another Product/c1"]@id'); $flag1_id =~ s/flag-//; $sel->selected_label_is("flag-$flag1_id", "+"); $sel->is_text_present_ok("$config->{admin_user_nick}: selenium_review-"); @@ -176,7 +182,8 @@ $sel->is_text_present_ok("$config->{admin_user_nick}: selenium_review-"); # Both the bug and attachment flags should survive. $sel->select_ok("product", "label=Another Product"); -$sel->type_ok("comment", "Moving to Another Product / c1. The flag should be preserved."); +$sel->type_ok("comment", + "Moving to Another Product / c1. The flag should be preserved."); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Verify New Product Details..."); @@ -201,8 +208,12 @@ $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); $sel->click_ok("link=bug $bug1_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^$bug1_id /); -ok(!$sel->is_element_present("flag-$flag1_id"), "The selenium bug flag didn't survive"); -ok(!$sel->is_element_present("flag_type-$flagtype1_id"), "The selenium flag type doesn't exist"); +ok( + !$sel->is_element_present("flag-$flag1_id"), + "The selenium bug flag didn't survive" +); +ok(!$sel->is_element_present("flag_type-$flagtype1_id"), + "The selenium flag type doesn't exist"); $sel->is_text_present_ok("$config->{admin_user_nick}: selenium_review-"); # File a bug in 'Another Product / c2' and assign it @@ -212,12 +223,14 @@ file_bug_in_product($sel, 'Another Product'); $sel->click_ok('//input[@value="Set bug flags"]'); $sel->select_ok("component", "label=c2"); $sel->type_ok("assigned_to", $config->{unprivileged_user_login}); -ok(!$sel->is_editable("flag_type-$flagtype1_id"), "The selenium bug flag type is displayed but not selectable"); +ok(!$sel->is_editable("flag_type-$flagtype1_id"), + "The selenium bug flag type is displayed but not selectable"); $sel->select_ok("component", "label=c1"); -$sel->is_editable_ok("flag_type-$flagtype1_id", "The selenium bug flag type is not selectable"); +$sel->is_editable_ok("flag_type-$flagtype1_id", + "The selenium bug flag type is not selectable"); $sel->select_ok("flag_type-$flagtype1_id", "label=?"); $sel->type_ok("short_desc", "Create a new selenium flag for c2"); -$sel->type_ok("comment", "."); +$sel->type_ok("comment", "."); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok('has been added to the database', 'Bug created'); @@ -229,7 +242,8 @@ $sel->click_ok("link=Bug $bug2_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^$bug2_id /); $sel->is_text_present_ok("$config->{admin_user_nick}: selenium"); -my $flag2_id = $sel->get_attribute('//select[@title="Available in TestProduct and Another Product/c1"]@id'); +my $flag2_id = $sel->get_attribute( + '//select[@title="Available in TestProduct and Another Product/c1"]@id'); $flag2_id =~ s/flag-//; $sel->selected_label_is("flag-$flag2_id", '?'); @@ -243,22 +257,22 @@ $sel->title_is("Administer Flag Types"); $sel->click_ok("link=Create Flag Type for Bugs"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Create Flag Type for Bugs"); -$sel->type_ok("name", "selenium"); +$sel->type_ok("name", "selenium"); $sel->type_ok("description", "Another flag with the selenium name"); $sel->add_selection_ok("inclusion_to_remove", "label=__Any__:__Any__"); $sel->click_ok("categoryAction-removeInclusion"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Create Flag Type for Bugs"); -$sel->select_ok("product", "label=Another Product"); +$sel->select_ok("product", "label=Another Product"); $sel->select_ok("component", "label=c2"); $sel->click_ok("categoryAction-include"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Create Flag Type for Bugs"); $sel->type_ok("sortkey", 50); -$sel->value_is("is_active", "on"); -$sel->value_is("is_requestable", "on"); +$sel->value_is("is_active", "on"); +$sel->value_is("is_requestable", "on"); $sel->value_is("is_multiplicable", "on"); -$sel->selected_label_is("grant_group", "(no group)"); +$sel->selected_label_is("grant_group", "(no group)"); $sel->selected_label_is("request_group", "(no group)"); $sel->click_ok("save"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -284,7 +298,8 @@ $sel->click_ok("link=bug $bug2_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^$bug2_id /); $sel->selected_label_is("flag-$flag2_id", '?'); -ok(!$sel->is_element_present("flag_type-$flagtype1_id"), "Flag type not available in c2"); +ok(!$sel->is_element_present("flag_type-$flagtype1_id"), + "Flag type not available in c2"); $sel->is_element_present_ok("flag_type-$flagtype2_id"); logout($sel); @@ -305,7 +320,8 @@ $sel->selected_label_is("flag-$flag2_id", "+"); # as the flag setter is not in the editbugs group. $sel->select_ok("product", "label=TestProduct"); -$sel->type_ok("comment", "selenium flag will be lost. I don't have editbugs privs."); +$sel->type_ok("comment", + "selenium flag will be lost. I don't have editbugs privs."); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Verify New Product Details..."); @@ -316,8 +332,12 @@ $sel->click_ok("link=bug $bug2_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^$bug2_id /); ok(!$sel->is_element_present("flag-$flag2_id"), "Flag $flag2_id deleted"); -ok(!$sel->is_editable("flag_type-$flagtype1_id"), "Flag type 'selenium' not editable by powerless users"); -ok(!$sel->is_element_present("flag_type-$flagtype2_id"), "Flag type not available in c1"); +ok( + !$sel->is_editable("flag_type-$flagtype1_id"), + "Flag type 'selenium' not editable by powerless users" +); +ok(!$sel->is_element_present("flag_type-$flagtype2_id"), + "Flag type not available in c1"); logout($sel); # Time to delete created flag types. @@ -328,18 +348,24 @@ $sel->click_ok("link=Flags"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Administer Flag Types"); -foreach my $flagtype ([$flagtype1_id, "selenium"], [$flagtype2_id, "selenium"], - [$aflagtype1_id, "selenium_review"], [$aflagtype2_id, "selenium_review"]) +foreach my $flagtype ( + [$flagtype1_id, "selenium"], + [$flagtype2_id, "selenium"], + [$aflagtype1_id, "selenium_review"], + [$aflagtype2_id, "selenium_review"] + ) { - my $flag_id = $flagtype->[0]; - my $flag_name = $flagtype->[1]; - $sel->click_ok("//a[\@href='editflagtypes.cgi?action=confirmdelete&id=$flag_id']"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Confirm Deletion of Flag Type '$flag_name'"); - $sel->click_ok("link=Yes, delete"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Flag Type '$flag_name' Deleted"); - my $msg = trim($sel->get_text("message")); - ok($msg eq "The flag type $flag_name has been deleted.", "Flag type $flag_name deleted"); + my $flag_id = $flagtype->[0]; + my $flag_name = $flagtype->[1]; + $sel->click_ok( + "//a[\@href='editflagtypes.cgi?action=confirmdelete&id=$flag_id']"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Confirm Deletion of Flag Type '$flag_name'"); + $sel->click_ok("link=Yes, delete"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Flag Type '$flag_name' Deleted"); + my $msg = trim($sel->get_text("message")); + ok($msg eq "The flag type $flag_name has been deleted.", + "Flag type $flag_name deleted"); } logout($sel); diff --git a/qa/t/test_groups.t b/qa/t/test_groups.t index eab30125f..96829faff 100644 --- a/qa/t/test_groups.t +++ b/qa/t/test_groups.t @@ -25,8 +25,8 @@ $sel->title_is("Edit Groups"); $sel->click_ok("link=Add Group"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Add group"); -$sel->type_ok("name", "Selenium-test"); -$sel->type_ok("desc", "Test group for Selenium"); +$sel->type_ok("name", "Selenium-test"); +$sel->type_ok("desc", "Test group for Selenium"); $sel->type_ok("owner", $config->{'admin_user_login'}); $sel->check_ok("isactive"); $sel->uncheck_ok("insertnew"); @@ -43,7 +43,7 @@ $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Edit Group Controls for TestProduct"); $sel->is_text_present_ok("Selenium-test"); $sel->select_ok("membercontrol_${group_id}", "label=Shown"); -$sel->select_ok("othercontrol_${group_id}", "label=Mandatory"); +$sel->select_ok("othercontrol_${group_id}", "label=Mandatory"); $sel->click_ok("submit"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Update group access controls for TestProduct"); @@ -52,17 +52,18 @@ $sel->title_is("Update group access controls for TestProduct"); file_bug_in_product($sel, "TestProduct"); $sel->is_text_present_ok("Test group for Selenium"); -$sel->value_is("group_${group_id}", "off"); # Must be OFF (else that's a bug) +$sel->value_is("group_${group_id}", "off"); # Must be OFF (else that's a bug) $sel->check_ok("group_${group_id}"); $sel->type_ok("short_desc", "bug restricted to the Selenium group"); -$sel->type_ok("comment", "should be invisible"); +$sel->type_ok("comment", "should be invisible"); $sel->selected_label_is("component", "TestComponent"); $sel->click_ok("commit"); $sel->wait_for_page_to_load(WAIT_TIME); my $bug1_id = $sel->get_value('//input[@name="id" and @type="hidden"]'); -$sel->is_text_present_ok('has been added to the database', "Bug $bug1_id created"); +$sel->is_text_present_ok('has been added to the database', + "Bug $bug1_id created"); $sel->is_text_present_ok("Test group for Selenium"); -$sel->value_is("group_${group_id}", "on"); # Must be ON +$sel->value_is("group_${group_id}", "on"); # Must be ON # Look for this new bug and add it to the new "Selenium bugs" saved search. @@ -88,7 +89,8 @@ $sel->click_ok("link=Selenium bugs"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Bug List: Selenium bugs"); $sel->is_text_present_ok("One bug found"); -$sel->is_element_present_ok("b$bug1_id", undef, "Bug $bug1_id restricted to the bug group"); +$sel->is_element_present_ok("b$bug1_id", undef, + "Bug $bug1_id restricted to the bug group"); # No longer use Selenium-test as a bug group. @@ -111,13 +113,17 @@ $sel->is_text_present_ok("The group will no longer be used for bugs"); file_bug_in_product($sel, "TestProduct"); $sel->selected_label_is("component", "TestComponent"); $sel->type_ok("short_desc", "bug restricted to the Selenium group"); -$sel->type_ok("comment", "should be *visible* when created (the group is disabled)"); -ok(!$sel->is_text_present("Test group for Selenium"), "Selenium-test group unavailable"); -ok(!$sel->is_element_present("group_${group_id}"), "Selenium-test checkbox not present"); +$sel->type_ok("comment", + "should be *visible* when created (the group is disabled)"); +ok(!$sel->is_text_present("Test group for Selenium"), + "Selenium-test group unavailable"); +ok(!$sel->is_element_present("group_${group_id}"), + "Selenium-test checkbox not present"); $sel->click_ok("commit"); $sel->wait_for_page_to_load(WAIT_TIME); my $bug2_id = $sel->get_value("//input[\@name='id' and \@type='hidden']"); -$sel->is_text_present_ok('has been added to the database', "Bug $bug2_id created"); +$sel->is_text_present_ok('has been added to the database', + "Bug $bug2_id created"); # Make sure the new bug doesn't appear in the "Selenium bugs" saved search. @@ -125,8 +131,12 @@ $sel->click_ok("link=Selenium bugs"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Bug List: Selenium bugs"); $sel->is_text_present_ok("One bug found"); -$sel->is_element_present_ok("b$bug1_id", undef, "Bug $bug1_id restricted to the bug group"); -ok(!$sel->is_element_present("b$bug2_id"), "Bug $bug2_id NOT restricted to the bug group"); +$sel->is_element_present_ok("b$bug1_id", undef, + "Bug $bug1_id restricted to the bug group"); +ok( + !$sel->is_element_present("b$bug2_id"), + "Bug $bug2_id NOT restricted to the bug group" +); # Re-enable the Selenium-test group as bug group. This doesn't affect # already filed bugs as this group is not mandatory. @@ -151,8 +161,12 @@ $sel->click_ok("link=Selenium bugs"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Bug List: Selenium bugs"); $sel->is_text_present_ok("One bug found"); -$sel->is_element_present_ok("b$bug1_id", undef, "Bug $bug1_id restricted to the bug group"); -ok(!$sel->is_element_present("b$bug2_id"), "Bug $bug2_id NOT restricted to the bug group"); +$sel->is_element_present_ok("b$bug1_id", undef, + "Bug $bug1_id restricted to the bug group"); +ok( + !$sel->is_element_present("b$bug2_id"), + "Bug $bug2_id NOT restricted to the bug group" +); # Make the Selenium-test group mandatory for TestProduct. @@ -168,37 +182,49 @@ $sel->is_text_present_ok("the group is newly mandatory and will be added"); $sel->click_ok("update"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Update group access controls for TestProduct"); -$sel->is_text_present_ok('regexp:Adding bugs to group \'Selenium-test\' which is\W+mandatory for this product'); +$sel->is_text_present_ok( + 'regexp:Adding bugs to group \'Selenium-test\' which is\W+mandatory for this product' +); # All bugs being in TestProduct must now be restricted to the bug group. $sel->click_ok("link=Selenium bugs"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Bug List: Selenium bugs"); -$sel->is_element_present_ok("b$bug1_id", undef, "Bug $bug1_id restricted to the bug group"); -$sel->is_element_present_ok("b$bug2_id", undef, "Bug $bug2_id restricted to the bug group"); +$sel->is_element_present_ok("b$bug1_id", undef, + "Bug $bug1_id restricted to the bug group"); +$sel->is_element_present_ok("b$bug2_id", undef, + "Bug $bug2_id restricted to the bug group"); # File a new bug, which must automatically be restricted to the bug group. file_bug_in_product($sel, "TestProduct"); $sel->selected_label_is("component", "TestComponent"); $sel->type_ok("short_desc", "Selenium-test group mandatory"); -$sel->type_ok("comment", "group enabled"); -ok(!$sel->is_text_present("Test group for Selenium"), "Selenium-test group not available"); -ok(!$sel->is_element_present("group_${group_id}"), "Selenium-test checkbox not present (mandatory group)"); +$sel->type_ok("comment", "group enabled"); +ok(!$sel->is_text_present("Test group for Selenium"), + "Selenium-test group not available"); +ok( + !$sel->is_element_present("group_${group_id}"), + "Selenium-test checkbox not present (mandatory group)" +); $sel->click_ok("commit"); $sel->wait_for_page_to_load(WAIT_TIME); my $bug3_id = $sel->get_value("//input[\@name='id' and \@type='hidden']"); -$sel->is_text_present_ok('has been added to the database', "Bug $bug3_id created"); +$sel->is_text_present_ok('has been added to the database', + "Bug $bug3_id created"); # Make sure all three bugs are listed as being restricted to the bug group. $sel->click_ok("link=Selenium bugs"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Bug List: Selenium bugs"); -$sel->is_element_present_ok("b$bug1_id", undef, "Bug $bug1_id restricted to the bug group"); -$sel->is_element_present_ok("b$bug2_id", undef, "Bug $bug2_id restricted to the bug group"); -$sel->is_element_present_ok("b$bug3_id", undef, "Bug $bug3_id restricted to the bug group"); +$sel->is_element_present_ok("b$bug1_id", undef, + "Bug $bug1_id restricted to the bug group"); +$sel->is_element_present_ok("b$bug2_id", undef, + "Bug $bug2_id restricted to the bug group"); +$sel->is_element_present_ok("b$bug3_id", undef, + "Bug $bug3_id restricted to the bug group"); # Turn off the Selenium-test group again. @@ -221,23 +247,32 @@ $sel->is_text_present_ok("The group will no longer be used for bugs"); file_bug_in_product($sel, "TestProduct"); $sel->selected_label_is("component", "TestComponent"); $sel->type_ok("short_desc", "bug restricted to the Selenium-test group"); -$sel->type_ok("comment", "group disabled"); -ok(!$sel->is_text_present("Test group for Selenium"), "Selenium-test group not available"); -ok(!$sel->is_element_present("group_${group_id}"), "Selenium-test checkbox not present"); +$sel->type_ok("comment", "group disabled"); +ok(!$sel->is_text_present("Test group for Selenium"), + "Selenium-test group not available"); +ok(!$sel->is_element_present("group_${group_id}"), + "Selenium-test checkbox not present"); $sel->click_ok("commit"); $sel->wait_for_page_to_load(WAIT_TIME); my $bug4_id = $sel->get_value("//input[\@name='id' and \@type='hidden']"); -$sel->is_text_present_ok('has been added to the database', "Bug $bug4_id created"); +$sel->is_text_present_ok('has been added to the database', + "Bug $bug4_id created"); # The last bug must not be in the list. $sel->click_ok("link=Selenium bugs"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Bug List: Selenium bugs"); -$sel->is_element_present_ok("b$bug1_id", undef, "Bug $bug1_id restricted to the bug group"); -$sel->is_element_present_ok("b$bug2_id", undef, "Bug $bug2_id restricted to the bug group"); -$sel->is_element_present_ok("b$bug3_id", undef, "Bug $bug3_id restricted to the bug group"); -ok(!$sel->is_element_present("b$bug4_id"), "Bug $bug4_id NOT restricted to the bug group"); +$sel->is_element_present_ok("b$bug1_id", undef, + "Bug $bug1_id restricted to the bug group"); +$sel->is_element_present_ok("b$bug2_id", undef, + "Bug $bug2_id restricted to the bug group"); +$sel->is_element_present_ok("b$bug3_id", undef, + "Bug $bug3_id restricted to the bug group"); +ok( + !$sel->is_element_present("b$bug4_id"), + "Bug $bug4_id NOT restricted to the bug group" +); # Re-enable the mandatory group. All bugs should be restricted to this bug group automatically. @@ -260,10 +295,14 @@ $sel->is_text_present_ok("The group will now be used for bugs"); $sel->click_ok("link=Selenium bugs"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Bug List: Selenium bugs"); -$sel->is_element_present_ok("b$bug1_id", undef, "Bug $bug1_id restricted to the bug group"); -$sel->is_element_present_ok("b$bug2_id", undef, "Bug $bug2_id restricted to the bug group"); -$sel->is_element_present_ok("b$bug3_id", undef, "Bug $bug3_id restricted to the bug group"); -$sel->is_element_present_ok("b$bug4_id", undef, "Bug $bug4_id restricted to the bug group"); +$sel->is_element_present_ok("b$bug1_id", undef, + "Bug $bug1_id restricted to the bug group"); +$sel->is_element_present_ok("b$bug2_id", undef, + "Bug $bug2_id restricted to the bug group"); +$sel->is_element_present_ok("b$bug3_id", undef, + "Bug $bug3_id restricted to the bug group"); +$sel->is_element_present_ok("b$bug4_id", undef, + "Bug $bug4_id restricted to the bug group"); # Try to remove the Selenium-test group from TestProduct, but DON'T do it! # We just want to make sure a warning is displayed about this removal. @@ -275,11 +314,12 @@ $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Edit Group Controls for TestProduct"); $sel->is_text_present_ok("Selenium-test"); $sel->select_ok("membercontrol_${group_id}", "NA"); -$sel->select_ok("othercontrol_${group_id}", "NA"); +$sel->select_ok("othercontrol_${group_id}", "NA"); $sel->click_ok("submit"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Confirm Group Control Change for product 'TestProduct'"); -$sel->is_text_present_ok("the group is no longer applicable and will be removed"); +$sel->is_text_present_ok( + "the group is no longer applicable and will be removed"); # Delete the Selenium-test group. @@ -301,7 +341,8 @@ $sel->click_ok("delete"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Cannot Delete Group"); my $error_msg = trim($sel->get_text("error_msg")); -ok($error_msg =~ /^The Selenium-test group cannot be deleted/, "Group is in use - not deletable"); +ok($error_msg =~ /^The Selenium-test group cannot be deleted/, + "Group is in use - not deletable"); $sel->go_back_ok(); $sel->wait_for_page_to_load(WAIT_TIME); $sel->check("removebugs"); diff --git a/qa/t/test_keywords.t b/qa/t/test_keywords.t index 0edffcc2f..da199b9c5 100644 --- a/qa/t/test_keywords.t +++ b/qa/t/test_keywords.t @@ -29,18 +29,18 @@ $sel->title_is("Select keyword"); # If keywords already exist, delete them to not disturb the test. -my $page = $sel->get_body_text(); +my $page = $sel->get_body_text(); my @keywords = $page =~ m/(key-selenium-\w+)/gi; foreach my $keyword (@keywords) { - my $url = $sel->get_attribute("link=$keyword\@href"); - $url =~ s/action=edit/action=del/; - $sel->click_ok("//a[\@href='$url']"); - $sel->wait_for_page_to_load(WAIT_TIME); - $sel->title_is("Delete Keyword"); - $sel->click_ok("delete"); - $sel->wait_for_page_to_load(WAIT_TIME); - $sel->title_is("Keyword Deleted"); + my $url = $sel->get_attribute("link=$keyword\@href"); + $url =~ s/action=edit/action=del/; + $sel->click_ok("//a[\@href='$url']"); + $sel->wait_for_page_to_load(WAIT_TIME); + $sel->title_is("Delete Keyword"); + $sel->click_ok("delete"); + $sel->wait_for_page_to_load(WAIT_TIME); + $sel->title_is("Keyword Deleted"); } # Now let's create our first keyword. @@ -52,7 +52,7 @@ $sel->title_is("Select keyword"); $sel->click_ok("link=Add a new keyword"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Add keyword"); -$sel->type_ok("name", "key-selenium-kone"); +$sel->type_ok("name", "key-selenium-kone"); $sel->type_ok("description", "Hopefully an ice cream"); $sel->click_ok("create"); $sel->wait_for_page_to_load(WAIT_TIME); @@ -63,19 +63,20 @@ $sel->title_is("New Keyword Created"); $sel->click_ok("link=Add a new keyword"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Add keyword"); -$sel->type_ok("name", "key-selenium-kone"); +$sel->type_ok("name", "key-selenium-kone"); $sel->type_ok("description", "FIX ME!"); $sel->click_ok("create"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Keyword Already Exists"); my $error_msg = trim($sel->get_text("error_msg")); -ok($error_msg eq 'A keyword with the name key-selenium-kone already exists.', 'Already created keyword'); +ok($error_msg eq 'A keyword with the name key-selenium-kone already exists.', + 'Already created keyword'); $sel->go_back_ok(); $sel->wait_for_page_to_load(WAIT_TIME); # Create a second keyword. -$sel->type_ok("name", "key-selenium-ktwo"); +$sel->type_ok("name", "key-selenium-ktwo"); $sel->type_ok("description", "FIX ME!"); $sel->click_ok("create"); $sel->wait_for_page_to_load(WAIT_TIME); @@ -86,13 +87,14 @@ $sel->title_is("New Keyword Created"); $sel->click_ok("link=key-selenium-ktwo"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Edit keyword"); -$sel->type_ok("name", "key-selenium-kone"); +$sel->type_ok("name", "key-selenium-kone"); $sel->type_ok("description", "the second keyword"); $sel->click_ok("update"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Keyword Already Exists"); $error_msg = trim($sel->get_text("error_msg")); -ok($error_msg eq 'A keyword with the name key-selenium-kone already exists.', 'Already created keyword'); +ok($error_msg eq 'A keyword with the name key-selenium-kone already exists.', + 'Already created keyword'); $sel->go_back_ok(); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Edit keyword"); @@ -104,6 +106,7 @@ $sel->title_is("Keyword Updated"); # Add keywords to bugs go_to_bug($sel, $test_bug_1); + # If another script is playing with keywords too, don't mess with it. my $kw1 = $sel->get_text("keywords"); $sel->type_ok("keywords", "$kw1, key-selenium-kone"); @@ -133,6 +136,7 @@ $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Search for bugs"); $sel->remove_all_selections("product"); $sel->remove_all_selections("bug_status"); + # Try with a different case than the one in the DB. $sel->type_ok("keywords", "key-selenium-ktWO"); $sel->click_ok("Search"); @@ -145,6 +149,7 @@ $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Search for bugs"); $sel->remove_all_selections("product"); $sel->remove_all_selections("bug_status"); + # Bugzilla doesn't allow substrings for keywords. $sel->type_ok("keywords", "selen"); $sel->click_ok("Search"); diff --git a/qa/t/test_login.t b/qa/t/test_login.t index 45bf1408f..2d8cc4217 100644 --- a/qa/t/test_login.t +++ b/qa/t/test_login.t @@ -23,8 +23,9 @@ my ($sel, $config) = get_selenium(); $sel->open_ok("/$config->{bugzilla_installation}/editparams.cgi"); $sel->title_is("Log in to Bugzilla"); + # The login and password are hardcoded here, because this account doesn't exist. -$sel->type_ok("Bugzilla_login", 'guest@foo.com'); +$sel->type_ok("Bugzilla_login", 'guest@foo.com'); $sel->type_ok("Bugzilla_password", 'foo-bar-baz'); $sel->click_ok("log_in"); $sel->wait_for_page_to_load_ok(WAIT_TIME); diff --git a/qa/t/test_milestones.t b/qa/t/test_milestones.t index e55bd5ca4..a7860879d 100644 --- a/qa/t/test_milestones.t +++ b/qa/t/test_milestones.t @@ -18,25 +18,33 @@ my ($sel, $config) = get_selenium(); # 1st step: turn on usetargetmilestone, musthavemilestoneonaccept and letsubmitterchoosemilestone. log_in($sel, $config, 'admin'); -set_parameters($sel, {'Bug Fields' => {'usetargetmilestone-on' => undef}, - 'Bug Change Policies' => {'musthavemilestoneonaccept-on' => undef, - 'letsubmitterchoosemilestone-on' => undef}, - } - ); +set_parameters( + $sel, + { + 'Bug Fields' => {'usetargetmilestone-on' => undef}, + 'Bug Change Policies' => { + 'musthavemilestoneonaccept-on' => undef, + 'letsubmitterchoosemilestone-on' => undef + }, + } +); # 2nd step: Add the milestone "2.0" (with sortkey = 10) to the TestProduct product. edit_product($sel, "TestProduct"); -$sel->click_ok("link=Edit milestones:", undef, "Go to the Edit milestones page"); +$sel->click_ok("link=Edit milestones:", undef, + "Go to the Edit milestones page"); $sel->wait_for_page_to_load(WAIT_TIME); -$sel->title_is("Select milestone of product 'TestProduct'", "Display milestones"); +$sel->title_is("Select milestone of product 'TestProduct'", + "Display milestones"); $sel->click_ok("link=Add", undef, "Go add a new milestone"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Add Milestone to Product 'TestProduct'", "Enter new milestone"); $sel->type_ok("milestone", "2.0", "Set its name to 2.0"); -$sel->type_ok("sortkey", "10", "Set its sortkey to 10"); +$sel->type_ok("sortkey", "10", "Set its sortkey to 10"); $sel->click_ok("create", undef, "Submit data"); $sel->wait_for_page_to_load(WAIT_TIME); + # If the milestone already exists, that's not a big deal. So no special action # is required in this case. $sel->title_is("Milestone Created", "Milestone Created"); @@ -44,26 +52,45 @@ $sel->title_is("Milestone Created", "Milestone Created"); # 3rd step: file a new bug, leaving the milestone alone (should fall back to the default one). file_bug_in_product($sel, "TestProduct"); -$sel->selected_label_is("component", "TestComponent", "Component already selected (no other component defined)"); -$sel->selected_label_is("target_milestone", "---", "Default milestone selected"); -$sel->selected_label_is("version", "unspecified", "Version already selected (no other version defined)"); -$sel->type_ok("short_desc", "Target Milestone left to default", "Enter bug summary"); -$sel->type_ok("comment", "Created by Selenium to test 'musthavemilestoneonaccept'", "Enter bug description"); +$sel->selected_label_is("component", "TestComponent", + "Component already selected (no other component defined)"); +$sel->selected_label_is("target_milestone", "---", + "Default milestone selected"); +$sel->selected_label_is("version", "unspecified", + "Version already selected (no other version defined)"); +$sel->type_ok( + "short_desc", + "Target Milestone left to default", + "Enter bug summary" +); +$sel->type_ok( + "comment", + "Created by Selenium to test 'musthavemilestoneonaccept'", + "Enter bug description" +); $sel->click_ok("commit", undef, "Commit bug data to post_bug.cgi"); $sel->wait_for_page_to_load(WAIT_TIME); my $bug1_id = $sel->get_value("//input[\@name='id' and \@type='hidden']"); -$sel->is_text_present_ok('has been added to the database', "Bug $bug1_id created"); +$sel->is_text_present_ok('has been added to the database', + "Bug $bug1_id created"); # 4th step: edit the bug (test musthavemilestoneonaccept ON). -$sel->select_ok("bug_status", "label=IN_PROGRESS", "Change bug status to IN_PROGRESS"); +$sel->select_ok("bug_status", "label=IN_PROGRESS", + "Change bug status to IN_PROGRESS"); $sel->click_ok("commit", undef, "Save changes"); $sel->wait_for_page_to_load(WAIT_TIME); -$sel->title_is("Milestone Required", "Change rejected: musthavemilestoneonaccept is on but the milestone selected is the default one"); -$sel->is_text_present_ok("You must select a target milestone", undef, "Display error message"); +$sel->title_is( + "Milestone Required", + "Change rejected: musthavemilestoneonaccept is on but the milestone selected is the default one" +); +$sel->is_text_present_ok("You must select a target milestone", + undef, "Display error message"); + # We cannot use go_back_ok() because we just left post_bug.cgi where data has been submitted using POST. go_to_bug($sel, $bug1_id); -$sel->select_ok("target_milestone", "label=2.0", "Select a non-default milestone"); +$sel->select_ok("target_milestone", "label=2.0", + "Select a non-default milestone"); $sel->click_ok("commit", undef, "Save changes (2nd attempt)"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); @@ -72,14 +99,25 @@ $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); file_bug_in_product($sel, "TestProduct"); $sel->select_ok("target_milestone", "label=2.0", "Set the milestone to 2.0"); -$sel->selected_label_is("component", "TestComponent", "Component already selected (no other component defined)"); -$sel->selected_label_is("version", "unspecified", "Version already selected (no other version defined)"); -$sel->type_ok("short_desc", "Target Milestone set to non-default", "Enter bug summary"); -$sel->type_ok("comment", "Created by Selenium to test 'musthavemilestoneonaccept'", "Enter bug description"); +$sel->selected_label_is("component", "TestComponent", + "Component already selected (no other component defined)"); +$sel->selected_label_is("version", "unspecified", + "Version already selected (no other version defined)"); +$sel->type_ok( + "short_desc", + "Target Milestone set to non-default", + "Enter bug summary" +); +$sel->type_ok( + "comment", + "Created by Selenium to test 'musthavemilestoneonaccept'", + "Enter bug description" +); $sel->click_ok("commit", undef, "Commit bug data to post_bug.cgi"); $sel->wait_for_page_to_load(WAIT_TIME); my $bug2_id = $sel->get_value("//input[\@name='id' and \@type='hidden']"); -$sel->is_text_present_ok('has been added to the database', "Bug $bug2_id created"); +$sel->is_text_present_ok('has been added to the database', + "Bug $bug2_id created"); # 6th step: edit the bug (test musthavemilestoneonaccept ON). @@ -115,7 +153,8 @@ $sel->click_ok("create"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Invalid Milestone Sortkey"); my $error_msg = trim($sel->get_text("error_msg")); -ok($error_msg =~ /^The sortkey '99999999999999999' is not in the range/, "Invalid sortkey"); +ok($error_msg =~ /^The sortkey '99999999999999999' is not in the range/, + "Invalid sortkey"); $sel->go_back_ok(); $sel->wait_for_page_to_load(WAIT_TIME); $sel->type_ok("sortkey", "-polu7A"); @@ -124,7 +163,8 @@ $sel->click_ok("create"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Invalid Milestone Sortkey"); $error_msg = trim($sel->get_text("error_msg")); -ok($error_msg =~ /^The sortkey '-polu7A' is not in the range/, "Invalid sortkey"); +ok($error_msg =~ /^The sortkey '-polu7A' is not in the range/, + "Invalid sortkey"); $sel->go_back_ok(); $sel->wait_for_page_to_load(WAIT_TIME); $sel->click_ok("link='TestProduct'"); @@ -133,7 +173,8 @@ $sel->title_is("Select milestone of product 'TestProduct'"); $sel->click_ok("link=Delete"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Delete Milestone of Product 'TestProduct'"); -$sel->is_text_present_ok("When you delete this milestone", undef, "Warn the user about bugs being affected"); +$sel->is_text_present_ok("When you delete this milestone", + undef, "Warn the user about bugs being affected"); $sel->click_ok("delete"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Milestone Deleted"); @@ -142,19 +183,30 @@ $sel->title_is("Milestone Deleted"); $sel->open_ok("/$config->{bugzilla_installation}/show_bug.cgi?id=$bug1_id"); $sel->title_like(qr/^$bug1_id/); -$sel->is_text_present_ok('regexp:Target Milestone:\W+---', undef, "Milestone has fallen back to the default milestone"); +$sel->is_text_present_ok('regexp:Target Milestone:\W+---', + undef, "Milestone has fallen back to the default milestone"); # 9th step: file another bug. file_bug_in_product($sel, "TestProduct"); -$sel->selected_label_is("target_milestone", "---", "Default milestone selected"); +$sel->selected_label_is("target_milestone", "---", + "Default milestone selected"); $sel->selected_label_is("component", "TestComponent"); -$sel->type_ok("short_desc", "Only one Target Milestone available", "Enter bug summary"); -$sel->type_ok("comment", "Created by Selenium to test 'musthavemilestoneonaccept'", "Enter bug description"); +$sel->type_ok( + "short_desc", + "Only one Target Milestone available", + "Enter bug summary" +); +$sel->type_ok( + "comment", + "Created by Selenium to test 'musthavemilestoneonaccept'", + "Enter bug description" +); $sel->click_ok("commit", undef, "Commit bug data to post_bug.cgi"); $sel->wait_for_page_to_load(WAIT_TIME); my $bug3_id = $sel->get_value("//input[\@name='id' and \@type='hidden']"); -$sel->is_text_present_ok('has been added to the database', "Bug $bug3_id created"); +$sel->is_text_present_ok('has been added to the database', + "Bug $bug3_id created"); # 10th step: musthavemilestoneonaccept must have no effect as there is # no other milestone available besides the default one. @@ -166,5 +218,6 @@ $sel->is_text_present_ok("Changes submitted for bug $bug3_id"); # 11th step: turn musthavemilestoneonaccept back to OFF. -set_parameters($sel, {'Bug Change Policies' => {'musthavemilestoneonaccept-off' => undef}}); +set_parameters($sel, + {'Bug Change Policies' => {'musthavemilestoneonaccept-off' => undef}}); logout($sel); diff --git a/qa/t/test_private_attachments.t b/qa/t/test_private_attachments.t index 9a6e8d54d..c7896007c 100644 --- a/qa/t/test_private_attachments.t +++ b/qa/t/test_private_attachments.t @@ -21,16 +21,22 @@ my ($sel, $config) = get_selenium(CHROME_MODE); # we can view and delete attachments. log_in($sel, $config, 'admin'); -set_parameters($sel, { "Group Security" => {"insidergroup" => {type => "select", value => "admin"}}, - "Attachments" => {"allow_attachment_display-on" => undef, - "allow_attachment_deletion-on" => undef} - }); +set_parameters( + $sel, + { + "Group Security" => {"insidergroup" => {type => "select", value => "admin"}}, + "Attachments" => { + "allow_attachment_display-on" => undef, + "allow_attachment_deletion-on" => undef + } + } +); # First create a new bug with a private attachment. file_bug_in_product($sel, "TestProduct"); $sel->type_ok("short_desc", "Some comments are private"); -$sel->type_ok("comment", "and some attachments too, like this one."); +$sel->type_ok("comment", "and some attachments too, like this one."); $sel->check_ok("comment_is_private"); $sel->click_ok('//input[@value="Add an attachment"]'); $sel->attach_file('//input[@name="data"]', $config->{attachment_file}); @@ -42,7 +48,8 @@ $sel->is_text_present_ok('has been added to the database', 'Bug created'); my $bug1_id = $sel->get_value('//input[@name="id" and @type="hidden"]'); $sel->is_text_present_ok("private attachment, v1 ("); $sel->is_text_present_ok("and some attachments too, like this one."); -$sel->is_checked_ok('//a[@id="comment_link_0"]/../..//div//input[@type="checkbox"]'); +$sel->is_checked_ok( + '//a[@id="comment_link_0"]/../..//div//input[@type="checkbox"]'); # Now attach a public patch to the existing bug. @@ -52,6 +59,7 @@ $sel->title_is("Create New Attachment for Bug #$bug1_id"); $sel->attach_file('//input[@name="data"]', $config->{attachment_file}); $sel->type_ok('//input[@name="description"]', "public attachment, v2"); $sel->check_ok('//input[@name="ispatch"]'); + # The existing attachment name must be displayed, to mark it as obsolete. $sel->is_text_present_ok("private attachment, v1"); $sel->type_ok("comment", "this patch is public. Everyone can see it."); @@ -73,31 +81,39 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^$bug1_id/); $sel->is_text_present_ok("public attachment, v2"); $sel->is_text_present_ok("this patch is public. Everyone can see it."); -ok(!$sel->is_checked('//a[@id="comment_link_1"]/../..//div//input[@type="checkbox"]'), "Public attachment is visible"); +ok( + !$sel->is_checked( + '//a[@id="comment_link_1"]/../..//div//input[@type="checkbox"]'), + "Public attachment is visible" +); logout($sel); # A logged out user cannot see the private attachment, only the public one. # Same for a user with no privs. foreach my $user ('', 'unprivileged') { - log_in($sel, $config, $user) if $user; - go_to_bug($sel, $bug1_id); - ok(!$sel->is_text_present("private attachment, v1"), "Private attachment not visible"); - $sel->is_text_present_ok("public attachment, v2"); - ok(!$sel->is_text_present("and some attachments too, like this one"), "Private comment not visible"); - $sel->is_text_present_ok("this patch is public. Everyone can see it."); + log_in($sel, $config, $user) if $user; + go_to_bug($sel, $bug1_id); + ok(!$sel->is_text_present("private attachment, v1"), + "Private attachment not visible"); + $sel->is_text_present_ok("public attachment, v2"); + ok(!$sel->is_text_present("and some attachments too, like this one"), + "Private comment not visible"); + $sel->is_text_present_ok("this patch is public. Everyone can see it."); } # A powerless user can comment on attachments he doesn't own. -$sel->click_ok('//a[@href="attachment.cgi?id=' . $attachment1_id . '&action=edit"]'); +$sel->click_ok( + '//a[@href="attachment.cgi?id=' . $attachment1_id . '&action=edit"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^Attachment $attachment1_id Details for Bug $bug1_id/); $sel->is_text_present_ok("created by QA Admin"); $sel->type_ok("comment", "This attachment is not mine."); $sel->click_ok("update"); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->is_text_present_ok("Changes to attachment $attachment1_id of bug $bug1_id submitted"); +$sel->is_text_present_ok( + "Changes to attachment $attachment1_id of bug $bug1_id submitted"); $sel->click_ok("link=bug $bug1_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^$bug1_id/); @@ -111,14 +127,17 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Create New Attachment for Bug #$bug1_id"); $sel->attach_file('//input[@name="data"]', $config->{attachment_file}); $sel->check_ok('//input[@name="ispatch"]'); + # The user doesn't have editbugs privs. $sel->is_text_present_ok("[no attachments can be made obsolete]"); -$sel->type_ok('//input[@name="description"]', "My patch, which I should see, always"); +$sel->type_ok('//input[@name="description"]', + "My patch, which I should see, always"); $sel->type_ok("comment", "This is my patch!"); $sel->click_ok("create"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok('regexp:Attachment #\d+ to bug \d+ created'); -$alink = $sel->get_attribute('//a[@title="My patch, which I should see, always"]@href'); +$alink = $sel->get_attribute( + '//a[@title="My patch, which I should see, always"]@href'); $alink =~ /id=(\d+)/; my $attachment2_id = $1; $sel->click_ok("link=bug $bug1_id"); @@ -132,29 +151,39 @@ logout($sel); log_in($sel, $config, 'admin'); go_to_bug($sel, $bug1_id); -$sel->click_ok('//a[@href="attachment.cgi?id=' . $attachment2_id . '&action=edit"]'); +$sel->click_ok( + '//a[@href="attachment.cgi?id=' . $attachment2_id . '&action=edit"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^Attachment $attachment2_id Details for Bug $bug1_id/); $sel->check_ok("isprivate"); $sel->type_ok("comment", "Making the powerless user's patch private."); $sel->click_ok("update"); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->is_text_present_ok("Changes to attachment $attachment2_id of bug $bug1_id submitted"); +$sel->is_text_present_ok( + "Changes to attachment $attachment2_id of bug $bug1_id submitted"); $sel->click_ok("link=bug $bug1_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^$bug1_id/); $sel->is_text_present_ok("My patch, which I should see, always ("); -$sel->is_checked_ok('//a[@id="comment_link_4"]/../..//div//input[@type="checkbox"]'); +$sel->is_checked_ok( + '//a[@id="comment_link_4"]/../..//div//input[@type="checkbox"]'); $sel->is_text_present_ok("Making the powerless user's patch private."); logout($sel); # A logged out user cannot see private attachments. go_to_bug($sel, $bug1_id); -ok(!$sel->is_text_present("private attachment, v1"), "Private attachment not visible to logged out users"); -ok(!$sel->is_text_present("My patch, which I should see, always ("), "Private attachment not visible to logged out users"); +ok( + !$sel->is_text_present("private attachment, v1"), + "Private attachment not visible to logged out users" +); +ok( + !$sel->is_text_present("My patch, which I should see, always ("), + "Private attachment not visible to logged out users" +); $sel->is_text_present_ok("This is my patch!"); -ok(!$sel->is_text_present("Making the powerless user's patch private"), "Private comment not visible to logged out users"); +ok(!$sel->is_text_present("Making the powerless user's patch private"), + "Private comment not visible to logged out users"); # A powerless user can only see private attachments he owns. @@ -163,6 +192,7 @@ go_to_bug($sel, $bug1_id); $sel->is_text_present_ok("My patch, which I should see, always ("); $sel->click_ok("link=My patch, which I should see, always"); $sel->wait_for_page_to_load_ok(WAIT_TIME); + # No title displayed while viewing an attachment. $sel->title_is(""); $sel->go_back_ok(); @@ -173,7 +203,8 @@ logout($sel); log_in($sel, $config, 'admin'); go_to_bug($sel, $bug1_id); -$sel->click_ok('//a[@href="attachment.cgi?id=' . $attachment2_id . '&action=edit"]'); +$sel->click_ok( + '//a[@href="attachment.cgi?id=' . $attachment2_id . '&action=edit"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^Attachment $attachment2_id Details for Bug $bug1_id/); $sel->click_ok("link=Delete"); @@ -183,7 +214,8 @@ $sel->is_text_present_ok("Do you really want to delete this attachment?"); $sel->type_ok("reason", "deleted by Selenium"); $sel->click_ok("delete"); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->is_text_present_ok("Changes to attachment $attachment2_id of bug $bug1_id submitted"); +$sel->is_text_present_ok( + "Changes to attachment $attachment2_id of bug $bug1_id submitted"); $sel->click_ok("link=bug $bug1_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^$bug1_id/); @@ -191,10 +223,14 @@ $sel->is_text_present_ok("deleted by Selenium"); $sel->click_ok("link=attachment $attachment2_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Attachment Removed"); -$sel->is_text_present_ok("The attachment you are attempting to access has been removed"); - -set_parameters($sel, { - "Group Security" => {"insidergroup" => { type => "select", - value => "QA-Selenium-TEST" }}, -}); +$sel->is_text_present_ok( + "The attachment you are attempting to access has been removed"); + +set_parameters( + $sel, + { + "Group Security" => + {"insidergroup" => {type => "select", value => "QA-Selenium-TEST"}}, + } +); logout($sel); diff --git a/qa/t/test_qa_contact.t b/qa/t/test_qa_contact.t index 3795e2edc..65ff14e3b 100644 --- a/qa/t/test_qa_contact.t +++ b/qa/t/test_qa_contact.t @@ -18,28 +18,38 @@ my ($sel, $config) = get_selenium(); # First make sure the 'My QA query' saved search is gone. log_in($sel, $config, 'admin'); -if($sel->is_text_present("My QA query")) { - $sel->open_ok("/$config->{bugzilla_installation}/buglist.cgi?cmdtype=dorem&remaction=forget&namedcmd=My%20QA%20query", - undef, "Make sure the 'My QA query' saved search isn't present"); - # We bypass the UI to delete the saved search, and so Bugzilla should complain about the missing token. - $sel->title_is("Suspicious Action"); - $sel->is_text_present_ok("It looks like you didn't come from the right page"); - $sel->click_ok("confirm"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Search is gone"); - my $text = trim($sel->get_text("message")); - ok($text =~ /OK, the My QA query search is gone/, "Removed the 'My QA query' saved search"); +if ($sel->is_text_present("My QA query")) { + $sel->open_ok( + "/$config->{bugzilla_installation}/buglist.cgi?cmdtype=dorem&remaction=forget&namedcmd=My%20QA%20query", + undef, "Make sure the 'My QA query' saved search isn't present" + ); + +# We bypass the UI to delete the saved search, and so Bugzilla should complain about the missing token. + $sel->title_is("Suspicious Action"); + $sel->is_text_present_ok("It looks like you didn't come from the right page"); + $sel->click_ok("confirm"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Search is gone"); + my $text = trim($sel->get_text("message")); + ok( + $text =~ /OK, the My QA query search is gone/, + "Removed the 'My QA query' saved search" + ); } # Enable the QA contact field and file a new bug restricted to the 'Master' group # with a powerless user as the QA contact. He should only be able to access the # bug if the QA contact field is enabled, else he looses this privilege. -set_parameters($sel, { "Bug Fields" => {"useqacontact-on" => undef} }); +set_parameters($sel, {"Bug Fields" => {"useqacontact-on" => undef}}); file_bug_in_product($sel, 'TestProduct'); -$sel->type_ok("qa_contact", $config->{unprivileged_user_login}, "Set the powerless user as QA contact"); +$sel->type_ok( + "qa_contact", + $config->{unprivileged_user_login}, + "Set the powerless user as QA contact" +); $sel->type_ok("short_desc", "Test for QA contact"); -$sel->type_ok("comment", "This is a test to check QA contact privs."); +$sel->type_ok("comment", "This is a test to check QA contact privs."); $sel->check_ok('//input[@name="groups" and @value="Master"]'); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -55,7 +65,11 @@ $sel->add_selection_ok("product", "TestProduct"); $sel->remove_all_selections("bug_status"); $sel->select_ok("f1", "label=QA Contact"); $sel->select_ok("o1", "label=is equal to"); -$sel->type_ok("v1", $config->{unprivileged_user_login}, "Look for the powerless user as QA contact"); +$sel->type_ok( + "v1", + $config->{unprivileged_user_login}, + "Look for the powerless user as QA contact" +); $sel->click_ok("Search"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Bug List"); @@ -66,7 +80,8 @@ $sel->click_ok("remember"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Search created"); my $text = trim($sel->get_text("message")); -ok($text =~ /OK, you have a new search named My QA query/, "New saved search 'My QA query'"); +ok($text =~ /OK, you have a new search named My QA query/, + "New saved search 'My QA query'"); $sel->click_ok("link=My QA query"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Bug List: My QA query"); @@ -77,7 +92,7 @@ $sel->is_text_present_ok("Test for QA contact"); # ("work" doesn't mean you should still see all bugs, depending on your role # and privs!) -set_parameters($sel, { "Bug Fields" => {"useqacontact-off" => undef} }); +set_parameters($sel, {"Bug Fields" => {"useqacontact-off" => undef}}); $sel->click_ok("link=My QA query"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Bug List: My QA query"); @@ -86,6 +101,7 @@ $sel->is_element_present_ok("b$bug1_id", undef, "Bug $bug1_id is on the list"); $sel->click_ok("link=$bug1_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^$bug1_id /); + # The 'QA Contact' label must not be displayed. ok(!$sel->is_element_present('//label[@for="qa_contact"]')); logout($sel); @@ -103,12 +119,21 @@ $sel->is_text_present_ok("You are not authorized to access bug"); # powerless user, as the QA contact field is disabled. # Don't use it log_in() as we want to follow this specific link. -$sel->click_ok("//a[contains(text(),'log\n in to an account')]", undef, "Log in"); +$sel->click_ok("//a[contains(text(),'log\n in to an account')]", + undef, "Log in"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Log in to Bugzilla"); $sel->is_text_present_ok("I need an email address and password to continue."); -$sel->type_ok("Bugzilla_login", $config->{unprivileged_user_login}, "Enter login name"); -$sel->type_ok("Bugzilla_password", $config->{unprivileged_user_passwd}, "Enter password"); +$sel->type_ok( + "Bugzilla_login", + $config->{unprivileged_user_login}, + "Enter login name" +); +$sel->type_ok( + "Bugzilla_password", + $config->{unprivileged_user_passwd}, + "Enter password" +); $sel->click_ok("log_in", undef, "Submit credentials"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Access Denied"); @@ -118,7 +143,7 @@ logout($sel); # Re-enable the QA contact field. log_in($sel, $config, 'admin'); -set_parameters($sel, { "Bug Fields" => {"useqacontact-on" => undef} }); +set_parameters($sel, {"Bug Fields" => {"useqacontact-on" => undef}}); logout($sel); # Log in as the powerless user. As the QA contact field is enabled again, @@ -132,7 +157,7 @@ $sel->title_is("User Preferences"); $sel->click_ok("link=General Preferences"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("User Preferences"); -$sel->select_ok("state_addselfcc", "value=never"); +$sel->select_ok("state_addselfcc", "value=never"); $sel->select_ok("post_bug_submit_action", "value=same_bug"); $sel->click_ok("update"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -144,7 +169,11 @@ $sel->add_selection_ok("product", "TestProduct"); $sel->remove_all_selections_ok("bug_status"); $sel->select_ok("f1", "label=QA Contact"); $sel->select_ok("o1", "label=is equal to"); -$sel->type_ok("v1", $config->{unprivileged_user_login}, "Look for the powerless user as QA contact"); +$sel->type_ok( + "v1", + $config->{unprivileged_user_login}, + "Look for the powerless user as QA contact" +); $sel->click_ok("Search"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Bug List"); @@ -155,7 +184,11 @@ $sel->click_ok("link=$bug1_id"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/$bug1_id /); $sel->click_ok("bz_qa_contact_edit_action"); -$sel->value_is("qa_contact", $config->{unprivileged_user_login}, "The powerless user is the current QA contact"); +$sel->value_is( + "qa_contact", + $config->{unprivileged_user_login}, + "The powerless user is the current QA contact" +); $sel->check_ok("set_default_qa_contact"); $sel->click_ok("commit"); diff --git a/qa/t/test_require_login.t b/qa/t/test_require_login.t index 1cfd5b42f..f8d2629f9 100644 --- a/qa/t/test_require_login.t +++ b/qa/t/test_require_login.t @@ -18,61 +18,65 @@ my ($sel, $config) = get_selenium(); # Turn on 'requirelogin'. log_in($sel, $config, 'admin'); -set_parameters($sel, { "User Authentication" => {"requirelogin-on" => undef} }); +set_parameters($sel, {"User Authentication" => {"requirelogin-on" => undef}}); logout($sel); # We try to access each page. None of the ones listed below should # let you view it without being logged in. my @pages = qw(admin attachment buglist chart colchange describecomponents - describekeywords duplicates editclassifications editcomponents - editfields editflagtypes editgroups editkeywords editmilestones - editparams editproducts editsettings editusers editvalues - editversions editwhines editworkflow enter_bug long_list page - post_bug process_bug query quips report reports request - sanitycheck search_plugin show_activity show_bug showattachment - showdependencygraph showdependencytree summarize_time - userprefs votes xml); + describekeywords duplicates editclassifications editcomponents + editfields editflagtypes editgroups editkeywords editmilestones + editparams editproducts editsettings editusers editvalues + editversions editwhines editworkflow enter_bug long_list page + post_bug process_bug query quips report reports request + sanitycheck search_plugin show_activity show_bug showattachment + showdependencygraph showdependencytree summarize_time + userprefs votes xml); foreach my $page (@pages) { - $sel->open_ok("/$config->{bugzilla_installation}/${page}.cgi"); - if ($page ne 'votes' || $config->{test_extensions}) { - $sel->title_is("Log in to Bugzilla"); - } - else { - $sel->title_is("Extension Disabled"); - } + $sel->open_ok("/$config->{bugzilla_installation}/${page}.cgi"); + if ($page ne 'votes' || $config->{test_extensions}) { + $sel->title_is("Log in to Bugzilla"); + } + else { + $sel->title_is("Extension Disabled"); + } } # Those have parameters passed to the page, so we put them here separately. -@pages = ("query.cgi?format=report-table", "query.cgi?format=report-graph", - "votes.cgi?action=show_user", "votes.cgi?action=show_bug"); +@pages = ( + "query.cgi?format=report-table", "query.cgi?format=report-graph", + "votes.cgi?action=show_user", "votes.cgi?action=show_bug" +); foreach my $page (@pages) { - $sel->open_ok("/$config->{bugzilla_installation}/$page"); - if ($page !~ /^votes/ || $config->{test_extensions}) { - $sel->title_is("Log in to Bugzilla"); - } - else { - $sel->title_is("Extension Disabled"); - } + $sel->open_ok("/$config->{bugzilla_installation}/$page"); + if ($page !~ /^votes/ || $config->{test_extensions}) { + $sel->title_is("Log in to Bugzilla"); + } + else { + $sel->title_is("Extension Disabled"); + } } # These pages should still be accessible. -@pages = ("config.cgi", "createaccount.cgi", "index.cgi", "relogin.cgi", - "token.cgi?a=reqpw&loginname=" . $config->{unprivileged_user_login}); +@pages = ( + "config.cgi", "createaccount.cgi", "index.cgi", "relogin.cgi", + "token.cgi?a=reqpw&loginname=" . $config->{unprivileged_user_login} +); foreach my $page (@pages) { - $sel->open_ok("/$config->{bugzilla_installation}/$page"); - $sel->title_isnt("Log in to Bugzilla"); + $sel->open_ok("/$config->{bugzilla_installation}/$page"); + $sel->title_isnt("Log in to Bugzilla"); } # Turn off 'requirelogin'. log_in($sel, $config, 'admin'); -set_parameters($sel, { "User Authentication" => {"requirelogin-off" => undef} }); +set_parameters($sel, {"User Authentication" => {"requirelogin-off" => undef}}); logout($sel); # Make sure we can access random pages again. diff --git a/qa/t/test_sanity_check.t b/qa/t/test_sanity_check.t index 06ab57355..2a3bbe1de 100644 --- a/qa/t/test_sanity_check.t +++ b/qa/t/test_sanity_check.t @@ -20,27 +20,33 @@ go_to_admin($sel); $sel->click_ok("link=Sanity Check", undef, "Go to Sanity Check (no parameter)"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Sanity Check", "Display sanitycheck.cgi"); -$sel->is_text_present_ok("Sanity check completed.", undef, "Page displayed correctly"); +$sel->is_text_present_ok("Sanity check completed.", + undef, "Page displayed correctly"); -my @args = qw(rebuildvotecache createmissinggroupcontrolmapentries repair_creation_date - repair_bugs_fulltext remove_invalid_bug_references repair_bugs_fulltext - remove_invalid_attach_references remove_old_whine_targets rescanallBugMail); +my @args + = qw(rebuildvotecache createmissinggroupcontrolmapentries repair_creation_date + repair_bugs_fulltext remove_invalid_bug_references repair_bugs_fulltext + remove_invalid_attach_references remove_old_whine_targets rescanallBugMail); foreach my $arg (@args) { - $sel->open_ok("/$config->{bugzilla_installation}/sanitycheck.cgi?$arg=1"); - $sel->title_is("Suspicious Action", "Calling sanitycheck.cgi with no token triggers a confirmation page"); - $sel->click_ok("confirm", "Confirm the action"); - $sel->wait_for_page_to_load(WAIT_TIME); - $sel->title_is("Sanity Check", "Calling sanitycheck.cgi with $arg=1"); - if ($arg eq 'rescanallBugMail') { - # sanitycheck.cgi always stops after looking for unsent bugmail. So we cannot rely on - # "Sanity check completed." to determine if an error has been thrown or not. - $sel->is_text_present_ok("found with possibly unsent mail", undef, "Look for unsent bugmail"); - ok(!$sel->is_text_present("Software error"), "No error thrown"); - } - else { - $sel->is_text_present_ok("Sanity check completed.", undef, "Page displayed correctly"); - } + $sel->open_ok("/$config->{bugzilla_installation}/sanitycheck.cgi?$arg=1"); + $sel->title_is("Suspicious Action", + "Calling sanitycheck.cgi with no token triggers a confirmation page"); + $sel->click_ok("confirm", "Confirm the action"); + $sel->wait_for_page_to_load(WAIT_TIME); + $sel->title_is("Sanity Check", "Calling sanitycheck.cgi with $arg=1"); + if ($arg eq 'rescanallBugMail') { + +# sanitycheck.cgi always stops after looking for unsent bugmail. So we cannot rely on +# "Sanity check completed." to determine if an error has been thrown or not. + $sel->is_text_present_ok("found with possibly unsent mail", + undef, "Look for unsent bugmail"); + ok(!$sel->is_text_present("Software error"), "No error thrown"); + } + else { + $sel->is_text_present_ok("Sanity check completed.", + undef, "Page displayed correctly"); + } } logout($sel); diff --git a/qa/t/test_saved_searches.t b/qa/t/test_saved_searches.t index b39458fa5..2ef907829 100644 --- a/qa/t/test_saved_searches.t +++ b/qa/t/test_saved_searches.t @@ -25,12 +25,15 @@ $sel->click_ok("link=Saved Searches"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("User Preferences"); -if($sel->is_text_present("SavedSearchTEST1")) { - # There is no other way to identify this link (as they are all named "Forget"). - $sel->click_ok('//a[contains(@href,"buglist.cgi?cmdtype=dorem&remaction=forget&namedcmd=SavedSearchTEST1")]'); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Search is gone"); - $sel->is_text_present_ok("OK, the SavedSearchTEST1 search is gone."); +if ($sel->is_text_present("SavedSearchTEST1")) { + + # There is no other way to identify this link (as they are all named "Forget"). + $sel->click_ok( + '//a[contains(@href,"buglist.cgi?cmdtype=dorem&remaction=forget&namedcmd=SavedSearchTEST1")]' + ); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Search is gone"); + $sel->is_text_present_ok("OK, the SavedSearchTEST1 search is gone."); } # Create a new saved search. @@ -45,7 +48,10 @@ $sel->click_ok("remember"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Search created"); my $text = trim($sel->get_text("message")); -ok($text =~ /OK, you have a new search named SavedSearchTEST1./, "New search named SavedSearchTEST1 has been created"); +ok( + $text =~ /OK, you have a new search named SavedSearchTEST1./, + "New search named SavedSearchTEST1 has been created" +); $sel->click_ok("link=SavedSearchTEST1"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Bug List: SavedSearchTEST1"); @@ -61,12 +67,14 @@ $sel->title_is("User Preferences"); $sel->is_text_present_ok("SavedSearchTEST1"); $sel->uncheck_ok('//input[@type="checkbox" and @alt="SavedSearchTEST1"]'); + # $sel->value_is("//input[\@type='checkbox' and \@alt='SavedSearchTEST1']", "off"); $sel->click_ok("update"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("User Preferences"); $text = trim($sel->get_text("message")); -ok($text =~ /The changes to your saved searches have been saved./, "Saved searches changes have been saved"); +ok($text =~ /The changes to your saved searches have been saved./, + "Saved searches changes have been saved"); # Modify the saved search. Said otherwise, we should still be able to save # a new search with exactly the same name. @@ -76,14 +84,21 @@ $sel->type_ok("short_desc", "bilboa"); $sel->click_ok("Search"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Bug List"); + # As we said, this saved search should no longer be displayed in the Search Bar. -ok(!$sel->is_text_present("SavedSearchTEST1"), "SavedSearchTEST1 is not present in the Search Bar"); +ok( + !$sel->is_text_present("SavedSearchTEST1"), + "SavedSearchTEST1 is not present in the Search Bar" +); $sel->type_ok("save_newqueryname", "SavedSearchTEST1"); $sel->click_ok("remember"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Search updated"); $text = trim($sel->get_text("message")); -ok($text =~ /Your search named SavedSearchTEST1 has been updated./, "Saved searche SavedSearchTEST1 has been updated."); +ok( + $text =~ /Your search named SavedSearchTEST1 has been updated./, + "Saved searche SavedSearchTEST1 has been updated." +); # Make sure our new criteria has been saved (let's edit the saved search). # As the saved search is no longer displayed in the Search Bar, we have to go @@ -97,7 +112,9 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("User Preferences"); $sel->is_text_present_ok("SavedSearchTEST1"); -$sel->click_ok('//a[@href="buglist.cgi?cmdtype=dorem&remaction=run&namedcmd=SavedSearchTEST1"]'); +$sel->click_ok( + '//a[@href="buglist.cgi?cmdtype=dorem&remaction=run&namedcmd=SavedSearchTEST1"]' +); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Bug List: SavedSearchTEST1"); $sel->click_ok("link=Edit Search"); @@ -110,5 +127,6 @@ $sel->click_ok("link=Forget Search 'SavedSearchTEST1'"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Search is gone"); $text = trim($sel->get_text("message")); -ok($text =~ /OK, the SavedSearchTEST1 search is gone./, "The SavedSearchTEST1 search is gone."); +ok($text =~ /OK, the SavedSearchTEST1 search is gone./, + "The SavedSearchTEST1 search is gone."); logout($sel); diff --git a/qa/t/test_search.t b/qa/t/test_search.t index d479cc263..2a7993465 100644 --- a/qa/t/test_search.t +++ b/qa/t/test_search.t @@ -20,7 +20,8 @@ my ($sel, $config) = get_selenium(); go_to_home($sel, $config); open_advanced_search_page($sel); -$sel->type_ok("short_desc", "ois£jdfm#sd%fasd!fm", "Type a non-existent string in the bug summary field"); +$sel->type_ok("short_desc", "ois£jdfm#sd%fasd!fm", + "Type a non-existent string in the bug summary field"); $sel->click_ok("Search"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Bug List"); @@ -28,7 +29,9 @@ $sel->is_text_present_ok("Zarro Boogs found"); # Display all available columns. Look for all bugs assigned to a user who doesn't exist. -$sel->open_ok("/$config->{bugzilla_installation}/buglist.cgi?quicksearch=%40xx45ft&columnlist=all"); +$sel->open_ok( + "/$config->{bugzilla_installation}/buglist.cgi?quicksearch=%40xx45ft&columnlist=all" +); $sel->title_like(qr/^Bug List:/); $sel->is_text_present_ok("Zarro Boogs found"); @@ -38,12 +41,12 @@ log_in($sel, $config, 'canconfirm'); file_bug_in_product($sel, "TestProduct"); my $bug_summary = "Update this summary with this bug ID"; $sel->type_ok("short_desc", $bug_summary); -$sel->type_ok("comment", "I'm supposed to appear in the coming buglist."); +$sel->type_ok("comment", "I'm supposed to appear in the coming buglist."); my $bug1_id = create_bug($sel, $bug_summary); $sel->click_ok("editme_action"); $bug_summary .= ": my ID is $bug1_id"; $sel->type_ok("short_desc", $bug_summary); -$sel->type_ok("comment", "Updating bug summary...."); +$sel->type_ok("comment", "Updating bug summary...."); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); @@ -67,5 +70,6 @@ $sel->click_ok("Search"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Bug List"); $sel->is_text_present_ok("One bug found"); -$sel->is_text_present_ok("Update this summary with this bug ID: my ID is $bug1_id"); +$sel->is_text_present_ok( + "Update this summary with this bug ID: my ID is $bug1_id"); logout($sel); diff --git a/qa/t/test_security.t b/qa/t/test_security.t index 97089cdac..7e975ecca 100644 --- a/qa/t/test_security.t +++ b/qa/t/test_security.t @@ -14,7 +14,7 @@ use Test::More "no_plan"; use QA::Util; my ($sel, $config) = get_selenium(CHROME_MODE); -my $urlbase = $config->{bugzilla_installation}; +my $urlbase = $config->{bugzilla_installation}; my $admin_user = $config->{admin_user_login}; # Let's create a bug and attachment to play with. @@ -23,7 +23,7 @@ log_in($sel, $config, 'admin'); file_bug_in_product($sel, "TestProduct"); my $bug_summary = "Security checks"; $sel->type_ok("short_desc", $bug_summary); -$sel->type_ok("comment", "This bug will be used to test security fixes."); +$sel->type_ok("comment", "This bug will be used to test security fixes."); $sel->attach_file('//input[@name="data"]', $config->{attachment_file}); $sel->type_ok('//input[@name="description"]', "simple patch, v1"); my $bug1_id = create_bug($sel, $bug_summary); @@ -35,7 +35,8 @@ my $bug1_id = create_bug($sel, $bug_summary); # No alternate host for attachments; cookies will be accessible. -set_parameters($sel, { "Attachments" => {"allow_attachment_display-on" => undef } }); +set_parameters($sel, + {"Attachments" => {"allow_attachment_display-on" => undef}}); go_to_bug($sel, $bug1_id); $sel->click_ok("link=simple patch, v1"); @@ -45,7 +46,8 @@ my @cookies = split(/[\s;]+/, $sel->get_cookie()); my $nb_cookies = scalar @cookies; ok($nb_cookies, "Found $nb_cookies cookies:\n" . join("\n", @cookies)); ok(!$sel->is_cookie_present("Bugzilla_login"), "Bugzilla_login not accessible"); -ok(!$sel->is_cookie_present("Bugzilla_logincookie"), "Bugzilla_logincookie not accessible"); +ok(!$sel->is_cookie_present("Bugzilla_logincookie"), + "Bugzilla_logincookie not accessible"); $sel->go_back_ok(); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^$bug1_id /); @@ -85,25 +87,30 @@ my $editbugs_cookie = $sel->get_value("token"); # Using our own unused token is fine. -$sel->open_ok("/$urlbase/userprefs.cgi?tab=settings&dosave=1&display_quips=off&token=$editbugs_cookie"); +$sel->open_ok( + "/$urlbase/userprefs.cgi?tab=settings&dosave=1&display_quips=off&token=$editbugs_cookie" +); $sel->title_is("User Preferences"); -$sel->is_text_present_ok("The changes to your general preferences have been saved"); +$sel->is_text_present_ok( + "The changes to your general preferences have been saved"); # Reusing a token must fail. They must all trigger the Suspicious Action warning. -my @args = ("", "token=", "token=i123x", "token=$admin_cookie", "token=$editbugs_cookie"); +my @args = ("", "token=", "token=i123x", "token=$admin_cookie", + "token=$editbugs_cookie"); foreach my $arg (@args) { - $sel->open_ok("/$urlbase/userprefs.cgi?tab=settings&dosave=1&display_quips=off&$arg"); - $sel->title_is("Suspicious Action"); - - if ($arg eq "token=$admin_cookie") { - $sel->is_text_present_ok("Generated by: QA Admin <$admin_user>"); - $sel->is_text_present_ok("This token has not been generated by you"); - } - else { - $sel->is_text_present_ok("It looks like you didn't come from the right page"); - } + $sel->open_ok( + "/$urlbase/userprefs.cgi?tab=settings&dosave=1&display_quips=off&$arg"); + $sel->title_is("Suspicious Action"); + + if ($arg eq "token=$admin_cookie") { + $sel->is_text_present_ok("Generated by: QA Admin <$admin_user>"); + $sel->is_text_present_ok("This token has not been generated by you"); + } + else { + $sel->is_text_present_ok("It looks like you didn't come from the right page"); + } } logout($sel); @@ -116,8 +123,8 @@ file_bug_in_product($sel, "TestProduct"); $sel->type_ok("alias", "secret_qa_bug_" . ($bug1_id + 1)); my $bug_summary2 = "Private QA Bug"; $sel->type_ok("short_desc", $bug_summary2); -$sel->type_ok("comment", "This private bug is used to test security fixes."); -$sel->type_ok("dependson", $bug1_id); +$sel->type_ok("comment", "This private bug is used to test security fixes."); +$sel->type_ok("dependson", $bug1_id); $sel->check_ok('//input[@name="groups" and @value="Master"]'); my $bug2_id = create_bug($sel, $bug_summary2); @@ -127,12 +134,14 @@ logout($sel); log_in($sel, $config, 'editbugs'); go_to_bug($sel, $bug1_id); -ok(!$sel->is_text_present("secret_qa_bug_$bug2_id"), "The alias 'secret_qa_bug_$bug2_id' is not visible for unauthorized users"); +ok(!$sel->is_text_present("secret_qa_bug_$bug2_id"), + "The alias 'secret_qa_bug_$bug2_id' is not visible for unauthorized users"); $sel->is_text_present_ok($bug2_id); logout($sel); go_to_bug($sel, $bug1_id); -ok(!$sel->is_text_present("secret_qa_bug_$bug2_id"), "The alias 'secret_qa_bug_$bug2_id' is not visible for logged out users"); +ok(!$sel->is_text_present("secret_qa_bug_$bug2_id"), + "The alias 'secret_qa_bug_$bug2_id' is not visible for logged out users"); $sel->is_text_present_ok($bug2_id); ####################################################################### @@ -143,7 +152,8 @@ $sel->is_text_present_ok($bug2_id); ####################################################################### log_in($sel, $config, 'admin'); -set_parameters($sel, { "Attachments" => {"allow_attachment_display-off" => undef} }); +set_parameters($sel, + {"Attachments" => {"allow_attachment_display-off" => undef}}); # Attachments are not viewable. @@ -151,8 +161,10 @@ go_to_bug($sel, $bug1_id); $sel->click_ok("link=Details"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/Attachment \d+ Details for Bug $bug1_id/); -$sel->is_text_present_ok("The attachment is not viewable in your browser due to security restrictions"); +$sel->is_text_present_ok( + "The attachment is not viewable in your browser due to security restrictions"); $sel->click_ok("link=View"); + # Wait 1 second to give the browser a chance to display the attachment. # Do not use wait_for_page_to_load_ok() as the File Saver will never go away. sleep(1); @@ -161,7 +173,8 @@ ok(!$sel->is_text_present('@@'), "Patch not displayed"); # Enable viewing attachments. -set_parameters($sel, { "Attachments" => {"allow_attachment_display-on" => undef} }); +set_parameters($sel, + {"Attachments" => {"allow_attachment_display-on" => undef}}); go_to_bug($sel, $bug1_id); $sel->click_ok('link=simple patch, v1'); diff --git a/qa/t/test_shared_searches.t b/qa/t/test_shared_searches.t index a4b2ac9ce..20b774432 100644 --- a/qa/t/test_shared_searches.t +++ b/qa/t/test_shared_searches.t @@ -18,7 +18,13 @@ my ($sel, $config) = get_selenium(); # Set the querysharegroup param to be the canconfirm group. log_in($sel, $config, 'admin'); -set_parameters($sel, { "Group Security" => {"querysharegroup" => {type => "select", value => "canconfirm"}} }); +set_parameters( + $sel, + { + "Group Security" => + {"querysharegroup" => {type => "select", value => "canconfirm"}} + } +); # Create new saved search and call it 'Shared Selenium buglist'. @@ -31,7 +37,10 @@ $sel->click_ok("remember"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Search created"); my $text = trim($sel->get_text("message")); -ok($text =~ /OK, you have a new search named Shared Selenium buglist./, "New search named 'Shared Selenium buglist' has been created"); +ok( + $text =~ /OK, you have a new search named Shared Selenium buglist./, + "New search named 'Shared Selenium buglist' has been created" +); # Retrieve the newly created saved search's internal ID and make sure it's displayed # in the Search Bar by default. @@ -42,7 +51,8 @@ $sel->title_is("User Preferences"); $sel->click_ok("link=Saved Searches"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("User Preferences"); -my $ssname = $sel->get_attribute('//input[@type="checkbox" and @alt="Shared Selenium buglist"]@name'); +my $ssname = $sel->get_attribute( + '//input[@type="checkbox" and @alt="Shared Selenium buglist"]@name'); $ssname =~ /(?:link_in_footer_(\d+))/; my $saved_search1_id = $1; $sel->is_checked_ok("link_in_footer_$saved_search1_id"); @@ -50,7 +60,8 @@ $sel->is_checked_ok("link_in_footer_$saved_search1_id"); # As an admin, the "Add to Search Bar" checkbox must be displayed, but unchecked by default. $sel->select_ok("share_$saved_search1_id", "label=canconfirm"); -ok(!$sel->is_checked("force_$saved_search1_id"), "Shared search not displayed in other users' Search Bar by default"); +ok(!$sel->is_checked("force_$saved_search1_id"), + "Shared search not displayed in other users' Search Bar by default"); $sel->click_ok("force_$saved_search1_id"); $sel->click_ok("update"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -66,8 +77,10 @@ $sel->is_text_present_ok("Shared Selenium buglist"); $sel->click_ok("link=Shared Selenium buglist"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Bug List: Shared Selenium buglist"); + # You cannot delete other users' saved searches. -ok(!$sel->is_text_present("Forget Search 'Shared Selenium buglist'"), "'Forget...' link not available"); +ok(!$sel->is_text_present("Forget Search 'Shared Selenium buglist'"), + "'Forget...' link not available"); # The name of the sharer must appear in the "Saved Searches" section. @@ -86,12 +99,16 @@ $sel->click_ok("link_in_footer_$saved_search1_id"); $sel->click_ok("update"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("User Preferences"); + # Go to a page where the query name is unlikely to appear in the main page. $sel->click_ok("link=Permissions"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("User Preferences"); $sel->click_ok("quicksearch_top"); -ok(!$sel->is_text_present("Shared Selenium buglist"), "Shared query no longer displayed in the Search Bar"); +ok( + !$sel->is_text_present("Shared Selenium buglist"), + "Shared query no longer displayed in the Search Bar" +); # Create your own saved search, and share it with the canconfirm group. @@ -104,7 +121,10 @@ $sel->click_ok("remember"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Search created"); $text = trim($sel->get_text("message")); -ok($text =~ /OK, you have a new search named helpwanted./, "New search named helpwanted has been created"); +ok( + $text =~ /OK, you have a new search named helpwanted./, + "New search named helpwanted has been created" +); $sel->click_ok("link=Preferences"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -112,9 +132,11 @@ $sel->title_is("User Preferences"); $sel->click_ok("link=Saved Searches"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("User Preferences"); -$ssname = $sel->get_attribute('//input[@type="checkbox" and @alt="helpwanted"]@name'); +$ssname + = $sel->get_attribute('//input[@type="checkbox" and @alt="helpwanted"]@name'); $ssname =~ /(?:link_in_footer_(\d+))/; my $saved_search2_id = $1; + # Our own saved searches are displayed in the Search Bar by default. $sel->is_checked_ok("link_in_footer_$saved_search2_id"); $sel->select_ok("share_$saved_search2_id", "label=canconfirm"); @@ -129,7 +151,10 @@ logout($sel); log_in($sel, $config, 'admin'); $sel->click_ok("quicksearch_top"); -ok(!$sel->is_text_present("helpwanted"), "No 'helpwanted' shared search displayed"); +ok( + !$sel->is_text_present("helpwanted"), + "No 'helpwanted' shared search displayed" +); $sel->click_ok("link=Preferences"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("User Preferences"); @@ -140,11 +165,15 @@ $sel->click_ok("quicksearch_top"); $sel->is_text_present_ok("helpwanted"); $sel->is_text_present_ok($config->{canconfirm_user_login}); -ok(!$sel->is_checked("link_in_footer_$saved_search2_id"), "Shared query available but not displayed"); +ok( + !$sel->is_checked("link_in_footer_$saved_search2_id"), + "Shared query available but not displayed" +); $sel->click_ok("link_in_footer_$saved_search2_id"); $sel->click_ok("update"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("User Preferences"); + # This query is now available from the Search Bar. $sel->click_ok("link=helpwanted"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -158,13 +187,19 @@ $sel->title_is("User Preferences"); $sel->click_ok("link=Saved Searches"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("User Preferences"); + # There is no better way to identify the link -$sel->click_ok('//a[contains(@href,"buglist.cgi?cmdtype=dorem&remaction=forget&namedcmd=Shared%20Selenium%20buglist")]', - undef, "Deleting the 'Shared Selenium buglist' search"); +$sel->click_ok( + '//a[contains(@href,"buglist.cgi?cmdtype=dorem&remaction=forget&namedcmd=Shared%20Selenium%20buglist")]', + undef, "Deleting the 'Shared Selenium buglist' search" +); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Search is gone"); $text = trim($sel->get_text("message")); -ok($text =~ /OK, the Shared Selenium buglist search is gone./, "The 'Shared Selenium buglist' search is gone"); +ok( + $text =~ /OK, the Shared Selenium buglist search is gone./, + "The 'Shared Selenium buglist' search is gone" +); logout($sel); # Make sure that the 'helpwanted' query is not shared with the QA_Selenium_TEST @@ -172,7 +207,8 @@ logout($sel); log_in($sel, $config, 'QA_Selenium_TEST'); $sel->click_ok("quicksearch_top"); -ok(!$sel->is_text_present("helpwanted"), "The 'helpwanted' query is not displayed in the Search Bar"); +ok(!$sel->is_text_present("helpwanted"), + "The 'helpwanted' query is not displayed in the Search Bar"); $sel->click_ok("link=Preferences"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("User Preferences"); @@ -180,7 +216,8 @@ $sel->click_ok("link=Saved Searches"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("User Preferences"); $sel->click_ok("quicksearch_top"); -ok(!$sel->is_text_present("helpwanted"), "The 'helpwanted' query is not shared with this user"); +ok(!$sel->is_text_present("helpwanted"), + "The 'helpwanted' query is not shared with this user"); logout($sel); # Now remove the 'helpwanted' saved search. @@ -193,11 +230,17 @@ $sel->click_ok("link=Saved Searches"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("User Preferences"); $sel->click_ok("quicksearch_top"); -ok(!$sel->is_text_present("Shared Selenium buglist"), "The 'Shared Selenium buglist' is no longer available"); -$sel->click_ok('//a[contains(@href,"buglist.cgi?cmdtype=dorem&remaction=forget&namedcmd=helpwanted")]', - undef, "Deleting the 'helpwanted' search"); +ok( + !$sel->is_text_present("Shared Selenium buglist"), + "The 'Shared Selenium buglist' is no longer available" +); +$sel->click_ok( + '//a[contains(@href,"buglist.cgi?cmdtype=dorem&remaction=forget&namedcmd=helpwanted")]', + undef, "Deleting the 'helpwanted' search" +); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Search is gone"); $text = trim($sel->get_text("message")); -ok($text =~ /OK, the helpwanted search is gone./, "The 'helpwanted' search is gone"); +ok($text =~ /OK, the helpwanted search is gone./, + "The 'helpwanted' search is gone"); logout($sel); diff --git a/qa/t/test_show_all_products.t b/qa/t/test_show_all_products.t index ecc806980..84ba50831 100644 --- a/qa/t/test_show_all_products.t +++ b/qa/t/test_show_all_products.t @@ -16,7 +16,7 @@ use QA::Util; my ($sel, $config) = get_selenium(); log_in($sel, $config, 'admin'); -set_parameters($sel, { "Bug Fields" => {"useclassification-on" => undef} }); +set_parameters($sel, {"Bug Fields" => {"useclassification-on" => undef}}); # Do not use file_bug_in_product() because our goal here is not to file # a bug but to check what is present in the UI, and also to make sure @@ -31,7 +31,10 @@ $sel->title_is("Enter Bug"); $sel->click_ok("link=Other Products", undef, "Choose full product list"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Enter Bug"); -ok(!$sel->is_text_present("QA-Selenium-TEST"), "The QA-Selenium-TEST product is not displayed"); +ok( + !$sel->is_text_present("QA-Selenium-TEST"), + "The QA-Selenium-TEST product is not displayed" +); logout($sel); # Same steps, but for a member of the "QA‑Selenium‑TEST" group. @@ -42,16 +45,18 @@ $sel->click_ok('//*[@class="link-file"]//a'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Enter A Bug"); if ($sel->is_text_present('None of the above; my bug is in')) { - $sel->click_ok('advanced_link'); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Enter Bug"); + $sel->click_ok('advanced_link'); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Enter Bug"); } $sel->click_ok('link=Other Products'); $sel->wait_for_page_to_load_ok(WAIT_TIME); + # For some unknown reason, Selenium doesn't like hyphens in links. # $sel->is_text_present_ok("QA-Selenium-TEST"); # $sel->click_ok("link=QA-Selenium-TEST"); -$sel->click_ok('//div[@id="choose_product"]//a[contains(@href, "QA-Selenium-TEST")]'); +$sel->click_ok( + '//div[@id="choose_product"]//a[contains(@href, "QA-Selenium-TEST")]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok("Product: QA-Selenium-TEST"); logout($sel); diff --git a/qa/t/test_status_whiteboard.t b/qa/t/test_status_whiteboard.t index 2252b2317..2942c9857 100644 --- a/qa/t/test_status_whiteboard.t +++ b/qa/t/test_status_whiteboard.t @@ -55,7 +55,8 @@ $sel->click_ok("remember"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Search created"); my $text = trim($sel->get_text("message")); -ok($text =~ /you have a new search named sw-x77v/, 'Saved search correctly saved'); +ok($text =~ /you have a new search named sw-x77v/, + 'Saved search correctly saved'); # Make sure the saved query works. @@ -69,12 +70,15 @@ $sel->is_text_present_ok("2 bugs found"); # is off. set_parameters($sel, {'Bug Fields' => {'usestatuswhiteboard-off' => undef}}); + # Show detailed bug information panel on advanced search -ok($sel->create_cookie('TUI=information_query=1'), 'Show detailed bug information'); +ok($sel->create_cookie('TUI=information_query=1'), + 'Show detailed bug information'); $sel->click_ok('//*[@class="link-search"]//a'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Search for bugs"); -ok(!$sel->is_text_present("Whiteboard:"), "Whiteboard label no longer displayed"); +ok(!$sel->is_text_present("Whiteboard:"), + "Whiteboard label no longer displayed"); $sel->open_ok("/$config->{bugzilla_installation}/show_bug.cgi?id=$test_bug_1"); $sel->title_like(qr/^$test_bug_1\b/); ok(!$sel->is_element_present('//label[@for="status_whiteboard"]')); diff --git a/qa/t/test_sudo_sessions.t b/qa/t/test_sudo_sessions.t index 9ef93c32d..1e29da42f 100644 --- a/qa/t/test_sudo_sessions.t +++ b/qa/t/test_sudo_sessions.t @@ -18,7 +18,7 @@ my ($sel, $config) = get_selenium(); # Turn on the usevisibilitygroups param so that some users are invisible. log_in($sel, $config, 'admin'); -set_parameters($sel, { "Group Security" => {"usevisibilitygroups-on" => undef} }); +set_parameters($sel, {"Group Security" => {"usevisibilitygroups-on" => undef}}); # You can see all users from editusers.cgi, but once you leave this page, # usual group visibility restrictions apply and the "powerless" user cannot @@ -39,17 +39,25 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Begin sudo session"); $sel->value_is("target_login", $config->{unprivileged_user_login}); $sel->type_ok("reason", "Selenium test about sudo sessions"); -$sel->type_ok("current_password", $config->{admin_user_passwd}, "Enter admin password"); +$sel->type_ok( + "current_password", + $config->{admin_user_passwd}, + "Enter admin password" +); $sel->click_ok('//input[@value="Begin Session"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Match Failed"); my $error_msg = trim($sel->get_text("error_msg")); -ok($error_msg eq "$config->{unprivileged_user_login} does not exist or you are not allowed to see that user.", - "Cannot impersonate users you cannot see"); +ok( + $error_msg eq + "$config->{unprivileged_user_login} does not exist or you are not allowed to see that user.", + "Cannot impersonate users you cannot see" +); # Turn off the usevisibilitygroups param so that all users are visible again. -set_parameters($sel, { "Group Security" => {"usevisibilitygroups-off" => undef} }); +set_parameters($sel, + {"Group Security" => {"usevisibilitygroups-off" => undef}}); # The "powerless" user can now be sudo'ed. @@ -67,12 +75,19 @@ $sel->click_ok("link=Impersonate this user"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Begin sudo session"); $sel->value_is("target_login", $config->{unprivileged_user_login}); -$sel->type_ok("current_password", $config->{admin_user_passwd}, "Enter admin password"); +$sel->type_ok( + "current_password", + $config->{admin_user_passwd}, + "Enter admin password" +); $sel->click_ok('//input[@value="Begin Session"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Sudo session started"); my $text = trim($sel->get_text("message")); -ok($text =~ /The sudo session has been started/, "The sudo session has been started"); +ok( + $text =~ /The sudo session has been started/, + "The sudo session has been started" +); # Make sure this user is not an admin and has no privs at all, and that # he cannot access editusers.cgi (despite the sudoer can). @@ -84,19 +99,24 @@ $sel->click_ok("link=Permissions"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("User Preferences"); $sel->is_text_present_ok("There are no permission bits set on your account"); + # We access the page directly as there is no link pointing to it. $sel->open_ok("/$config->{bugzilla_installation}/editusers.cgi"); $sel->title_is("Authorization Required"); $error_msg = trim($sel->get_text("error_msg")); -ok($error_msg =~ /^Sorry, you aren't a member of the 'editusers' group/, "Not a member of the editusers group"); -$sel->click_ok("link=End sudo session impersonating " . $config->{unprivileged_user_login}); +ok($error_msg =~ /^Sorry, you aren't a member of the 'editusers' group/, + "Not a member of the editusers group"); +$sel->click_ok( + "link=End sudo session impersonating " . $config->{unprivileged_user_login}); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Sudo session complete"); $sel->is_text_present_ok("The sudo session has been ended"); # Try to access the sudo page directly, with no credentials. -$sel->open_ok("/$config->{bugzilla_installation}/relogin.cgi?action=begin-sudo&target_login=$config->{admin_user_login}"); +$sel->open_ok( + "/$config->{bugzilla_installation}/relogin.cgi?action=begin-sudo&target_login=$config->{admin_user_login}" +); $sel->title_is("Password Required"); # The link should populate the target_login field correctly. @@ -107,12 +127,20 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Begin sudo session"); $sel->value_is("target_login", $config->{admin_user_login}); $sel->type_ok("reason", "Selenium hack"); -$sel->type_ok("current_password", $config->{admin_user_passwd}, "Enter admin password"); +$sel->type_ok( + "current_password", + $config->{admin_user_passwd}, + "Enter admin password" +); $sel->click_ok('//input[@value="Begin Session"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("User Protected"); $error_msg = trim($sel->get_text("error_msg")); -ok($error_msg =~ /^The user $config->{admin_user_login} may not be impersonated by sudoers/, "Cannot impersonate administrators"); +ok( + $error_msg + =~ /^The user $config->{admin_user_login} may not be impersonated by sudoers/, + "Cannot impersonate administrators" +); # Now try to sudo a non-existing user account, with no password. @@ -126,13 +154,23 @@ $sel->title_is("Password Required"); # Same as above, but with your password. -$sel->open_ok("/$config->{bugzilla_installation}/relogin.cgi?action=prepare-sudo&target_login=foo\@bar.com"); +$sel->open_ok( + "/$config->{bugzilla_installation}/relogin.cgi?action=prepare-sudo&target_login=foo\@bar.com" +); $sel->title_is("Begin sudo session"); $sel->value_is("target_login", 'foo@bar.com'); -$sel->type_ok("current_password", $config->{admin_user_passwd}, "Enter admin password"); +$sel->type_ok( + "current_password", + $config->{admin_user_passwd}, + "Enter admin password" +); $sel->click_ok('//input[@value="Begin Session"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Match Failed"); $error_msg = trim($sel->get_text("error_msg")); -ok($error_msg eq 'foo@bar.com does not exist or you are not allowed to see that user.', "Cannot impersonate non-existing accounts"); +ok( + $error_msg eq + 'foo@bar.com does not exist or you are not allowed to see that user.', + "Cannot impersonate non-existing accounts" +); logout($sel); diff --git a/qa/t/test_target_milestones.t b/qa/t/test_target_milestones.t index 7558f0525..ef62dd726 100644 --- a/qa/t/test_target_milestones.t +++ b/qa/t/test_target_milestones.t @@ -20,7 +20,7 @@ my $test_bug_1 = $config->{test_bug_1}; # Enable target milestones. log_in($sel, $config, 'admin'); -set_parameters($sel, { "Bug Fields" => {"usetargetmilestone-on" => undef} }); +set_parameters($sel, {"Bug Fields" => {"usetargetmilestone-on" => undef}}); # Create a new milestone to the 'TestProduct' product. @@ -32,7 +32,7 @@ $sel->click_ok("link=Add"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Add Milestone to Product 'TestProduct'"); $sel->type_ok("milestone", "TM1"); -$sel->type_ok("sortkey", "10"); +$sel->type_ok("sortkey", "10"); $sel->click_ok("create"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Milestone Created"); @@ -51,7 +51,7 @@ $sel->is_text_present_ok("Changes submitted for bug $test_bug_1"); open_advanced_search_page($sel); $sel->is_text_present_ok("Target Milestone:"); $sel->remove_all_selections_ok("product"); -$sel->add_selection_ok("product", "label=TestProduct"); +$sel->add_selection_ok("product", "label=TestProduct"); $sel->add_selection_ok("target_milestone", "label=TM1"); $sel->click_ok("Search"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -62,16 +62,22 @@ $sel->click_ok("remember"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Search created"); my $text = trim($sel->get_text("message")); -ok($text =~ /OK, you have a new search named selenium_m0./, "New search named selenium_m0 has been created"); +ok( + $text =~ /OK, you have a new search named selenium_m0./, + "New search named selenium_m0 has been created" +); # Turn off milestones and check that the milestone field no longer appears in bugs. -set_parameters($sel, { "Bug Fields" => {"usetargetmilestone-off" => undef} }); +set_parameters($sel, {"Bug Fields" => {"usetargetmilestone-off" => undef}}); $sel->click_ok('//*[@class="link-search"]//a'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Search for bugs"); -ok(!$sel->is_text_present("Target Milestone:"), "The target milestone field is no longer displayed"); +ok( + !$sel->is_text_present("Target Milestone:"), + "The target milestone field is no longer displayed" +); go_to_bug($sel, $test_bug_1); ok(!$sel->is_element_present('//label[@for="target_milestone"]')); @@ -86,23 +92,29 @@ $sel->click_ok("link=Forget Search 'selenium_m0'"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Search is gone"); $text = trim($sel->get_text("message")); -ok($text =~ /OK, the selenium_m0 search is gone./, "The selenium_m0 search is gone"); +ok($text =~ /OK, the selenium_m0 search is gone./, + "The selenium_m0 search is gone"); # Re-enable the usetargetmilestone parameter and delete the created # milestone from the Testproduct product. -set_parameters($sel, { "Bug Fields" => {"usetargetmilestone-on" => undef} }); +set_parameters($sel, {"Bug Fields" => {"usetargetmilestone-on" => undef}}); edit_product($sel, "TestProduct"); $sel->click_ok("link=Edit milestones:"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Select milestone of product 'TestProduct'"); -$sel->click_ok('//a[@href="editmilestones.cgi?action=del&product=TestProduct&milestone=TM1"]', - undef, "Deleting the TM1 milestone"); +$sel->click_ok( + '//a[@href="editmilestones.cgi?action=del&product=TestProduct&milestone=TM1"]', + undef, "Deleting the TM1 milestone" +); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Delete Milestone of Product 'TestProduct'"); $text = trim($sel->get_body_text()); -ok($text =~ /There is 1 bug entered for this milestone/, "Warning displayed about 1 bug targetted to TM1"); +ok( + $text =~ /There is 1 bug entered for this milestone/, + "Warning displayed about 1 bug targetted to TM1" +); $sel->click_ok("delete"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Milestone Deleted"); diff --git a/qa/t/test_time_summary.t b/qa/t/test_time_summary.t index 504c864f2..646f6ea66 100644 --- a/qa/t/test_time_summary.t +++ b/qa/t/test_time_summary.t @@ -20,17 +20,24 @@ my $test_bug_1 = $config->{test_bug_1}; # Set the timetracking group to "editbugs", which is the default value for this parameter. log_in($sel, $config, 'admin'); -set_parameters($sel, { "Group Security" => {"timetrackinggroup" => {type => "select", value => "editbugs"}} }); +set_parameters( + $sel, + { + "Group Security" => + {"timetrackinggroup" => {type => "select", value => "editbugs"}} + } +); # Add some Hours Worked to a bug so that we are sure at least one bug # will be present in our buglist below. go_to_bug($sel, $test_bug_1); $sel->type_ok("work_time", 2.6); -$sel->type_ok("comment", "I did some work"); +$sel->type_ok("comment", "I did some work"); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok("Changes submitted for bug $test_bug_1"); + # Make sure the correct bug is redisplayed. $sel->click_ok("link=bug $test_bug_1"); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -43,7 +50,8 @@ $sel->is_text_present_ok("Hours Worked: 2.6"); $sel->open_ok("/$config->{bugzilla_installation}/summarize_time.cgi"); $sel->title_is("No Bugs Selected"); my $error_msg = trim($sel->get_text("error_msg")); -ok($error_msg =~ /You apparently didn't choose any bugs to view/, "No data displayed"); +ok($error_msg =~ /You apparently didn't choose any bugs to view/, + "No data displayed"); # Search for bugs which have some value in the Hours Worked field. @@ -65,7 +73,7 @@ $sel->title_like(qr/^Time Summary \(\d+ bugs selected\)/); $sel->check_ok("monthly"); $sel->check_ok("detailed"); $sel->type_ok("start_date", "2009-01-01"); -$sel->type_ok("end_date", "2009-04-30"); +$sel->type_ok("end_date", "2009-04-30"); $sel->click_ok("summarize"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^Time Summary \(\d+ bugs selected\)/); diff --git a/qa/t/test_user_groups.t b/qa/t/test_user_groups.t index 0798a1b80..bc3f2e500 100644 --- a/qa/t/test_user_groups.t +++ b/qa/t/test_user_groups.t @@ -17,7 +17,8 @@ use constant PASSWORD => 'uChoopoh1che'; my ($sel, $config) = get_selenium(); log_in($sel, $config, 'admin'); -set_parameters($sel, { "Administrative Policies" => {"allowuserdeletion-on" => undef} }); +set_parameters($sel, + {"Administrative Policies" => {"allowuserdeletion-on" => undef}}); # First delete test users, if not deleted correctly during a previous run. @@ -44,7 +45,8 @@ $sel->click_ok("link=Add Group"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Add group"); $sel->type_ok("name", "Slave"); -$sel->type_ok("desc", "Members of the Master group are also members of this group"); +$sel->type_ok("desc", + "Members of the Master group are also members of this group"); $sel->type_ok("owner", $config->{'admin_user_login'}); $sel->uncheck_ok("isactive"); ok(!$sel->is_checked("insertnew"), "Group not added to products by default"); @@ -66,9 +68,9 @@ $sel->title_is('Search users'); $sel->click_ok('link=add a new user'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is('Add user'); -$sel->type_ok('login', 'master@selenium.bugzilla.org'); -$sel->type_ok('name', 'master-user'); -$sel->type_ok('password', PASSWORD, 'Enter password'); +$sel->type_ok('login', 'master@selenium.bugzilla.org'); +$sel->type_ok('name', 'master-user'); +$sel->type_ok('password', PASSWORD, 'Enter password'); $sel->type_ok('disabledtext', 'Not for common usage'); $sel->click_ok('add'); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -82,9 +84,9 @@ $sel->is_text_present_ok('The account has been added to the Master group'); $sel->click_ok("//a[contains(text(),'add\n a new user')]"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is('Add user'); -$sel->type_ok('login', 'slave@selenium.bugzilla.org'); -$sel->type_ok('name', 'slave-user'); -$sel->type_ok('password', PASSWORD, 'Enter password'); +$sel->type_ok('login', 'slave@selenium.bugzilla.org'); +$sel->type_ok('name', 'slave-user'); +$sel->type_ok('password', PASSWORD, 'Enter password'); $sel->type_ok('disabledtext', 'Not for common usage'); $sel->click_ok('add'); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -98,9 +100,9 @@ $sel->is_text_present_ok('The account has been added to the Slave group'); $sel->click_ok("//a[contains(text(),'add\n a new user')]"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is('Add user'); -$sel->type_ok('login', 'reg@selenium.bugzilla.org'); -$sel->type_ok('name', 'reg-user'); -$sel->type_ok('password', PASSWORD, 'Enter password'); +$sel->type_ok('login', 'reg@selenium.bugzilla.org'); +$sel->type_ok('name', 'reg-user'); +$sel->type_ok('password', PASSWORD, 'Enter password'); $sel->type_ok('disabledtext', 'Not for common usage'); $sel->click_ok('add'); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -112,25 +114,31 @@ $sel->click_ok('link=find other users'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is('Search users'); $sel->check_ok('grouprestrict'); -$sel->select_ok('groupid', 'label=Master'); +$sel->select_ok('groupid', 'label=Master'); $sel->select_ok('matchtype', 'value=substr'); $sel->click_ok('search'); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->is_text_present_ok('master@selenium.bugzilla.org', 'master-user in Master group'); -ok(!$sel->is_text_present('slave@selenium.bugzilla.org'), 'slave-user not in Master group'); -ok(!$sel->is_text_present('reg@selenium.bugzilla.org'), 'reg-user not in Master group'); +$sel->is_text_present_ok('master@selenium.bugzilla.org', + 'master-user in Master group'); +ok(!$sel->is_text_present('slave@selenium.bugzilla.org'), + 'slave-user not in Master group'); +ok(!$sel->is_text_present('reg@selenium.bugzilla.org'), + 'reg-user not in Master group'); $sel->click_ok('link=find other users'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is('Search users'); $sel->check_ok('grouprestrict'); -$sel->select_ok('groupid', 'label=Slave'); +$sel->select_ok('groupid', 'label=Slave'); $sel->select_ok('matchtype', 'value=substr'); $sel->click_ok('search'); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->is_text_present_ok('master@selenium.bugzilla.org', 'master-user in Slave group'); -$sel->is_text_present_ok('slave@selenium.bugzilla.org', 'slave-user in Slave group'); -ok(!$sel->is_text_present('reg@selenium.bugzilla.org'), 'reg-user not in Slave group'); +$sel->is_text_present_ok('master@selenium.bugzilla.org', + 'master-user in Slave group'); +$sel->is_text_present_ok('slave@selenium.bugzilla.org', + 'slave-user in Slave group'); +ok(!$sel->is_text_present('reg@selenium.bugzilla.org'), + 'reg-user not in Slave group'); # Add a regular expression to the Slave group. @@ -153,25 +161,31 @@ $sel->click_ok("link=Users"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is('Search users'); $sel->check_ok('grouprestrict'); -$sel->select_ok('groupid', 'label=Master'); +$sel->select_ok('groupid', 'label=Master'); $sel->select_ok('matchtype', 'value=substr'); $sel->click_ok('search'); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->is_text_present_ok('master@selenium.bugzilla.org', 'master-user in Master group'); -ok(!$sel->is_text_present('slave@selenium.bugzilla.org'), 'slave-user not in Master group'); -ok(!$sel->is_text_present('reg@selenium.bugzilla.org'), 'reg-user not in Master group'); +$sel->is_text_present_ok('master@selenium.bugzilla.org', + 'master-user in Master group'); +ok(!$sel->is_text_present('slave@selenium.bugzilla.org'), + 'slave-user not in Master group'); +ok(!$sel->is_text_present('reg@selenium.bugzilla.org'), + 'reg-user not in Master group'); $sel->click_ok('link=find other users'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is('Search users'); $sel->check_ok('grouprestrict'); -$sel->select_ok('groupid', 'label=Slave'); +$sel->select_ok('groupid', 'label=Slave'); $sel->select_ok('matchtype', 'value=substr'); $sel->click_ok('search'); $sel->wait_for_page_to_load_ok(WAIT_TIME); -$sel->is_text_present_ok('master@selenium.bugzilla.org', 'master-user in Slave group'); -$sel->is_text_present_ok('slave@selenium.bugzilla.org', 'slave-user in Slave group'); -$sel->is_text_present_ok('reg@selenium.bugzilla.org', 'reg-user in Slave group'); +$sel->is_text_present_ok('master@selenium.bugzilla.org', + 'master-user in Slave group'); +$sel->is_text_present_ok('slave@selenium.bugzilla.org', + 'slave-user in Slave group'); +$sel->is_text_present_ok('reg@selenium.bugzilla.org', + 'reg-user in Slave group'); # Remove created users and groups. @@ -180,52 +194,53 @@ cleanup_groups($sel, $slave_gid); logout($sel); sub cleanup_users { - my $sel = shift; - - go_to_admin($sel); - $sel->click_ok("link=Users"); + my $sel = shift; + + go_to_admin($sel); + $sel->click_ok("link=Users"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Search users"); + $sel->type_ok('matchstr', '(master|slave|reg)@selenium.bugzilla.org'); + $sel->select_ok('matchtype', 'value=regexp'); + $sel->click_ok("search"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Select user"); + + foreach my $user ('master', 'slave', 'reg') { + my $login = $user . '@selenium.bugzilla.org'; + next unless $sel->is_text_present($login); + + $sel->click_ok("link=$login"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Edit user ${user}-user <$login>"); + $sel->click_ok("delete"); $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Search users"); - $sel->type_ok('matchstr', '(master|slave|reg)@selenium.bugzilla.org'); - $sel->select_ok('matchtype', 'value=regexp'); - $sel->click_ok("search"); + $sel->title_is("Confirm deletion of user $login"); + ok(!$sel->is_text_present('You cannot delete this user account'), + 'The user can be safely deleted'); + $sel->click_ok("delete"); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("User $login deleted"); + $sel->click_ok('link=show the user list again'); $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Select user"); - - foreach my $user ('master', 'slave', 'reg') { - my $login = $user . '@selenium.bugzilla.org'; - next unless $sel->is_text_present($login); - - $sel->click_ok("link=$login"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Edit user ${user}-user <$login>"); - $sel->click_ok("delete"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Confirm deletion of user $login"); - ok(!$sel->is_text_present('You cannot delete this user account'), 'The user can be safely deleted'); - $sel->click_ok("delete"); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("User $login deleted"); - $sel->click_ok('link=show the user list again'); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is('Select user'); - } + $sel->title_is('Select user'); + } } sub cleanup_groups { - my ($sel, $slave_gid) = @_; - - go_to_admin($sel); - $sel->click_ok("link=Groups"); - $sel->wait_for_page_to_load(WAIT_TIME); - $sel->title_is("Edit Groups"); - $sel->click_ok("//a[\@href='editgroups.cgi?action=del&group=$slave_gid']"); - $sel->wait_for_page_to_load(WAIT_TIME); - $sel->title_is("Delete group"); - $sel->is_text_present_ok("Do you really want to delete this group?"); - ok(!$sel->is_element_present("removeusers"), 'No direct members in this group'); - $sel->click_ok("delete"); - $sel->wait_for_page_to_load(WAIT_TIME); - $sel->title_is("Group Deleted"); - $sel->is_text_present_ok("The group Slave has been deleted."); + my ($sel, $slave_gid) = @_; + + go_to_admin($sel); + $sel->click_ok("link=Groups"); + $sel->wait_for_page_to_load(WAIT_TIME); + $sel->title_is("Edit Groups"); + $sel->click_ok("//a[\@href='editgroups.cgi?action=del&group=$slave_gid']"); + $sel->wait_for_page_to_load(WAIT_TIME); + $sel->title_is("Delete group"); + $sel->is_text_present_ok("Do you really want to delete this group?"); + ok(!$sel->is_element_present("removeusers"), 'No direct members in this group'); + $sel->click_ok("delete"); + $sel->wait_for_page_to_load(WAIT_TIME); + $sel->title_is("Group Deleted"); + $sel->is_text_present_ok("The group Slave has been deleted."); } diff --git a/qa/t/test_user_matching.t b/qa/t/test_user_matching.t index 3b7b71ed5..b2dc25e19 100644 --- a/qa/t/test_user_matching.t +++ b/qa/t/test_user_matching.t @@ -19,11 +19,17 @@ my $test_bug_1 = $config->{test_bug_1}; log_in($sel, $config, 'tweakparams'); -set_parameters($sel, { "User Matching" => {"usemenuforusers-off" => undef, - "maxusermatches" => {type => 'text', value => '0'}, - "confirmuniqueusermatch-on" => undef}, - "Group Security" => {"usevisibilitygroups-off" => undef} - }); +set_parameters( + $sel, + { + "User Matching" => { + "usemenuforusers-off" => undef, + "maxusermatches" => {type => 'text', value => '0'}, + "confirmuniqueusermatch-on" => undef + }, + "Group Security" => {"usevisibilitygroups-off" => undef} + } +); go_to_bug($sel, $test_bug_1); $sel->click_ok("cc_edit_area_showhide"); @@ -35,7 +41,8 @@ $sel->type_ok("newcc", $config->{unprivileged_user_login_truncated}); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Confirm Match"); -$sel->is_text_present_ok("$config->{unprivileged_user_login_truncated} matched"); +$sel->is_text_present_ok( + "$config->{unprivileged_user_login_truncated} matched"); $sel->go_back_ok(); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^$test_bug_1/); @@ -75,7 +82,8 @@ $sel->is_text_present_ok("*$config->{common_email} matched:"); # Now restrict 'maxusermatches'. -set_parameters($sel, { "User Matching" => {"maxusermatches" => {type => 'text', value => '1'}} }); +set_parameters($sel, + {"User Matching" => {"maxusermatches" => {type => 'text', value => '1'}}}); go_to_bug($sel, $test_bug_1); $sel->click_ok("cc_edit_area_showhide"); @@ -103,9 +111,13 @@ $sel->is_text_present_ok("Changes submitted for bug $test_bug_1"); # Now turn on group visibility. It involves important security checks. -set_parameters($sel, { "User Matching" => {"maxusermatches" => {type => 'text', value => '2'}}, - "Group Security" => {"usevisibilitygroups-on" => undef} - }); +set_parameters( + $sel, + { + "User Matching" => {"maxusermatches" => {type => 'text', value => '2'}}, + "Group Security" => {"usevisibilitygroups-on" => undef} + } +); # By default, groups are not visible to themselves, so we have to enable this. # The tweakparams user has not enough privs to do it himself. @@ -121,11 +133,11 @@ $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Change Group: tweakparams"); my @groups = $sel->get_select_options("visible_from_add"); -if (grep {$_ eq 'tweakparams'} @groups) { - $sel->add_selection_ok("visible_from_add", "label=tweakparams"); - $sel->click_ok('//input[@value="Update Group"]'); - $sel->wait_for_page_to_load_ok(WAIT_TIME); - $sel->title_is("Change Group: tweakparams"); +if (grep { $_ eq 'tweakparams' } @groups) { + $sel->add_selection_ok("visible_from_add", "label=tweakparams"); + $sel->click_ok('//input[@value="Update Group"]'); + $sel->wait_for_page_to_load_ok(WAIT_TIME); + $sel->title_is("Change Group: tweakparams"); } logout($sel); log_in($sel, $config, 'tweakparams'); @@ -139,7 +151,8 @@ $sel->type_ok("newcc", $config->{unprivileged_user_login_truncated}); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Match Failed"); -$sel->is_text_present_ok("$config->{unprivileged_user_login_truncated} did not match anything"); +$sel->is_text_present_ok( + "$config->{unprivileged_user_login_truncated} did not match anything"); $sel->go_back_ok(); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^$test_bug_1/); @@ -152,7 +165,8 @@ $sel->type_ok("newcc", $config->{common_email}); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Confirm Match"); -$sel->is_text_present_ok("$config->{common_email} matched more than the maximum of 2 users"); +$sel->is_text_present_ok( + "$config->{common_email} matched more than the maximum of 2 users"); $sel->go_back_ok(); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^$test_bug_1/); @@ -168,21 +182,39 @@ $sel->is_text_present_ok("<$config->{tweakparams_user_login}>"); # Now test user menus. It must NOT display users we are not allowed to see. -set_parameters($sel, { "User Matching" => {"usemenuforusers-on" => undef} }); +set_parameters($sel, {"User Matching" => {"usemenuforusers-on" => undef}}); go_to_bug($sel, $test_bug_1); $sel->click_ok("cc_edit_area_showhide"); my @cc = $sel->get_select_options("newcc"); -ok(!grep($_ =~ /$config->{unprivileged_user_login}/, @cc), "$config->{unprivileged_user_login} is not visible"); -ok(!grep($_ =~ /$config->{canconfirm_user_login}/, @cc), "$config->{canconfirm_user_login} is not visible"); -ok(grep($_ =~ /$config->{admin_user_login}/, @cc), "$config->{admin_user_login} is visible"); -ok(grep($_ =~ /$config->{tweakparams_user_login}/, @cc), "$config->{tweakparams_user_login} is visible"); +ok( + !grep($_ =~ /$config->{unprivileged_user_login}/, @cc), + "$config->{unprivileged_user_login} is not visible" +); +ok( + !grep($_ =~ /$config->{canconfirm_user_login}/, @cc), + "$config->{canconfirm_user_login} is not visible" +); +ok( + grep($_ =~ /$config->{admin_user_login}/, @cc), + "$config->{admin_user_login} is visible" +); +ok( + grep($_ =~ /$config->{tweakparams_user_login}/, @cc), + "$config->{tweakparams_user_login} is visible" +); # Reset paramters. -set_parameters($sel, { "User Matching" => {"usemenuforusers-off" => undef, - "maxusermatches" => {type => 'text', value => '0'}, - "confirmuniqueusermatch-off" => undef}, - "Group Security" => {"usevisibilitygroups-off" => undef} - }); +set_parameters( + $sel, + { + "User Matching" => { + "usemenuforusers-off" => undef, + "maxusermatches" => {type => 'text', value => '0'}, + "confirmuniqueusermatch-off" => undef + }, + "Group Security" => {"usevisibilitygroups-off" => undef} + } +); logout($sel); diff --git a/qa/t/test_user_preferences.t b/qa/t/test_user_preferences.t index d9e0562c1..de311533f 100644 --- a/qa/t/test_user_preferences.t +++ b/qa/t/test_user_preferences.t @@ -44,11 +44,16 @@ $sel->title_is("User Preferences"); $sel->click_ok("link=General Preferences"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("User Preferences"); -ok(!$sel->is_element_present("skin"), "The 'skin' user preference is not present"); +ok(!$sel->is_element_present("skin"), + "The 'skin' user preference is not present"); $sel->select_ok("state_addselfcc", "label=Site Default (Never)"); -$sel->select_ok("post_bug_submit_action", "label=Site Default (Show the updated bug)"); +$sel->select_ok("post_bug_submit_action", + "label=Site Default (Show the updated bug)"); $sel->select_ok("per_bug_queries", "label=Site Default (On)"); -ok(!$sel->is_element_present("zoom_textareas"), "The 'zoom_textareas' user preference is not present"); +ok( + !$sel->is_element_present("zoom_textareas"), + "The 'zoom_textareas' user preference is not present" +); $sel->click_ok("update"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("User Preferences"); @@ -58,11 +63,12 @@ $sel->title_is("User Preferences"); file_bug_in_product($sel, 'TestProduct'); $sel->value_is("cc", ""); $sel->type_ok("short_desc", "First bug created"); -$sel->type_ok("comment", "I'm not in the CC list."); +$sel->type_ok("comment", "I'm not in the CC list."); $sel->click_ok("commit"); $sel->wait_for_page_to_load(WAIT_TIME); my $bug1_id = $sel->get_value('//input[@name="id" and @type="hidden"]'); -$sel->is_text_present_ok('has been added to the database', "Bug $bug1_id created"); +$sel->is_text_present_ok('has been added to the database', + "Bug $bug1_id created"); $sel->value_is("addselfcc", "off"); $sel->select_ok("bug_status", "label=IN_PROGRESS"); $sel->click_ok("commit"); @@ -70,18 +76,19 @@ $sel->wait_for_page_to_load(WAIT_TIME); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); $sel->click_ok("editme_action"); $sel->value_is("short_desc", "First bug created"); -$sel->value_is("addselfcc", "off"); +$sel->value_is("addselfcc", "off"); # Tag the bug. $sel->select_ok("lob_action", "label=Add"); $sel->type_ok("lob_newqueryname", "sel-tmp"); -$sel->type_ok("bug_ids", $bug1_id); +$sel->type_ok("bug_ids", $bug1_id); $sel->click_ok("commit_list_of_bugs"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Tag Updated"); my $text = trim($sel->get_text("message")); -ok($text =~ /The 'sel-tmp' tag has been added to bug $bug1_id/, "Bug added to 'sel-tmp' tag"); +ok($text =~ /The 'sel-tmp' tag has been added to bug $bug1_id/, + "Bug added to 'sel-tmp' tag"); $sel->click_ok("link=sel-tmp"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->is_text_present_ok("Tags: sel-tmp"); @@ -92,23 +99,25 @@ $sel->is_text_present_ok("One bug found"); file_bug_in_product($sel, 'TestProduct'); $sel->value_is("cc", ""); $sel->type_ok("short_desc", "My second bug"); -$sel->type_ok("comment", "Still not in the CC list"); +$sel->type_ok("comment", "Still not in the CC list"); $sel->click_ok("commit"); $sel->wait_for_page_to_load(WAIT_TIME); my $bug2_id = $sel->get_value('//input[@name="id" and @type="hidden"]'); -$sel->is_text_present_ok('has been added to the database', "Bug $bug2_id created"); +$sel->is_text_present_ok('has been added to the database', + "Bug $bug2_id created"); $sel->value_is("addselfcc", "off"); # Add another bug to the tag. -$sel->select_ok("lob_action", "label=Add"); +$sel->select_ok("lob_action", "label=Add"); $sel->select_ok("lob_oldqueryname", "label=sel-tmp"); $sel->type_ok("bug_ids", $bug2_id); $sel->click_ok("commit_list_of_bugs"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Tag Updated"); $text = trim($sel->get_text("message")); -ok($text =~ /The 'sel-tmp' tag has been added to bug $bug2_id/, "Bug added to 'sel-tmp' tag"); +ok($text =~ /The 'sel-tmp' tag has been added to bug $bug2_id/, + "Bug added to 'sel-tmp' tag"); $sel->click_ok("link=sel-tmp"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Bug List"); @@ -128,21 +137,23 @@ $sel->is_text_present_ok("The next bug I should see is this one."); # Remove the tag from all bugs. -$sel->open_ok("/$config->{bugzilla_installation}/buglist.cgi?tag=sel-tmp", undef, "List 'sel-tmp' bugs"); +$sel->open_ok("/$config->{bugzilla_installation}/buglist.cgi?tag=sel-tmp", + undef, "List 'sel-tmp' bugs"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Bug List"); $sel->is_text_present_ok("Tags: sel-tmp"); $sel->click_ok("link=$bug1_id"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_like(qr/^$bug1_id /); -$sel->select_ok("lob_action", "label=Remove"); +$sel->select_ok("lob_action", "label=Remove"); $sel->select_ok("lob_oldqueryname", "label=sel-tmp"); $sel->type_ok("bug_ids", $bug1_id); $sel->click_ok("commit_list_of_bugs"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Tag Updated"); $text = trim($sel->get_text("message")); -ok($text =~ /The 'sel-tmp' tag has been removed from bug $bug1_id/, "Bug removed from 'sel-tmp' tag"); +ok($text =~ /The 'sel-tmp' tag has been removed from bug $bug1_id/, + "Bug removed from 'sel-tmp' tag"); $sel->click_ok("link=sel-tmp"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Bug List"); @@ -150,14 +161,15 @@ $sel->is_text_present_ok("Tags: sel-tmp"); $sel->click_ok("link=$bug2_id"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_like(qr/^$bug2_id /); -$sel->select_ok("lob_action", "label=Remove"); +$sel->select_ok("lob_action", "label=Remove"); $sel->select_ok("lob_oldqueryname", "label=sel-tmp"); $sel->type_ok("bug_ids", $bug2_id); $sel->click_ok("commit_list_of_bugs"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Tag Updated"); $text = trim($sel->get_text("message")); -ok($text =~ /The 'sel-tmp' tag has been removed from bug $bug2_id/, "Bug removed from 'sel-tmp' tag"); +ok($text =~ /The 'sel-tmp' tag has been removed from bug $bug2_id/, + "Bug removed from 'sel-tmp' tag"); $sel->click_ok("link=sel-tmp"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Bug List"); @@ -174,18 +186,31 @@ $sel->title_is("User Preferences"); $sel->click_ok("link=General Preferences"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("User Preferences"); -ok(!$sel->is_element_present("skin"), "The 'skin' user preference is not present"); -$sel->select_ok("state_addselfcc", "label=Always"); +ok(!$sel->is_element_present("skin"), + "The 'skin' user preference is not present"); +$sel->select_ok("state_addselfcc", "label=Always"); $sel->select_ok("post_bug_submit_action", "label=Show next bug in my list"); -$sel->select_ok("per_bug_queries", "label=Off"); -ok(!$sel->is_element_present("zoom_textareas"), "The 'zoom_textareas' user preference is not present"); +$sel->select_ok("per_bug_queries", "label=Off"); +ok( + !$sel->is_element_present("zoom_textareas"), + "The 'zoom_textareas' user preference is not present" +); $sel->click_ok("update"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("User Preferences"); -ok(!$sel->is_element_present("lob_action"), "Element 1/3 for tags is not displayed"); -ok(!$sel->is_element_present("lob_newqueryname"), "Element 2/3 for tags is not displayed"); -ok(!$sel->is_element_present("commit_list_of_bugs"), "Element 3/3 for tags is not displayed"); +ok( + !$sel->is_element_present("lob_action"), + "Element 1/3 for tags is not displayed" +); +ok( + !$sel->is_element_present("lob_newqueryname"), + "Element 2/3 for tags is not displayed" +); +ok( + !$sel->is_element_present("commit_list_of_bugs"), + "Element 3/3 for tags is not displayed" +); # Create a new search named 'my_list'. @@ -205,7 +230,10 @@ $sel->click_ok("remember"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Search created"); $text = trim($sel->get_text("message")); -ok($text =~ /OK, you have a new search named my_list./, "New saved search 'my_list' has been created"); +ok( + $text =~ /OK, you have a new search named my_list./, + "New saved search 'my_list' has been created" +); # Editing bugs should follow user preferences. @@ -216,12 +244,15 @@ $sel->click_ok("link=$bug1_id"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_like(qr/^$bug1_id .* First bug created/); $sel->value_is("addselfcc", "on"); -$sel->type_ok("comment", "I should be CC'ed and then I should see the next bug."); +$sel->type_ok("comment", + "I should be CC'ed and then I should see the next bug."); $sel->click_ok("commit"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->is_text_present_ok("Changes submitted for bug $bug1_id"); $sel->is_text_present_ok("The next bug in your list is bug $bug2_id"); -ok(!$sel->is_text_present("I should see the next bug"), "The updated bug is no longer displayed"); +ok(!$sel->is_text_present("I should see the next bug"), + "The updated bug is no longer displayed"); + # The user has no privs, so the short_desc field is not present. $sel->is_text_present_ok("My second bug"); $sel->value_is("addselfcc", "on"); @@ -239,5 +270,8 @@ $sel->click_ok("link=Forget Search 'my_list'"); $sel->wait_for_page_to_load(WAIT_TIME); $sel->title_is("Search is gone"); $text = trim($sel->get_text("message")); -ok($text =~ /OK, the my_list search is gone/, "The saved search 'my_list' has been deleted"); +ok( + $text =~ /OK, the my_list search is gone/, + "The saved search 'my_list' has been deleted" +); logout($sel); diff --git a/qa/t/test_user_privs.t b/qa/t/test_user_privs.t index 72b205b25..4c9acbfef 100644 --- a/qa/t/test_user_privs.t +++ b/qa/t/test_user_privs.t @@ -18,7 +18,8 @@ my $test_bug_1 = $config->{test_bug_1}; # When being logged out, the 'Commit' button should not be displayed. -$sel->open_ok("/$config->{bugzilla_installation}/index.cgi?logout=1", undef, "Log out (if required)"); +$sel->open_ok("/$config->{bugzilla_installation}/index.cgi?logout=1", + undef, "Log out (if required)"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Logged Out"); go_to_bug($sel, $test_bug_1); @@ -31,11 +32,12 @@ log_in($sel, $config, 'unprivileged'); file_bug_in_product($sel, 'TestProduct'); ok(!$sel->is_editable("assigned_to"), "The assignee field is not editable"); $sel->type_ok("short_desc", "Greetings from a powerless user"); -$sel->type_ok("comment", "File a bug with an empty CC list"); +$sel->type_ok("comment", "File a bug with an empty CC list"); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); my $bug1_id = $sel->get_value("//input[\@name='id' and \@type='hidden']"); -$sel->is_text_present_ok('has been added to the database', "Bug $bug1_id created"); +$sel->is_text_present_ok('has been added to the database', + "Bug $bug1_id created"); logout($sel); # Some checks while being logged out. @@ -43,8 +45,11 @@ logout($sel); go_to_bug($sel, $bug1_id); ok(!$sel->is_element_present("commit"), "Button 'Commit' not available"); my $text = trim($sel->get_text("//fieldset")); -ok($text =~ /You need to log in before you can comment on or make changes to this bug./, - "Addl. comment box not displayed"); +ok( + $text + =~ /You need to log in before you can comment on or make changes to this bug./, + "Addl. comment box not displayed" +); # Don't call log_in() here. We explicitly want to use the "log in" link # in the addl. comment box. @@ -53,8 +58,16 @@ $sel->click_ok("link=log in"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Log in to Bugzilla"); $sel->is_text_present_ok("I need an email address and password to continue."); -$sel->type_ok("Bugzilla_login", $config->{unprivileged_user_login}, "Enter login name"); -$sel->type_ok("Bugzilla_password", $config->{unprivileged_user_passwd}, "Enter password"); +$sel->type_ok( + "Bugzilla_login", + $config->{unprivileged_user_login}, + "Enter login name" +); +$sel->type_ok( + "Bugzilla_password", + $config->{unprivileged_user_passwd}, + "Enter password" +); $sel->click_ok("log_in", undef, "Submit credentials"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_like(qr/^$bug1_id/, "Display bug $bug1_id"); @@ -62,7 +75,13 @@ $sel->title_like(qr/^$bug1_id/, "Display bug $bug1_id"); # Neither the (edit) link nor the hidden form must exist, at all. # But the 'Commit' button does exist. -ok(!$sel->is_element_present("bz_assignee_edit_action"), "No (edit) link displayed for the assignee"); -ok(!$sel->is_element_present("assigned_to"), "No hidden assignee field available"); +ok( + !$sel->is_element_present("bz_assignee_edit_action"), + "No (edit) link displayed for the assignee" +); +ok( + !$sel->is_element_present("assigned_to"), + "No hidden assignee field available" +); $sel->is_element_present_ok("commit"); logout($sel); diff --git a/qa/t/test_votes.t b/qa/t/test_votes.t index ee257e85c..e97498853 100644 --- a/qa/t/test_votes.t +++ b/qa/t/test_votes.t @@ -16,25 +16,30 @@ use QA::Util; my ($sel, $config) = get_selenium(); unless ($config->{test_extensions}) { - ok(1, "this installation doesn't test extensions. Skipping test_votes.t completely."); - exit; + ok(1, + "this installation doesn't test extensions. Skipping test_votes.t completely."); + exit; } log_in($sel, $config, 'admin'); -set_parameters($sel, { "Bug Fields" => {"useclassification-off" => undef}, - "Administrative Policies" => {"allowbugdeletion-on" => undef} - }); +set_parameters( + $sel, + { + "Bug Fields" => {"useclassification-off" => undef}, + "Administrative Policies" => {"allowbugdeletion-on" => undef} + } +); # Create a new product, so that we can safely play with vote settings. add_product($sel); -$sel->type_ok("product", "Eureka"); -$sel->type_ok("description", "A great new product"); -$sel->type_ok("votesperuser", 10); +$sel->type_ok("product", "Eureka"); +$sel->type_ok("description", "A great new product"); +$sel->type_ok("votesperuser", 10); $sel->type_ok("maxvotesperbug", 5); $sel->type_ok("votestoconfirm", 3); -$sel->select_ok("security_group_id", "label=core-security"); -$sel->select_ok("default_op_sys_id", "Unspecified"); +$sel->select_ok("security_group_id", "label=core-security"); +$sel->select_ok("default_op_sys_id", "Unspecified"); $sel->select_ok("default_platform_id", "Unspecified"); $sel->click_ok('//input[@type="submit" and @value="Add"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); @@ -42,9 +47,13 @@ $sel->title_is("Product Created"); $sel->click_ok("link=add at least one component"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Add component to the Eureka product"); -$sel->type_ok("component", "Pegasus"); +$sel->type_ok("component", "Pegasus"); $sel->type_ok("description", "A constellation in the north hemisphere."); -$sel->type_ok("initialowner", $config->{permanent_user}, "Setting the default owner"); +$sel->type_ok( + "initialowner", + $config->{permanent_user}, + "Setting the default owner" +); $sel->uncheck_ok("watch_user_auto"); $sel->type_ok("watch_user", "pegasus\@eureka.bugs"); $sel->check_ok("watch_user_auto"); @@ -52,15 +61,17 @@ $sel->click_ok("create"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Component Created"); my $text = trim($sel->get_text("message")); -ok($text =~ qr/The component Pegasus has been created/, "Component 'Pegasus' created"); +ok($text =~ qr/The component Pegasus has been created/, + "Component 'Pegasus' created"); # Create a new bug with the CONFIRMED status. file_bug_in_product($sel, 'Eureka'); + # CONFIRMED must be the default bug status for users with editbugs privs. $sel->selected_label_is("bug_status", "CONFIRMED"); $sel->type_ok("short_desc", "Aries"); -$sel->type_ok("comment", "1st constellation"); +$sel->type_ok("comment", "1st constellation"); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok('has been added to the database'); @@ -71,26 +82,32 @@ my $bug1_id = $sel->get_value('//input[@name="id" and @type="hidden"]'); $sel->click_ok("link=vote"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Change Votes"); + # No comment :-/ my $full_text = trim($sel->get_body_text()); + # OK, this is not the most robust regexp, but that's better than nothing. -ok($full_text =~ /only 5 votes allowed per bug in this product/, - "Notice about the number of votes allowed per bug displayed"); +ok( + $full_text =~ /only 5 votes allowed per bug in this product/, + "Notice about the number of votes allowed per bug displayed" +); $sel->type_ok("bug_$bug1_id", 4); $sel->click_ok("change"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Change Votes"); $full_text = trim($sel->get_body_text()); + # OK, we may get a false positive if another product has the exact same numbers, # but I have no better idea to check this information. -ok($full_text =~ /4 votes used out of 10 allowed/, "Display the number of votes used"); +ok($full_text =~ /4 votes used out of 10 allowed/, + "Display the number of votes used"); # File a new bug, now as UNCONFIRMED. We will confirm it by popular votes. file_bug_in_product($sel, 'Eureka'); $sel->select_ok("bug_status", "UNCONFIRMED"); $sel->type_ok("short_desc", "Taurus"); -$sel->type_ok("comment", "2nd constellation"); +$sel->type_ok("comment", "2nd constellation"); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok('has been added to the database'); @@ -113,7 +130,7 @@ $sel->is_text_present_ok("Bug $bug2_id confirmed by number of votes"); file_bug_in_product($sel, 'Eureka'); $sel->select_ok("bug_status", "UNCONFIRMED"); $sel->type_ok("short_desc", "Gemini"); -$sel->type_ok("comment", "3rd constellation"); +$sel->type_ok("comment", "3rd constellation"); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok('has been added to the database'); @@ -131,14 +148,18 @@ $sel->type_ok("bug_$bug3_id", 2); $sel->click_ok("change"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Change Votes"); + # Illegal change: max is 5 votes per bug! $sel->type_ok("bug_$bug2_id", 15); $sel->click_ok("change"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Illegal Vote"); $text = trim($sel->get_text("error_msg")); -ok($text =~ /You may only use at most 5 votes for a single bug in the Eureka product, but you are trying to use 15/, - "Too many votes per bug"); +ok( + $text + =~ /You may only use at most 5 votes for a single bug in the Eureka product, but you are trying to use 15/, + "Too many votes per bug" +); # FIXME: We cannot use go_back_ok() here, because Firefox complains about # POST data not being stored in its cache. As a workaround, we go to @@ -156,8 +177,11 @@ $sel->click_ok("change"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Illegal Vote"); $text = trim($sel->get_text("error_msg")); -ok($text =~ /You tried to use 12 votes in the Eureka product, which exceeds the maximum of 10 votes for this product/, - "Too many votes for this product"); +ok( + $text + =~ /You tried to use 12 votes in the Eureka product, which exceeds the maximum of 10 votes for this product/, + "Too many votes for this product" +); # Decrease the confirmation threshold so that $bug3 becomes confirmed. @@ -168,7 +192,7 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Updating Product 'Eureka'"); $full_text = trim($sel->get_body_text()); ok($full_text =~ /Updated number of votes needed to confirm a bug from 3 to 2/, - "Confirming the new number of votes to confirm"); + "Confirming the new number of votes to confirm"); $sel->is_text_present_ok("Bug $bug3_id confirmed by number of votes"); # Decrease the number of votes per bug so that $bug2 is updated. @@ -181,9 +205,11 @@ $sel->click_ok('//input[@type="submit" and @value="Save Changes"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Updating Product 'Eureka'"); $full_text = trim($sel->get_body_text()); -ok($full_text =~ /Updated maximum votes per bug from 5 to 4/, "Confirming the new number of votes per bug"); -$sel->is_text_present_ok("removed votes for bug $bug2_id from " . $config->{admin_user_login}, undef, - "Removed votes from the admin"); +ok($full_text =~ /Updated maximum votes per bug from 5 to 4/, + "Confirming the new number of votes per bug"); +$sel->is_text_present_ok( + "removed votes for bug $bug2_id from " . $config->{admin_user_login}, + undef, "Removed votes from the admin"); # Go check that $bug2 has been correctly updated. @@ -202,7 +228,10 @@ $sel->click_ok('//input[@type="submit" and @value="Save Changes"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Updating Product 'Eureka'"); $full_text = trim($sel->get_body_text()); -ok($full_text =~ /Updated votes per user from 10 to 5/, "Confirming the new number of votes per user"); +ok( + $full_text =~ /Updated votes per user from 10 to 5/, + "Confirming the new number of votes per user" +); $sel->is_text_present_ok("removed votes for bug"); # Go check that $bug3 has been correctly updated. @@ -221,14 +250,16 @@ $sel->click_ok('//input[@type="submit" and @value="Save Changes"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Updating Product 'Eureka'"); $full_text = trim($sel->get_body_text()); -ok($full_text =~ /The product no longer allows the UNCONFIRMED status/, "Disable UNCONFIRMED"); +ok($full_text =~ /The product no longer allows the UNCONFIRMED status/, + "Disable UNCONFIRMED"); # File a new bug. UNCONFIRMED must not be listed as a valid bug status. file_bug_in_product($sel, "Eureka"); -ok(!scalar(grep {$_ eq "UNCONFIRMED"} $sel->get_select_options("bug_status")), "UNCONFIRMED not listed"); +ok(!scalar(grep { $_ eq "UNCONFIRMED" } $sel->get_select_options("bug_status")), + "UNCONFIRMED not listed"); $sel->type_ok("short_desc", "Cancer"); -$sel->type_ok("comment", "4th constellation"); +$sel->type_ok("comment", "4th constellation"); $sel->click_ok("commit"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->is_text_present_ok('has been added to the database'); @@ -244,8 +275,10 @@ $sel->click_ok('//a[@href="editproducts.cgi?action=del&product=Eureka"]'); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Delete Product 'Eureka'"); $full_text = trim($sel->get_body_text()); -ok($full_text =~ /There are 4 bugs entered for this product/, "Display warning about existing bugs"); -ok($full_text =~ /Pegasus: A constellation in the north hemisphere/, "Display product description"); +ok($full_text =~ /There are 4 bugs entered for this product/, + "Display warning about existing bugs"); +ok($full_text =~ /Pegasus: A constellation in the north hemisphere/, + "Display product description"); $sel->click_ok("delete"); $sel->wait_for_page_to_load_ok(WAIT_TIME); $sel->title_is("Product Deleted"); diff --git a/qa/t/webservice_bug_add_attachment.t b/qa/t/webservice_bug_add_attachment.t index 382e5bf99..8b4759c42 100644 --- a/qa/t/webservice_bug_add_attachment.t +++ b/qa/t/webservice_bug_add_attachment.t @@ -13,215 +13,250 @@ use MIME::Base64 qw(encode_base64 decode_base64); use Test::More tests => 187; my ($config, $xmlrpc, $jsonrpc, $jsonrpc_get) = get_rpc_clients(); -use constant INVALID_BUG_ID => -1; +use constant INVALID_BUG_ID => -1; use constant INVALID_BUG_ALIAS => random_string(20); -use constant PRIVS_USER => 'QA_Selenium_TEST'; +use constant PRIVS_USER => 'QA_Selenium_TEST'; sub attach { - my ($id, $override) = @_; - my %fields = ( - ids => [$id], - data => 'data-' . random_string(100), - file_name => 'file_name-' . random_string(60), - summary => 'summary-' . random_string(100), - content_type => 'text/plain', - comment => 'comment-' . random_string(100), - ); + my ($id, $override) = @_; + my %fields = ( + ids => [$id], + data => 'data-' . random_string(100), + file_name => 'file_name-' . random_string(60), + summary => 'summary-' . random_string(100), + content_type => 'text/plain', + comment => 'comment-' . random_string(100), + ); - foreach my $key (keys %{ $override || {} }) { - my $value = $override->{$key}; - if (defined $value) { - $fields{$key} = $value; - } - else { - delete $fields{$key}; - } + foreach my $key (keys %{$override || {}}) { + my $value = $override->{$key}; + if (defined $value) { + $fields{$key} = $value; + } + else { + delete $fields{$key}; } - return \%fields; + } + return \%fields; } -my ($public_bug, $private_bug) = - $xmlrpc->bz_create_test_bugs('private'); -my $public_id = $public_bug->{id}; +my ($public_bug, $private_bug) = $xmlrpc->bz_create_test_bugs('private'); +my $public_id = $public_bug->{id}; my $private_id = $private_bug->{id}; my @tests = ( - # Permissions - { args => attach($public_id), - error => 'You must log in', - test => 'Logged-out user cannot add an attachment to a public bug', - }, - { args => attach($private_id), - error => "You must log in", - test => 'Logged-out user cannot add an attachment to a private bug', - }, - { user => 'editbugs', - args => attach($private_id), - error => "not authorized to access", - test => "Editbugs user can't add an attachment to a private bug", - }, - - # Test ID parameter - { user => 'unprivileged', - args => attach(undef, { ids => undef }), - error => 'a ids argument', - test => 'Failing to pass the "ids" param fails', - }, - { user => 'unprivileged', - args => attach(INVALID_BUG_ID), - error => "It does not seem like bug number", - test => 'Passing invalid bug id returns error "Invalid Bug ID"', - }, - { user => 'unprivileged', - args => attach(''), - error => "You must enter a valid bug number", - test => 'Passing empty bug id returns error "Invalid Bug ID"', - }, - { user => 'unprivileged', - args => attach(INVALID_BUG_ALIAS), - error => "nor an alias to a bug", - test => 'Passing invalid bug alias returns error "Invalid Bug Alias"', - }, - - # Test Comment parameter - { user => 'unprivileged', - args => attach($public_id, { data => undef }), - error => 'a data argument', - test => 'Failing to pass the "data" parameter fails', - }, - { user => 'unprivileged', - args => attach($public_id, { data => '' }), - error => "The file you are trying to attach is empty", - test => 'Passing empty data fails', - }, - { user => 'unprivileged', - args => attach($public_id, { data => random_string(300_000) }), - error => "Attachments cannot be more than", - test => "Passing an attachment that's too large fails", - }, - - # Test the private parameter - { user => 'unprivileged', - args => attach($public_id, { is_private => 1 }), - error => 'attachments as private', - test => 'Unprivileged user cannot add a private attachment' - }, - - # Content-type - { user => 'unprivileged', - args => attach($public_id, { content_type => 'foo/bar' }), - error => "Valid types must be of the form", - test => "Well-formed but invalid content type fails", - }, - { user => 'unprivileged', - args => attach($public_id, { content_type => undef }), - error => 'Valid types must be of the form', - test => "Failing to pass content_type fails", - }, - { user => 'unprivileged', - args => attach($public_id, { content_type => '' }), - error => 'Valid types must be of the form', - test => "Empty content type fails", - }, - - # Summary - { user => 'unprivileged', - args => attach($public_id, { summary => undef }), - error => 'You must enter a description for the attachment', - test => "Failing to pass summary fails", - }, - { user => 'unprivileged', - args => attach($public_id, { summary => '' }), - error => 'You must enter a description for the attachment', - test => "Empty summary fails", - }, - - # Filename - { user => 'unprivileged', - args => attach($public_id, { file_name => undef }), - error => 'You did not specify a file to attach', - test => "Failing to pass file_name fails", - }, - { user => 'unprivileged', - args => attach($public_id, { file_name => '' }), - error => 'You did not specify a file to attach', - test => "Empty file_name fails", - }, - - # Success tests - { user => 'unprivileged', - args => attach($public_id), - test => 'Unprivileged user can add an attachment to a public bug', - }, - { user => 'unprivileged', - args => attach($public_id, { is_patch => 1, content_type => undef }), - test => 'Attaching a patch with no content type works', - }, - { user => 'unprivileged', - args => attach($public_id, { is_patch => 1, - content_type => 'application/octet-stream' }), - test => 'Attaching a patch with a bad content_type works', - }, - { user => PRIVS_USER, - args => attach($private_id), - test => 'Privileged user can add an attachment to a private bug', - }, - { user => PRIVS_USER, - args => attach($public_id, { is_private => 1 }), - test => 'Insidergroup user can add a private attachment', - }, + + # Permissions + { + args => attach($public_id), + error => 'You must log in', + test => 'Logged-out user cannot add an attachment to a public bug', + }, + { + args => attach($private_id), + error => "You must log in", + test => 'Logged-out user cannot add an attachment to a private bug', + }, + { + user => 'editbugs', + args => attach($private_id), + error => "not authorized to access", + test => "Editbugs user can't add an attachment to a private bug", + }, + + # Test ID parameter + { + user => 'unprivileged', + args => attach(undef, {ids => undef}), + error => 'a ids argument', + test => 'Failing to pass the "ids" param fails', + }, + { + user => 'unprivileged', + args => attach(INVALID_BUG_ID), + error => "It does not seem like bug number", + test => 'Passing invalid bug id returns error "Invalid Bug ID"', + }, + { + user => 'unprivileged', + args => attach(''), + error => "You must enter a valid bug number", + test => 'Passing empty bug id returns error "Invalid Bug ID"', + }, + { + user => 'unprivileged', + args => attach(INVALID_BUG_ALIAS), + error => "nor an alias to a bug", + test => 'Passing invalid bug alias returns error "Invalid Bug Alias"', + }, + + # Test Comment parameter + { + user => 'unprivileged', + args => attach($public_id, {data => undef}), + error => 'a data argument', + test => 'Failing to pass the "data" parameter fails', + }, + { + user => 'unprivileged', + args => attach($public_id, {data => ''}), + error => "The file you are trying to attach is empty", + test => 'Passing empty data fails', + }, + { + user => 'unprivileged', + args => attach($public_id, {data => random_string(300_000)}), + error => "Attachments cannot be more than", + test => "Passing an attachment that's too large fails", + }, + + # Test the private parameter + { + user => 'unprivileged', + args => attach($public_id, {is_private => 1}), + error => 'attachments as private', + test => 'Unprivileged user cannot add a private attachment' + }, + + # Content-type + { + user => 'unprivileged', + args => attach($public_id, {content_type => 'foo/bar'}), + error => "Valid types must be of the form", + test => "Well-formed but invalid content type fails", + }, + { + user => 'unprivileged', + args => attach($public_id, {content_type => undef}), + error => 'Valid types must be of the form', + test => "Failing to pass content_type fails", + }, + { + user => 'unprivileged', + args => attach($public_id, {content_type => ''}), + error => 'Valid types must be of the form', + test => "Empty content type fails", + }, + + # Summary + { + user => 'unprivileged', + args => attach($public_id, {summary => undef}), + error => 'You must enter a description for the attachment', + test => "Failing to pass summary fails", + }, + { + user => 'unprivileged', + args => attach($public_id, {summary => ''}), + error => 'You must enter a description for the attachment', + test => "Empty summary fails", + }, + + # Filename + { + user => 'unprivileged', + args => attach($public_id, {file_name => undef}), + error => 'You did not specify a file to attach', + test => "Failing to pass file_name fails", + }, + { + user => 'unprivileged', + args => attach($public_id, {file_name => ''}), + error => 'You did not specify a file to attach', + test => "Empty file_name fails", + }, + + # Success tests + { + user => 'unprivileged', + args => attach($public_id), + test => 'Unprivileged user can add an attachment to a public bug', + }, + { + user => 'unprivileged', + args => attach($public_id, {is_patch => 1, content_type => undef}), + test => 'Attaching a patch with no content type works', + }, + { + user => 'unprivileged', + args => attach( + $public_id, {is_patch => 1, content_type => 'application/octet-stream'} + ), + test => 'Attaching a patch with a bad content_type works', + }, + { + user => PRIVS_USER, + args => attach($private_id), + test => 'Privileged user can add an attachment to a private bug', + }, + { + user => PRIVS_USER, + args => attach($public_id, {is_private => 1}), + test => 'Insidergroup user can add a private attachment', + }, ); -$jsonrpc_get->bz_call_fail('Bug.add_attachment', attach($public_id), - 'must use HTTP POST', 'add_attachment fails over GET'); +$jsonrpc_get->bz_call_fail( + 'Bug.add_attachment', attach($public_id), + 'must use HTTP POST', 'add_attachment fails over GET' +); foreach my $rpc ($jsonrpc, $xmlrpc) { - $rpc->bz_run_tests(tests => \@tests, method => 'Bug.add_attachment', - post_success => \&post_success, pre_call => \&pre_call); + $rpc->bz_run_tests( + tests => \@tests, + method => 'Bug.add_attachment', + post_success => \&post_success, + pre_call => \&pre_call + ); } # We have to encode data manually when using JSON-RPC, else it fails. sub pre_call { - my ($t, $rpc) = @_; - return if !$rpc->isa('QA::RPC::JSONRPC'); - return if !defined $t->{args}->{data}; + my ($t, $rpc) = @_; + return if !$rpc->isa('QA::RPC::JSONRPC'); + return if !defined $t->{args}->{data}; - $t->{args}->{data} = encode_base64($t->{args}->{data}, ''); + $t->{args}->{data} = encode_base64($t->{args}->{data}, ''); } sub post_success { - my ($call, $t, $rpc) = @_; - - my $ids = [ keys %{ $call->result->{attachments} } ]; - $call = $rpc->bz_call_success("Bug.attachments", {attachment_ids => $ids}); - my $attachments = $call->result->{attachments}; - - foreach my $id (keys %$attachments) { - my $attachment = $attachments->{$id}; - if ($t->{args}->{is_private}) { - ok($attachment->{is_private}, - $rpc->TYPE . ": Attachment $id is private"); - } - else { - ok(!$attachment->{is_private}, - $rpc->TYPE . ": Attachment $id is NOT private"); - } - - if ($t->{args}->{is_patch}) { - is($attachment->{content_type}, 'text/plain', - $rpc->TYPE . ": Patch $id content type is text/plain"); - } - else { - is($attachment->{content_type}, $t->{args}->{content_type}, - $rpc->TYPE . ": Attachment $id content type is correct"); - } - - if ($rpc->isa('QA::RPC::JSONRPC')) { - # We encoded data in pre_call(), so we have to restore it to its original content. - $t->{args}->{data} = decode_base64($t->{args}->{data}); - $attachment->{data} = decode_base64($attachment->{data}); - } - is($attachment->{data}, $t->{args}->{data}, - $rpc->TYPE . ": Attachment $id data is correct"); + my ($call, $t, $rpc) = @_; + + my $ids = [keys %{$call->result->{attachments}}]; + $call = $rpc->bz_call_success("Bug.attachments", {attachment_ids => $ids}); + my $attachments = $call->result->{attachments}; + + foreach my $id (keys %$attachments) { + my $attachment = $attachments->{$id}; + if ($t->{args}->{is_private}) { + ok($attachment->{is_private}, $rpc->TYPE . ": Attachment $id is private"); + } + else { + ok(!$attachment->{is_private}, $rpc->TYPE . ": Attachment $id is NOT private"); + } + + if ($t->{args}->{is_patch}) { + is($attachment->{content_type}, + 'text/plain', $rpc->TYPE . ": Patch $id content type is text/plain"); } + else { + is( + $attachment->{content_type}, + $t->{args}->{content_type}, + $rpc->TYPE . ": Attachment $id content type is correct" + ); + } + + if ($rpc->isa('QA::RPC::JSONRPC')) { + + # We encoded data in pre_call(), so we have to restore it to its original content. + $t->{args}->{data} = decode_base64($t->{args}->{data}); + $attachment->{data} = decode_base64($attachment->{data}); + } + is( + $attachment->{data}, + $t->{args}->{data}, + $rpc->TYPE . ": Attachment $id data is correct" + ); + } } diff --git a/qa/t/webservice_bug_add_comment.t b/qa/t/webservice_bug_add_comment.t index dafd088fb..a7b95caeb 100644 --- a/qa/t/webservice_bug_add_comment.t +++ b/qa/t/webservice_bug_add_comment.t @@ -16,153 +16,182 @@ use QA::Util; use Test::More tests => 141; my ($config, $xmlrpc, $jsonrpc, $jsonrpc_get) = get_rpc_clients(); -use constant INVALID_BUG_ID => -1; +use constant INVALID_BUG_ID => -1; use constant INVALID_BUG_ALIAS => 'aaaaaaa12345'; -use constant PRIVS_USER => 'QA_Selenium_TEST'; +use constant PRIVS_USER => 'QA_Selenium_TEST'; use constant TIMETRACKING_USER => 'admin'; -use constant TEST_COMMENT => '--- Test Comment From QA Tests ---'; +use constant TEST_COMMENT => '--- Test Comment From QA Tests ---'; use constant TOO_LONG_COMMENT => 'a' x 100000; my @tests = ( - # Permissions - { args => { id => 'public_bug', comment => TEST_COMMENT }, - error => 'You must log in', - test => 'Logged-out user cannot comment on a public bug', - }, - { args => { id => 'private_bug', comment => TEST_COMMENT }, - error => "You must log in", - test => 'Logged-out user cannot comment on a private bug', - }, - { user => 'unprivileged', - args => { id => 'private_bug', comment => TEST_COMMENT }, - error => "not authorized to access", - test => "Unprivileged user can't comment on a private bug", - }, - - # Test ID parameter - { user => 'unprivileged', - args => { comment => TEST_COMMENT }, - error => 'a id argument', - test => 'Failing to pass the "id" param fails', - }, - { user => 'unprivileged', - args => { id => INVALID_BUG_ID, comment => TEST_COMMENT }, - error => "It does not seem like bug number", - test => 'Passing invalid bug id returns error "Invalid Bug ID"', - }, - { user => 'unprivileged', - args => { id => '', comment => TEST_COMMENT }, - error => "You must enter a valid bug number", - test => 'Passing empty bug id param returns error "Invalid Bug ID"', - }, - { user => 'unprivileged', - args => { id => INVALID_BUG_ALIAS, comment => TEST_COMMENT }, - error => "nor an alias to a bug", - test => 'Passing invalid bug alias returns error "Invalid Bug Alias"', - }, - - # Test Comment parameter - { user => 'unprivileged', - args => { id => 'public_bug' }, - error => 'a comment argument', - test => 'Failing to pass the "comment" parameter fails', - }, - { user => 'unprivileged', - args => { id => 'public_bug', comment => '' }, - error => "a comment argument", - test => 'Passing an empty comment fails', - }, - { user => 'unprivileged', - args => { id => 'public_bug', comment => ' ' }, - error => 'a comment argument', - test => 'Passing only a space for comment fails', - }, - { user => 'unprivileged', - args => { id => 'public_bug', comment => " \t\n\n\r\n\r\n\r " }, - error => 'a comment argument', - test => 'Passing only whitespace (including newlines) fails', - }, - { user => 'unprivileged', - args => { id => 'public_bug', comment => TOO_LONG_COMMENT }, - error => "cannot be longer than", - test => "Passing a comment that's too long fails", - }, - - # Testing the "private" parameter happens in the tests for Bug.comments - - # Test work_time parameter - # FIXME: Should be testing permissions on the work_time parameter, - # but we currently have no way to verify whether or not time was - # added to the bug, and there's no error thrown if you lack perms. - { user => 'admin', - args => { id => 'public_bug', comment => TEST_COMMENT, - work_time => 'aaa' }, - error => "is not a numeric value", - test => "Passing a non-numeric work_time fails", - }, - { user => 'admin', - args => { id => 'public_bug', comment => TEST_COMMENT, - work_time => '1234567890' }, - error => 'more than the maximum', - test => 'Passing too large of a work_time fails', - }, - { user => 'admin', - args => { id => 'public_bug', comment => '', - work_time => '1.0' }, - error => 'a comment argument', - test => 'Passing a work_time with an empty comment fails', - }, - - # Success tests - { user => 'unprivileged', - args => { id => 'public_bug', comment => TEST_COMMENT }, - test => 'Unprivileged user can add a comment to a public bug', - }, - { user => 'unprivileged', - args => { id => 'public_bug', comment => " \n" . TEST_COMMENT }, - test => 'Can add a comment to a bug where the first line is whitespace', - }, - { user => 'QA_Selenium_TEST', - args => { id => 'private_bug', comment => TEST_COMMENT }, - test => 'Privileged user can add a comment to a private bug', - check_privacy => 1, - }, - { user => 'QA_Selenium_TEST', - args => { id => 'public_bug', comment => TEST_COMMENT, - is_private => 1 }, - test => 'Insidergroup user can add a private comment', - check_privacy => 1, - }, - { user => 'admin', - args => { id => 'public_bug', comment => TEST_COMMENT, - work_time => '1.5' }, - test => 'Timetracking user can add work_time to a bug', - }, - # FIXME: Need to verify that the comment added actually has work_time. + + # Permissions + { + args => {id => 'public_bug', comment => TEST_COMMENT}, + error => 'You must log in', + test => 'Logged-out user cannot comment on a public bug', + }, + { + args => {id => 'private_bug', comment => TEST_COMMENT}, + error => "You must log in", + test => 'Logged-out user cannot comment on a private bug', + }, + { + user => 'unprivileged', + args => {id => 'private_bug', comment => TEST_COMMENT}, + error => "not authorized to access", + test => "Unprivileged user can't comment on a private bug", + }, + + # Test ID parameter + { + user => 'unprivileged', + args => {comment => TEST_COMMENT}, + error => 'a id argument', + test => 'Failing to pass the "id" param fails', + }, + { + user => 'unprivileged', + args => {id => INVALID_BUG_ID, comment => TEST_COMMENT}, + error => "It does not seem like bug number", + test => 'Passing invalid bug id returns error "Invalid Bug ID"', + }, + { + user => 'unprivileged', + args => {id => '', comment => TEST_COMMENT}, + error => "You must enter a valid bug number", + test => 'Passing empty bug id param returns error "Invalid Bug ID"', + }, + { + user => 'unprivileged', + args => {id => INVALID_BUG_ALIAS, comment => TEST_COMMENT}, + error => "nor an alias to a bug", + test => 'Passing invalid bug alias returns error "Invalid Bug Alias"', + }, + + # Test Comment parameter + { + user => 'unprivileged', + args => {id => 'public_bug'}, + error => 'a comment argument', + test => 'Failing to pass the "comment" parameter fails', + }, + { + user => 'unprivileged', + args => {id => 'public_bug', comment => ''}, + error => "a comment argument", + test => 'Passing an empty comment fails', + }, + { + user => 'unprivileged', + args => {id => 'public_bug', comment => ' '}, + error => 'a comment argument', + test => 'Passing only a space for comment fails', + }, + { + user => 'unprivileged', + args => {id => 'public_bug', comment => " \t\n\n\r\n\r\n\r "}, + error => 'a comment argument', + test => 'Passing only whitespace (including newlines) fails', + }, + { + user => 'unprivileged', + args => {id => 'public_bug', comment => TOO_LONG_COMMENT}, + error => "cannot be longer than", + test => "Passing a comment that's too long fails", + }, + + # Testing the "private" parameter happens in the tests for Bug.comments + + # Test work_time parameter + # FIXME: Should be testing permissions on the work_time parameter, + # but we currently have no way to verify whether or not time was + # added to the bug, and there's no error thrown if you lack perms. + { + user => 'admin', + args => {id => 'public_bug', comment => TEST_COMMENT, work_time => 'aaa'}, + error => "is not a numeric value", + test => "Passing a non-numeric work_time fails", + }, + { + user => 'admin', + args => + {id => 'public_bug', comment => TEST_COMMENT, work_time => '1234567890'}, + error => 'more than the maximum', + test => 'Passing too large of a work_time fails', + }, + { + user => 'admin', + args => {id => 'public_bug', comment => '', work_time => '1.0'}, + error => 'a comment argument', + test => 'Passing a work_time with an empty comment fails', + }, + + # Success tests + { + user => 'unprivileged', + args => {id => 'public_bug', comment => TEST_COMMENT}, + test => 'Unprivileged user can add a comment to a public bug', + }, + { + user => 'unprivileged', + args => {id => 'public_bug', comment => " \n" . TEST_COMMENT}, + test => 'Can add a comment to a bug where the first line is whitespace', + }, + { + user => 'QA_Selenium_TEST', + args => {id => 'private_bug', comment => TEST_COMMENT}, + test => 'Privileged user can add a comment to a private bug', + check_privacy => 1, + }, + { + user => 'QA_Selenium_TEST', + args => {id => 'public_bug', comment => TEST_COMMENT, is_private => 1}, + test => 'Insidergroup user can add a private comment', + check_privacy => 1, + }, + { + user => 'admin', + args => {id => 'public_bug', comment => TEST_COMMENT, work_time => '1.5'}, + test => 'Timetracking user can add work_time to a bug', + }, + + # FIXME: Need to verify that the comment added actually has work_time. ); -$jsonrpc_get->bz_call_fail('Bug.add_comment', - { id => 'public_bug', comment => TEST_COMMENT }, - 'must use HTTP POST', 'add_comment fails over GET'); +$jsonrpc_get->bz_call_fail( + 'Bug.add_comment', + {id => 'public_bug', comment => TEST_COMMENT}, + 'must use HTTP POST', + 'add_comment fails over GET' +); foreach my $rpc ($jsonrpc, $xmlrpc) { - $rpc->bz_run_tests(tests => \@tests, method => 'Bug.add_comment', - post_success => \&post_success); + $rpc->bz_run_tests( + tests => \@tests, + method => 'Bug.add_comment', + post_success => \&post_success + ); } sub post_success { - my ($call, $t, $rpc) = @_; - return unless $t->{check_privacy}; - - my $comment_id = $call->result->{id}; - my $result = $rpc->bz_call_success('Bug.comments', {comment_ids => [$comment_id]}); - if ($t->{args}->{is_private}) { - ok($result->result->{comments}->{$comment_id}->{is_private}, - $rpc->TYPE . ": Comment $comment_id is private"); - } - else { - ok(!$result->result->{comments}->{$comment_id}->{is_private}, - $rpc->TYPE . ": Comment $comment_id is NOT private"); - } + my ($call, $t, $rpc) = @_; + return unless $t->{check_privacy}; + + my $comment_id = $call->result->{id}; + my $result + = $rpc->bz_call_success('Bug.comments', {comment_ids => [$comment_id]}); + if ($t->{args}->{is_private}) { + ok( + $result->result->{comments}->{$comment_id}->{is_private}, + $rpc->TYPE . ": Comment $comment_id is private" + ); + } + else { + ok( + !$result->result->{comments}->{$comment_id}->{is_private}, + $rpc->TYPE . ": Comment $comment_id is NOT private" + ); + } } diff --git a/qa/t/webservice_bug_attachments.t b/qa/t/webservice_bug_attachments.t index daa5032a3..cd2e6bfa4 100644 --- a/qa/t/webservice_bug_attachments.t +++ b/qa/t/webservice_bug_attachments.t @@ -23,36 +23,41 @@ my ($config, @clients) = get_rpc_clients(); our %attachments; sub post_bug_success { - my ($call, $t) = @_; - - my $bugs = $call->result->{bugs}; - is(scalar keys %$bugs, 1, "Got exactly one bug") - or diag(Dumper($call->result)); - - my $bug_attachments = (values %$bugs)[0]; - # Collect attachment ids - foreach my $alias (qw(public_bug private_bug)) { - foreach my $is_private (0, 1) { - my $find_desc = "${alias}_${is_private}"; - my $attachment = first { $_->{summary} eq $find_desc } - reverse @$bug_attachments; - if ($attachment) { - $attachments{$find_desc} = $attachment->{id}; - } - } + my ($call, $t) = @_; + + my $bugs = $call->result->{bugs}; + is(scalar keys %$bugs, 1, "Got exactly one bug") or diag(Dumper($call->result)); + + my $bug_attachments = (values %$bugs)[0]; + + # Collect attachment ids + foreach my $alias (qw(public_bug private_bug)) { + foreach my $is_private (0, 1) { + my $find_desc = "${alias}_${is_private}"; + my $attachment = first { $_->{summary} eq $find_desc } + reverse @$bug_attachments; + if ($attachment) { + $attachments{$find_desc} = $attachment->{id}; + } } + } } foreach my $rpc (@clients) { - $rpc->bz_run_tests(tests => STANDARD_BUG_TESTS, method => 'Bug.attachments', - post_success => \&post_bug_success); + $rpc->bz_run_tests( + tests => STANDARD_BUG_TESTS, + method => 'Bug.attachments', + post_success => \&post_bug_success + ); } foreach my $alias (qw(public_bug private_bug)) { - foreach my $is_private (0, 1) { - ok($attachments{"${alias}_${is_private}"}, - "Found attachment id for ${alias}_${is_private}"); - } + foreach my $is_private (0, 1) { + ok( + $attachments{"${alias}_${is_private}"}, + "Found attachment id for ${alias}_${is_private}" + ); + } } #################### @@ -69,83 +74,99 @@ close($fh); # format of each return value is correct. my @tests = ( - # Logged-out user - { args => { attachment_ids => [$attachments{'public_bug_0'}] }, - test => 'Logged-out user can access public attachment on public' - . ' bug by id', - }, - { args => { attachment_ids => [$attachments{'public_bug_1'}] }, - test => 'Logged-out user cannot access private attachment on public bug', - error => 'Sorry, you are not authorized', - }, - { args => { attachment_ids => [$attachments{'private_bug_0'}] }, - test => 'Logged-out user cannot access attachments by id on private bug', - error => 'You are not authorized to access', - }, - { args => { attachment_ids => [$attachments{'private_bug_1'}] }, - test => 'Logged-out user cannot access private attachment on ' - . ' private bug', - error => 'You are not authorized to access', - }, - - # Logged-in, unprivileged user. - { user => 'unprivileged', - args => { attachment_ids => [$attachments{'public_bug_0'}] }, - test => 'Logged-in user can see a public attachment on a public bug by id', - }, - { user => 'unprivileged', - args => { attachment_ids => [$attachments{'public_bug_1'}] }, - test => 'Logged-in user cannot access private attachment on public bug', - error => 'Sorry, you are not authorized', - }, - { user => 'unprivileged', - args => { attachment_ids => [$attachments{'private_bug_0'}] }, - test => 'Logged-in user cannot access attachments by id on private bug', - error => "You are not authorized to access", - }, - { user => 'unprivileged', - args => { attachment_ids => [$attachments{'private_bug_1'}] }, - test => 'Logged-in user cannot access private attachment on private bug', - error => "You are not authorized to access", - }, - - # User who can see private bugs and private attachments - { user => PRIVATE_BUG_USER, - args => { attachment_ids => [$attachments{'public_bug_1'}] }, - test => PRIVATE_BUG_USER . ' can see private attachment on public bug', - }, - { user => PRIVATE_BUG_USER, - args => { attachment_ids => [$attachments{'private_bug_1'}] }, - test => PRIVATE_BUG_USER . ' can see private attachment on private bug', - }, + + # Logged-out user + { + args => {attachment_ids => [$attachments{'public_bug_0'}]}, + test => 'Logged-out user can access public attachment on public' + . ' bug by id', + }, + { + args => {attachment_ids => [$attachments{'public_bug_1'}]}, + test => 'Logged-out user cannot access private attachment on public bug', + error => 'Sorry, you are not authorized', + }, + { + args => {attachment_ids => [$attachments{'private_bug_0'}]}, + test => 'Logged-out user cannot access attachments by id on private bug', + error => 'You are not authorized to access', + }, + { + args => {attachment_ids => [$attachments{'private_bug_1'}]}, + test => 'Logged-out user cannot access private attachment on ' . ' private bug', + error => 'You are not authorized to access', + }, + + # Logged-in, unprivileged user. + { + user => 'unprivileged', + args => {attachment_ids => [$attachments{'public_bug_0'}]}, + test => 'Logged-in user can see a public attachment on a public bug by id', + }, + { + user => 'unprivileged', + args => {attachment_ids => [$attachments{'public_bug_1'}]}, + test => 'Logged-in user cannot access private attachment on public bug', + error => 'Sorry, you are not authorized', + }, + { + user => 'unprivileged', + args => {attachment_ids => [$attachments{'private_bug_0'}]}, + test => 'Logged-in user cannot access attachments by id on private bug', + error => "You are not authorized to access", + }, + { + user => 'unprivileged', + args => {attachment_ids => [$attachments{'private_bug_1'}]}, + test => 'Logged-in user cannot access private attachment on private bug', + error => "You are not authorized to access", + }, + + # User who can see private bugs and private attachments + { + user => PRIVATE_BUG_USER, + args => {attachment_ids => [$attachments{'public_bug_1'}]}, + test => PRIVATE_BUG_USER . ' can see private attachment on public bug', + }, + { + user => PRIVATE_BUG_USER, + args => {attachment_ids => [$attachments{'private_bug_1'}]}, + test => PRIVATE_BUG_USER . ' can see private attachment on private bug', + }, ); sub post_success { - my ($call, $t, $rpc) = @_; - is(scalar keys %{ $call->result->{attachments} }, 1, - "Got exactly one attachment"); - my $attachment = (values %{ $call->result->{attachments} })[0]; - - cmp_ok($attachment->{last_change_time}, '=~', $rpc->DATETIME_REGEX, - "last_change_time is in the right format"); - cmp_ok($attachment->{creation_time}, '=~', $rpc->DATETIME_REGEX, - "creation_time is in the right format"); - is($attachment->{is_obsolete}, 0, 'is_obsolete is 0'); - cmp_ok($attachment->{bug_id}, '=~', qr/^\d+$/, "bug_id is an integer"); - cmp_ok($attachment->{id}, '=~', qr/^\d+$/, "id is an integer"); - is($attachment->{content_type}, 'application/x-perl', - "content_type is correct"); - cmp_ok($attachment->{file_name}, '=~', qr/^\w+\.pl$/, - "filename is in the expected format"); - is($attachment->{creator}, $config->{QA_Selenium_TEST_user_login}, - "creator is the correct user"); - my $data = $attachment->{data}; - $data = decode_base64($data) if $rpc->isa('QA::RPC::JSONRPC'); - is($data, $content, 'data is correct'); - is($attachment->{size}, length($data), "size matches data's size"); + my ($call, $t, $rpc) = @_; + is(scalar keys %{$call->result->{attachments}}, 1, + "Got exactly one attachment"); + my $attachment = (values %{$call->result->{attachments}})[0]; + + cmp_ok($attachment->{last_change_time}, + '=~', $rpc->DATETIME_REGEX, "last_change_time is in the right format"); + cmp_ok($attachment->{creation_time}, + '=~', $rpc->DATETIME_REGEX, "creation_time is in the right format"); + is($attachment->{is_obsolete}, 0, 'is_obsolete is 0'); + cmp_ok($attachment->{bug_id}, '=~', qr/^\d+$/, "bug_id is an integer"); + cmp_ok($attachment->{id}, '=~', qr/^\d+$/, "id is an integer"); + is($attachment->{content_type}, 'application/x-perl', + "content_type is correct"); + cmp_ok($attachment->{file_name}, + '=~', qr/^\w+\.pl$/, "filename is in the expected format"); + is( + $attachment->{creator}, + $config->{QA_Selenium_TEST_user_login}, + "creator is the correct user" + ); + my $data = $attachment->{data}; + $data = decode_base64($data) if $rpc->isa('QA::RPC::JSONRPC'); + is($data, $content, 'data is correct'); + is($attachment->{size}, length($data), "size matches data's size"); } foreach my $rpc (@clients) { - $rpc->bz_run_tests(method => 'Bug.attachments', tests => \@tests, - post_success => \&post_success); + $rpc->bz_run_tests( + method => 'Bug.attachments', + tests => \@tests, + post_success => \&post_success + ); } diff --git a/qa/t/webservice_bug_comments.t b/qa/t/webservice_bug_comments.t index ccc0c6d34..f3f834f85 100644 --- a/qa/t/webservice_bug_comments.t +++ b/qa/t/webservice_bug_comments.t @@ -21,46 +21,50 @@ my ($config, @clients) = get_rpc_clients(); # These gets populated when we call Bug.add_comment. our $creation_time; our %comments = ( - public_comment_public_bug => 0, - public_comment_private_bug => 0, - private_comment_public_bug => 0, - private_comment_private_bug => 0, + public_comment_public_bug => 0, + public_comment_private_bug => 0, + private_comment_public_bug => 0, + private_comment_private_bug => 0, ); sub test_comments { - my ($comments_returned, $call, $t, $rpc) = @_; + my ($comments_returned, $call, $t, $rpc) = @_; - my $comment = $comments_returned->[0]; - ok($comment->{bug_id}, "bug_id exists"); - # FIXME: At some point we should test attachment_id here. + my $comment = $comments_returned->[0]; + ok($comment->{bug_id}, "bug_id exists"); - if ($t->{args}->{comment_ids}) { - my $expected_id = $t->{args}->{comment_ids}->[0]; - is($comment->{id}, $expected_id, "comment id is correct"); + # FIXME: At some point we should test attachment_id here. - my %reverse_map = reverse %comments; - my $expected_text = $reverse_map{$expected_id}; - is($comment->{text}, $expected_text, "comment has the correct text"); + if ($t->{args}->{comment_ids}) { + my $expected_id = $t->{args}->{comment_ids}->[0]; + is($comment->{id}, $expected_id, "comment id is correct"); - my $priv_login = $rpc->bz_config->{PRIVATE_BUG_USER . '_user_login'}; - is($comment->{creator}, $priv_login, "comment creator is correct"); + my %reverse_map = reverse %comments; + my $expected_text = $reverse_map{$expected_id}; + is($comment->{text}, $expected_text, "comment has the correct text"); + my $priv_login = $rpc->bz_config->{PRIVATE_BUG_USER . '_user_login'}; + is($comment->{creator}, $priv_login, "comment creator is correct"); - my $creation_day; - if ($rpc->isa('QA::RPC::XMLRPC')) { - $creation_day = $creation_time->ymd(''); - } - else { - $creation_day = $creation_time->ymd; - } - like($comment->{time}, qr/^\Q${creation_day}\ET\d\d:\d\d:\d\d/, - "comment time has the right format"); + + my $creation_day; + if ($rpc->isa('QA::RPC::XMLRPC')) { + $creation_day = $creation_time->ymd(''); } else { - foreach my $field (qw(id text creator time)) { - ok(defined $comment->{$field}, "$field is defined"); - } + $creation_day = $creation_time->ymd; + } + like( + $comment->{time}, + qr/^\Q${creation_day}\ET\d\d:\d\d:\d\d/, + "comment time has the right format" + ); + } + else { + foreach my $field (qw(id text creator time)) { + ok(defined $comment->{$field}, "$field is defined"); } + } } ################ @@ -68,16 +72,19 @@ sub test_comments { ################ sub post_bug_success { - my ($call, $t) = @_; - my @bugs = values %{ $call->result->{bugs} }; - is(scalar @bugs, 1, "Got exactly one bug"); - my @comments = map { @{ $_->{comments} } } @bugs; - test_comments(\@comments, @_); + my ($call, $t) = @_; + my @bugs = values %{$call->result->{bugs}}; + is(scalar @bugs, 1, "Got exactly one bug"); + my @comments = map { @{$_->{comments}} } @bugs; + test_comments(\@comments, @_); } foreach my $rpc (@clients) { - $rpc->bz_run_tests(tests => STANDARD_BUG_TESTS, method => 'Bug.comments', - post_success => \&post_bug_success); + $rpc->bz_run_tests( + tests => STANDARD_BUG_TESTS, + method => 'Bug.comments', + post_success => \&post_bug_success + ); } #################### @@ -87,89 +94,110 @@ foreach my $rpc (@clients) { # First, create comments using add_comment. my @add_comment_tests; foreach my $key (keys %comments) { - $key =~ /^([a-z]+)_comment_(\w+)$/; - my $is_private = ($1 eq 'private' ? 1 : 0); - my $bug_alias = $2; - push(@add_comment_tests, { args => { id => $bug_alias, comment => $key, - private => $is_private }, - test => "Add comment: $key", - user => PRIVATE_BUG_USER }); + $key =~ /^([a-z]+)_comment_(\w+)$/; + my $is_private = ($1 eq 'private' ? 1 : 0); + my $bug_alias = $2; + push( + @add_comment_tests, + { + args => {id => $bug_alias, comment => $key, private => $is_private}, + test => "Add comment: $key", + user => PRIVATE_BUG_USER + } + ); } # Set the comment id for each comment that we add, so we can test getting # them back, later. sub post_add { - my ($call, $t) = @_; - my $key = $t->{args}->{comment}; - $comments{$key} = $call->result->{id}; + my ($call, $t) = @_; + my $key = $t->{args}->{comment}; + $comments{$key} = $call->result->{id}; } $creation_time = DateTime->now(); + # We only need to create these comments once, with one of the interfaces. $clients[0]->bz_run_tests( - tests => \@add_comment_tests, method => 'Bug.add_comment', - post_success => \&post_add); + tests => \@add_comment_tests, + method => 'Bug.add_comment', + post_success => \&post_add +); # Now check access on each private and public comment my @comment_tests = ( - # Logged-out user - { args => { comment_ids => [$comments{'public_comment_public_bug'}] }, - test => 'Logged-out user can access public comment on public bug by id', - }, - { args => { comment_ids => [$comments{'private_comment_public_bug'}] }, - test => 'Logged-out user cannot access private comment on public bug', - error => 'is private', - }, - { args => { comment_ids => [$comments{'public_comment_private_bug'}] }, - test => 'Logged-out user cannot access comments by id on private bug', - error => 'You are not authorized to access', - }, - { args => { comment_ids => [$comments{'private_comment_private_bug'}] }, - test => 'Logged-out user cannot access private comment on private bug', - error => 'You are not authorized to access', - }, - - # Logged-in, unprivileged user. - { user => 'unprivileged', - args => { comment_ids => [$comments{'public_comment_public_bug'}] }, - test => 'Logged-in user can see a public comment on a public bug by id', - }, - { user => 'unprivileged', - args => { comment_ids => [$comments{'private_comment_public_bug'}] }, - test => 'Logged-in user cannot access private comment on public bug', - error => 'is private', - }, - { user => 'unprivileged', - args => { comment_ids => [$comments{'public_comment_private_bug'}] }, - test => 'Logged-in user cannot access comments by id on private bug', - error => "You are not authorized to access", - }, - { user => 'unprivileged', - args => { comment_ids => [$comments{'private_comment_private_bug'}] }, - test => 'Logged-in user cannot access private comment on private bug', - error => "You are not authorized to access", - }, - - # User who can see private bugs and private comments - { user => PRIVATE_BUG_USER, - args => { comment_ids => [$comments{'private_comment_public_bug'}] }, - test => PRIVATE_BUG_USER . ' can see private comment on public bug', - }, - { user => PRIVATE_BUG_USER, - args => { comment_ids => [$comments{'private_comment_private_bug'}] }, - test => PRIVATE_BUG_USER . ' can see private comment on private bug', - }, + + # Logged-out user + { + args => {comment_ids => [$comments{'public_comment_public_bug'}]}, + test => 'Logged-out user can access public comment on public bug by id', + }, + { + args => {comment_ids => [$comments{'private_comment_public_bug'}]}, + test => 'Logged-out user cannot access private comment on public bug', + error => 'is private', + }, + { + args => {comment_ids => [$comments{'public_comment_private_bug'}]}, + test => 'Logged-out user cannot access comments by id on private bug', + error => 'You are not authorized to access', + }, + { + args => {comment_ids => [$comments{'private_comment_private_bug'}]}, + test => 'Logged-out user cannot access private comment on private bug', + error => 'You are not authorized to access', + }, + + # Logged-in, unprivileged user. + { + user => 'unprivileged', + args => {comment_ids => [$comments{'public_comment_public_bug'}]}, + test => 'Logged-in user can see a public comment on a public bug by id', + }, + { + user => 'unprivileged', + args => {comment_ids => [$comments{'private_comment_public_bug'}]}, + test => 'Logged-in user cannot access private comment on public bug', + error => 'is private', + }, + { + user => 'unprivileged', + args => {comment_ids => [$comments{'public_comment_private_bug'}]}, + test => 'Logged-in user cannot access comments by id on private bug', + error => "You are not authorized to access", + }, + { + user => 'unprivileged', + args => {comment_ids => [$comments{'private_comment_private_bug'}]}, + test => 'Logged-in user cannot access private comment on private bug', + error => "You are not authorized to access", + }, + + # User who can see private bugs and private comments + { + user => PRIVATE_BUG_USER, + args => {comment_ids => [$comments{'private_comment_public_bug'}]}, + test => PRIVATE_BUG_USER . ' can see private comment on public bug', + }, + { + user => PRIVATE_BUG_USER, + args => {comment_ids => [$comments{'private_comment_private_bug'}]}, + test => PRIVATE_BUG_USER . ' can see private comment on private bug', + }, ); sub post_comments { - my ($call) = @_; - my @comments = values %{ $call->result->{comments} }; - is(scalar @comments, 1, "Got exactly one comment"); - test_comments(\@comments, @_); + my ($call) = @_; + my @comments = values %{$call->result->{comments}}; + is(scalar @comments, 1, "Got exactly one comment"); + test_comments(\@comments, @_); } foreach my $rpc (@clients) { - $rpc->bz_run_tests(tests => \@comment_tests, method => 'Bug.comments', - post_success => \&post_comments); + $rpc->bz_run_tests( + tests => \@comment_tests, + method => 'Bug.comments', + post_success => \&post_comments + ); } diff --git a/qa/t/webservice_bug_create.t b/qa/t/webservice_bug_create.t index 8bab088af..34a03778a 100644 --- a/qa/t/webservice_bug_create.t +++ b/qa/t/webservice_bug_create.t @@ -28,212 +28,215 @@ my $bug_fields = create_bug_fields($config); # hash to contain all the possible $bug_fields values that # can be passed to createBug() my $fields = { - summary => { - undefined => { - faultstring => 'You must enter a summary for this bug', - value => undef - }, - }, - - product => { - undefined => { faultstring => 'You must select/enter a product.', value => undef }, - invalid => - { faultstring => 'does not exist', value => 'does-not-exist' }, - }, - - component => { - undefined => { - faultstring => 'you must first choose a component', - value => undef - }, - invalid => { - faultstring => "There is no component named 'does-not-exist'", - value => 'does-not-exist' - }, - }, - - version => { - undefined => - { faultstring => 'You must select/enter a version.', value => undef }, - invalid => { - faultstring => "There is no version named 'does-not-exist' in the", - value => 'does-not-exist' - }, - }, - platform => { - undefined => - { faultstring => 'You must select/enter a Hardware.', - value => '' }, - invalid => { - faultstring => "There is no Hardware named 'does-not-exist'.", - value => 'does-not-exist' - }, - }, - - status => { - invalid => { - faultstring => "There is no status named 'does-not-exist'", - value => 'does-not-exist' - }, - }, - - severity => { - undefined => - { faultstring => 'You must select/enter a Severity.', - value => '' }, - invalid => { - faultstring => "There is no Severity named 'does-not-exist'.", - value => 'does-not-exist' - }, - }, - - priority => { - undefined => - { faultstring => 'You must select/enter a Priority.', - value => '' }, - invalid => { - faultstring => "There is no Priority named 'does-not-exist'.", - value => 'does-not-exist' - }, - }, - - op_sys => { - undefined => { - faultstring => 'You must select/enter a OS.', - value => '' - }, - invalid => { - faultstring => "There is no OS named 'does-not-exist'.", - value => 'does-not-exist' - }, - }, - - cc => { - invalid => { - faultstring => 'not a valid username', - value => ['nonuserATbugillaDOTorg'] - }, - }, - - assigned_to => { - invalid => { - faultstring => "There is no user named 'does-not-exist'", - value => 'does-not-exist' - }, - }, - qa_contact => { - invalid => { - faultstring => "There is no user named 'does-not-exist'", - value => 'does-not-exist' - }, - }, - alias => { - long => { - faultstring => 'Bug aliases cannot be longer than 20 characters', - value => 'MyyyyyyyyyyyyyyyyyyBugggggggggggggggggggggg' - }, - existing => { - faultstring => 'already taken the alias', - value => 'public_bug' - }, - numeric => { - faultstring => 'aliases cannot be merely numbers', - value => '12345' - }, - commma_or_space_separated => { - faultstring => 'contains one or more commas or spaces', - value => 'Bug 12345' - }, - - }, - groups => { - non_existent => { - faultstring => 'either this group does not exist, or you are not allowed to restrict bugs to this group', - value => [random_string(20)], - }, - }, - comment_is_private => { - invalid => { - faultstring => 'you are not allowed to.+comments.+private', - value => 1, - } - }, + summary => { + undefined => + {faultstring => 'You must enter a summary for this bug', value => undef}, + }, + + product => { + undefined => + {faultstring => 'You must select/enter a product.', value => undef}, + invalid => {faultstring => 'does not exist', value => 'does-not-exist'}, + }, + + component => { + undefined => + {faultstring => 'you must first choose a component', value => undef}, + invalid => { + faultstring => "There is no component named 'does-not-exist'", + value => 'does-not-exist' + }, + }, + + version => { + undefined => + {faultstring => 'You must select/enter a version.', value => undef}, + invalid => { + faultstring => "There is no version named 'does-not-exist' in the", + value => 'does-not-exist' + }, + }, + platform => { + undefined => {faultstring => 'You must select/enter a Hardware.', value => ''}, + invalid => { + faultstring => "There is no Hardware named 'does-not-exist'.", + value => 'does-not-exist' + }, + }, + + status => { + invalid => { + faultstring => "There is no status named 'does-not-exist'", + value => 'does-not-exist' + }, + }, + + severity => { + undefined => {faultstring => 'You must select/enter a Severity.', value => ''}, + invalid => { + faultstring => "There is no Severity named 'does-not-exist'.", + value => 'does-not-exist' + }, + }, + + priority => { + undefined => {faultstring => 'You must select/enter a Priority.', value => ''}, + invalid => { + faultstring => "There is no Priority named 'does-not-exist'.", + value => 'does-not-exist' + }, + }, + + op_sys => { + undefined => {faultstring => 'You must select/enter a OS.', value => ''}, + invalid => { + faultstring => "There is no OS named 'does-not-exist'.", + value => 'does-not-exist' + }, + }, + + cc => { + invalid => + {faultstring => 'not a valid username', value => ['nonuserATbugillaDOTorg']}, + }, + + assigned_to => { + invalid => { + faultstring => "There is no user named 'does-not-exist'", + value => 'does-not-exist' + }, + }, + qa_contact => { + invalid => { + faultstring => "There is no user named 'does-not-exist'", + value => 'does-not-exist' + }, + }, + alias => { + long => { + faultstring => 'Bug aliases cannot be longer than 20 characters', + value => 'MyyyyyyyyyyyyyyyyyyBugggggggggggggggggggggg' + }, + existing => {faultstring => 'already taken the alias', value => 'public_bug'}, + numeric => + {faultstring => 'aliases cannot be merely numbers', value => '12345'}, + commma_or_space_separated => { + faultstring => 'contains one or more commas or spaces', + value => 'Bug 12345' + }, + + }, + groups => { + non_existent => { + faultstring => + 'either this group does not exist, or you are not allowed to restrict bugs to this group', + value => [random_string(20)], + }, + }, + comment_is_private => { + invalid => + {faultstring => 'you are not allowed to.+comments.+private', value => 1,} + }, }; -$jsonrpc_get->bz_call_fail('Bug.create', $bug_fields, - 'must use HTTP POST', 'create fails over GET'); +$jsonrpc_get->bz_call_fail( + 'Bug.create', $bug_fields, + 'must use HTTP POST', + 'create fails over GET' +); my @tests = ( - { args => $bug_fields, - error => "You must log in", - test => "Cannot file bugs as a logged-out user", - }, - { user => PRIVATE_BUG_USER, - args => { %$bug_fields, product => 'QA-Selenium-TEST', - component => 'QA-Selenium-TEST', - target_milestone => 'QAMilestone', - version => 'QAVersion', - groups => ['QA-Selenium-TEST'], - # These are set here because we can't actually set them, - # and we need the values to be correct for post_success. - qa_contact => $config->{PRIVATE_BUG_USER . '_user_login'}, - status => 'UNCONFIRMED' }, - test => "Authorized user can file a bug against a group", - }, - { user => PRIVATE_BUG_USER, - args => { %$bug_fields, comment_is_private => 1, - # These are here because PRIVATE_BUG_USER can't set them - # and we need their values to be correct for post_success. - assigned_to => $config->{'permanent_user'}, - qa_contact => '', - status => 'UNCONFIRMED' }, - test => "Insider can create a private description" - }, - { user => 'editbugs', - args => $bug_fields, - test => "Creating a bug with standard values succeeds", - }, + { + args => $bug_fields, + error => "You must log in", + test => "Cannot file bugs as a logged-out user", + }, + { + user => PRIVATE_BUG_USER, + args => { + %$bug_fields, + product => 'QA-Selenium-TEST', + component => 'QA-Selenium-TEST', + target_milestone => 'QAMilestone', + version => 'QAVersion', + groups => ['QA-Selenium-TEST'], + + # These are set here because we can't actually set them, + # and we need the values to be correct for post_success. + qa_contact => $config->{PRIVATE_BUG_USER . '_user_login'}, + status => 'UNCONFIRMED' + }, + test => "Authorized user can file a bug against a group", + }, + { + user => PRIVATE_BUG_USER, + args => { + %$bug_fields, + comment_is_private => 1, + + # These are here because PRIVATE_BUG_USER can't set them + # and we need their values to be correct for post_success. + assigned_to => $config->{'permanent_user'}, + qa_contact => '', + status => 'UNCONFIRMED' + }, + test => "Insider can create a private description" + }, + { + user => 'editbugs', + args => $bug_fields, + test => "Creating a bug with standard values succeeds", + }, ); # Convert the $fields tests into standard bz_run_tests format. foreach my $field (sort keys %$fields) { - my $test_values = $fields->{$field}; - foreach my $test_name (sort keys %$test_values) { - my $input_fields = dclone($bug_fields); - my $check_value = $test_values->{$test_name}->{value}; - my $error = $test_values->{$test_name}->{faultstring}; - $input_fields->{$field} = $check_value; - my $test = { user => 'editbugs', args => $input_fields, - error => $error, - test => "$field $test_name: fails as expected" }; - push(@tests, $test); - } + my $test_values = $fields->{$field}; + foreach my $test_name (sort keys %$test_values) { + my $input_fields = dclone($bug_fields); + my $check_value = $test_values->{$test_name}->{value}; + my $error = $test_values->{$test_name}->{faultstring}; + $input_fields->{$field} = $check_value; + my $test = { + user => 'editbugs', + args => $input_fields, + error => $error, + test => "$field $test_name: fails as expected" + }; + push(@tests, $test); + } } sub post_success { - my ($call, $t, $rpc) = @_; + my ($call, $t, $rpc) = @_; - my $id = $call->result->{id}; - ok($id, $rpc->TYPE . ": Result has an id: $id"); + my $id = $call->result->{id}; + ok($id, $rpc->TYPE . ": Result has an id: $id"); - my $get_call = $rpc->bz_call_success('Bug.get', { ids => [$id] }); - my $bug = $get_call->result->{bugs}->[0]; + my $get_call = $rpc->bz_call_success('Bug.get', {ids => [$id]}); + my $bug = $get_call->result->{bugs}->[0]; - my $expect = dclone $t->{args}; + my $expect = dclone $t->{args}; - my $comment_is_private = delete $expect->{comment_is_private}; - $expect->{creator} = $rpc->bz_config->{$t->{user} . '_user_login'}; + my $comment_is_private = delete $expect->{comment_is_private}; + $expect->{creator} = $rpc->bz_config->{$t->{user} . '_user_login'}; - my @fields = keys %$expect; - $rpc->bz_test_bug(\@fields, $bug, $expect, $t); + my @fields = keys %$expect; + $rpc->bz_test_bug(\@fields, $bug, $expect, $t); - my $comment_call = $rpc->bz_call_success('Bug.comments', { ids => [$id] }); - my $comment = $comment_call->result->{bugs}->{$id}->{comments}->[0]; - is($comment->{is_private} ? 1 : 0, $comment_is_private ? 1 : 0, - $rpc->TYPE . ": comment privacy is correct"); + my $comment_call = $rpc->bz_call_success('Bug.comments', {ids => [$id]}); + my $comment = $comment_call->result->{bugs}->{$id}->{comments}->[0]; + is( + $comment->{is_private} ? 1 : 0, + $comment_is_private ? 1 : 0, + $rpc->TYPE . ": comment privacy is correct" + ); } foreach my $rpc ($jsonrpc, $xmlrpc) { - $rpc->bz_run_tests(tests => \@tests, method => 'Bug.create', - post_success => \&post_success); + $rpc->bz_run_tests( + tests => \@tests, + method => 'Bug.create', + post_success => \&post_success + ); } diff --git a/qa/t/webservice_bug_fields.t b/qa/t/webservice_bug_fields.t index be565521f..110ed5741 100644 --- a/qa/t/webservice_bug_fields.t +++ b/qa/t/webservice_bug_fields.t @@ -17,203 +17,218 @@ my ($config, @clients) = get_rpc_clients(); plan tests => ($config->{test_extensions} ? 1338 : 1320); use constant INVALID_FIELD_NAME => 'invalid_field'; -use constant INVALID_FIELD_ID => -1; -sub GLOBAL_GENERAL_FIELDS { - my @fields = qw( - attach_data.thedata - attachments.description - attachments.filename - attachments.isobsolete - attachments.ispatch - attachments.isprivate - attachments.mimetype - attachments.submitter - - flagtypes.name - requestees.login_name - setters.login_name - - alias - assigned_to - blocked - bug_file_loc - bug_group - bug_id - cc - cclist_accessible - classification - commenter - content - creation_ts - days_elapsed - delta_ts - dependson - everconfirmed - keywords - longdesc - longdescs.isprivate - owner_idle_time - product - qa_contact - reporter - reporter_accessible - see_also - short_desc - status_whiteboard - - deadline - estimated_time - percentage_complete - remaining_time - work_time - ); - push(@fields, 'votes') if QA::Util::get_config()->{test_extensions}; +use constant INVALID_FIELD_ID => -1; - return @fields; +sub GLOBAL_GENERAL_FIELDS { + my @fields = qw( + attach_data.thedata + attachments.description + attachments.filename + attachments.isobsolete + attachments.ispatch + attachments.isprivate + attachments.mimetype + attachments.submitter + + flagtypes.name + requestees.login_name + setters.login_name + + alias + assigned_to + blocked + bug_file_loc + bug_group + bug_id + cc + cclist_accessible + classification + commenter + content + creation_ts + days_elapsed + delta_ts + dependson + everconfirmed + keywords + longdesc + longdescs.isprivate + owner_idle_time + product + qa_contact + reporter + reporter_accessible + see_also + short_desc + status_whiteboard + + deadline + estimated_time + percentage_complete + remaining_time + work_time + ); + push(@fields, 'votes') if QA::Util::get_config()->{test_extensions}; + + return @fields; } use constant STANDARD_SELECT_FIELDS => - qw(bug_severity bug_status op_sys priority rep_platform resolution); + qw(bug_severity bug_status op_sys priority rep_platform resolution); -use constant ALL_SELECT_FIELDS => (STANDARD_SELECT_FIELDS, - qw(cf_qa_status cf_single_select)); +use constant ALL_SELECT_FIELDS => + (STANDARD_SELECT_FIELDS, qw(cf_qa_status cf_single_select)); use constant PRODUCT_FIELDS => qw(version target_milestone component); -use constant ALL_FIELDS => (GLOBAL_GENERAL_FIELDS, ALL_SELECT_FIELDS, - PRODUCT_FIELDS); +use constant ALL_FIELDS => + (GLOBAL_GENERAL_FIELDS, ALL_SELECT_FIELDS, PRODUCT_FIELDS); use constant MANDATORY_FIELDS => qw(short_desc product version component); use constant PUBLIC_PRODUCT => 'Another Product'; use constant PRIVATE_PRODUCT => 'QA-Selenium-TEST'; sub get_field { - my ($fields, $field) = @_; - return first { $_->{name} eq $field } @$fields; + my ($fields, $field) = @_; + return first { $_->{name} eq $field } @$fields; } sub get_products_from_field { - my $field = shift; - my %products; - foreach my $value (@{ $field->{values} }) { - foreach my $vis_value (@{ $value->{visibility_values} }) { - $products{$vis_value} = 1; - } + my $field = shift; + my %products; + foreach my $value (@{$field->{values}}) { + foreach my $vis_value (@{$value->{visibility_values}}) { + $products{$vis_value} = 1; } - return \%products; + } + return \%products; } our %field_ids; foreach my $rpc (@clients) { - my $call = $rpc->bz_call_success('Bug.fields'); - my $fields = $call->result->{fields}; - foreach my $field (ALL_FIELDS) { - my $field_data = get_field($fields, $field); - ok($field_data, "$field is in the returned result") - or diag(Dumper($fields)); - $field_ids{$field} = $field_data->{id}; - - if (grep($_ eq $field, MANDATORY_FIELDS)) { - ok($field_data->{is_mandatory}, "$field is mandatory"); - } - else { - ok(!$field_data->{is_mandatory}, "$field is not mandatory"); - } + my $call = $rpc->bz_call_success('Bug.fields'); + my $fields = $call->result->{fields}; + foreach my $field (ALL_FIELDS) { + my $field_data = get_field($fields, $field); + ok($field_data, "$field is in the returned result") or diag(Dumper($fields)); + $field_ids{$field} = $field_data->{id}; + + if (grep($_ eq $field, MANDATORY_FIELDS)) { + ok($field_data->{is_mandatory}, "$field is mandatory"); } - - foreach my $field (ALL_SELECT_FIELDS, PRODUCT_FIELDS) { - my $field_data = get_field($fields, $field); - ok(defined $field_data->{visibility_values}, - "$field has visibility_values defined"); - my $field_vis_undefs = grep { !defined $_ } - @{ $field_data->{visibility_values} }; - is($field_vis_undefs, 0, "$field.visibility_values has no undefs") - or diag(Dumper($field_data->{visibility_values})); - - ok(defined $field_data->{values}, - "$field has 'values' defined"); - my $num_values = scalar @{ $field_data->{values} }; - ok($num_values, "$field has $num_values values"); - # The first bug status is a fake one and has no name, so we choose the 2nd item. - my $first_value = $field_data->{values}->[1]; - ok(defined $first_value->{name}, 'The first value has a name') - or diag(Dumper($field_data->{values})); - # The sortkey for milestones can be negative. - cmp_ok($first_value->{sortkey}, '=~', qr/^-?\d+$/, - "The first value has a numeric sortkey"); - - ok(defined $first_value->{visibility_values}, - "$field has visibilty_values defined on its first value") - or diag(Dumper($field_data->{values})); - my @value_visibility_values = map { @{ $_->{visibility_values} } } - @{ $field_data->{values} }; - my $undefs = grep { !defined $_ } @value_visibility_values; - is($undefs, 0, - "$field.values.visibility_values has no undefs"); + else { + ok(!$field_data->{is_mandatory}, "$field is not mandatory"); } + } - foreach my $field (PRODUCT_FIELDS) { - my $field_data = get_field($fields, $field); - is($field_data->{value_field}, 'product', - "The value_field for $field is 'product'"); - my $products = get_products_from_field($field_data); - ok($products->{+PUBLIC_PRODUCT}, - "$field values are returned for the public product"); - ok(!$products->{+PRIVATE_PRODUCT}, - "No $field values are returned for the private product"); - } + foreach my $field (ALL_SELECT_FIELDS, PRODUCT_FIELDS) { + my $field_data = get_field($fields, $field); + ok( + defined $field_data->{visibility_values}, + "$field has visibility_values defined" + ); + my $field_vis_undefs = grep { !defined $_ } @{$field_data->{visibility_values}}; + is($field_vis_undefs, 0, "$field.visibility_values has no undefs") + or diag(Dumper($field_data->{visibility_values})); + + ok(defined $field_data->{values}, "$field has 'values' defined"); + my $num_values = scalar @{$field_data->{values}}; + ok($num_values, "$field has $num_values values"); + + # The first bug status is a fake one and has no name, so we choose the 2nd item. + my $first_value = $field_data->{values}->[1]; + ok(defined $first_value->{name}, 'The first value has a name') + or diag(Dumper($field_data->{values})); + + # The sortkey for milestones can be negative. + cmp_ok($first_value->{sortkey}, + '=~', qr/^-?\d+$/, "The first value has a numeric sortkey"); + + ok(defined $first_value->{visibility_values}, + "$field has visibilty_values defined on its first value") + or diag(Dumper($field_data->{values})); + my @value_visibility_values + = map { @{$_->{visibility_values}} } @{$field_data->{values}}; + my $undefs = grep { !defined $_ } @value_visibility_values; + is($undefs, 0, "$field.values.visibility_values has no undefs"); + } + + foreach my $field (PRODUCT_FIELDS) { + my $field_data = get_field($fields, $field); + is($field_data->{value_field}, + 'product', "The value_field for $field is 'product'"); + my $products = get_products_from_field($field_data); + ok($products->{+PUBLIC_PRODUCT}, + "$field values are returned for the public product"); + ok(!$products->{+PRIVATE_PRODUCT}, + "No $field values are returned for the private product"); + } } my @all_tests = ( - { args => { ids => [values %field_ids], - names => [ALL_FIELDS] }, - test => 'Getting all fields by name and id simultaneously', - count => scalar ALL_FIELDS - }, - { args => { names => [INVALID_FIELD_NAME] }, - error => "There is no field named", - test => 'Invalid field name' - }, - { args => { ids => [INVALID_FIELD_ID] }, - error => 'must be numeric', - test => 'Invalid field id' - }, - { user => 'QA_Selenium_TEST', - args => { names => [PRODUCT_FIELDS] }, - test => 'Getting product-specific fields as a privileged user', - count => scalar PRODUCT_FIELDS, - product_private_values => 1 - }, + { + args => {ids => [values %field_ids], names => [ALL_FIELDS]}, + test => 'Getting all fields by name and id simultaneously', + count => scalar ALL_FIELDS + }, + { + args => {names => [INVALID_FIELD_NAME]}, + error => "There is no field named", + test => 'Invalid field name' + }, + { + args => {ids => [INVALID_FIELD_ID]}, + error => 'must be numeric', + test => 'Invalid field id' + }, + { + user => 'QA_Selenium_TEST', + args => {names => [PRODUCT_FIELDS]}, + test => 'Getting product-specific fields as a privileged user', + count => scalar PRODUCT_FIELDS, + product_private_values => 1 + }, ); foreach my $field (ALL_FIELDS) { - push(@all_tests, - { args => { names => [$field] }, - test => "Logged-out users can get the $field field by name" }); - push(@all_tests, - { args => { ids => [$field_ids{$field}] }, - test => "Logged-out users can get the $field by id" }); + push( + @all_tests, + { + args => {names => [$field]}, + test => "Logged-out users can get the $field field by name" + } + ); + push( + @all_tests, + { + args => {ids => [$field_ids{$field}]}, + test => "Logged-out users can get the $field by id" + } + ); } sub post_success { - my ($call, $t) = @_; - my $fields = $call->result->{fields}; - my $count = $t->{count}; - $count = 1 if !defined $count; - is(scalar @$fields, $count, "Exactly $count field(s) returned"); - - if ($t->{product_private_values}) { - foreach my $field (@$fields) { - my $name = $field->{name}; - my $field_data = get_field($fields, $name); - my $products = get_products_from_field($field_data); - ok($products->{+PUBLIC_PRODUCT}, - "$name values are returned for the public product"); - ok($products->{+PRIVATE_PRODUCT}, - "$name values are returned for the private product"); - } + my ($call, $t) = @_; + my $fields = $call->result->{fields}; + my $count = $t->{count}; + $count = 1 if !defined $count; + is(scalar @$fields, $count, "Exactly $count field(s) returned"); + + if ($t->{product_private_values}) { + foreach my $field (@$fields) { + my $name = $field->{name}; + my $field_data = get_field($fields, $name); + my $products = get_products_from_field($field_data); + ok($products->{+PUBLIC_PRODUCT}, + "$name values are returned for the public product"); + ok($products->{+PRIVATE_PRODUCT}, + "$name values are returned for the private product"); } + } } foreach my $rpc (@clients) { - $rpc->bz_run_tests(tests => \@all_tests, method => 'Bug.fields', - post_success => \&post_success); + $rpc->bz_run_tests( + tests => \@all_tests, + method => 'Bug.fields', + post_success => \&post_success + ); } diff --git a/qa/t/webservice_bug_get.t b/qa/t/webservice_bug_get.t index cad5c3893..c87346c08 100644 --- a/qa/t/webservice_bug_get.t +++ b/qa/t/webservice_bug_get.t @@ -23,124 +23,147 @@ my $xmlrpc = $clients[0]; our $creation_time = DateTime->now(); our ($public_bug, $private_bug) = $xmlrpc->bz_create_test_bugs('private'); my $private_id = $private_bug->{id}; -my $public_id = $public_bug->{id}; +my $public_id = $public_bug->{id}; -my $base_url = $config->{browser_url} . "/" - . $config->{bugzilla_installation} . '/'; +my $base_url + = $config->{browser_url} . "/" . $config->{bugzilla_installation} . '/'; # Set a few fields on the private bug, including setting up # a dependency relationship. $xmlrpc->bz_log_in(PRIVATE_BUG_USER); -$xmlrpc->bz_call_success('Bug.update', { - ids => [$private_id], - blocks => { set => [$public_id] }, - dupe_of => $public_id, +$xmlrpc->bz_call_success( + 'Bug.update', + { + ids => [$private_id], + blocks => {set => [$public_id]}, + dupe_of => $public_id, is_creator_accessible => 0, - keywords => { set => ['test-keyword-1', 'test-keyword-2'] }, - see_also => { add => ["${base_url}show_bug.cgi?id=$public_id", - "https://bugzilla-dev.allizom.org/show_bug.cgi?id=123456"] }, - cf_qa_status => ['in progress', 'verified'], + keywords => {set => ['test-keyword-1', 'test-keyword-2']}, + see_also => { + add => [ + "${base_url}show_bug.cgi?id=$public_id", + "https://bugzilla-dev.allizom.org/show_bug.cgi?id=123456" + ] + }, + cf_qa_status => ['in progress', 'verified'], cf_single_select => 'two', -}, 'Update the private bug'); + }, + 'Update the private bug' +); $xmlrpc->bz_call_success('User.logout'); -$private_bug->{blocks} = [$public_id]; -$private_bug->{dupe_of} = $public_id; -$private_bug->{status} = 'RESOLVED'; -$private_bug->{is_open} = 0; -$private_bug->{resolution} = 'DUPLICATE'; +$private_bug->{blocks} = [$public_id]; +$private_bug->{dupe_of} = $public_id; +$private_bug->{status} = 'RESOLVED'; +$private_bug->{is_open} = 0; +$private_bug->{resolution} = 'DUPLICATE'; $private_bug->{is_creator_accessible} = 0; -$private_bug->{is_cc_accessible} = 1; -$private_bug->{keywords} = ['test-keyword-1', 'test-keyword-2']; -$private_bug->{see_also} = ["${base_url}show_bug.cgi?id=$public_id", - "https://bugzilla-dev.allizom.org/show_bug.cgi?id=123456"]; +$private_bug->{is_cc_accessible} = 1; +$private_bug->{keywords} = ['test-keyword-1', 'test-keyword-2']; +$private_bug->{see_also} = [ + "${base_url}show_bug.cgi?id=$public_id", + "https://bugzilla-dev.allizom.org/show_bug.cgi?id=123456" +]; $private_bug->{cf_qa_status} = ['in progress', 'verified']; $private_bug->{cf_single_select} = 'two'; -$public_bug->{depends_on} = [$private_id]; -$public_bug->{dupe_of} = undef; -$public_bug->{resolution} = ''; -$public_bug->{is_open} = 1; +$public_bug->{depends_on} = [$private_id]; +$public_bug->{dupe_of} = undef; +$public_bug->{resolution} = ''; +$public_bug->{is_open} = 1; $public_bug->{is_creator_accessible} = 1; -$public_bug->{is_cc_accessible} = 1; -$public_bug->{keywords} = []; +$public_bug->{is_cc_accessible} = 1; +$public_bug->{keywords} = []; + # Local Bugzilla bugs are automatically updated. -$public_bug->{see_also} = ["${base_url}show_bug.cgi?id=$private_id"]; -$public_bug->{cf_qa_status} = []; +$public_bug->{see_also} = ["${base_url}show_bug.cgi?id=$private_id"]; +$public_bug->{cf_qa_status} = []; $public_bug->{cf_single_select} = '---'; # Fill in the timetracking fields on the public bug. $xmlrpc->bz_log_in('admin'); -$xmlrpc->bz_call_success('Bug.update', { - ids => [$public_id], - deadline => '2038-01-01', +$xmlrpc->bz_call_success( + 'Bug.update', + { + ids => [$public_id], + deadline => '2038-01-01', estimated_time => '10.0', remaining_time => '5.0', -}); + } +); $xmlrpc->bz_call_success('User.logout'); # Populate other fields. -$public_bug->{classification} = 'Unclassified'; +$public_bug->{classification} = 'Unclassified'; $private_bug->{classification} = 'Unclassified'; -$private_bug->{groups} = ['QA-Selenium-TEST']; -$public_bug->{groups} = []; +$private_bug->{groups} = ['QA-Selenium-TEST']; +$public_bug->{groups} = []; # The user filing $private_bug doesn't have permission to set the status # or qa_contact, so they differ from normal $public_bug values. $private_bug->{qa_contact} = $config->{PRIVATE_BUG_USER . '_user_login'}; sub post_success { - my ($call, $t, $rpc) = @_; - - is(scalar @{ $call->result->{bugs} }, 1, "Got exactly one bug"); - my $bug = $call->result->{bugs}->[0]; - - if ($t->{user} && $t->{user} eq 'admin') { - ok(exists $bug->{estimated_time} && exists $bug->{remaining_time}, - 'Admin correctly gets time-tracking fields'); - is($bug->{deadline}, '2038-01-01', 'deadline is correct'); - cmp_ok($bug->{estimated_time}, '==', '10.0', - 'estimated_time is correct'); - cmp_ok($bug->{remaining_time}, '==', '5.0', - 'remaining_time is correct'); - } - else { - ok(!exists $bug->{estimated_time} && !exists $bug->{remaining_time}, - 'Time-tracking fields are not returned to non-privileged users'); - } - - if ($t->{user}) { - ok($bug->{update_token}, 'Update token returned for logged-in user'); - } - else { - ok(!exists $bug->{update_token}, - 'Update token not returned for logged-out users'); - } - - my $expect = $bug->{id} == $private_bug->{id} ? $private_bug : $public_bug; - - my @fields = sort keys %$expect; - push(@fields, 'creation_time', 'last_change_time'); - - $rpc->bz_test_bug(\@fields, $bug, $expect, $t, $creation_time); + my ($call, $t, $rpc) = @_; + + is(scalar @{$call->result->{bugs}}, 1, "Got exactly one bug"); + my $bug = $call->result->{bugs}->[0]; + + if ($t->{user} && $t->{user} eq 'admin') { + ok(exists $bug->{estimated_time} && exists $bug->{remaining_time}, + 'Admin correctly gets time-tracking fields'); + is($bug->{deadline}, '2038-01-01', 'deadline is correct'); + cmp_ok($bug->{estimated_time}, '==', '10.0', 'estimated_time is correct'); + cmp_ok($bug->{remaining_time}, '==', '5.0', 'remaining_time is correct'); + } + else { + ok( + !exists $bug->{estimated_time} && !exists $bug->{remaining_time}, + 'Time-tracking fields are not returned to non-privileged users' + ); + } + + if ($t->{user}) { + ok($bug->{update_token}, 'Update token returned for logged-in user'); + } + else { + ok(!exists $bug->{update_token}, + 'Update token not returned for logged-out users'); + } + + my $expect = $bug->{id} == $private_bug->{id} ? $private_bug : $public_bug; + + my @fields = sort keys %$expect; + push(@fields, 'creation_time', 'last_change_time'); + + $rpc->bz_test_bug(\@fields, $bug, $expect, $t, $creation_time); } my @tests = ( - @{ bug_tests($public_id, $private_id) }, - { args => { ids => [$public_id], - include_fields => ['id', 'summary', 'groups'] }, - test => 'include_fields', + @{bug_tests($public_id, $private_id)}, + { + args => {ids => [$public_id], include_fields => ['id', 'summary', 'groups']}, + test => 'include_fields', + }, + { + args => + {ids => [$public_id], exclude_fields => ['assigned_to', 'cf_qa_status']}, + test => 'exclude_fields' + }, + { + args => { + ids => [$public_id], + include_fields => ['id', 'summary', 'groups'], + exclude_fields => ['summary'] }, - { args => { ids => [$public_id], - exclude_fields => ['assigned_to', 'cf_qa_status'] }, - test => 'exclude_fields' }, - { args => { ids => [$public_id], - include_fields => ['id', 'summary', 'groups'], - exclude_fields => ['summary'] }, - test => 'exclude_fields overrides include_fields' }, + test => 'exclude_fields overrides include_fields' + }, ); foreach my $rpc (@clients) { - $rpc->bz_run_tests(tests => \@tests, method => 'Bug.get', - post_success => \&post_success); + $rpc->bz_run_tests( + tests => \@tests, + method => 'Bug.get', + post_success => \&post_success + ); } diff --git a/qa/t/webservice_bug_get_bugs.t b/qa/t/webservice_bug_get_bugs.t index d66249b2c..9fbe00fbd 100644 --- a/qa/t/webservice_bug_get_bugs.t +++ b/qa/t/webservice_bug_get_bugs.t @@ -23,124 +23,144 @@ my $xmlrpc = $clients[0]; our $creation_time = DateTime->now(); our ($public_bug, $private_bug) = $xmlrpc->bz_create_test_bugs('private'); my $private_id = $private_bug->{id}; -my $public_id = $public_bug->{id}; +my $public_id = $public_bug->{id}; -my $base_url = $config->{browser_url} . "/" - . $config->{bugzilla_installation} . '/'; +my $base_url + = $config->{browser_url} . "/" . $config->{bugzilla_installation} . '/'; # Set a few fields on the private bug, including setting up # a dependency relationship. $xmlrpc->bz_log_in(PRIVATE_BUG_USER); -$xmlrpc->bz_call_success('Bug.update', { - ids => [$private_id], - blocks => { set => [$public_id] }, - dupe_of => $public_id, +$xmlrpc->bz_call_success( + 'Bug.update', + { + ids => [$private_id], + blocks => {set => [$public_id]}, + dupe_of => $public_id, is_creator_accessible => 0, - keywords => { set => ['test-keyword-1', 'test-keyword-2'] }, - see_also => { add => ["${base_url}show_bug.cgi?id=$public_id"] }, - cf_qa_status => ['in progress', 'verified'], - cf_single_select => 'two', -}, 'Update the private bug'); + keywords => {set => ['test-keyword-1', 'test-keyword-2']}, + see_also => {add => ["${base_url}show_bug.cgi?id=$public_id"]}, + cf_qa_status => ['in progress', 'verified'], + cf_single_select => 'two', + }, + 'Update the private bug' +); $xmlrpc->bz_call_success('User.logout'); -$private_bug->{blocks} = [$public_id]; -$private_bug->{dupe_of} = $public_id; -$private_bug->{status} = 'RESOLVED'; -$private_bug->{is_open} = 0; -$private_bug->{resolution} = 'DUPLICATE'; +$private_bug->{blocks} = [$public_id]; +$private_bug->{dupe_of} = $public_id; +$private_bug->{status} = 'RESOLVED'; +$private_bug->{is_open} = 0; +$private_bug->{resolution} = 'DUPLICATE'; $private_bug->{is_creator_accessible} = 0; -$private_bug->{is_cc_accessible} = 1; -$private_bug->{keywords} = ['test-keyword-1', 'test-keyword-2']; -$private_bug->{see_also} = ["${base_url}show_bug.cgi?id=$public_id"]; -$private_bug->{cf_qa_status} = ['in progress', 'verified']; +$private_bug->{is_cc_accessible} = 1; +$private_bug->{keywords} = ['test-keyword-1', 'test-keyword-2']; +$private_bug->{see_also} = ["${base_url}show_bug.cgi?id=$public_id"]; +$private_bug->{cf_qa_status} = ['in progress', 'verified']; $private_bug->{cf_single_select} = 'two'; -$public_bug->{depends_on} = [$private_id]; -$public_bug->{dupe_of} = undef; -$public_bug->{resolution} = ''; -$public_bug->{is_open} = 1; +$public_bug->{depends_on} = [$private_id]; +$public_bug->{dupe_of} = undef; +$public_bug->{resolution} = ''; +$public_bug->{is_open} = 1; $public_bug->{is_creator_accessible} = 1; -$public_bug->{is_cc_accessible} = 1; -$public_bug->{keywords} = []; -$public_bug->{see_also} = ["${base_url}show_bug.cgi?id=$private_id"]; -$public_bug->{cf_qa_status} = []; +$public_bug->{is_cc_accessible} = 1; +$public_bug->{keywords} = []; +$public_bug->{see_also} = ["${base_url}show_bug.cgi?id=$private_id"]; +$public_bug->{cf_qa_status} = []; $public_bug->{cf_single_select} = '---'; # Fill in the timetracking fields on the public bug. $xmlrpc->bz_log_in('admin'); -$xmlrpc->bz_call_success('Bug.update', { - ids => [$public_id], - deadline => '2038-01-01', +$xmlrpc->bz_call_success( + 'Bug.update', + { + ids => [$public_id], + deadline => '2038-01-01', estimated_time => '10.0', remaining_time => '5.0', -}); + } +); $xmlrpc->bz_call_success('User.logout'); # Populate other fields. -$public_bug->{classification} = 'Unclassified'; +$public_bug->{classification} = 'Unclassified'; $private_bug->{classification} = 'Unclassified'; -$private_bug->{groups} = ['QA-Selenium-TEST']; -$public_bug->{groups} = []; +$private_bug->{groups} = ['QA-Selenium-TEST']; +$public_bug->{groups} = []; # The user filing $private_bug doesn't have permission to set the status # or qa_contact, so they differ from normal $public_bug values. $private_bug->{qa_contact} = $config->{PRIVATE_BUG_USER . '_user_login'}; sub post_success { - my ($call, $t, $rpc) = @_; - - is(scalar @{ $call->result->{bugs} }, 1, "Got exactly one bug"); - my $bug = $call->result->{bugs}->[0]; - - if ($t->{user} && $t->{user} eq 'admin') { - ok(exists $bug->{estimated_time} && exists $bug->{remaining_time} - && exists $bug->{deadline}, - 'Admin correctly gets time-tracking fields'); - - is($bug->{deadline}, '2038-01-01', 'deadline is correct'); - cmp_ok($bug->{estimated_time}, '==', '10.0', - 'estimated_time is correct'); - cmp_ok($bug->{remaining_time}, '==', '5.0', - 'remaining_time is correct'); - } - else { - ok(!exists $bug->{estimated_time} && !exists $bug->{remaining_time} - && !exists $bug->{deadline}, - 'Time-tracking fields are not returned to non-privileged users'); - } - - if ($t->{user}) { - ok($bug->{update_token}, 'Update token returned for logged-in user'); - } - else { - ok(!exists $bug->{update_token}, - 'Update token not returned for logged-out users'); - } - - my $expect = $bug->{id} == $private_bug->{id} ? $private_bug : $public_bug; - - my @fields = sort keys %$expect; - push(@fields, 'creation_time', 'last_change_time'); - - $rpc->bz_test_bug(\@fields, $bug, $expect, $t, $creation_time); + my ($call, $t, $rpc) = @_; + + is(scalar @{$call->result->{bugs}}, 1, "Got exactly one bug"); + my $bug = $call->result->{bugs}->[0]; + + if ($t->{user} && $t->{user} eq 'admin') { + ok( + exists $bug->{estimated_time} + && exists $bug->{remaining_time} + && exists $bug->{deadline}, + 'Admin correctly gets time-tracking fields' + ); + + is($bug->{deadline}, '2038-01-01', 'deadline is correct'); + cmp_ok($bug->{estimated_time}, '==', '10.0', 'estimated_time is correct'); + cmp_ok($bug->{remaining_time}, '==', '5.0', 'remaining_time is correct'); + } + else { + ok( + !exists $bug->{estimated_time} + && !exists $bug->{remaining_time} + && !exists $bug->{deadline}, + 'Time-tracking fields are not returned to non-privileged users' + ); + } + + if ($t->{user}) { + ok($bug->{update_token}, 'Update token returned for logged-in user'); + } + else { + ok(!exists $bug->{update_token}, + 'Update token not returned for logged-out users'); + } + + my $expect = $bug->{id} == $private_bug->{id} ? $private_bug : $public_bug; + + my @fields = sort keys %$expect; + push(@fields, 'creation_time', 'last_change_time'); + + $rpc->bz_test_bug(\@fields, $bug, $expect, $t, $creation_time); } my @tests = ( - @{ bug_tests($public_id, $private_id) }, - { args => { ids => [$public_id], - include_fields => ['id', 'summary', 'groups'] }, - test => 'include_fields', + @{bug_tests($public_id, $private_id)}, + { + args => {ids => [$public_id], include_fields => ['id', 'summary', 'groups']}, + test => 'include_fields', + }, + { + args => + {ids => [$public_id], exclude_fields => ['assigned_to', 'cf_qa_status']}, + test => 'exclude_fields' + }, + { + args => { + ids => [$public_id], + include_fields => ['id', 'summary', 'groups'], + exclude_fields => ['summary'] }, - { args => { ids => [$public_id], - exclude_fields => ['assigned_to', 'cf_qa_status'] }, - test => 'exclude_fields' }, - { args => { ids => [$public_id], - include_fields => ['id', 'summary', 'groups'], - exclude_fields => ['summary'] }, - test => 'exclude_fields overrides include_fields' }, + test => 'exclude_fields overrides include_fields' + }, ); foreach my $rpc (@clients) { - $rpc->bz_run_tests(tests => \@tests, method => 'Bug.get', - post_success => \&post_success); + $rpc->bz_run_tests( + tests => \@tests, + method => 'Bug.get', + post_success => \&post_success + ); } diff --git a/qa/t/webservice_bug_history.t b/qa/t/webservice_bug_history.t index 7451fe450..7accacfd6 100644 --- a/qa/t/webservice_bug_history.t +++ b/qa/t/webservice_bug_history.t @@ -18,12 +18,15 @@ use Test::More tests => 114; my ($config, @clients) = get_rpc_clients(); sub post_success { - my ($call, $t) = @_; - is(scalar @{ $call->result->{bugs} }, 1, "Got exactly one bug"); - isa_ok($call->result->{bugs}->[0]->{history}, 'ARRAY', "Bug's history"); + my ($call, $t) = @_; + is(scalar @{$call->result->{bugs}}, 1, "Got exactly one bug"); + isa_ok($call->result->{bugs}->[0]->{history}, 'ARRAY', "Bug's history"); } foreach my $rpc (@clients) { - $rpc->bz_run_tests(tests => STANDARD_BUG_TESTS, - method => 'Bug.history', post_success => \&post_success); + $rpc->bz_run_tests( + tests => STANDARD_BUG_TESTS, + method => 'Bug.history', + post_success => \&post_success + ); } diff --git a/qa/t/webservice_bug_legal_values.t b/qa/t/webservice_bug_legal_values.t index 29f444708..303868517 100644 --- a/qa/t/webservice_bug_legal_values.t +++ b/qa/t/webservice_bug_legal_values.t @@ -19,82 +19,92 @@ my ($config, @clients) = get_rpc_clients(); use constant INVALID_PRODUCT_ID => -1; use constant INVALID_FIELD_NAME => 'invalid_field'; use constant GLOBAL_FIELDS => - qw(bug_severity bug_status op_sys priority rep_platform resolution - cf_qa_status cf_single_select); + qw(bug_severity bug_status op_sys priority rep_platform resolution + cf_qa_status cf_single_select); use constant PRODUCT_FIELDS => qw(version target_milestone component); -my $products = $clients[0]->bz_get_products(); -my $public_product = $products->{'Another Product'}; +my $products = $clients[0]->bz_get_products(); +my $public_product = $products->{'Another Product'}; my $private_product = $products->{'QA-Selenium-TEST'}; my @all_tests; for my $field (GLOBAL_FIELDS) { - push(@all_tests, - { args => { field => $field }, - test => "Logged-out user can get $field values" }); + push(@all_tests, + {args => {field => $field}, test => "Logged-out user can get $field values"}); } for my $field (PRODUCT_FIELDS) { - my @tests = ( - { args => { field => $field }, - error => "argument was not set", - test => "$field can't be accessed without a value for 'product'", - }, - { args => { product_id => INVALID_PRODUCT_ID, field => $field }, - error => "does not exist", - test => "$field cannot be accessed with an invalid product id", - }, - - { args => { product_id => $private_product, field => $field }, - error => "you don't have access", - test => "Logged-out user cannot access $field in private product" - }, - { args => { product_id => $public_product, field => $field }, - test => "Logged-out user can access $field in a public product", - }, - - { user => 'unprivileged', - args => { product_id => $private_product, field => $field }, - error => "you don't have access", - test => "Unprivileged user cannot access $field in private product", - }, - { user => 'unprivileged', - args => { product_id => $public_product, field => $field }, - test => "Logged-in user can access $field in public product", - }, - - { user => 'QA_Selenium_TEST', - args => { product_id => $private_product, field => $field }, - test => "Privileged user can access $field in a private product", - }, - ); - - push(@all_tests, @tests); -} + my @tests = ( + { + args => {field => $field}, + error => "argument was not set", + test => "$field can't be accessed without a value for 'product'", + }, + { + args => {product_id => INVALID_PRODUCT_ID, field => $field}, + error => "does not exist", + test => "$field cannot be accessed with an invalid product id", + }, -my @extra_tests = ( - { args => { product_id => $private_product, }, - error => "requires a field argument", - test => "Passing product_id without 'field' throws an error", + { + args => {product_id => $private_product, field => $field}, + error => "you don't have access", + test => "Logged-out user cannot access $field in private product" + }, + { + args => {product_id => $public_product, field => $field}, + test => "Logged-out user can access $field in a public product", + }, + + { + user => 'unprivileged', + args => {product_id => $private_product, field => $field}, + error => "you don't have access", + test => "Unprivileged user cannot access $field in private product", }, - { args => { field => INVALID_FIELD_NAME }, - error => "Can't use " . INVALID_FIELD_NAME . " as a field name", - test => 'Invalid field name' + { + user => 'unprivileged', + args => {product_id => $public_product, field => $field}, + test => "Logged-in user can access $field in public product", }, + + { + user => 'QA_Selenium_TEST', + args => {product_id => $private_product, field => $field}, + test => "Privileged user can access $field in a private product", + }, + ); + + push(@all_tests, @tests); +} + +my @extra_tests = ( + { + args => {product_id => $private_product,}, + error => "requires a field argument", + test => "Passing product_id without 'field' throws an error", + }, + { + args => {field => INVALID_FIELD_NAME}, + error => "Can't use " . INVALID_FIELD_NAME . " as a field name", + test => 'Invalid field name' + }, ); push(@all_tests, @extra_tests); sub post_success { - my ($call) = @_; + my ($call) = @_; - cmp_ok(scalar @{ $call->result->{'values'} }, '>', 0, - 'Got one or more values'); + cmp_ok(scalar @{$call->result->{'values'}}, '>', 0, 'Got one or more values'); } foreach my $rpc (@clients) { - $rpc->bz_run_tests(tests => \@all_tests, method => 'Bug.legal_values', - post_success => \&post_success); + $rpc->bz_run_tests( + tests => \@all_tests, + method => 'Bug.legal_values', + post_success => \&post_success + ); } diff --git a/qa/t/webservice_bug_search.t b/qa/t/webservice_bug_search.t index 6a4933c5a..7b6d7dade 100644 --- a/qa/t/webservice_bug_search.t +++ b/qa/t/webservice_bug_search.t @@ -25,161 +25,207 @@ my ($public_bug, $private_bug) = $clients[0]->bz_create_test_bugs('private'); my @tests; foreach my $field (keys %$public_bug) { - next if ($field eq 'cc' or $field eq 'description'); - my $test = { args => { $field => $public_bug->{$field} }, - test => "Search by $field" }; - if ( grep($_ eq $field, qw(alias whiteboard summary)) ) { - $test->{exactly} = 1; $test->{bugs} = 1; - } - push(@tests, $test); + next if ($field eq 'cc' or $field eq 'description'); + my $test + = {args => {$field => $public_bug->{$field}}, test => "Search by $field"}; + if (grep($_ eq $field, qw(alias whiteboard summary))) { + $test->{exactly} = 1; + $test->{bugs} = 1; + } + push(@tests, $test); } -push(@tests, ( - { args => { offset => 1 }, +push( + @tests, + ( + { + args => {offset => 1}, test => "Offset without limit fails", error => 'requires a limit argument', }, - { args => { alias => $private_bug->{alias} }, + { + args => {alias => $private_bug->{alias}}, test => 'Logged-out cannot find a private_bug by alias', bugs => 0, }, - { args => { creation_time => '19700101T00:00:00' }, + { + args => {creation_time => '19700101T00:00:00'}, test => 'Get all bugs by creation time', }, - { args => { creation_time => '20380101T00:00:00' }, + { + args => {creation_time => '20380101T00:00:00'}, test => 'Get no bugs, by creation time', bugs => 0, }, - { args => { last_change_time => '19700101T00:00:00' }, + { + args => {last_change_time => '19700101T00:00:00'}, test => 'Get all bugs by last_change_time', }, - { args => { last_change_time => '20380101T00:00:00' }, + { + args => {last_change_time => '20380101T00:00:00'}, test => 'Get no bugs by last_change_time', bugs => 0, }, - { args => { reporter => $config->{editbugs_user_login} }, + { + args => {reporter => $config->{editbugs_user_login}}, test => 'Search by reporter', }, - { args => { resolution => '---' }, - test => 'Search for empty resolution', - }, - { args => { resolution => 'NO_SUCH_RESOLUTION' }, + {args => {resolution => '---'}, test => 'Search for empty resolution',}, + { + args => {resolution => 'NO_SUCH_RESOLUTION'}, test => 'Search for invalid resolution', bugs => 0, }, - { args => { summary => substr($public_bug->{summary}, 0, 50) }, - test => 'Search by partial summary', - bugs => 1, exactly => 1 + { + args => {summary => substr($public_bug->{summary}, 0, 50)}, + test => 'Search by partial summary', + bugs => 1, + exactly => 1 }, - { args => { summary => random_string() . ' ' . random_string() }, + { + args => {summary => random_string() . ' ' . random_string()}, test => 'Summary search that returns no results', bugs => 0, }, - { args => { summary => [split(/\s/, $public_bug->{summary})] }, + { + args => {summary => [split(/\s/, $public_bug->{summary})]}, test => 'Summary search using multiple terms', }, - { args => { whiteboard => substr($public_bug->{whiteboard}, 0, 50) }, - test => 'Search by partial whiteboard', - bugs => 1, exactly => 1, + { + args => {whiteboard => substr($public_bug->{whiteboard}, 0, 50)}, + test => 'Search by partial whiteboard', + bugs => 1, + exactly => 1, }, - { args => { whiteboard => random_string(100) }, + { + args => {whiteboard => random_string(100)}, test => 'Whiteboard search that returns no results', bugs => 0, }, - { args => { whiteboard => [split(/\s/, $public_bug->{whiteboard})] }, - test => 'Whiteboard search using multiple terms', - bugs => 1, exactly => 1, + { + args => {whiteboard => [split(/\s/, $public_bug->{whiteboard})]}, + test => 'Whiteboard search using multiple terms', + bugs => 1, + exactly => 1, }, - { args => { product => $public_bug->{product}, - component => $public_bug->{component}, - last_change_time => '19700101T00:00:00' }, + { + args => { + product => $public_bug->{product}, + component => $public_bug->{component}, + last_change_time => '19700101T00:00:00' + }, test => 'Search by multiple arguments', }, # Logged-in user who can see private bugs - { user => PRIVATE_BUG_USER, - args => { alias => [$public_bug->{alias}, $private_bug->{alias}] }, - test => 'Search using two aliases (including one private)', - bugs => 2, exactly => 1, - }, - { user => PRIVATE_BUG_USER, - args => { product => [$public_bug->{product}, $private_bug->{product}], - limit => 1 }, - test => 'Limit 1', - bugs => 1, exactly => 1, - }, - { user => PRIVATE_BUG_USER, - args => { product => [$public_bug->{product}, $private_bug->{product}], - limit => 1, offset => 1 }, - test => 'Limit 1 Offset 1', - bugs => 1, exactly => 1, + { + user => PRIVATE_BUG_USER, + args => {alias => [$public_bug->{alias}, $private_bug->{alias}]}, + test => 'Search using two aliases (including one private)', + bugs => 2, + exactly => 1, + }, + { + user => PRIVATE_BUG_USER, + args => + {product => [$public_bug->{product}, $private_bug->{product}], limit => 1}, + test => 'Limit 1', + bugs => 1, + exactly => 1, + }, + { + user => PRIVATE_BUG_USER, + args => { + product => [$public_bug->{product}, $private_bug->{product}], + limit => 1, + offset => 1 + }, + test => 'Limit 1 Offset 1', + bugs => 1, + exactly => 1, }, # include_fields ane exclude_fields - { args => { id => $public_bug->{id}, - include_fields => ['id', 'alias', 'summary', 'groups'] }, + { + args => { + id => $public_bug->{id}, + include_fields => ['id', 'alias', 'summary', 'groups'] + }, test => 'include_fields', }, - { args => { id => $public_bug->{id}, - exclude_fields => ['assigned_to', 'cf_qa_status'] }, - test => 'exclude_fields' }, - { args => { id => $public_bug->{id}, - include_fields => ['id', 'alias', 'summary', 'groups'], - exclude_fields => ['summary'] }, - test => 'exclude_fields overrides include_fields' }, -)); - -push(@tests, - { args => { votes => 1 }, - test => 'Search by votes', - bugs => -1, # We don't care how many it returns, for now. - }) if $config->{test_extensions}; + { + args => + {id => $public_bug->{id}, exclude_fields => ['assigned_to', 'cf_qa_status']}, + test => 'exclude_fields' + }, + { + args => { + id => $public_bug->{id}, + include_fields => ['id', 'alias', 'summary', 'groups'], + exclude_fields => ['summary'] + }, + test => 'exclude_fields overrides include_fields' + }, + ) +); + +push( + @tests, + { + args => {votes => 1}, + test => 'Search by votes', + bugs => -1, # We don't care how many it returns, for now. + } +) if $config->{test_extensions}; sub post_success { - my ($call, $t) = @_; - my $bugs = $call->result->{bugs}; - my $expected_count = $t->{bugs}; - $expected_count = 1 if !defined $expected_count; - if ($expected_count) { - my $operator = $t->{exactly} ? '==' : '>='; - cmp_ok(scalar @$bugs, $operator, $expected_count, - 'The right number of bugs are returned'); - unless ($t->{user} and $t->{user} eq PRIVATE_BUG_USER) { - ok(!grep($_->{alias} && $_->{alias} eq $private_bug->{alias}, @$bugs), - 'Result does not contain the private bug'); - } + my ($call, $t) = @_; + my $bugs = $call->result->{bugs}; + my $expected_count = $t->{bugs}; + $expected_count = 1 if !defined $expected_count; + if ($expected_count) { + my $operator = $t->{exactly} ? '==' : '>='; + cmp_ok(scalar @$bugs, + $operator, $expected_count, 'The right number of bugs are returned'); + unless ($t->{user} and $t->{user} eq PRIVATE_BUG_USER) { + ok(!grep($_->{alias} && $_->{alias} eq $private_bug->{alias}, @$bugs), + 'Result does not contain the private bug'); + } - my @include = @{ $t->{args}->{include_fields} || [] }; - my @exclude = @{ $t->{args}->{exclude_fields} || [] }; - if (@include or @exclude) { - my @check_fields = uniq (keys %$public_bug, @include); - foreach my $field (sort @check_fields) { - next if $field eq 'description'; - if ((@include and !grep { $_ eq $field } @include ) - or (@exclude and grep { $_ eq $field } @exclude)) - { - ok(!exists $bugs->[0]->{$field}, "$field is not included") - or diag Dumper($bugs); - } - else { - ok(exists $bugs->[0]->{$field}, "$field is included"); - } - } + my @include = @{$t->{args}->{include_fields} || []}; + my @exclude = @{$t->{args}->{exclude_fields} || []}; + if (@include or @exclude) { + my @check_fields = uniq(keys %$public_bug, @include); + foreach my $field (sort @check_fields) { + next if $field eq 'description'; + if ( (@include and !grep { $_ eq $field } @include) + or (@exclude and grep { $_ eq $field } @exclude)) + { + ok(!exists $bugs->[0]->{$field}, "$field is not included") + or diag Dumper($bugs); } - - } - else { - is(scalar @$bugs, 0, 'No bugs returned'); + else { + ok(exists $bugs->[0]->{$field}, "$field is included"); + } + } } + + } + else { + is(scalar @$bugs, 0, 'No bugs returned'); + } } foreach my $rpc (@clients) { - $rpc->bz_run_tests(tests => \@tests, - method => 'Bug.search', post_success => \&post_success); + $rpc->bz_run_tests( + tests => \@tests, + method => 'Bug.search', + post_success => \&post_success + ); } diff --git a/qa/t/webservice_bug_update.t b/qa/t/webservice_bug_update.t index 95af809e0..2d82170cb 100644 --- a/qa/t/webservice_bug_update.t +++ b/qa/t/webservice_bug_update.t @@ -23,585 +23,763 @@ use constant NONEXISTANT_BUG => 12_000_000; # We have to generate different values for each RPC client, so we # have a function to generate the tests for each client. sub get_tests { - my ($config, $rpc) = @_; - - # update doesn't support logged-out users. - my @tests = grep { $_->{user} } @{ STANDARD_BUG_TESTS() }; - - my ($public_bug, $second_bug) = $rpc->bz_create_test_bugs(); - my ($public_id, $second_id) = ($public_bug->{id}, $second_bug->{id}); - - my $comment_call = $rpc->bz_call_success( - 'Bug.comments', { ids => [$public_id, $second_id] }); - $public_bug->{comment} = - $comment_call->result->{bugs}->{$public_id}->{comments}->[0]; - $second_bug->{comment} = - $comment_call->result->{bugs}->{$second_id}->{comments}->[0]; - - push(@tests, ( - { args => { ids => [$public_id] }, - error => 'You must log in', - test => 'Logged-out users cannot call update' }, - - # FIXME: We need a permissions test for canedit, but it's so uncommonly - # used that it's not a high priority. - )); - - my %valid = valid_values($config, $public_bug, $second_bug); - my $valid_value_tests = valid_values_to_tests(\%valid, $public_bug); - push(@tests, @$valid_value_tests); - - my %invalid = invalid_values($public_bug, $second_bug); - my $invalid_value_tests = invalid_values_to_tests(\%invalid, $public_bug); - push(@tests, @$invalid_value_tests); - - return \@tests; + my ($config, $rpc) = @_; + + # update doesn't support logged-out users. + my @tests = grep { $_->{user} } @{STANDARD_BUG_TESTS()}; + + my ($public_bug, $second_bug) = $rpc->bz_create_test_bugs(); + my ($public_id, $second_id) = ($public_bug->{id}, $second_bug->{id}); + + my $comment_call + = $rpc->bz_call_success('Bug.comments', {ids => [$public_id, $second_id]}); + $public_bug->{comment} + = $comment_call->result->{bugs}->{$public_id}->{comments}->[0]; + $second_bug->{comment} + = $comment_call->result->{bugs}->{$second_id}->{comments}->[0]; + + push( + @tests, + ( + { + args => {ids => [$public_id]}, + error => 'You must log in', + test => 'Logged-out users cannot call update' + }, + + # FIXME: We need a permissions test for canedit, but it's so uncommonly + # used that it's not a high priority. + ) + ); + + my %valid = valid_values($config, $public_bug, $second_bug); + my $valid_value_tests = valid_values_to_tests(\%valid, $public_bug); + push(@tests, @$valid_value_tests); + + my %invalid = invalid_values($public_bug, $second_bug); + my $invalid_value_tests = invalid_values_to_tests(\%invalid, $public_bug); + push(@tests, @$invalid_value_tests); + + return \@tests; } sub valid_values { - my ($config, $public_bug, $second_bug) = @_; - - my $admin = $config->{'admin_user_login'}; - my $second_id = $second_bug->{id}; - my $comment_id = $public_bug->{comment}->{id}; - my $bug_uri = $config->{browser_url} . '/' - . $config->{bugzilla_installation} . '/show_bug.cgi?id='; - - my %values = ( - alias => [ - { value => random_string(20) }, - ], - assigned_to => [ - { value => $config->{'unprivileged_user_login'} } - ], - blocks => [ - { value => { set => [$second_id] }, - added => $second_id, - test => 'set to second bug' }, - { value => { remove => [$second_id] }, - added => '', removed => $second_id, - test => 'remove second bug' }, - { value => { add => [$second_id] }, - added => $second_id, removed => '', - test => 'add second bug' }, - { value => { set => [] }, - added => '', removed => $second_id, - test => 'set to nothing' }, - ], - - cc => [ - { value => { add => [$admin] }, - added => $admin, removed => '', - test => 'add admin' }, - { value => { remove => [$admin] }, - added => '', removed => $admin, - test => 'remove admin' }, - { value => { remove => [$admin] }, - test => "removing user who isn't on the list works", - no_changes => 1 }, - ], - - is_cc_accessible => [ - { value => 0, test => 'set to 0' }, - { value => 1, test => 'set to 1' }, - ], - - comment => [ - { value => { body => random_string(100) }, test => 'public' }, - { value => { body => random_string(100), is_private => 1 }, - user => PRIVATE_BUG_USER, test => 'private' }, - ], - - comment_is_private => [ - { value => { $comment_id => 1 }, - user => PRIVATE_BUG_USER, test => 'make description private' }, - { value => { $comment_id => 0 }, - user => PRIVATE_BUG_USER, test => 'make description public' }, - ], - - component => [ - { value => 'c2' } - ], - - deadline => [ - { value => '2037-01-01' }, - { value => '', removed => '2037-01-01', test => 'remove' }, - ], - - dupe_of => [ - { value => $second_id }, - ], - - estimated_time => [ - { value => '10.0' }, - { value => '0.0', removed => '10.0', test => 'set to zero' }, - ], - - groups => [ - { value => { add => ['Master'] }, - user => 'admin', added => 'Master', test => 'add Master' }, - { value => { remove => ['Master'] }, - user => 'admin', added => '', removed => 'Master', - test => 'remove Master' }, - ], - - keywords => [ - { value => { add => ['test-keyword-1'] }, - test => 'add one', added => 'test-keyword-1' }, - { value => { set => ['test-keyword-1', 'test-keyword-2'] }, - test => 'set two', added => 'test-keyword-2' }, - { value => { remove => ['test-keyword-1'] }, - removed => 'test-keyword-1', added => '', - test => 'remove one' }, - { value => { set => [] }, - removed => 'test-keyword-2', added => '', - test => 'set to empty' }, - { value => { remove => ['test-keyword-2'] }, - test => 'removing removed keyword does nothing', - no_changes => 1 }, - ], - - op_sys => [ - { value => 'All' }, - ], - - platform => [ - { value => 'All' }, - ], - - priority => [ - { value => 'Normal' }, - ], - - product => [ - { value => 'C2 Forever', - extra => { - component => 'Helium', version => 'unspecified', - target_milestone => '---', - }, - test => 'move to C2 Forever' - }, - # This also tests that the extra fields transfer over properly - # when they have identical names in both products. - { value => $public_bug->{product}, - extra => { component => $public_bug->{component} }, - test => 'move back to original product' }, - ], - - qa_contact => [ - { value => $admin }, - { value => '', test => 'set blank', removed => $admin }, - # Reset to the original so that reset_qa_contact can also be tested. - { value => $public_bug->{qa_contact} }, - ], - - remaining_time => [ - { value => '1000.50' }, - { value => 0 }, - ], - - reset_assigned_to => [ - { value => 1, field => 'assigned_to', - added => $config->{permanent_user} }, - ], - - reset_qa_contact => [ - { value => 1, field => 'qa_contact', added => '' }, - ], - - resolution => [ - { value => 'FIXED', extra => { status => 'RESOLVED' }, - test => 'to RESOLVED FIXED' }, - { value => 'INVALID', test => 'just resolution' }, - ], - - see_also => [ - { value => { add => [$bug_uri . $second_id] }, - added => $bug_uri . $second_id, removed => '', - test => 'add local bug URI' }, - { value => { remove => [$bug_uri . $second_id] }, - removed => $bug_uri . $second_id, added => '', - test => 'remove local bug URI' }, - { value => { remove => ['https://bugzilla-dev.allizom.org/show_bug.cgi?id=1'] }, - no_changes => 1, - test => 'removing non-existent URI works' }, - { value => { add => [''] }, - no_changes => 1, - test => 'adding an empty string to see_also does nothing' }, - { value => { add => [undef] }, - no_changes => 1, - test => 'adding a null to see_also does nothing' }, - ], - - status => [ - # At this point, due to previous tests, the status is RESOLVED, - # so changing to CONFIRMED is our only real option if we want to - # test a simple open status. - { value => 'CONFIRMED' }, - ], - - severity => [ - { value => 'critical' }, - ], - - summary => [ - { value => random_string(100) }, - ], - - target_milestone => [ - { value => 'AnotherMS2' }, - ], - - url => [ - { value => 'http://' . random_string(20) . '/' }, - ], - - version => [ - { value => 'Another2' }, - ], - - whiteboard => [ - { value => random_string(1000) }, - ], - - work_time => [ - # FIXME: work_time really needs to start showing up in the changes hash. - { value => '1.2', no_changes => 1 }, - { value => '-1.2', test => 'negative value', no_changes => 1 }, - ], - ); - - $values{depends_on} = $values{blocks}; - $values{is_creator_accessible} = $values{is_cc_accessible}; - - return %values; -}; + my ($config, $public_bug, $second_bug) = @_; + + my $admin = $config->{'admin_user_login'}; + my $second_id = $second_bug->{id}; + my $comment_id = $public_bug->{comment}->{id}; + my $bug_uri + = $config->{browser_url} . '/' + . $config->{bugzilla_installation} + . '/show_bug.cgi?id='; + + my %values = ( + alias => [{value => random_string(20)},], + assigned_to => [{value => $config->{'unprivileged_user_login'}}], + blocks => [ + { + value => {set => [$second_id]}, + added => $second_id, + test => 'set to second bug' + }, + { + value => {remove => [$second_id]}, + added => '', + removed => $second_id, + test => 'remove second bug' + }, + { + value => {add => [$second_id]}, + added => $second_id, + removed => '', + test => 'add second bug' + }, + { + value => {set => []}, + added => '', + removed => $second_id, + test => 'set to nothing' + }, + ], + + cc => [ + { + value => {add => [$admin]}, + added => $admin, + removed => '', + test => 'add admin' + }, + { + value => {remove => [$admin]}, + added => '', + removed => $admin, + test => 'remove admin' + }, + { + value => {remove => [$admin]}, + test => "removing user who isn't on the list works", + no_changes => 1 + }, + ], + + is_cc_accessible => + [{value => 0, test => 'set to 0'}, {value => 1, test => 'set to 1'},], + + comment => [ + {value => {body => random_string(100)}, test => 'public'}, + { + value => {body => random_string(100), is_private => 1}, + user => PRIVATE_BUG_USER, + test => 'private' + }, + ], + + comment_is_private => [ + { + value => {$comment_id => 1}, + user => PRIVATE_BUG_USER, + test => 'make description private' + }, + { + value => {$comment_id => 0}, + user => PRIVATE_BUG_USER, + test => 'make description public' + }, + ], + + component => [{value => 'c2'}], + + deadline => [ + {value => '2037-01-01'}, + {value => '', removed => '2037-01-01', test => 'remove'}, + ], + + dupe_of => [{value => $second_id},], + + estimated_time => [ + {value => '10.0'}, + {value => '0.0', removed => '10.0', test => 'set to zero'}, + ], + + groups => [ + { + value => {add => ['Master']}, + user => 'admin', + added => 'Master', + test => 'add Master' + }, + { + value => {remove => ['Master']}, + user => 'admin', + added => '', + removed => 'Master', + test => 'remove Master' + }, + ], + + keywords => [ + { + value => {add => ['test-keyword-1']}, + test => 'add one', + added => 'test-keyword-1' + }, + { + value => {set => ['test-keyword-1', 'test-keyword-2']}, + test => 'set two', + added => 'test-keyword-2' + }, + { + value => {remove => ['test-keyword-1']}, + removed => 'test-keyword-1', + added => '', + test => 'remove one' + }, + { + value => {set => []}, + removed => 'test-keyword-2', + added => '', + test => 'set to empty' + }, + { + value => {remove => ['test-keyword-2']}, + test => 'removing removed keyword does nothing', + no_changes => 1 + }, + ], + + op_sys => [{value => 'All'},], + + platform => [{value => 'All'},], + + priority => [{value => 'Normal'},], + + product => [ + { + value => 'C2 Forever', + extra => + {component => 'Helium', version => 'unspecified', target_milestone => '---',}, + test => 'move to C2 Forever' + }, + + # This also tests that the extra fields transfer over properly + # when they have identical names in both products. + { + value => $public_bug->{product}, + extra => {component => $public_bug->{component}}, + test => 'move back to original product' + }, + ], + + qa_contact => [ + {value => $admin}, {value => '', test => 'set blank', removed => $admin}, + + # Reset to the original so that reset_qa_contact can also be tested. + {value => $public_bug->{qa_contact}}, + ], + + remaining_time => [{value => '1000.50'}, {value => 0},], + + reset_assigned_to => + [{value => 1, field => 'assigned_to', added => $config->{permanent_user}},], + + reset_qa_contact => [{value => 1, field => 'qa_contact', added => ''},], + + resolution => [ + { + value => 'FIXED', + extra => {status => 'RESOLVED'}, + test => 'to RESOLVED FIXED' + }, + {value => 'INVALID', test => 'just resolution'}, + ], + + see_also => [ + { + value => {add => [$bug_uri . $second_id]}, + added => $bug_uri . $second_id, + removed => '', + test => 'add local bug URI' + }, + { + value => {remove => [$bug_uri . $second_id]}, + removed => $bug_uri . $second_id, + added => '', + test => 'remove local bug URI' + }, + { + value => {remove => ['https://bugzilla-dev.allizom.org/show_bug.cgi?id=1']}, + no_changes => 1, + test => 'removing non-existent URI works' + }, + { + value => {add => ['']}, + no_changes => 1, + test => 'adding an empty string to see_also does nothing' + }, + { + value => {add => [undef]}, + no_changes => 1, + test => 'adding a null to see_also does nothing' + }, + ], + + status => [ + + # At this point, due to previous tests, the status is RESOLVED, + # so changing to CONFIRMED is our only real option if we want to + # test a simple open status. + {value => 'CONFIRMED'}, + ], + + severity => [{value => 'critical'},], + + summary => [{value => random_string(100)},], + + target_milestone => [{value => 'AnotherMS2'},], + + url => [{value => 'http://' . random_string(20) . '/'},], + + version => [{value => 'Another2'},], + + whiteboard => [{value => random_string(1000)},], + + work_time => [ + + # FIXME: work_time really needs to start showing up in the changes hash. + {value => '1.2', no_changes => 1}, + {value => '-1.2', test => 'negative value', no_changes => 1}, + ], + ); + + $values{depends_on} = $values{blocks}; + $values{is_creator_accessible} = $values{is_cc_accessible}; + + return %values; +} sub valid_values_to_tests { - my ($valid_values, $public_bug) = @_; - - my @tests; - foreach my $field (sort keys %$valid_values) { - my @tests_valid = @{ $valid_values->{$field} }; - foreach my $item (@tests_valid) { - my $desc = $item->{test} || 'valid value'; - my %args = ( - ids => [$public_bug->{id}], - $field => $item->{value}, - %{ $item->{extra} || {} }, - ); - my %test = ( user => 'editbugs', args => \%args, field => $field, - test => "$field: $desc" ); - foreach my $item_field (qw(no_changes added removed field user)) { - next if !exists $item->{$item_field}; - $test{$item_field} = $item->{$item_field}; - } - push(@tests, \%test); - } + my ($valid_values, $public_bug) = @_; + + my @tests; + foreach my $field (sort keys %$valid_values) { + my @tests_valid = @{$valid_values->{$field}}; + foreach my $item (@tests_valid) { + my $desc = $item->{test} || 'valid value'; + my %args = ( + ids => [$public_bug->{id}], + $field => $item->{value}, + %{$item->{extra} || {}}, + ); + my %test = ( + user => 'editbugs', + args => \%args, + field => $field, + test => "$field: $desc" + ); + foreach my $item_field (qw(no_changes added removed field user)) { + next if !exists $item->{$item_field}; + $test{$item_field} = $item->{$item_field}; + } + push(@tests, \%test); } + } - return \@tests; + return \@tests; } sub invalid_values { - my ($public_bug, $second_bug) = @_; - - my $public_id = $public_bug->{id}; - my $second_id = $second_bug->{id}; - - my $comment_id = $public_bug->{comment}->{id}; - my $second_comment_id = $second_bug->{comment}->{id}; - - my %values = ( - alias => [ - { value => random_string(41), - error => 'aliases cannot be longer than', - test => 'alias cannot be too long' }, - { value => $second_bug->{alias}, - error => 'has already taken the alias', - test => 'duplicate alias fails' }, - { value => 123456, - error => 'at least one letter', - test => 'numeric alias fails' }, - { value => random_string(20), ids => [$public_id, $second_id], - error => 'aliases when modifying multiple', - test => 'setting alias on multiple bugs fails' }, - ], - - assigned_to => [ - { value => random_string(20), - error => 'There is no user named', - test => 'changing assigned_to to invalid user fails' }, - # FIXME: Also check strict_isolation at some point in the future, perhaps. - ], - - blocks => [ - { value => { add => [NONEXISTANT_BUG] }, - error => 'does not exist', - test => 'Non-existent bug number fails in deps' }, - { value => { add => [$public_id] }, - error => 'block itself or depend on itself', - test => "can't add this bug itself in a dep field" }, - # FIXME: Could use strict_isolation checks at some point. - # FIXME: Could use a dependency_loop_multi test. - ], - - cc => [ - { value => { add => [random_string(20)] }, - error => 'There is no user named', - test => 'adding invalid user to cc fails' }, - { value => { remove => [random_string(20)] }, - error => 'There is no user named', - test => 'removing invalid user from cc fails' }, - ], - - comment => [ - { value => { body => random_string(100_000) }, - error => 'cannot be longer', - test => 'comment too long' }, - { value => { body => random_string(100), is_private => 1 }, - error => 'comments or attachments as private', - test => 'normal user cannot add private comments' }, - ], - - comment_is_private => [ - { value => { $comment_id => 1 }, - error => 'comments or attachments as private', - test => 'normal user cannot make a comment private' }, - { value => { $second_comment_id => 1 }, - error => 'You tried to modify the privacy of comment', - user => PRIVATE_BUG_USER, - test => 'cannot change privacy on a comment on another bug' }, - ], - - component => [ - { value => '', - error => 'you must first choose a component', - test => 'empty component fails' }, - { value => random_string(20), - error => 'There is no component named', - test => 'invalid component fails' }, - ], - - deadline => [ - { value => random_string(20), - error => 'is not a legal date', - test => 'Non-date fails in deadline' }, - { value => '2037', - error => 'is not a legal date', - test => 'year alone fails in deadline' }, - ], - - dupe_of => [ - { value => undef, - error => 'dup_id was not defined', - test => 'undefined dupe_of fails' }, - { value => NONEXISTANT_BUG, - error => 'does not exist', - test => 'Cannot dup to a nonexistant bug' }, - { value => $public_id, - error => 'as a duplicate of itself', - test => 'Cannot dup bug to itself' }, - ], - - estimated_time => [ - { value => -1, - error => 'less than the minimum allowable value', - test => 'negative estimated_time fails' }, - { value => 100_000_000, - error => 'more than the maximum allowable value', - test => 'too-large estimated_time fails' }, - { value => random_string(20), - error => 'is not a numeric value', - test => 'non-numeric estimated_time fails' }, - # We use PRIVATE_BUG_USER because he can modify the bug, but - # can't change time-tracking fields. - { value => '100', user => PRIVATE_BUG_USER, - error => 'only a user with the required permissions', - test => 'non-timetracker can not set estimated_time' }, - ], - - groups => [ - { value => { add => ['Master'] }, - error => 'either this group does not exist, or you are not allowed to restrict bugs to this group', - test => "adding group we don't have access to but is valid fails" }, - { value => { add => ['QA-Selenium-TEST'] }, - error => 'either this group does not exist, or you are not allowed to restrict bugs to this group', - test => 'adding valid group that is not in this product fails' }, - { value => { add => [random_string(20)] }, - error => 'either this group does not exist, or you are not allowed to restrict bugs to this group', - test => 'adding non-existent group fails' }, - { value => { remove => [random_string(20)] }, - error => 'either this group does not exist, or you are not allowed to remove bugs from this group', - test => 'removing non-existent group fails' }, - ], - - keywords => [ - { value => { add => [random_string(20)] }, - error => 'The legal keyword names are listed here', - test => 'adding invalid keyword fails' }, - { value => { remove => [random_string(20)] }, - error => 'The legal keyword names are listed here', - test => 'removing invalid keyword fails' }, - { value => { set => [random_string(20)] }, - error => 'The legal keyword names are listed here', - test => 'setting invalid keyword fails' }, - ], - - op_sys => [ - { value => random_string(20), - error => 'There is no', - test => 'invalid op_sys fails' }, - { value => '', - error => 'You must select/enter', - test => 'blank op_sys fails' }, - ], - - product => [ - { value => random_string(60), - error => "does not exist or you aren't authorized", - test => 'invalid product fails' }, - { value => '', - error => 'You must select/enter a product', - test => 'moving to blank product fails' }, - { value => 'TestProduct', - error => 'There is no component named', - test => 'moving products without other fields fails' }, - { value => 'QA-Selenium-TEST', - extra => { component => 'QA-Selenium-TEST' }, - error => "does not exist or you aren't authorized", - test => 'moving to inaccessible product fails' }, - { value => 'QA Entry Only', - error => "does not exist or you aren't authorized", - test => 'moving to product where ENTRY is denied fails' }, - ], - - qa_contact => [ - { value => random_string(20), - error => 'There is no user named', - test => 'changing qa_contact to invalid user fails' }, - ], - - remaining_time => [ - { value => -1, - error => 'less than the minimum allowable value', - test => 'negative remaining_time fails' }, - { value => 100_000_000, - error => 'more than the maximum allowable value', - test => 'too-large remaining_time fails' }, - { value => random_string(20), - error => 'is not a numeric value', - test => 'non-numeric remaining_time fails' }, - # We use PRIVATE_BUG_USER because he can modify the bug, but - # can't change time-tracking fields. - { value => '100', user => PRIVATE_BUG_USER, - error => 'only a user with the required permissions', - test => 'non-timetracker can not set remaining_time' }, - ], - - # We do all the failing resolution tests on the second bug, - # because we want to be sure that we're starting from an open - # status. - resolution => [ - { value => random_string(20), ids => [$second_id], - extra => { status => 'RESOLVED' }, - error => 'There is no Resolution named', - test => 'invalid resolution fails' }, - { value => 'FIXED', ids => [$second_id], - error => 'You cannot set a resolution for open bugs', - test => 'setting resolution on open bug fails' }, - { value => 'DUPLICATE', ids => [$second_id], - extra => { status => 'RESOLVED' }, - error => 'id to mark this bug as a duplicate', - test => 'setting DUPLICATE without dup_id fails' }, - { value => '', ids => [$second_id], - extra => { status => 'RESOLVED' }, - error => 'A valid resolution is required', - test => 'blank resolution fails with closed status' }, - ], - - see_also => [ - { value => { add => [random_string(20)] }, - error => 'It does not seem like bug number nor an alias to a bug.', - test => 'random string fails in see_also' }, - { value => { add => ['https://bugzilla-dev.allizom.org/'] }, - error => 'See Also URLs should point to one of', - test => 'no show_bug.cgi in see_also URI' }, - ], - - status => [ - { value => random_string(20), - error => 'There is no status named', - test => 'invalid status fails' }, - { value => '', - error => 'You must select/enter a status', - test => 'blank status fails' }, - # We use the second bug for this because we can guarantee that - # it is open. - { value => 'VERIFIED', ids => [$second_id], - extra => { resolution => 'FIXED' }, - error => 'You are not allowed to change the bug status from', - test => 'invalid transition fails' }, - ], - - summary => [ - { value => random_string(300), - error => 'The text you entered in the Summary field is too long', - test => 'too-long summary fails' }, - { value => '', - error => 'You must enter a summary for this bug', - test => 'blank summary fails' }, - ], - - work_time => [ - { value => 100_000_000, - error => 'more than the maximum allowable value', - test => 'too-large work_time fails' }, - { value => random_string(20), - error => 'is not a numeric value', - test => 'non-numeric work_time fails' }, - # We use PRIVATE_BUG_USER because he can modify the bug, but - # can't change time-tracking fields. - { value => '10', user => PRIVATE_BUG_USER, - error => 'only a user with the required permissions', - test => 'non-timetracker can not set work_time' }, - ], - ); - - $values{depends_on} = $values{blocks}; - - foreach my $field (qw(platform priority severity target_milestone version)) - { - my $tests = dclone($values{op_sys}); - foreach my $test (@$tests) { - $test->{test} =~ s/op_sys/$field/g; - } - $values{$field} = $tests; + my ($public_bug, $second_bug) = @_; + + my $public_id = $public_bug->{id}; + my $second_id = $second_bug->{id}; + + my $comment_id = $public_bug->{comment}->{id}; + my $second_comment_id = $second_bug->{comment}->{id}; + + my %values = ( + alias => [ + { + value => random_string(41), + error => 'aliases cannot be longer than', + test => 'alias cannot be too long' + }, + { + value => $second_bug->{alias}, + error => 'has already taken the alias', + test => 'duplicate alias fails' + }, + { + value => 123456, + error => 'at least one letter', + test => 'numeric alias fails' + }, + { + value => random_string(20), + ids => [$public_id, $second_id], + error => 'aliases when modifying multiple', + test => 'setting alias on multiple bugs fails' + }, + ], + + assigned_to => [ + { + value => random_string(20), + error => 'There is no user named', + test => 'changing assigned_to to invalid user fails' + }, + + # FIXME: Also check strict_isolation at some point in the future, perhaps. + ], + + blocks => [ + { + value => {add => [NONEXISTANT_BUG]}, + error => 'does not exist', + test => 'Non-existent bug number fails in deps' + }, + { + value => {add => [$public_id]}, + error => 'block itself or depend on itself', + test => "can't add this bug itself in a dep field" + }, + + # FIXME: Could use strict_isolation checks at some point. + # FIXME: Could use a dependency_loop_multi test. + ], + + cc => [ + { + value => {add => [random_string(20)]}, + error => 'There is no user named', + test => 'adding invalid user to cc fails' + }, + { + value => {remove => [random_string(20)]}, + error => 'There is no user named', + test => 'removing invalid user from cc fails' + }, + ], + + comment => [ + { + value => {body => random_string(100_000)}, + error => 'cannot be longer', + test => 'comment too long' + }, + { + value => {body => random_string(100), is_private => 1}, + error => 'comments or attachments as private', + test => 'normal user cannot add private comments' + }, + ], + + comment_is_private => [ + { + value => {$comment_id => 1}, + error => 'comments or attachments as private', + test => 'normal user cannot make a comment private' + }, + { + value => {$second_comment_id => 1}, + error => 'You tried to modify the privacy of comment', + user => PRIVATE_BUG_USER, + test => 'cannot change privacy on a comment on another bug' + }, + ], + + component => [ + { + value => '', + error => 'you must first choose a component', + test => 'empty component fails' + }, + { + value => random_string(20), + error => 'There is no component named', + test => 'invalid component fails' + }, + ], + + deadline => [ + { + value => random_string(20), + error => 'is not a legal date', + test => 'Non-date fails in deadline' + }, + { + value => '2037', + error => 'is not a legal date', + test => 'year alone fails in deadline' + }, + ], + + dupe_of => [ + { + value => undef, + error => 'dup_id was not defined', + test => 'undefined dupe_of fails' + }, + { + value => NONEXISTANT_BUG, + error => 'does not exist', + test => 'Cannot dup to a nonexistant bug' + }, + { + value => $public_id, + error => 'as a duplicate of itself', + test => 'Cannot dup bug to itself' + }, + ], + + estimated_time => [ + { + value => -1, + error => 'less than the minimum allowable value', + test => 'negative estimated_time fails' + }, + { + value => 100_000_000, + error => 'more than the maximum allowable value', + test => 'too-large estimated_time fails' + }, + { + value => random_string(20), + error => 'is not a numeric value', + test => 'non-numeric estimated_time fails' + }, + + # We use PRIVATE_BUG_USER because he can modify the bug, but + # can't change time-tracking fields. + { + value => '100', + user => PRIVATE_BUG_USER, + error => 'only a user with the required permissions', + test => 'non-timetracker can not set estimated_time' + }, + ], + + groups => [ + { + value => {add => ['Master']}, + error => + 'either this group does not exist, or you are not allowed to restrict bugs to this group', + test => "adding group we don't have access to but is valid fails" + }, + { + value => {add => ['QA-Selenium-TEST']}, + error => + 'either this group does not exist, or you are not allowed to restrict bugs to this group', + test => 'adding valid group that is not in this product fails' + }, + { + value => {add => [random_string(20)]}, + error => + 'either this group does not exist, or you are not allowed to restrict bugs to this group', + test => 'adding non-existent group fails' + }, + { + value => {remove => [random_string(20)]}, + error => + 'either this group does not exist, or you are not allowed to remove bugs from this group', + test => 'removing non-existent group fails' + }, + ], + + keywords => [ + { + value => {add => [random_string(20)]}, + error => 'The legal keyword names are listed here', + test => 'adding invalid keyword fails' + }, + { + value => {remove => [random_string(20)]}, + error => 'The legal keyword names are listed here', + test => 'removing invalid keyword fails' + }, + { + value => {set => [random_string(20)]}, + error => 'The legal keyword names are listed here', + test => 'setting invalid keyword fails' + }, + ], + + op_sys => [ + { + value => random_string(20), + error => 'There is no', + test => 'invalid op_sys fails' + }, + {value => '', error => 'You must select/enter', test => 'blank op_sys fails'}, + ], + + product => [ + { + value => random_string(60), + error => "does not exist or you aren't authorized", + test => 'invalid product fails' + }, + { + value => '', + error => 'You must select/enter a product', + test => 'moving to blank product fails' + }, + { + value => 'TestProduct', + error => 'There is no component named', + test => 'moving products without other fields fails' + }, + { + value => 'QA-Selenium-TEST', + extra => {component => 'QA-Selenium-TEST'}, + error => "does not exist or you aren't authorized", + test => 'moving to inaccessible product fails' + }, + { + value => 'QA Entry Only', + error => "does not exist or you aren't authorized", + test => 'moving to product where ENTRY is denied fails' + }, + ], + + qa_contact => [ + { + value => random_string(20), + error => 'There is no user named', + test => 'changing qa_contact to invalid user fails' + }, + ], + + remaining_time => [ + { + value => -1, + error => 'less than the minimum allowable value', + test => 'negative remaining_time fails' + }, + { + value => 100_000_000, + error => 'more than the maximum allowable value', + test => 'too-large remaining_time fails' + }, + { + value => random_string(20), + error => 'is not a numeric value', + test => 'non-numeric remaining_time fails' + }, + + # We use PRIVATE_BUG_USER because he can modify the bug, but + # can't change time-tracking fields. + { + value => '100', + user => PRIVATE_BUG_USER, + error => 'only a user with the required permissions', + test => 'non-timetracker can not set remaining_time' + }, + ], + + # We do all the failing resolution tests on the second bug, + # because we want to be sure that we're starting from an open + # status. + resolution => [ + { + value => random_string(20), + ids => [$second_id], + extra => {status => 'RESOLVED'}, + error => 'There is no Resolution named', + test => 'invalid resolution fails' + }, + { + value => 'FIXED', + ids => [$second_id], + error => 'You cannot set a resolution for open bugs', + test => 'setting resolution on open bug fails' + }, + { + value => 'DUPLICATE', + ids => [$second_id], + extra => {status => 'RESOLVED'}, + error => 'id to mark this bug as a duplicate', + test => 'setting DUPLICATE without dup_id fails' + }, + { + value => '', + ids => [$second_id], + extra => {status => 'RESOLVED'}, + error => 'A valid resolution is required', + test => 'blank resolution fails with closed status' + }, + ], + + see_also => [ + { + value => {add => [random_string(20)]}, + error => 'It does not seem like bug number nor an alias to a bug.', + test => 'random string fails in see_also' + }, + { + value => {add => ['https://bugzilla-dev.allizom.org/']}, + error => 'See Also URLs should point to one of', + test => 'no show_bug.cgi in see_also URI' + }, + ], + + status => [ + { + value => random_string(20), + error => 'There is no status named', + test => 'invalid status fails' + }, + { + value => '', + error => 'You must select/enter a status', + test => 'blank status fails' + }, + + # We use the second bug for this because we can guarantee that + # it is open. + { + value => 'VERIFIED', + ids => [$second_id], + extra => {resolution => 'FIXED'}, + error => 'You are not allowed to change the bug status from', + test => 'invalid transition fails' + }, + ], + + summary => [ + { + value => random_string(300), + error => 'The text you entered in the Summary field is too long', + test => 'too-long summary fails' + }, + { + value => '', + error => 'You must enter a summary for this bug', + test => 'blank summary fails' + }, + ], + + work_time => [ + { + value => 100_000_000, + error => 'more than the maximum allowable value', + test => 'too-large work_time fails' + }, + { + value => random_string(20), + error => 'is not a numeric value', + test => 'non-numeric work_time fails' + }, + + # We use PRIVATE_BUG_USER because he can modify the bug, but + # can't change time-tracking fields. + { + value => '10', + user => PRIVATE_BUG_USER, + error => 'only a user with the required permissions', + test => 'non-timetracker can not set work_time' + }, + ], + ); + + $values{depends_on} = $values{blocks}; + + foreach my $field (qw(platform priority severity target_milestone version)) { + my $tests = dclone($values{op_sys}); + foreach my $test (@$tests) { + $test->{test} =~ s/op_sys/$field/g; } + $values{$field} = $tests; + } - return %values; + return %values; } sub invalid_values_to_tests { - my ($invalid_values, $public_bug) = @_; - - my @tests; - foreach my $field (sort keys %$invalid_values) { - my @tests_invalid = @{ $invalid_values->{$field} }; - foreach my $item (@tests_invalid) { - my %args = ( - ids => $item->{ids} || [$public_bug->{id}], - $field => $item->{value}, - %{ $item->{extra} || {} }, - ); - push(@tests, { user => $item->{user} || 'editbugs', - args => \%args, - error => $item->{error}, - test => $item->{test} }); + my ($invalid_values, $public_bug) = @_; + + my @tests; + foreach my $field (sort keys %$invalid_values) { + my @tests_invalid = @{$invalid_values->{$field}}; + foreach my $item (@tests_invalid) { + my %args = ( + ids => $item->{ids} || [$public_bug->{id}], + $field => $item->{value}, + %{$item->{extra} || {}}, + ); + push( + @tests, + { + user => $item->{user} || 'editbugs', + args => \%args, + error => $item->{error}, + test => $item->{test} } + ); } + } - return \@tests; + return \@tests; } ############### @@ -610,74 +788,78 @@ sub invalid_values_to_tests { my ($config, $xmlrpc, $jsonrpc, $jsonrpc_get) = get_rpc_clients(); -$jsonrpc_get->bz_call_fail('Bug.update', - { ids => ['public_bug'] }, - 'must use HTTP POST', 'update fails over GET'); +$jsonrpc_get->bz_call_fail( + 'Bug.update', + {ids => ['public_bug']}, + 'must use HTTP POST', + 'update fails over GET' +); sub post_success { - my ($call, $t, $rpc) = @_; - return if $t->{no_changes}; - my $field = $t->{field}; - return if !$field; - - my @bugs = @{ $call->result->{bugs} }; - foreach my $bug (@bugs) { - if ($field =~ /^comment/) { - _check_comment($bug, $field, $t, $rpc); - } - else { - _check_changes($bug, $field, $t); - } + my ($call, $t, $rpc) = @_; + return if $t->{no_changes}; + my $field = $t->{field}; + return if !$field; + + my @bugs = @{$call->result->{bugs}}; + foreach my $bug (@bugs) { + if ($field =~ /^comment/) { + _check_comment($bug, $field, $t, $rpc); + } + else { + _check_changes($bug, $field, $t); } + } } sub _check_changes { - my ($bug, $field, $t) = @_; + my ($bug, $field, $t) = @_; - my $changes = $bug->{changes}->{$field}; - ok(defined $changes, "$field was changed") - or diag Dumper($bug, $t); + my $changes = $bug->{changes}->{$field}; + ok(defined $changes, "$field was changed") or diag Dumper($bug, $t); - my $new_value = $t->{added}; - $new_value = $t->{args}->{$field} if !defined $new_value; - _test_value($changes->{added}, $new_value, $field, 'added'); + my $new_value = $t->{added}; + $new_value = $t->{args}->{$field} if !defined $new_value; + _test_value($changes->{added}, $new_value, $field, 'added'); - if (defined $t->{removed}) { - _test_value($changes->{removed}, $t->{removed}, $field, 'removed'); - } + if (defined $t->{removed}) { + _test_value($changes->{removed}, $t->{removed}, $field, 'removed'); + } } sub _test_value { - my ($got, $expected, $field, $type) = @_; - if ($field eq 'estimated_time' or $field eq 'remaining_time') { - cmp_ok($got, '==', $expected, "$field: $type is correct"); - } - else { - is($got, $expected, "$field: $type is correct"); - } + my ($got, $expected, $field, $type) = @_; + if ($field eq 'estimated_time' or $field eq 'remaining_time') { + cmp_ok($got, '==', $expected, "$field: $type is correct"); + } + else { + is($got, $expected, "$field: $type is correct"); + } } sub _check_comment { - my ($bug, $field, $t, $rpc) = @_; - my $bug_id = $bug->{id}; - my $call = $rpc->bz_call_success('Bug.comments', { ids => [$bug_id] }); - my $comments = $call->result->{bugs}->{$bug_id}->{comments}; - - if ($field eq 'comment_is_private') { - my $first_private = $comments->[0]->{is_private}; - my ($expected) = values %{ $t->{args}->{comment_is_private} }; - cmp_ok($first_private, '==', $expected, - 'description privacy is correct'); - } - else { - my $last_comment = $comments->[-1]; - my $expected = $t->{args}->{comment}->{body}; - is($last_comment->{text}, $expected, 'comment added correctly'); - } + my ($bug, $field, $t, $rpc) = @_; + my $bug_id = $bug->{id}; + my $call = $rpc->bz_call_success('Bug.comments', {ids => [$bug_id]}); + my $comments = $call->result->{bugs}->{$bug_id}->{comments}; + + if ($field eq 'comment_is_private') { + my $first_private = $comments->[0]->{is_private}; + my ($expected) = values %{$t->{args}->{comment_is_private}}; + cmp_ok($first_private, '==', $expected, 'description privacy is correct'); + } + else { + my $last_comment = $comments->[-1]; + my $expected = $t->{args}->{comment}->{body}; + is($last_comment->{text}, $expected, 'comment added correctly'); + } } foreach my $rpc ($jsonrpc, $xmlrpc) { - $rpc->bz_run_tests(tests => get_tests($config, $rpc), - method => 'Bug.update', post_success => \&post_success); + $rpc->bz_run_tests( + tests => get_tests($config, $rpc), + method => 'Bug.update', + post_success => \&post_success + ); } diff --git a/qa/t/webservice_bug_update_see_also.t b/qa/t/webservice_bug_update_see_also.t index 0af0e78d5..9fd1613e8 100644 --- a/qa/t/webservice_bug_update_see_also.t +++ b/qa/t/webservice_bug_update_see_also.t @@ -20,63 +20,80 @@ my ($config, $xmlrpc, $jsonrpc, $jsonrpc_get) = get_rpc_clients(); my $bug_url = 'https://bugzilla-dev.allizom.org/show_bug.cgi?id=100'; # update_see_also doesn't support logged-out users. -my @tests = grep { $_->{user} } @{ STANDARD_BUG_TESTS() }; +my @tests = grep { $_->{user} } @{STANDARD_BUG_TESTS()}; foreach my $t (@tests) { - $t->{args}->{add} = $t->{args}->{remove} = []; + $t->{args}->{add} = $t->{args}->{remove} = []; } -push(@tests, ( - { user => 'unprivileged', - args => { ids => ['public_bug'], add => [$bug_url] }, +push( + @tests, + ( + { + user => 'unprivileged', + args => {ids => ['public_bug'], add => [$bug_url]}, error => 'only the assignee or reporter of the bug, or a user', test => 'Unprivileged user cannot add a URL to a bug', }, - { user => 'admin', - args => { ids => ['public_bug'], add => ['asdfasdfasdf'] }, + { + user => 'admin', + args => {ids => ['public_bug'], add => ['asdfasdfasdf']}, error => 'ASDF', test => 'Admin cannot add an invalid URL', }, - { user => 'admin', - args => { ids => ['public_bug'], remove => ['asdfasdfasdf'] }, + { + user => 'admin', + args => {ids => ['public_bug'], remove => ['asdfasdfasdf']}, test => 'Invalid URL silently ignored', }, - { user => 'admin', - args => { ids => ['public_bug'], add => [$bug_url] }, + { + user => 'admin', + args => {ids => ['public_bug'], add => [$bug_url]}, test => 'Admin can add a URL to a public bug', }, - { user => 'unprivileged', - args => { ids => ['public_bug'], remove => [$bug_url] }, + { + user => 'unprivileged', + args => {ids => ['public_bug'], remove => [$bug_url]}, error => 'only the assignee or reporter of the bug, or a user', test => 'Unprivileged user cannot remove a URL from a bug', }, - { user => 'admin', - args => { ids => ['public_bug'], remove => [$bug_url] }, + { + user => 'admin', + args => {ids => ['public_bug'], remove => [$bug_url]}, test => 'Admin can remove a URL from a public bug', }, - { user => PRIVATE_BUG_USER, - args => { ids => ['private_bug'], add => [$bug_url] }, + { + user => PRIVATE_BUG_USER, + args => {ids => ['private_bug'], add => [$bug_url]}, test => PRIVATE_BUG_USER . ' can add a URL to a private bug', }, - { user => PRIVATE_BUG_USER, - args => { ids => ['private_bug'], remove => [$bug_url] }, + { + user => PRIVATE_BUG_USER, + args => {ids => ['private_bug'], remove => [$bug_url]}, test => PRIVATE_BUG_USER . ' can remove a URL from a private bug', }, -)); + ) +); sub post_success { - my ($call, $t) = @_; - isa_ok($call->result->{changes}, 'HASH', "Changes"); + my ($call, $t) = @_; + isa_ok($call->result->{changes}, 'HASH', "Changes"); } -$jsonrpc_get->bz_call_fail('Bug.update_see_also', - { ids => ['public_bug'], add => [$bug_url] }, - 'must use HTTP POST', 'update_see_also fails over GET'); +$jsonrpc_get->bz_call_fail( + 'Bug.update_see_also', + {ids => ['public_bug'], add => [$bug_url]}, + 'must use HTTP POST', + 'update_see_also fails over GET' +); foreach my $rpc ($jsonrpc, $xmlrpc) { - $rpc->bz_run_tests(tests => \@tests, method => 'Bug.update_see_also', - post_success => \&post_success); + $rpc->bz_run_tests( + tests => \@tests, + method => 'Bug.update_see_also', + post_success => \&post_success + ); } diff --git a/qa/t/webservice_bugzilla.t b/qa/t/webservice_bugzilla.t index 6d40e3088..f51afa097 100644 --- a/qa/t/webservice_bugzilla.t +++ b/qa/t/webservice_bugzilla.t @@ -17,29 +17,30 @@ use QA::Util; my ($config, @clients) = get_rpc_clients(); foreach my $rpc (@clients) { - my $vers_call = $rpc->bz_call_success('Bugzilla.version'); - my $version = $vers_call->result->{version}; - ok($version, "Bugzilla.version returns $version"); + my $vers_call = $rpc->bz_call_success('Bugzilla.version'); + my $version = $vers_call->result->{version}; + ok($version, "Bugzilla.version returns $version"); - my $tz_call = $rpc->bz_call_success('Bugzilla.timezone'); - my $tz = $tz_call->result->{timezone}; - ok($tz, "Bugzilla.timezone retuns $tz"); + my $tz_call = $rpc->bz_call_success('Bugzilla.timezone'); + my $tz = $tz_call->result->{timezone}; + ok($tz, "Bugzilla.timezone retuns $tz"); - my $ext_call = $rpc->bz_call_success('Bugzilla.extensions'); - my $extensions = $ext_call->result->{extensions}; - isa_ok($extensions, 'HASH', 'extensions'); + my $ext_call = $rpc->bz_call_success('Bugzilla.extensions'); + my $extensions = $ext_call->result->{extensions}; + isa_ok($extensions, 'HASH', 'extensions'); - # There is always at least the QA extension enabled. - my $cmp = $config->{test_extensions} ? '>' : '=='; - my @ext_names = keys %$extensions; - my $desc = scalar(@ext_names) . ' extension(s) returned: ' . join(', ', @ext_names); - cmp_ok(scalar(@ext_names), $cmp, 1, $desc); - ok(grep($_ eq 'QA', @ext_names), 'The QA extension is enabled'); + # There is always at least the QA extension enabled. + my $cmp = $config->{test_extensions} ? '>' : '=='; + my @ext_names = keys %$extensions; + my $desc + = scalar(@ext_names) . ' extension(s) returned: ' . join(', ', @ext_names); + cmp_ok(scalar(@ext_names), $cmp, 1, $desc); + ok(grep($_ eq 'QA', @ext_names), 'The QA extension is enabled'); - my $time_call = $rpc->bz_call_success('Bugzilla.time'); - my $time_result = $time_call->result; - foreach my $type (qw(db_time web_time)) { - cmp_ok($time_result->{$type}, '=~', $rpc->DATETIME_REGEX, - "Bugzilla.time returns a datetime for $type"); - } + my $time_call = $rpc->bz_call_success('Bugzilla.time'); + my $time_result = $time_call->result; + foreach my $type (qw(db_time web_time)) { + cmp_ok($time_result->{$type}, '=~', $rpc->DATETIME_REGEX, + "Bugzilla.time returns a datetime for $type"); + } } diff --git a/qa/t/webservice_group_create.t b/qa/t/webservice_group_create.t index e2c0a725d..8622621a1 100644 --- a/qa/t/webservice_group_create.t +++ b/qa/t/webservice_group_create.t @@ -18,80 +18,103 @@ use QA::Util; use constant DESCRIPTION => 'Group created by Group.create'; sub post_success { - my $call = shift; - my $gid = $call->result->{id}; - ok($gid, "Got a non-zero group ID: $gid"); + my $call = shift; + my $gid = $call->result->{id}; + ok($gid, "Got a non-zero group ID: $gid"); } my ($config, $xmlrpc, $jsonrpc, $jsonrpc_get) = get_rpc_clients(); my @tests = ( - { args => { name => random_string(20), description => DESCRIPTION }, - error => 'You must log in', - test => 'Logged-out user cannot call Group.create', - }, - { user => 'unprivileged', - args => { name => random_string(20), description => DESCRIPTION }, - error => 'you are not authorized', - test => 'Unprivileged user cannot call Group.create', - }, - { user => 'admin', - args => { description => DESCRIPTION }, - error => 'You must enter a name', - test => 'Missing name to Group.create', - }, - { user => 'admin', - args => { name => random_string(20) }, - error => 'You must enter a description', - test => 'Missing description to Group.create', - }, - { user => 'admin', - args => { name => '', description => DESCRIPTION }, - error => 'You must enter a name', - test => 'Name to Group.create cannot be empty', - }, - { user => 'admin', - args => { name => random_string(20), description => '' }, - error => 'You must enter a description', - test => 'Description to Group.create cannot be empty', - }, - { user => 'admin', - args => { name => 'canconfirm', description => DESCRIPTION }, - error => 'already exists', - test => 'Name to Group.create already exists', - }, - { user => 'admin', - args => { name => 'caNConFIrm', description => DESCRIPTION }, - error => 'already exists', - test => 'Name to Group.create already exists but with a different case', - }, - { user => 'admin', - args => { name => random_string(20), description => DESCRIPTION, - user_regexp => '\\'}, - error => 'The regular expression you entered is invalid', - test => 'The regular expression passed to Group.create is invalid', - }, + { + args => {name => random_string(20), description => DESCRIPTION}, + error => 'You must log in', + test => 'Logged-out user cannot call Group.create', + }, + { + user => 'unprivileged', + args => {name => random_string(20), description => DESCRIPTION}, + error => 'you are not authorized', + test => 'Unprivileged user cannot call Group.create', + }, + { + user => 'admin', + args => {description => DESCRIPTION}, + error => 'You must enter a name', + test => 'Missing name to Group.create', + }, + { + user => 'admin', + args => {name => random_string(20)}, + error => 'You must enter a description', + test => 'Missing description to Group.create', + }, + { + user => 'admin', + args => {name => '', description => DESCRIPTION}, + error => 'You must enter a name', + test => 'Name to Group.create cannot be empty', + }, + { + user => 'admin', + args => {name => random_string(20), description => ''}, + error => 'You must enter a description', + test => 'Description to Group.create cannot be empty', + }, + { + user => 'admin', + args => {name => 'canconfirm', description => DESCRIPTION}, + error => 'already exists', + test => 'Name to Group.create already exists', + }, + { + user => 'admin', + args => {name => 'caNConFIrm', description => DESCRIPTION}, + error => 'already exists', + test => 'Name to Group.create already exists but with a different case', + }, + { + user => 'admin', + args => + {name => random_string(20), description => DESCRIPTION, user_regexp => '\\'}, + error => 'The regular expression you entered is invalid', + test => 'The regular expression passed to Group.create is invalid', + }, ); -$jsonrpc_get->bz_call_fail('Group.create', - { name => random_string(20), description => 'Created with JSON-RPC via GET' }, - 'must use HTTP POST', 'Group.create fails over GET'); +$jsonrpc_get->bz_call_fail( + 'Group.create', + {name => random_string(20), description => 'Created with JSON-RPC via GET'}, + 'must use HTTP POST', + 'Group.create fails over GET' +); foreach my $rpc ($xmlrpc, $jsonrpc) { - # Tests which work must be called from here, - # to avoid creating twice the same group. - my @all_tests = (@tests, - { user => 'admin', - args => { name => random_string(20), description => DESCRIPTION }, - test => 'Passing the name and description only works', - }, - { user => 'admin', - args => { name => random_string(20), description => DESCRIPTION, - user_regexp => '\@foo.com$', is_active => 1, - icon_url => 'https://www.bugzilla.org/favicon.ico' }, - test => 'Passing all arguments works', - }, - ); - $rpc->bz_run_tests(tests => \@all_tests, method => 'Group.create', - post_success => \&post_success); + + # Tests which work must be called from here, + # to avoid creating twice the same group. + my @all_tests = ( + @tests, + { + user => 'admin', + args => {name => random_string(20), description => DESCRIPTION}, + test => 'Passing the name and description only works', + }, + { + user => 'admin', + args => { + name => random_string(20), + description => DESCRIPTION, + user_regexp => '\@foo.com$', + is_active => 1, + icon_url => 'https://www.bugzilla.org/favicon.ico' + }, + test => 'Passing all arguments works', + }, + ); + $rpc->bz_run_tests( + tests => \@all_tests, + method => 'Group.create', + post_success => \&post_success + ); } diff --git a/qa/t/webservice_jsonp.t b/qa/t/webservice_jsonp.t index 53b23aaf2..8aa72a145 100644 --- a/qa/t/webservice_jsonp.t +++ b/qa/t/webservice_jsonp.t @@ -12,19 +12,26 @@ use Test::More tests => 85; use QA::Util; my $jsonrpc_get = QA::Util::get_jsonrpc_client('GET'); -my @chars = (0..9, 'A'..'Z', 'a'..'z', '_[].'); +my @chars = (0 .. 9, 'A' .. 'Z', 'a' .. 'z', '_[].'); our @tests = ( - { args => { callback => join('', @chars) }, - test => 'callback accepts all legal characters.' }, + { + args => {callback => join('', @chars)}, + test => 'callback accepts all legal characters.' + }, ); -foreach my $char (qw(! ~ ` @ $ % ^ & * - + = { } ; : ' " < > / ? |), - '(', ')', '\\', '#', ',') +foreach + my $char (qw(! ~ ` @ $ % ^ & * - + = { } ; : ' " < > / ? |), '(', ')', '\\', + '#', ',') { - push(@tests, - { args => { callback => "a$char" }, - error => "as your 'callback' parameter", - test => "$char is not valid in callback" }); + push( + @tests, + { + args => {callback => "a$char"}, + error => "as your 'callback' parameter", + test => "$char is not valid in callback" + } + ); } $jsonrpc_get->bz_run_tests(method => 'Bugzilla.version', tests => \@tests); diff --git a/qa/t/webservice_product.t b/qa/t/webservice_product.t index 1ced65276..7d44f08ae 100644 --- a/qa/t/webservice_product.t +++ b/qa/t/webservice_product.t @@ -20,7 +20,7 @@ use Test::More tests => 134; use QA::Util; my ($config, @clients) = get_rpc_clients(); -my $products = $clients[0]->bz_get_products(); +my $products = $clients[0]->bz_get_products(); my $public = $products->{'Another Product'}; my $private = $products->{'QA-Selenium-TEST'}; my $no_entry = $products->{'QA Entry Only'}; @@ -29,81 +29,79 @@ my $no_search = $products->{'QA Search Only'}; my %id_map = reverse %$products; my $tests = { - 'QA_Selenium_TEST' => { - selectable => [$public, $private, $no_entry, $no_search], - enterable => [$public, $private, $no_entry, $no_search], - accessible => [$public, $private, $no_entry, $no_search], - }, - 'unprivileged' => { - selectable => [$public, $no_entry], - not_selectable => $no_search, - enterable => [$public, $no_search], - not_enterable => $no_entry, - accessible => [$public, $no_entry, $no_search], - not_accessible => $private, - }, - '' => { - selectable => [$public, $no_entry], - not_selectable => $no_search, - enterable => [$public, $no_search], - not_enterable => $no_entry, - accessible => [$public, $no_entry, $no_search], - not_accessible => $private, - }, + 'QA_Selenium_TEST' => { + selectable => [$public, $private, $no_entry, $no_search], + enterable => [$public, $private, $no_entry, $no_search], + accessible => [$public, $private, $no_entry, $no_search], + }, + 'unprivileged' => { + selectable => [$public, $no_entry], + not_selectable => $no_search, + enterable => [$public, $no_search], + not_enterable => $no_entry, + accessible => [$public, $no_entry, $no_search], + not_accessible => $private, + }, + '' => { + selectable => [$public, $no_entry], + not_selectable => $no_search, + enterable => [$public, $no_search], + not_enterable => $no_entry, + accessible => [$public, $no_entry, $no_search], + not_accessible => $private, + }, }; foreach my $rpc (@clients) { - foreach my $user (keys %$tests) { - my @selectable = @{ $tests->{$user}->{selectable} }; - my @enterable = @{ $tests->{$user}->{enterable} }; - my @accessible = @{ $tests->{$user}->{accessible} }; - my $not_selectable = $tests->{$user}->{not_selectable}; - my $not_enterable = $tests->{$user}->{not_enterable}; - my $not_accessible = $tests->{$user}->{not_accessible}; + foreach my $user (keys %$tests) { + my @selectable = @{$tests->{$user}->{selectable}}; + my @enterable = @{$tests->{$user}->{enterable}}; + my @accessible = @{$tests->{$user}->{accessible}}; + my $not_selectable = $tests->{$user}->{not_selectable}; + my $not_enterable = $tests->{$user}->{not_enterable}; + my $not_accessible = $tests->{$user}->{not_accessible}; - $rpc->bz_log_in($user) if $user; - $user ||= "Logged-out user"; + $rpc->bz_log_in($user) if $user; + $user ||= "Logged-out user"; - my $select_call = - $rpc->bz_call_success('Product.get_selectable_products'); - my $select_ids = $select_call->result->{ids}; - foreach my $id (@selectable) { - ok(grep($_ == $id, @$select_ids), - "$user can select " . $id_map{$id}); - } - if ($not_selectable) { - ok(!grep($_ == $not_selectable, @$select_ids), - "$user cannot select " . $id_map{$not_selectable}); - } - - my $enter_call = - $rpc->bz_call_success('Product.get_enterable_products'); - my $enter_ids = $enter_call->result->{ids}; - foreach my $id (@enterable) { - ok(grep($_ == $id, @$enter_ids), "$user can enter " . $id_map{$id}); - } - if ($not_enterable) { - ok(!grep($_ == $not_enterable, @$enter_ids), - "$user cannot enter " . $id_map{$not_enterable}); - } + my $select_call = $rpc->bz_call_success('Product.get_selectable_products'); + my $select_ids = $select_call->result->{ids}; + foreach my $id (@selectable) { + ok(grep($_ == $id, @$select_ids), "$user can select " . $id_map{$id}); + } + if ($not_selectable) { + ok( + !grep($_ == $not_selectable, @$select_ids), + "$user cannot select " . $id_map{$not_selectable} + ); + } - my $access_call = - $rpc->bz_call_success('Product.get_accessible_products'); - my $get_call = $rpc->bz_call_success('Product.get', - { ids => \@accessible }); - my $products = $get_call->result->{products}; - my $expected_count = scalar @accessible; - cmp_ok(scalar @$products, '==', $expected_count, - "Product.get gets all $expected_count accessible products" - . " for $user."); - if ($not_accessible) { - my $no_access_call = $rpc->bz_call_success( - 'Product.get', { ids => [$not_accessible] }); - ok(!scalar @{ $no_access_call->result->{products} }, - "$user gets 0 products when asking for " - . $id_map{$not_accessible}); - } + my $enter_call = $rpc->bz_call_success('Product.get_enterable_products'); + my $enter_ids = $enter_call->result->{ids}; + foreach my $id (@enterable) { + ok(grep($_ == $id, @$enter_ids), "$user can enter " . $id_map{$id}); + } + if ($not_enterable) { + ok( + !grep($_ == $not_enterable, @$enter_ids), + "$user cannot enter " . $id_map{$not_enterable} + ); + } - $rpc->bz_call_success('User.logout') if $user ne "Logged-out user"; + my $access_call = $rpc->bz_call_success('Product.get_accessible_products'); + my $get_call = $rpc->bz_call_success('Product.get', {ids => \@accessible}); + my $products = $get_call->result->{products}; + my $expected_count = scalar @accessible; + cmp_ok(scalar @$products, + '==', $expected_count, + "Product.get gets all $expected_count accessible products" . " for $user."); + if ($not_accessible) { + my $no_access_call + = $rpc->bz_call_success('Product.get', {ids => [$not_accessible]}); + ok(!scalar @{$no_access_call->result->{products}}, + "$user gets 0 products when asking for " . $id_map{$not_accessible}); } + + $rpc->bz_call_success('User.logout') if $user ne "Logged-out user"; + } } diff --git a/qa/t/webservice_product_create.t b/qa/t/webservice_product_create.t index 3b8fe78b1..01b3ea4d5 100644 --- a/qa/t/webservice_product_create.t +++ b/qa/t/webservice_product_create.t @@ -15,149 +15,226 @@ use lib qw(lib ../../lib ../../local/lib/perl5); use Test::More tests => 121; use QA::Util; -use constant DESCRIPTION => 'Product created by Product.create'; +use constant DESCRIPTION => 'Product created by Product.create'; use constant PROD_VERSION => 'unspecified'; sub post_success { - my ($call, $test, $self) = @_; - my $args = $test->{args}; - my $prod_id = $call->result->{id}; - ok($prod_id, "Got a non-zero product ID: $prod_id"); + my ($call, $test, $self) = @_; + my $args = $test->{args}; + my $prod_id = $call->result->{id}; + ok($prod_id, "Got a non-zero product ID: $prod_id"); - $call = $self->bz_call_success("Product.get", {ids => [$prod_id]}); - my $product = $call->result->{products}->[0]; - my $prod_name = $product->{name}; - my $is_active = defined $args->{is_open} ? $args->{is_open} : 1; - ok($product->{is_active} == $is_active, - "Product $prod_name has the correct value for is_active/is_open: $is_active"); - my $has_unco = defined $args->{has_unconfirmed} ? $args->{has_unconfirmed} : 1; - ok($product->{has_unconfirmed} == $has_unco, - "Product $prod_name has the correct value for has_unconfirmed: $has_unco"); + $call = $self->bz_call_success("Product.get", {ids => [$prod_id]}); + my $product = $call->result->{products}->[0]; + my $prod_name = $product->{name}; + my $is_active = defined $args->{is_open} ? $args->{is_open} : 1; + ok($product->{is_active} == $is_active, + "Product $prod_name has the correct value for is_active/is_open: $is_active"); + my $has_unco = defined $args->{has_unconfirmed} ? $args->{has_unconfirmed} : 1; + ok($product->{has_unconfirmed} == $has_unco, + "Product $prod_name has the correct value for has_unconfirmed: $has_unco"); } my ($config, $xmlrpc, $jsonrpc, $jsonrpc_get) = get_rpc_clients(); my @tests = ( - { args => { name => random_string(20), version => PROD_VERSION, - description => DESCRIPTION }, - error => 'You must log in', - test => 'Logged-out user cannot call Product.create', + { + args => { + name => random_string(20), + version => PROD_VERSION, + description => DESCRIPTION }, - { user => 'unprivileged', - args => { name => random_string(20), version => PROD_VERSION, - description => DESCRIPTION }, - error => 'you are not authorized', - test => 'Unprivileged user cannot call Product.create', + error => 'You must log in', + test => 'Logged-out user cannot call Product.create', + }, + { + user => 'unprivileged', + args => { + name => random_string(20), + version => PROD_VERSION, + description => DESCRIPTION }, - { user => 'admin', - args => { version => PROD_VERSION, description => DESCRIPTION }, - error => 'You must enter a name', - test => 'Missing name to Product.create', + error => 'you are not authorized', + test => 'Unprivileged user cannot call Product.create', + }, + { + user => 'admin', + args => {version => PROD_VERSION, description => DESCRIPTION}, + error => 'You must enter a name', + test => 'Missing name to Product.create', + }, + { + user => 'admin', + args => {name => random_string(20), version => PROD_VERSION}, + error => 'You must enter a description', + test => 'Missing description to Product.create', + }, + { + user => 'admin', + args => {name => random_string(20), description => DESCRIPTION}, + error => 'You must enter a valid version', + test => 'Missing version to Product.create', + }, + { + user => 'admin', + args => {name => '', version => PROD_VERSION, description => DESCRIPTION}, + error => 'You must enter a name', + test => 'Name to Product.create cannot be empty', + }, + { + user => 'admin', + args => {name => random_string(20), version => PROD_VERSION, description => ''}, + error => 'You must enter a description', + test => 'Description to Product.create cannot be empty', + }, + { + user => 'admin', + args => {name => random_string(20), version => '', description => DESCRIPTION}, + error => 'You must enter a valid version', + test => 'Version to Product.create cannot be empty', + }, + { + user => 'admin', + args => { + name => random_string(20000), + version => PROD_VERSION, + description => DESCRIPTION }, - { user => 'admin', - args => { name => random_string(20), version => PROD_VERSION }, - error => 'You must enter a description', - test => 'Missing description to Product.create', + error => 'The name of a product is limited', + test => 'Name to Product.create too long', + }, + { + user => 'admin', + args => { + name => 'Another Product', + version => PROD_VERSION, + description => DESCRIPTION }, - { user => 'admin', - args => { name => random_string(20), description => DESCRIPTION }, - error => 'You must enter a valid version', - test => 'Missing version to Product.create', - }, - { user => 'admin', - args => { name => '', version => PROD_VERSION, description => DESCRIPTION }, - error => 'You must enter a name', - test => 'Name to Product.create cannot be empty', - }, - { user => 'admin', - args => { name => random_string(20), version => PROD_VERSION, description => '' }, - error => 'You must enter a description', - test => 'Description to Product.create cannot be empty', - }, - { user => 'admin', - args => { name => random_string(20), version => '', description => DESCRIPTION }, - error => 'You must enter a valid version', - test => 'Version to Product.create cannot be empty', - }, - { user => 'admin', - args => { name => random_string(20000), version => PROD_VERSION, - description => DESCRIPTION }, - error => 'The name of a product is limited', - test => 'Name to Product.create too long', - }, - { user => 'admin', - args => { name => 'Another Product', version => PROD_VERSION, - description => DESCRIPTION }, - error => 'already exists', - test => 'Name to Product.create already exists', - }, - { user => 'admin', - args => { name => 'aNoThEr Product', version => PROD_VERSION, - description => DESCRIPTION }, - error => 'differs from existing product', - test => 'Name to Product.create already exists but with a different case', + error => 'already exists', + test => 'Name to Product.create already exists', + }, + { + user => 'admin', + args => { + name => 'aNoThEr Product', + version => PROD_VERSION, + description => DESCRIPTION }, + error => 'differs from existing product', + test => 'Name to Product.create already exists but with a different case', + }, ); # FIXME: Should be: if (classifications enabled). # But there is currently now way to query the value of a parameter via WS. if (0) { - push(@tests, - { user => 'admin', - args => { name => random_string(20), version => PROD_VERSION, - description => DESCRIPTION, has_unconfirmed => 1, - classification => '', default_milestone => '2.0', - is_open => 1, create_series => 1 }, - error => 'You must select/enter a classification', - test => 'Passing an empty classification to Product.create fails', - }, - { user => 'admin', - args => { name => random_string(20), version => PROD_VERSION, - description => DESCRIPTION, has_unconfirmed => 1, - classification => random_string(10), default_milestone => '2.0', - is_open => 1, create_series => 1 }, - error => 'You must select/enter a classification', - test => 'Passing an invalid classification to Product.create fails', - }, - ) + push( + @tests, + { + user => 'admin', + args => { + name => random_string(20), + version => PROD_VERSION, + description => DESCRIPTION, + has_unconfirmed => 1, + classification => '', + default_milestone => '2.0', + is_open => 1, + create_series => 1 + }, + error => 'You must select/enter a classification', + test => 'Passing an empty classification to Product.create fails', + }, + { + user => 'admin', + args => { + name => random_string(20), + version => PROD_VERSION, + description => DESCRIPTION, + has_unconfirmed => 1, + classification => random_string(10), + default_milestone => '2.0', + is_open => 1, + create_series => 1 + }, + error => 'You must select/enter a classification', + test => 'Passing an invalid classification to Product.create fails', + }, + ); } -$jsonrpc_get->bz_call_fail('Product.create', - { name => random_string(20), version => PROD_VERSION, - description => 'Created with JSON-RPC via GET' }, - 'must use HTTP POST', 'Product.create fails over GET'); +$jsonrpc_get->bz_call_fail( + 'Product.create', + { + name => random_string(20), + version => PROD_VERSION, + description => 'Created with JSON-RPC via GET' + }, + 'must use HTTP POST', + 'Product.create fails over GET' +); foreach my $rpc ($xmlrpc, $jsonrpc) { - # Tests which work must be called from here, - # to avoid creating twice the same product. - my @all_tests = (@tests, - { user => 'admin', - args => { name => random_string(20), version => PROD_VERSION, - description => DESCRIPTION }, - test => 'Passing the name, description and version only works', - }, - { user => 'admin', - args => { name => random_string(20), version => PROD_VERSION, - description => DESCRIPTION, has_unconfirmed => 1, - classification => 'Class2_QA', default_milestone => '2.0', - is_open => 1, create_series => 1 }, - test => 'Passing all arguments works', - }, - { user => 'admin', - args => { name => random_string(20), version => PROD_VERSION, - description => DESCRIPTION, has_unconfirmed => 0, - classification => 'Class2_QA', default_milestone => '2.0', - is_open => 0, create_series => 0 }, - test => 'Passing null values works', - }, - { user => 'admin', - args => { name => random_string(20), version => PROD_VERSION, - description => DESCRIPTION, has_unconfirmed => 1, - classification => 'Class2_QA', default_milestone => '', - is_open => 1, create_series => 1 }, - test => 'Passing an empty default milestone works (falls back to "---")', - }, - ); - $rpc->bz_run_tests(tests => \@all_tests, method => 'Product.create', - post_success => \&post_success); + + # Tests which work must be called from here, + # to avoid creating twice the same product. + my @all_tests = ( + @tests, + { + user => 'admin', + args => { + name => random_string(20), + version => PROD_VERSION, + description => DESCRIPTION + }, + test => 'Passing the name, description and version only works', + }, + { + user => 'admin', + args => { + name => random_string(20), + version => PROD_VERSION, + description => DESCRIPTION, + has_unconfirmed => 1, + classification => 'Class2_QA', + default_milestone => '2.0', + is_open => 1, + create_series => 1 + }, + test => 'Passing all arguments works', + }, + { + user => 'admin', + args => { + name => random_string(20), + version => PROD_VERSION, + description => DESCRIPTION, + has_unconfirmed => 0, + classification => 'Class2_QA', + default_milestone => '2.0', + is_open => 0, + create_series => 0 + }, + test => 'Passing null values works', + }, + { + user => 'admin', + args => { + name => random_string(20), + version => PROD_VERSION, + description => DESCRIPTION, + has_unconfirmed => 1, + classification => 'Class2_QA', + default_milestone => '', + is_open => 1, + create_series => 1 + }, + test => 'Passing an empty default milestone works (falls back to "---")', + }, + ); + $rpc->bz_run_tests( + tests => \@all_tests, + method => 'Product.create', + post_success => \&post_success + ); } diff --git a/qa/t/webservice_product_get.t b/qa/t/webservice_product_get.t index 7f445ced7..bd46ae400 100644 --- a/qa/t/webservice_product_get.t +++ b/qa/t/webservice_product_get.t @@ -20,7 +20,7 @@ use Test::More tests => 134; use QA::Util; my ($config, @clients) = get_rpc_clients(); -my $products = $clients[0]->bz_get_products(); +my $products = $clients[0]->bz_get_products(); my $public = $products->{'Another Product'}; my $private = $products->{'QA-Selenium-TEST'}; my $no_entry = $products->{'QA Entry Only'}; @@ -29,81 +29,79 @@ my $no_search = $products->{'QA Search Only'}; my %id_map = reverse %$products; my $tests = { - 'QA_Selenium_TEST' => { - selectable => [$public, $private, $no_entry, $no_search], - enterable => [$public, $private, $no_entry, $no_search], - accessible => [$public, $private, $no_entry, $no_search], - }, - 'unprivileged' => { - selectable => [$public, $no_entry], - not_selectable => $no_search, - enterable => [$public, $no_search], - not_enterable => $no_entry, - accessible => [$public, $no_entry, $no_search], - not_accessible => $private, - }, - '' => { - selectable => [$public, $no_entry], - not_selectable => $no_search, - enterable => [$public, $no_search], - not_enterable => $no_entry, - accessible => [$public, $no_entry, $no_search], - not_accessible => $private, - }, + 'QA_Selenium_TEST' => { + selectable => [$public, $private, $no_entry, $no_search], + enterable => [$public, $private, $no_entry, $no_search], + accessible => [$public, $private, $no_entry, $no_search], + }, + 'unprivileged' => { + selectable => [$public, $no_entry], + not_selectable => $no_search, + enterable => [$public, $no_search], + not_enterable => $no_entry, + accessible => [$public, $no_entry, $no_search], + not_accessible => $private, + }, + '' => { + selectable => [$public, $no_entry], + not_selectable => $no_search, + enterable => [$public, $no_search], + not_enterable => $no_entry, + accessible => [$public, $no_entry, $no_search], + not_accessible => $private, + }, }; foreach my $rpc (@clients) { - foreach my $user (keys %$tests) { - my @selectable = @{ $tests->{$user}->{selectable} }; - my @enterable = @{ $tests->{$user}->{enterable} }; - my @accessible = @{ $tests->{$user}->{accessible} }; - my $not_selectable = $tests->{$user}->{not_selectable}; - my $not_enterable = $tests->{$user}->{not_enterable}; - my $not_accessible = $tests->{$user}->{not_accessible}; + foreach my $user (keys %$tests) { + my @selectable = @{$tests->{$user}->{selectable}}; + my @enterable = @{$tests->{$user}->{enterable}}; + my @accessible = @{$tests->{$user}->{accessible}}; + my $not_selectable = $tests->{$user}->{not_selectable}; + my $not_enterable = $tests->{$user}->{not_enterable}; + my $not_accessible = $tests->{$user}->{not_accessible}; - $rpc->bz_log_in($user) if $user; - $user ||= "Logged-out user"; + $rpc->bz_log_in($user) if $user; + $user ||= "Logged-out user"; - my $select_call = - $rpc->bz_call_success('Product.get_selectable_products'); - my $select_ids = $select_call->result->{ids}; - foreach my $id (@selectable) { - ok(grep($_ == $id, @$select_ids), - "$user can select " . $id_map{$id}); - } - if ($not_selectable) { - ok(!grep($_ == $not_selectable, @$select_ids), - "$user cannot select " . $id_map{$not_selectable}); - } - - my $enter_call = - $rpc->bz_call_success('Product.get_enterable_products'); - my $enter_ids = $enter_call->result->{ids}; - foreach my $id (@enterable) { - ok(grep($_ == $id, @$enter_ids), "$user can enter " . $id_map{$id}); - } - if ($not_enterable) { - ok(!grep($_ == $not_enterable, @$enter_ids), - "$user cannot enter " . $id_map{$not_enterable}); - } + my $select_call = $rpc->bz_call_success('Product.get_selectable_products'); + my $select_ids = $select_call->result->{ids}; + foreach my $id (@selectable) { + ok(grep($_ == $id, @$select_ids), "$user can select " . $id_map{$id}); + } + if ($not_selectable) { + ok( + !grep($_ == $not_selectable, @$select_ids), + "$user cannot select " . $id_map{$not_selectable} + ); + } - my $access_call = - $rpc->bz_call_success('Product.get_accessible_products'); - my $get_call = $rpc->bz_call_success('Product.get', - { ids => \@accessible }); - my $products = $get_call->result->{products}; - my $expected_count = scalar @accessible; - cmp_ok(scalar @$products, '==', $expected_count, - "Product.get gets all $expected_count accessible products" - . " for $user."); - if ($not_accessible) { - my $no_access_call = $rpc->bz_call_success( - 'Product.get', { ids => [$not_accessible] }); - ok(!scalar @{ $no_access_call->result->{products} }, - "$user gets 0 products when asking for " - . $id_map{$not_accessible}); - } + my $enter_call = $rpc->bz_call_success('Product.get_enterable_products'); + my $enter_ids = $enter_call->result->{ids}; + foreach my $id (@enterable) { + ok(grep($_ == $id, @$enter_ids), "$user can enter " . $id_map{$id}); + } + if ($not_enterable) { + ok( + !grep($_ == $not_enterable, @$enter_ids), + "$user cannot enter " . $id_map{$not_enterable} + ); + } - $rpc->bz_call_success('User.logout') if $user ne "Logged-out user"; + my $access_call = $rpc->bz_call_success('Product.get_accessible_products'); + my $get_call = $rpc->bz_call_success('Product.get', {ids => \@accessible}); + my $products = $get_call->result->{products}; + my $expected_count = scalar @accessible; + cmp_ok(scalar @$products, + '==', $expected_count, + "Product.get gets all $expected_count accessible products" . " for $user."); + if ($not_accessible) { + my $no_access_call + = $rpc->bz_call_success('Product.get', {ids => [$not_accessible]}); + ok(!scalar @{$no_access_call->result->{products}}, + "$user gets 0 products when asking for " . $id_map{$not_accessible}); } + + $rpc->bz_call_success('User.logout') if $user ne "Logged-out user"; + } } diff --git a/qa/t/webservice_user_create.t b/qa/t/webservice_user_create.t index 34b7a4896..33b042a51 100644 --- a/qa/t/webservice_user_create.t +++ b/qa/t/webservice_user_create.t @@ -25,90 +25,116 @@ use constant PASSWORD_TOO_SHORT => 'a'; use constant INVALID_EMAIL => '()[]\;:,<>@webservice.test'; sub new_login { - return 'created_' . random_string(@_) . '@webservice.test'; + return 'created_' . random_string(@_) . '@webservice.test'; } sub post_success { - my ($call) = @_; - ok($call->result->{id}, "Got a non-zero user id"); + my ($call) = @_; + ok($call->result->{id}, "Got a non-zero user id"); } -$jsonrpc_get->bz_call_fail('User.create', - { email => new_login(), full_name => NEW_FULLNAME, - password => '*' }, - 'must use HTTP POST', 'User.create fails over GET'); +$jsonrpc_get->bz_call_fail( + 'User.create', + {email => new_login(), full_name => NEW_FULLNAME, password => '*'}, + 'must use HTTP POST', + 'User.create fails over GET' +); # We have to wrap @tests in the foreach, because we want a different # login for each user, separately for each RPC client. (You can't create # two users with the same username, and XML-RPC would otherwise try to # create the same users that JSON-RPC created.) foreach my $rpc ($jsonrpc, $xmlrpc) { - my @tests = ( - # Permissions checks - { args => { email => new_login(), full_name => NEW_FULLNAME, - password => NEW_PASSWORD }, - error => "you are not authorized", - test => 'Logged-out user cannot call User.create', - }, - { user => 'unprivileged', - args => { email => new_login(), full_name => NEW_FULLNAME, - password => NEW_PASSWORD }, - error => "you are not authorized", - test => 'Unprivileged user cannot call User.create', - }, + my @tests = ( - # Login name checks. - { user => 'admin', - args => { full_name => NEW_FULLNAME, password => NEW_PASSWORD }, - error => "argument was not set", - test => 'Leaving out email argument fails', - }, - { user => 'admin', - args => { email => '', full_name => NEW_FULLNAME, - password => NEW_PASSWORD }, - error => "argument was not set", - test => "Passing an empty email argument fails", - }, - { user => 'admin', - args => { email => INVALID_EMAIL, full_name => NEW_FULLNAME, - password => NEW_PASSWORD }, - error => "didn't pass our syntax checking", - test => 'Invalid email address fails', - }, - { user => 'admin', - args => { email => new_login(128), full_name => NEW_FULLNAME, - password => NEW_PASSWORD }, - error => "didn't pass our syntax checking", - test => 'Too long (> 127 chars) email address fails', - }, - { user => 'admin', - args => { email => $config->{unprivileged_user_login}, - full_name => NEW_FULLNAME, password => NEW_PASSWORD }, - error => "There is already an account", - test => 'Trying to use an existing login name fails', - }, + # Permissions checks + { + args => + {email => new_login(), full_name => NEW_FULLNAME, password => NEW_PASSWORD}, + error => "you are not authorized", + test => 'Logged-out user cannot call User.create', + }, + { + user => 'unprivileged', + args => + {email => new_login(), full_name => NEW_FULLNAME, password => NEW_PASSWORD}, + error => "you are not authorized", + test => 'Unprivileged user cannot call User.create', + }, - { user => 'admin', - args => { email => new_login(), full_name => NEW_FULLNAME, - password => PASSWORD_TOO_SHORT }, - error => 'The password does not meet our security requirements for the following reason: too short', - test => 'Password Too Short fails', - }, - { user => 'admin', - args => { email => new_login(), full_name => NEW_FULLNAME, - password => NEW_PASSWORD }, - test => 'Creating a user with all arguments and correct privileges', - }, - { user => 'admin', - args => { email => new_login(), password => NEW_PASSWORD }, - test => 'Leaving out fullname works', - }, - { user => 'admin', - args => { email => new_login(), full_name => NEW_FULLNAME }, - test => 'Leaving out password works', - }, - ); + # Login name checks. + { + user => 'admin', + args => {full_name => NEW_FULLNAME, password => NEW_PASSWORD}, + error => "argument was not set", + test => 'Leaving out email argument fails', + }, + { + user => 'admin', + args => {email => '', full_name => NEW_FULLNAME, password => NEW_PASSWORD}, + error => "argument was not set", + test => "Passing an empty email argument fails", + }, + { + user => 'admin', + args => + {email => INVALID_EMAIL, full_name => NEW_FULLNAME, password => NEW_PASSWORD}, + error => "didn't pass our syntax checking", + test => 'Invalid email address fails', + }, + { + user => 'admin', + args => { + email => new_login(128), + full_name => NEW_FULLNAME, + password => NEW_PASSWORD + }, + error => "didn't pass our syntax checking", + test => 'Too long (> 127 chars) email address fails', + }, + { + user => 'admin', + args => { + email => $config->{unprivileged_user_login}, + full_name => NEW_FULLNAME, + password => NEW_PASSWORD + }, + error => "There is already an account", + test => 'Trying to use an existing login name fails', + }, - $rpc->bz_run_tests(tests => \@tests, method => 'User.create', - post_success => \&post_success); + { + user => 'admin', + args => { + email => new_login(), + full_name => NEW_FULLNAME, + password => PASSWORD_TOO_SHORT + }, + error => + 'The password does not meet our security requirements for the following reason: too short', + test => 'Password Too Short fails', + }, + { + user => 'admin', + args => + {email => new_login(), full_name => NEW_FULLNAME, password => NEW_PASSWORD}, + test => 'Creating a user with all arguments and correct privileges', + }, + { + user => 'admin', + args => {email => new_login(), password => NEW_PASSWORD}, + test => 'Leaving out fullname works', + }, + { + user => 'admin', + args => {email => new_login(), full_name => NEW_FULLNAME}, + test => 'Leaving out password works', + }, + ); + + $rpc->bz_run_tests( + tests => \@tests, + method => 'User.create', + post_success => \&post_success + ); } diff --git a/qa/t/webservice_user_get.t b/qa/t/webservice_user_get.t index 4a7f74f78..1437646bb 100644 --- a/qa/t/webservice_user_get.t +++ b/qa/t/webservice_user_get.t @@ -17,202 +17,254 @@ use QA::Tests qw(PRIVATE_BUG_USER); use Test::More tests => 330; our ($config, @clients) = get_rpc_clients(); -my $get_user = $config->{'unprivileged_user_login'}; +my $get_user = $config->{'unprivileged_user_login'}; my $canconfirm_user = $config->{'canconfirm_user_login'}; -my $priv_user = $config->{PRIVATE_BUG_USER . '_user_login'}; -my $disabled = $config->{'disabled_user_login'}; -my $disabled_match = substr($disabled, 0, length($disabled) - 1); +my $priv_user = $config->{PRIVATE_BUG_USER . '_user_login'}; +my $disabled = $config->{'disabled_user_login'}; +my $disabled_match = substr($disabled, 0, length($disabled) - 1); # These are the basic tests. There are tests for include_fields # and exclude_field below. my @tests = ( - { args => { names => [$get_user] }, - test => "Logged-out user can get unprivileged user by name" - }, - { args => { match => [$get_user] }, - test => 'Logged-out user cannot use the match argument', - error => 'Logged-out users cannot use', - }, - { args => { ids => [1] }, - test => 'Logged-out users cannot use the "ids" argument', - error => 'Logged-out users cannot use', - }, + { + args => {names => [$get_user]}, + test => "Logged-out user can get unprivileged user by name" + }, + { + args => {match => [$get_user]}, + test => 'Logged-out user cannot use the match argument', + error => 'Logged-out users cannot use', + }, + { + args => {ids => [1]}, + test => 'Logged-out users cannot use the "ids" argument', + error => 'Logged-out users cannot use', + }, - # match & names - { user => 'unprivileged', - args => { names => [$get_user] }, - test => "Unprivileged user can get himself", - }, - { user => 'unprivileged', - args => { match => [$get_user] }, - test => 'Logged-in user can use the match argument', - }, - { user => 'unprivileged', - args => { match => [$get_user], names => [$get_user] }, - test => 'Specifying the same thing in "match" and "names"', - }, + # match & names + { + user => 'unprivileged', + args => {names => [$get_user]}, + test => "Unprivileged user can get himself", + }, + { + user => 'unprivileged', + args => {match => [$get_user]}, + test => 'Logged-in user can use the match argument', + }, + { + user => 'unprivileged', + args => {match => [$get_user], names => [$get_user]}, + test => 'Specifying the same thing in "match" and "names"', + }, - # include_disabled - { user => 'unprivileged', - args => { match => [$get_user, $disabled_match] }, - test => 'Disabled users are not normally returned' - }, - { user => 'unprivileged', - args => { match => [$disabled_match], include_disabled => 1 }, - test => 'Specifying include_disabled returns disabled users' - }, - { user => 'unprivileged', - args => { match => [$disabled] }, - test => 'Full match on a disabled user returns that user', - }, + # include_disabled + { + user => 'unprivileged', + args => {match => [$get_user, $disabled_match]}, + test => 'Disabled users are not normally returned' + }, + { + user => 'unprivileged', + args => {match => [$disabled_match], include_disabled => 1}, + test => 'Specifying include_disabled returns disabled users' + }, + { + user => 'unprivileged', + args => {match => [$disabled]}, + test => 'Full match on a disabled user returns that user', + }, - # groups and group_ids - { args => { groups => ['QA-Selenium-TEST'] }, - test => 'Specifying just groups fails', - error => 'one of the following parameters', - }, - { args => { group_ids => [1] }, - test => 'Specifying just group ids fails', - error => 'one of the following parameters', - }, - { args => { names => [$get_user, $priv_user], groups => ['QA-Selenium-TEST'] }, - test => 'Limiting the return value to a group while being logged out fails', - error => 'The group you specified, QA-Selenium-TEST, is not valid here', - }, - { user => 'unprivileged', - args => { names => [$get_user, $priv_user], groups => ['missing_group'] }, - test => 'Limiting the return value to a group which does not exist fails', - error => 'The group you specified, missing_group, is not valid here', - }, - { user => 'unprivileged', - args => { names => [$get_user, $priv_user], groups => ['QA-Selenium-TEST'] }, - test => 'Limiting the return value to a group you do not belong to fails', - error => 'The group you specified, QA-Selenium-TEST, is not valid here', - }, - { user => 'editbugs', - args => { names => [$get_user, $priv_user], groups => ['Master', 'editbugs'] }, - test => 'Limiting the return value to some groups you do not belong to fails', - error => 'The group you specified, Master, is not valid here', - }, - { user => 'admin', - args => { names => [$canconfirm_user], groups => ['canconfirm', 'editbugs'] }, - test => 'Limiting the return value to groups you belong to', - }, + # groups and group_ids + { + args => {groups => ['QA-Selenium-TEST']}, + test => 'Specifying just groups fails', + error => 'one of the following parameters', + }, + { + args => {group_ids => [1]}, + test => 'Specifying just group ids fails', + error => 'one of the following parameters', + }, + { + args => {names => [$get_user, $priv_user], groups => ['QA-Selenium-TEST']}, + test => 'Limiting the return value to a group while being logged out fails', + error => 'The group you specified, QA-Selenium-TEST, is not valid here', + }, + { + user => 'unprivileged', + args => {names => [$get_user, $priv_user], groups => ['missing_group']}, + test => 'Limiting the return value to a group which does not exist fails', + error => 'The group you specified, missing_group, is not valid here', + }, + { + user => 'unprivileged', + args => {names => [$get_user, $priv_user], groups => ['QA-Selenium-TEST']}, + test => 'Limiting the return value to a group you do not belong to fails', + error => 'The group you specified, QA-Selenium-TEST, is not valid here', + }, + { + user => 'editbugs', + args => {names => [$get_user, $priv_user], groups => ['Master', 'editbugs']}, + test => 'Limiting the return value to some groups you do not belong to fails', + error => 'The group you specified, Master, is not valid here', + }, + { + user => 'admin', + args => {names => [$canconfirm_user], groups => ['canconfirm', 'editbugs']}, + test => 'Limiting the return value to groups you belong to', + }, - # groups returned - { user => 'admin', - args => { names => [$get_user] }, - test => 'Admin can get user', - }, - { user => 'admin', - args => { names => [$canconfirm_user] }, - test => 'Admin can get user', - }, - { user => 'canconfirm', - args => { names => [$canconfirm_user] }, - test => 'Privileged user can get himself', - }, - { user => 'editbugs', - args => { names => [$canconfirm_user] }, - test => 'Privileged user can get another user', - }, + # groups returned + { + user => 'admin', + args => {names => [$get_user]}, + test => 'Admin can get user', + }, + { + user => 'admin', + args => {names => [$canconfirm_user]}, + test => 'Admin can get user', + }, + { + user => 'canconfirm', + args => {names => [$canconfirm_user]}, + test => 'Privileged user can get himself', + }, + { + user => 'editbugs', + args => {names => [$canconfirm_user]}, + test => 'Privileged user can get another user', + }, ); sub post_success { - my ($call, $t) = @_; + my ($call, $t) = @_; - my $result = $call->result; - is(scalar @{ $result->{users} }, 1, "Got exactly one user"); - my $item = $result->{users}->[0]; - my $user = $t->{user} || ''; + my $result = $call->result; + is(scalar @{$result->{users}}, 1, "Got exactly one user"); + my $item = $result->{users}->[0]; + my $user = $t->{user} || ''; - if ($user eq 'admin') { - ok(exists $item->{email} && exists $item->{can_login} - && exists $item->{email_enabled} && exists $item->{login_denied_text}, - 'Admin correctly gets all user fields'); - } - elsif ($user) { - ok(exists $item->{email} && exists $item->{can_login}, - 'Logged-in user correctly gets email and can_login'); - ok(!exists $item->{email_enabled} - && !exists $item->{login_denied_text}, - "Non-admin user doesn't get email_enabled and login_denied_text"); - } - else { - my @item_keys = sort keys %$item; - is_deeply(\@item_keys, ['id', 'name', 'real_name'], - 'Only id, name, and real_name are returned to logged-out users'); - return; - } + if ($user eq 'admin') { + ok( + exists $item->{email} + && exists $item->{can_login} + && exists $item->{email_enabled} + && exists $item->{login_denied_text}, + 'Admin correctly gets all user fields' + ); + } + elsif ($user) { + ok( + exists $item->{email} && exists $item->{can_login}, + 'Logged-in user correctly gets email and can_login' + ); + ok( + !exists $item->{email_enabled} && !exists $item->{login_denied_text}, + "Non-admin user doesn't get email_enabled and login_denied_text" + ); + } + else { + my @item_keys = sort keys %$item; + is_deeply( + \@item_keys, + ['id', 'name', 'real_name'], + 'Only id, name, and real_name are returned to logged-out users' + ); + return; + } - my $username = $config->{"${user}_user_login"}; - # FIXME: We have no way to create a saved search or a saved report from - # the WebService, so we cannot test that the correct data is returned - # if the user is accessing his own account. - if ($username eq $item->{name}) { - ok(exists $item->{saved_searches}, - 'Users can get the list of saved searches and reports for their own account'); - } - else { - ok(!exists $item->{saved_searches}, - "Users cannot get the list of saved searches and reports from someone else's acccount"); - } + my $username = $config->{"${user}_user_login"}; + + # FIXME: We have no way to create a saved search or a saved report from + # the WebService, so we cannot test that the correct data is returned + # if the user is accessing his own account. + if ($username eq $item->{name}) { + ok(exists $item->{saved_searches}, + 'Users can get the list of saved searches and reports for their own account'); + } + else { + ok( + !exists $item->{saved_searches}, + "Users cannot get the list of saved searches and reports from someone else's acccount" + ); + } - my @groups = map { $_->{name} } @{$item->{groups}}; - # Admins can see all groups a user belongs to (assuming they inherited - # membership for all groups). Same for a user querying his own account. - if ($username eq $item->{name} || $user eq 'admin') { - if ($username eq $get_user) { - ok(!scalar @groups, "The unprivileged user doesn't belong to any group"); - } - elsif ($username eq $canconfirm_user) { - ok(grep($_ eq 'canconfirm', @groups), "Group 'canconfirm' returned"); - } + my @groups = map { $_->{name} } @{$item->{groups}}; + + # Admins can see all groups a user belongs to (assuming they inherited + # membership for all groups). Same for a user querying his own account. + if ($username eq $item->{name} || $user eq 'admin') { + if ($username eq $get_user) { + ok(!scalar @groups, "The unprivileged user doesn't belong to any group"); } - else { - ok(!scalar @groups, "No groups are visible to users without bless privs"); + elsif ($username eq $canconfirm_user) { + ok(grep($_ eq 'canconfirm', @groups), "Group 'canconfirm' returned"); } + } + else { + ok(!scalar @groups, "No groups are visible to users without bless privs"); + } } foreach my $rpc (@clients) { - $rpc->bz_run_tests(tests => \@tests, method => 'User.get', - post_success => \&post_success); - - ############################# - # Include and Exclude Tests # - ############################# - - my $include_nothing = $rpc->bz_call_success('User.get', { - names => [$get_user], include_fields => ['asdfasdfsdf'], - }, 'User.get including only invalid fields'); - is(scalar keys %{ $include_nothing->result->{users}->[0] }, 0, - 'No fields returned for user'); - - my $include_one = $rpc->bz_call_success('User.get', { - names => [$get_user], include_fields => ['id'], - }, 'User.get including only id'); - is(scalar keys %{ $include_one->result->{users}->[0] }, 1, - 'Only one field returned for user'); - - my $exclude_none = $rpc->bz_call_success('User.get', { - names => [$get_user], exclude_fields => ['asdfasdfsdf'], - }, 'User.get excluding only invalid fields'); - is(scalar keys %{ $exclude_none->result->{users}->[0] }, 3, - 'All fields returned for user'); - - my $exclude_one = $rpc->bz_call_success('User.get', { - names => [$get_user], exclude_fields => ['id'], - }, 'User.get excluding id'); - is(scalar keys %{ $exclude_one->result->{users}->[0] }, 2, - 'Only two fields returned for user'); - - my $override = $rpc->bz_call_success('User.get', { - names => [$get_user], include_fields => ['id', 'name'], - exclude_fields => ['id'] - }, 'User.get with both include and exclude'); - is(scalar keys %{ $override->result->{users}->[0] }, 1, - 'Only one field returned'); - ok(exists $override->result->{users}->[0]->{name}, - '...and that field is the "name" field'); + $rpc->bz_run_tests( + tests => \@tests, + method => 'User.get', + post_success => \&post_success + ); + + ############################# + # Include and Exclude Tests # + ############################# + + my $include_nothing = $rpc->bz_call_success( + 'User.get', + {names => [$get_user], include_fields => ['asdfasdfsdf'],}, + 'User.get including only invalid fields' + ); + is(scalar keys %{$include_nothing->result->{users}->[0]}, + 0, 'No fields returned for user'); + + my $include_one = $rpc->bz_call_success( + 'User.get', + {names => [$get_user], include_fields => ['id'],}, + 'User.get including only id' + ); + is(scalar keys %{$include_one->result->{users}->[0]}, + 1, 'Only one field returned for user'); + + my $exclude_none = $rpc->bz_call_success( + 'User.get', + {names => [$get_user], exclude_fields => ['asdfasdfsdf'],}, + 'User.get excluding only invalid fields' + ); + is(scalar keys %{$exclude_none->result->{users}->[0]}, + 3, 'All fields returned for user'); + + my $exclude_one = $rpc->bz_call_success( + 'User.get', + {names => [$get_user], exclude_fields => ['id'],}, + 'User.get excluding id' + ); + is(scalar keys %{$exclude_one->result->{users}->[0]}, + 2, 'Only two fields returned for user'); + + my $override = $rpc->bz_call_success( + 'User.get', + { + names => [$get_user], + include_fields => ['id', 'name'], + exclude_fields => ['id'] + }, + 'User.get with both include and exclude' + ); + is(scalar keys %{$override->result->{users}->[0]}, 1, + 'Only one field returned'); + ok( + exists $override->result->{users}->[0]->{name}, + '...and that field is the "name" field' + ); } diff --git a/qa/t/webservice_user_login_logout.t b/qa/t/webservice_user_login_logout.t index a6abec88e..8c86ac0e8 100644 --- a/qa/t/webservice_user_login_logout.t +++ b/qa/t/webservice_user_login_logout.t @@ -19,106 +19,115 @@ my ($config, @clients) = get_rpc_clients(); use constant INVALID_EMAIL => '@invalid_user@'; -my $user = $config->{unprivileged_user_login}; -my $pass = $config->{unprivileged_user_passwd}; +my $user = $config->{unprivileged_user_login}; +my $pass = $config->{unprivileged_user_passwd}; my $error = "The username or password you entered is not valid"; my @tests = ( - { user => 'unprivileged', - test => "Unprivileged user can log in successfully", - }, + {user => 'unprivileged', test => "Unprivileged user can log in successfully",}, - { args => { login => $user, password => '' }, - error => $error, - test => "Empty password can't log in", - }, - { args => { login => '', password => $pass }, - error => $error, - test => "Empty login can't log in", - }, - { args => { login => $user }, - error => "requires a password argument", - test => "Undef password can't log in", - }, - { args => { password => $pass }, - error => "requires a login argument", - test => "Undef login can't log in", - }, + { + args => {login => $user, password => ''}, + error => $error, + test => "Empty password can't log in", + }, + { + args => {login => '', password => $pass}, + error => $error, + test => "Empty login can't log in", + }, + { + args => {login => $user}, + error => "requires a password argument", + test => "Undef password can't log in", + }, + { + args => {password => $pass}, + error => "requires a login argument", + test => "Undef login can't log in", + }, - { args => { login => INVALID_EMAIL, password => $pass }, - error => $error, - test => "Invalid email can't log in", - }, - { args => { login => $user, password => '*' }, - error => $error, - test => "Invalid password can't log in", - }, + { + args => {login => INVALID_EMAIL, password => $pass}, + error => $error, + test => "Invalid email can't log in", + }, + { + args => {login => $user, password => '*'}, + error => $error, + test => "Invalid password can't log in", + }, - { args => { login => $config->{disabled_user_login}, - password => $config->{disabled_user_passwd} }, - error => "!!This is the text!!", - test => "Can't log in with a disabled account", - }, - { args => { login => $config->{disabled_user_login}, password => '*' }, - error => $error, - test => "Logging in with invalid password doesn't show disabledtext", + { + args => { + login => $config->{disabled_user_login}, + password => $config->{disabled_user_passwd} }, + error => "!!This is the text!!", + test => "Can't log in with a disabled account", + }, + { + args => {login => $config->{disabled_user_login}, password => '*'}, + error => $error, + test => "Logging in with invalid password doesn't show disabledtext", + }, ); sub _login_args { - my $args = shift; - my %fixed_args = %$args; - $fixed_args{Bugzilla_login} = delete $fixed_args{login}; - $fixed_args{Bugzilla_password} = delete $fixed_args{password}; - return \%fixed_args; + my $args = shift; + my %fixed_args = %$args; + $fixed_args{Bugzilla_login} = delete $fixed_args{login}; + $fixed_args{Bugzilla_password} = delete $fixed_args{password}; + return \%fixed_args; } foreach my $rpc (@clients) { - if ($rpc->bz_get_mode) { - $rpc->bz_call_fail('User.logout', undef, 'must use HTTP POST', - 'User.logout fails when called via GET'); - } + if ($rpc->bz_get_mode) { + $rpc->bz_call_fail( + 'User.logout', undef, + 'must use HTTP POST', + 'User.logout fails when called via GET' + ); + } - foreach my $t (@tests) { - if ($t->{user}) { - my $username = $config->{$t->{user} . '_user_login'}; - my $password = $config->{$t->{user} . '_user_passwd'}; + foreach my $t (@tests) { + if ($t->{user}) { + my $username = $config->{$t->{user} . '_user_login'}; + my $password = $config->{$t->{user} . '_user_passwd'}; - if ($rpc->bz_get_mode) { - $rpc->bz_call_fail('User.login', - { login => $username, password => $password }, - 'must use HTTP POST', $t->{test} . ' (fails on GET)'); - } - else { - $rpc->bz_log_in($t->{user}); - ok($rpc->{_bz_credentials}->{token}, 'Login token returned'); - $rpc->bz_call_success('User.logout'); - } + if ($rpc->bz_get_mode) { + $rpc->bz_call_fail( + 'User.login', + {login => $username, password => $password}, + 'must use HTTP POST', + $t->{test} . ' (fails on GET)' + ); + } + else { + $rpc->bz_log_in($t->{user}); + ok($rpc->{_bz_credentials}->{token}, 'Login token returned'); + $rpc->bz_call_success('User.logout'); + } - if ($t->{error}) { - $rpc->bz_call_fail('Bugzilla.version', - { Bugzilla_login => $username, - Bugzilla_password => $password }); - } - else { - $rpc->bz_call_success('Bugzilla.version', - { Bugzilla_login => $username, - Bugzilla_password => $password }); - } - } - else { - # Under GET, there's no reason to have extra failing tests. - if (!$rpc->bz_get_mode) { - $rpc->bz_call_fail('User.login', $t->{args}, $t->{error}, - $t->{test}); - } - if (defined $t->{args}->{login} - and defined $t->{args}->{password}) - { - my $fixed_args = _login_args($t->{args}); - $rpc->bz_call_fail('Bugzilla.version', $fixed_args, - $t->{error}, "Bugzilla_login: " . $t->{test}); - } - } + if ($t->{error}) { + $rpc->bz_call_fail('Bugzilla.version', + {Bugzilla_login => $username, Bugzilla_password => $password}); + } + else { + $rpc->bz_call_success('Bugzilla.version', + {Bugzilla_login => $username, Bugzilla_password => $password}); + } + } + else { + # Under GET, there's no reason to have extra failing tests. + if (!$rpc->bz_get_mode) { + $rpc->bz_call_fail('User.login', $t->{args}, $t->{error}, $t->{test}); + } + if (defined $t->{args}->{login} and defined $t->{args}->{password}) { + my $fixed_args = _login_args($t->{args}); + $rpc->bz_call_fail('Bugzilla.version', $fixed_args, $t->{error}, + "Bugzilla_login: " . $t->{test}); + } } + } } diff --git a/qa/t/webservice_user_offer_account_by_email.t b/qa/t/webservice_user_offer_account_by_email.t index e9392bab5..10b5714b2 100644 --- a/qa/t/webservice_user_offer_account_by_email.t +++ b/qa/t/webservice_user_offer_account_by_email.t @@ -20,40 +20,45 @@ my ($config, $xmlrpc, $jsonrpc, $jsonrpc_get) = get_rpc_clients(); use constant INVALID_EMAIL => '()[]\;:,<>@webservice.test'; sub new_login { - return 'requested_' . random_string() . '@webservice.test'; + return 'requested_' . random_string() . '@webservice.test'; } -$jsonrpc_get->bz_call_fail('User.offer_account_by_email', - { email => new_login() }, - 'must use HTTP POST', 'offer_account_by_email fails over GET'); +$jsonrpc_get->bz_call_fail( + 'User.offer_account_by_email', + {email => new_login()}, + 'must use HTTP POST', + 'offer_account_by_email fails over GET' +); # Have to wrap @tests in the foreach so that new_login returns something # different each time. foreach my $rpc ($jsonrpc, $xmlrpc) { - my @tests = ( - # Login name checks. - { args => { }, - error => "argument was not set", - test => 'Leaving out email argument fails', - }, - { args => { email => '' }, - error => "argument was not set", - test => "Passing an empty email argument fails", - }, - { args => { email => INVALID_EMAIL }, - error => "didn't pass our syntax checking", - test => 'Invalid email address fails', - }, - { args => { email => $config->{unprivileged_user_login} }, - error => "There is already an account", - test => 'Trying to use an existing login name fails', - }, - - { args => { email => new_login() }, - test => 'Valid, non-existing email passes.', - }, - ); - - $rpc->bz_run_tests(tests => \@tests, - method => 'User.offer_account_by_email'); + my @tests = ( + + # Login name checks. + { + args => {}, + error => "argument was not set", + test => 'Leaving out email argument fails', + }, + { + args => {email => ''}, + error => "argument was not set", + test => "Passing an empty email argument fails", + }, + { + args => {email => INVALID_EMAIL}, + error => "didn't pass our syntax checking", + test => 'Invalid email address fails', + }, + { + args => {email => $config->{unprivileged_user_login}}, + error => "There is already an account", + test => 'Trying to use an existing login name fails', + }, + + {args => {email => new_login()}, test => 'Valid, non-existing email passes.',}, + ); + + $rpc->bz_run_tests(tests => \@tests, method => 'User.offer_account_by_email'); } |