summaryrefslogtreecommitdiffstats
path: root/qa/t
diff options
context:
space:
mode:
Diffstat (limited to 'qa/t')
-rw-r--r--qa/t/archived/test_email_preferences.t367
-rw-r--r--qa/t/lib/QA/REST.pm61
-rw-r--r--qa/t/lib/QA/RPC.pm454
-rw-r--r--qa/t/lib/QA/RPC/JSONRPC.pm192
-rw-r--r--qa/t/lib/QA/RPC/XMLRPC.pm2
-rw-r--r--qa/t/lib/QA/Tests.pm114
-rw-r--r--qa/t/lib/QA/Util.pm593
-rw-r--r--qa/t/rest_bugzilla.t31
-rw-r--r--qa/t/rest_classification.t76
-rw-r--r--qa/t/selenium_server_start.t76
-rw-r--r--qa/t/selenium_server_stop.t2
-rw-r--r--qa/t/test_bmo_autolinkification.t12
-rw-r--r--qa/t/test_bmo_enter_new_bug.t384
-rw-r--r--qa/t/test_bmo_retire_values.t141
-rw-r--r--qa/t/test_bug_edit.t354
-rw-r--r--qa/t/test_choose_priority.t9
-rw-r--r--qa/t/test_classifications.t48
-rw-r--r--qa/t/test_config.t14
-rw-r--r--qa/t/test_create_user_accounts.t119
-rw-r--r--qa/t/test_custom_fields.t149
-rw-r--r--qa/t/test_custom_fields_admin.t45
-rw-r--r--qa/t/test_default_groups.t62
-rw-r--r--qa/t/test_dependencies.t13
-rw-r--r--qa/t/test_edit_products_properties.t254
-rw-r--r--qa/t/test_enter_new_bug.t22
-rw-r--r--qa/t/test_flags.t208
-rw-r--r--qa/t/test_flags2.t110
-rw-r--r--qa/t/test_groups.t123
-rw-r--r--qa/t/test_keywords.t35
-rw-r--r--qa/t/test_login.t3
-rw-r--r--qa/t/test_milestones.t117
-rw-r--r--qa/t/test_private_attachments.t98
-rw-r--r--qa/t/test_qa_contact.t81
-rw-r--r--qa/t/test_require_login.t64
-rw-r--r--qa/t/test_sanity_check.t42
-rw-r--r--qa/t/test_saved_searches.t42
-rw-r--r--qa/t/test_search.t14
-rw-r--r--qa/t/test_security.t61
-rw-r--r--qa/t/test_shared_searches.t81
-rw-r--r--qa/t/test_show_all_products.t17
-rw-r--r--qa/t/test_status_whiteboard.t10
-rw-r--r--qa/t/test_sudo_sessions.t68
-rw-r--r--qa/t/test_target_milestones.t34
-rw-r--r--qa/t/test_time_summary.t16
-rw-r--r--qa/t/test_user_groups.t155
-rw-r--r--qa/t/test_user_matching.t86
-rw-r--r--qa/t/test_user_preferences.t90
-rw-r--r--qa/t/test_user_privs.t37
-rw-r--r--qa/t/test_votes.t99
-rw-r--r--qa/t/webservice_bug_add_attachment.t411
-rw-r--r--qa/t/webservice_bug_add_comment.t301
-rw-r--r--qa/t/webservice_bug_attachments.t213
-rw-r--r--qa/t/webservice_bug_comments.t228
-rw-r--r--qa/t/webservice_bug_create.t379
-rw-r--r--qa/t/webservice_bug_fields.t341
-rw-r--r--qa/t/webservice_bug_get.t187
-rw-r--r--qa/t/webservice_bug_get_bugs.t190
-rw-r--r--qa/t/webservice_bug_history.t13
-rw-r--r--qa/t/webservice_bug_legal_values.t120
-rw-r--r--qa/t/webservice_bug_search.t246
-rw-r--r--qa/t/webservice_bug_update.t1406
-rw-r--r--qa/t/webservice_bug_update_see_also.t71
-rw-r--r--qa/t/webservice_bugzilla.t43
-rw-r--r--qa/t/webservice_group_create.t157
-rw-r--r--qa/t/webservice_jsonp.t25
-rw-r--r--qa/t/webservice_product.t138
-rw-r--r--qa/t/webservice_product_create.t321
-rw-r--r--qa/t/webservice_product_get.t138
-rw-r--r--qa/t/webservice_user_create.t170
-rw-r--r--qa/t/webservice_user_get.t404
-rw-r--r--qa/t/webservice_user_login_logout.t179
-rw-r--r--qa/t/webservice_user_offer_account_by_email.t65
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 .= "&params=$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 .= "&params=$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&amp;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&amp;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&amp;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&amp;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');
}