diff --git a/mozilla/webtools/testopia/Bugzilla/Testopia/TestCaseRun.pm b/mozilla/webtools/testopia/Bugzilla/Testopia/TestCaseRun.pm index 112d68e10d8..2ec8aa4ceec 100644 --- a/mozilla/webtools/testopia/Bugzilla/Testopia/TestCaseRun.pm +++ b/mozilla/webtools/testopia/Bugzilla/Testopia/TestCaseRun.pm @@ -164,7 +164,7 @@ sub _check_case_text_version { sub new { my $invocant = shift; my $class = ref($invocant) || $invocant; - my ($param, $run_id, $build_id, $env_id) = (@_); + my ($param, $case_id, $build_id, $env_id) = (@_); my $dbh = Bugzilla->dbh; # We want to be able to supply an empty object to the templates for numerous @@ -176,11 +176,11 @@ sub new { return $param; } } - elsif ($run_id && detaint_natural($run_id) + elsif ($case_id && detaint_natural($case_id) && $build_id && detaint_natural($build_id) && $env_id && detaint_natural($env_id)){ - my $case_id = $param; + my $run_id = $param; detaint_natural($case_id) || return undef; ($param) = $dbh->selectrow_array( "SELECT case_run_id FROM test_case_runs @@ -601,39 +601,42 @@ Attaches the specified bug to this test case-run sub attach_bug { my $self = shift; - my ($bug, $caserun_id) = @_; + my ($bugs, $caserun_id) = @_; + my @bugs = Bugzilla::Testopia::TestCase::_check_bugs($bugs); $caserun_id ||= $self->{'case_run_id'}; my $dbh = Bugzilla->dbh; - + $dbh->bz_lock_tables('test_case_bugs WRITE'); - my ($exists) = $dbh->selectrow_array( - "SELECT bug_id - FROM test_case_bugs - WHERE case_run_id=? - AND bug_id=?", - undef, ($caserun_id, $bug)); - if ($exists) { - $dbh->bz_unlock_tables(); - return; - } - my ($check) = $dbh->selectrow_array( - "SELECT bug_id - FROM test_case_bugs - WHERE case_id=? - AND bug_id=? - AND case_run_id=?", - undef, ($caserun_id, $bug, undef)); - - if ($check){ - $dbh->do("UPDATE test_case_bugs - SET test_case_run_id = ? - WHERE case_id = ? - AND bug_id = ?", - undef, ($bug, $self->{'case_run_id'})); - } - else{ - $dbh->do("INSERT INTO test_case_bugs (bug_id, case_run_id, case_id) - VALUES(?,?,?)", undef, ($bug, $self->{'case_run_id'}, $self->{'case_id'})); + foreach my $bug (@bugs){ + my ($exists) = $dbh->selectrow_array( + "SELECT bug_id + FROM test_case_bugs + WHERE case_run_id=? + AND bug_id=?", + undef, ($caserun_id, $bug)); + if ($exists) { + $dbh->bz_unlock_tables(); + return; + } + my ($check) = $dbh->selectrow_array( + "SELECT bug_id + FROM test_case_bugs + WHERE case_id=? + AND bug_id=? + AND case_run_id=?", + undef, ($caserun_id, $bug, undef)); + + if ($check){ + $dbh->do("UPDATE test_case_bugs + SET test_case_run_id = ? + WHERE case_id = ? + AND bug_id = ?", + undef, ($bug, $self->{'case_run_id'})); + } + else{ + $dbh->do("INSERT INTO test_case_bugs (bug_id, case_run_id, case_id) + VALUES(?,?,?)", undef, ($bug, $self->{'case_run_id'}, $self->{'case_id'})); + } } $dbh->bz_unlock_tables(); } diff --git a/mozilla/webtools/testopia/Bugzilla/Testopia/TestRun.pm b/mozilla/webtools/testopia/Bugzilla/Testopia/TestRun.pm index 18f760ea8b9..2a18962fd78 100644 --- a/mozilla/webtools/testopia/Bugzilla/Testopia/TestRun.pm +++ b/mozilla/webtools/testopia/Bugzilla/Testopia/TestRun.pm @@ -146,7 +146,7 @@ sub _check_summary{ sub _check_manager { my ($invocant, $login) = @_; $login = trim($login); - return unless $login; + ThrowUserError('testopia-missing-required-field', {'field' => 'manager'}) unless $login; if ($login =~ /^\d+$/){ $login = Bugzilla::User->new($login); return $login->id; diff --git a/mozilla/webtools/testopia/Bugzilla/Testopia/Util.pm b/mozilla/webtools/testopia/Bugzilla/Testopia/Util.pm index bb5e22d29b5..dfea94f8b4f 100644 --- a/mozilla/webtools/testopia/Bugzilla/Testopia/Util.pm +++ b/mozilla/webtools/testopia/Bugzilla/Testopia/Util.pm @@ -38,7 +38,7 @@ use strict; use base qw(Exporter); @Bugzilla::Testopia::Util::EXPORT = qw(get_test_field_id get_time_stamp validate_test_id validate_selection - support_server_push + support_server_push process_list percentage); use Bugzilla; @@ -202,6 +202,23 @@ sub log_activity { } +sub process_list { + my ($ids) = @_; + + my @ids; + if (ref $ids eq 'ARRAY'){ + @ids = @$ids; + } + elsif ($ids =~ /,/){ + @ids = split(/[\s,]+/, $ids); + } + else { + push @ids, $ids; + } + + return @ids; +} + =head1 AUTHOR Greg Hendricks diff --git a/mozilla/webtools/testopia/Bugzilla/WebService/Testopia/TestCase.pm b/mozilla/webtools/testopia/Bugzilla/WebService/Testopia/TestCase.pm index 7f0dd2db4c0..161067fa01f 100644 --- a/mozilla/webtools/testopia/Bugzilla/WebService/Testopia/TestCase.pm +++ b/mozilla/webtools/testopia/Bugzilla/WebService/Testopia/TestCase.pm @@ -10,10 +10,14 @@ # implied. See the License for the specific language governing # rights and limitations under the License. # -# The Original Code is the Bugzilla Bug Tracking System. +# The Original Code is the Bugzilla Testopia System. # -# Contributor(s): Marc Schumann -# Dallas Harken +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Dallas Harken +# Greg Hendricks package Bugzilla::WebService::Testopia::TestCase; @@ -28,23 +32,6 @@ use Bugzilla::Testopia::Table; use base qw(Bugzilla::WebService); -sub _process_list { - my ($ids) = @_; - - my @ids; - if (ref $ids eq 'ARRAY'){ - @ids = @$ids; - } - elsif ($ids =~ /,/){ - @ids = split(/[\s,]+/, $ids); - } - else { - push @ids, $ids; - } - - return @ids; -} - sub get { my $self = shift; my ($case_id) = @_; @@ -92,7 +79,7 @@ sub create { if (ref $new_values->{'plans'} eq 'ARRAY'){ push @plan_ids, @{$new_values->{'plans'}}; } - elsif ($new_values->{'plans'} =~ /^\d+$/){ + elsif ($new_values->{'plans'} =~ /,/){ push @plan_ids, split(/[\s,]+/, $new_values->{'plans'}); } @@ -130,14 +117,13 @@ sub create { return $case; } - sub update { my $self = shift; my ($ids, $new_values) = @_; Bugzilla->login(LOGIN_REQUIRED); - my @ids = _process_list($ids); + my @ids = Bugzilla::Testopia::Util::process_list($ids); my @cases; foreach my $id (@ids){ @@ -233,7 +219,7 @@ sub attach_bug { Bugzilla->login(LOGIN_REQUIRED); - my @ids = _process_list($case_ids); + my @ids = Bugzilla::Testopia::Util::process_list($case_ids); my @results; foreach my $id (@ids){ my $case = new Bugzilla::Testopia::TestCase($id); @@ -294,7 +280,7 @@ sub add_component { Bugzilla->login(LOGIN_REQUIRED); - my @ids = _process_list($case_ids); + my @ids = Bugzilla::Testopia::Util::process_list($case_ids); my @results; foreach my $id (@ids){ my $case = new Bugzilla::Testopia::TestCase($id); @@ -355,7 +341,7 @@ sub add_tag { Bugzilla->login(LOGIN_REQUIRED); - my @ids = _process_list($case_ids); + my @ids = Bugzilla::Testopia::Util::process_list($case_ids); my @results; foreach my $id (@ids){ my $case = new Bugzilla::Testopia::TestCase($id); @@ -436,7 +422,7 @@ sub link_plan { my ($case_ids, $test_plan_id) = @_; Bugzilla->login(LOGIN_REQUIRED); - my @ids = _process_list($case_ids); + my @ids = Bugzilla::Testopia::Util::process_list($case_ids); my @results; foreach my $id (@ids){ my $case = new Bugzilla::Testopia::TestCase($id); @@ -483,7 +469,7 @@ sub add_to_run { Bugzilla->login(LOGIN_REQUIRED); - my @ids = _process_list($case_ids); + my @ids = Bugzilla::Testopia::Util::process_list($case_ids); my @results; foreach my $id (@ids){ my $case = new Bugzilla::Testopia::TestCase($id); @@ -764,7 +750,7 @@ Provides methods for automated scripts to manipulate Testopia TestCases Returns: Array: An array of case-run object hashes. -=item C +=item C Description: Get the list of changes to the fields of this case. @@ -838,11 +824,19 @@ Provides methods for automated scripts to manipulate Testopia TestCases | author | A bugzilla login (email address) | | author_type | (select from email_variants) | | case_id | comma separated integers | + | case_status | String: Status | + | case_status_id | Integer: Status | + | category | String: Category Name | + | category_id | Integer | + | component | String: Component Name | | default_tester | A bugzilla login (email address) | | default_tester_type | (select from email_variants) | + | isautomated | 1: true 0: false | | plan_id | comma separated integers | | priority | String: Priority | + | priority_id | Integer | | product | String: Product Name | + | product_id | Integer | | requirement | String: Requirement | | requirement_type | (select from query_variants) | | run_id | comma separated integers | @@ -916,17 +910,37 @@ Provides methods for automated scripts to manipulate Testopia TestCases Returns: Array: Matching test cases are retuned in a list of hashes. -=item C B Use TestCase::get instead - -=item C B Use TestCase::check_build instead +=item C + + Params: $id - Integer: ID of the case status to return -=item C B Use TestCase::get instead + Returns: String: the status name. -=item C B Use TestCase::check_build instead +=item C B Use check_category instead -=item C B Use TestCase::get instead +=item C + + Params: $id - Integer: ID of the case status to return + + Returns: String: the status name. -=item C B Use TestCase::check_build instead +=item C + + Params: $name - String: the status name. + + Returns: Integer: ID of the case status. + +=item C + + Params: $id - Integer: ID of the case status to return + + Returns: String: the status name. + +=item C + + Params: $name - String: the status name. + + Returns: Integer: ID of the case status. =item C @@ -961,7 +975,7 @@ Provides methods for automated scripts to manipulate Testopia TestCases =item C - Description: Updates the fields of the selected build or builds. + Description: Updates the fields of the selected case or cases. Params: $ids - Integer/String/Array Integer: A single TestCase ID. @@ -972,9 +986,9 @@ Provides methods for automated scripts to manipulate Testopia TestCases $values - Hash of keys matching TestCase fields and the new values to set each field to. - Returns: Hash/Array: In the case of a single build it is returned. If a - list was passed, it returns an array of build hashes. If the - update on any particular build failed, the has will contain a + Returns: Hash/Array: In the case of a single case it is returned. If a + list was passed, it returns an array of case hashes. If the + update on any particular case failed, the has will contain a FAILED key and the message as to why it failed. =back diff --git a/mozilla/webtools/testopia/Bugzilla/WebService/Testopia/TestCaseRun.pm b/mozilla/webtools/testopia/Bugzilla/WebService/Testopia/TestCaseRun.pm index f558ca362e2..9d6c78c3d62 100644 --- a/mozilla/webtools/testopia/Bugzilla/WebService/Testopia/TestCaseRun.pm +++ b/mozilla/webtools/testopia/Bugzilla/WebService/Testopia/TestCaseRun.pm @@ -10,10 +10,14 @@ # implied. See the License for the specific language governing # rights and limitations under the License. # -# The Original Code is the Bugzilla Bug Tracking System. +# The Original Code is the Bugzilla Testopia System. # -# Contributor(s): Marc Schumann -# Dallas Harken +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Dallas Harken +# Greg Hendricks package Bugzilla::WebService::Testopia::TestCaseRun; @@ -22,234 +26,611 @@ use strict; use base qw(Bugzilla::WebService); use Bugzilla::User; +use Bugzilla::Constants; use Bugzilla::Testopia::Constants; use Bugzilla::Testopia::Search; use Bugzilla::Testopia::Table; use Bugzilla::Testopia::TestCaseRun; +use Bugzilla::Testopia::Util; -# Utility method called by the list method -sub _list -{ +sub get { + my $self = shift; + my ($run_id, $case_id, $build_id, $env_id) = @_; + + Bugzilla->login(LOGIN_REQUIRED); + + #Result is a test case run hash map + my $caserun = new Bugzilla::Testopia::TestCaseRun($run_id, $case_id, $build_id, $env_id); + + ThrowUserError('invalid-test-id-non-existent', {type => 'Test Case Run', id => $run_id}) unless $caserun; + ThrowUserError('testopia-permission-denied', {'object' => $caserun}) unless $caserun->canview; + + return $caserun; +} + +sub list { + my $self = shift; my ($query) = @_; + + Bugzilla->login(LOGIN_REQUIRED); my $cgi = Bugzilla->cgi; - + $cgi->param("current_tab", "case_run"); - foreach (keys(%$query)) - { + foreach (keys(%$query)){ $cgi->param($_, $$query{$_}); } my $search = Bugzilla::Testopia::Search->new($cgi); - # Result is an array of test case run hash maps - return Bugzilla::Testopia::Table->new('case_run', - 'tr_xmlrpc.cgi', - $cgi, - undef, - $search->query() - )->list(); + return Bugzilla::Testopia::Table->new('case_run','tr_xmlrpc.cgi',$cgi,undef,$search->query())->list(); } -sub get -{ +sub create { my $self = shift; - my ($test_case_run_id) = @_; - - $self->login; - - #Result is a test case run hash map - my $test_case_run = new Bugzilla::Testopia::TestCaseRun($test_case_run_id); - - if (not defined $test_case_run) - { - $self->logout; - die "TestcaseRun, " . $test_case_run_id . ", not found"; - } - - if (not $test_case_run->canview) - { - $self->logout; - die "User Not Authorized"; - } - - $self->logout; - - return $test_case_run; - -} - -sub get_bugs -{ - my $self = shift; - my ($test_case_run_id) = @_; - - $self->login; - - my $test_case_run = new Bugzilla::Testopia::TestCaseRun($test_case_run_id); - - if (not defined $test_case_run) - { - $self->logout; - die "TestcaseRun, " . $test_case_run_id . ", not found"; - } - - if (not $test_case_run->canview) - { - $self->logout; - die "User Not Authorized"; - } - - my $result = $test_case_run->bugs; - - $self->logout; - - # Result is list of bugs for the given test case run - return $result; -} - -sub list -{ - my $self = shift; - my ($query) = @_; - - $self->login; - - my $list = _list($query); - - $self->logout; - - return $list; -} - -sub create -{ - my $self =shift; my ($new_values) = @_; + + Bugzilla->login(LOGIN_REQUIRED); + + my $run = Bugzilla::Testopia::TestCaseRun->new($new_values->{'run_id'}); + ThrowUserError('invalid-test-id-non-existent', {type => 'Test Run', id => $new_values->{'run_id'}}) unless $run; + ThrowUserError('testopia-read-only', {'object' => $run}) unless $run->canedit; + + if ($new_values->{'status'}){ + $new_values->{'case_run_status_id'} = Bugzilla::Testopia::TestCaseRun::lookup_status_by_name($new_values->{'status'}); + delete $new_values->{'status'}; + } $new_values->{'case_run_status_id'} = IDLE unless $new_values->{'case_run_status_id'}; - $self->login; - - my $test_case_run = Bugzilla::Testopia::TestCaseRun->create($new_values); + my $caserun = Bugzilla::Testopia::TestCaseRun->create($new_values); - $self->logout; - - # Result is new test case run id - return $test_case_run->id; + # Result is new test case run object hash + return $caserun; } -sub update -{ - my $self =shift; - my ($run_id, $case_id, $build_id, $environment_id, $new_values) = @_; +sub update { + my $self = shift; + my ($run_id, $case_id, $build_id, $env_id, $new_values) = @_; - $self->login; - - my $test_case_run = new Bugzilla::Testopia::TestCaseRun($case_id, - $run_id, - $build_id, - $environment_id - ); - - if (not defined $test_case_run) - { - $self->logout; - die "TestCaseRun for build_id = " . $build_id . - ", case_id = " . $case_id . - ", environment_id = " . $environment_id . - ", run_id = " . $run_id . - ", not found"; - } - - if (not $test_case_run->canedit) - { - $self->logout; - die "User Not Authorized"; - } - - # Check to see what has changed then use set methods - # The order is important. We need to check if the build or environment has - # Changed so that we can switch to the right record first. - if (defined($$new_values{build_id})) - { - $test_case_run = $test_case_run->switch($$new_values{build_id}, $environment_id ,$run_id, $case_id); - } - - if (defined($$new_values{environment_id})) - { - $test_case_run = $test_case_run->switch($build_id, $$new_values{environment_id} ,$run_id, $case_id); - } - - if (defined($$new_values{assignee})) - { - $test_case_run->set_assignee($$new_values{assignee}); - } - - if (defined($$new_values{case_run_status_id})) - { - $test_case_run->set_status($$new_values{case_run_status_id}, $$new_values{update_bugs}); - } - - if (defined($$new_values{notes})) - { - $test_case_run->append_note($$new_values{notes}); - } + Bugzilla->login(LOGIN_REQUIRED); - # Remove assignee user object and replace with just assignee id - if (ref($$test_case_run{assignee}) eq 'Bugzilla::User') - { - $$test_case_run{assignee} = $$test_case_run{assignee}->id(); + my @caseruns; + my @ids = use Bugzilla::Testopia::Util::process_list($run_id); + if (ref $case_id eq 'HASH' && !$build_id){ + $new_values = $case_id; + foreach my $id (@ids){ + my $caserun = new Bugzilla::Testopia::TestCaseRun($run_id); + if ($caserun){ + push @caseruns, $caserun; + } + else { + push @caseruns, {FAILED => 1, message => 'Case-run does not exist'}; + } + } + } + else { + foreach my $id (@ids){ + my $caserun = new Bugzilla::Testopia::TestCaseRun($run_id,$case_id,$build_id,$env_id); + if ($caserun){ + push @caseruns, $caserun; + } + else { + push @caseruns, {FAILED => 1, message => 'Case-run does not exist'}; + } + } } - $self->logout; + if ($new_values->{'status'}){ + $new_values->{'case_run_status_id'} = Bugzilla::Testopia::TestCaseRun::lookup_status_by_name($new_values->{'status'}); + delete $new_values->{'status'}; + } - #Remove attributes we do not want to publish - delete $$test_case_run{bugs}; - delete $$test_case_run{build}; - delete $$test_case_run{case}; - delete $$test_case_run{environment}; - delete $$test_case_run{run}; + my @results; + foreach my $caserun (@caseruns){ + if ($caserun->{'FAILED'}){ + push @results, $caserun; + next; + } + unless ($caserun->canedit){ + push @results, {FAILED => 1, message => "You do not have rights to edit this test case"}; + next; + } + + $run_id = $caserun->run_id; + $case_id = $caserun->case_id; + $build_id ||= $caserun->build_id; + $env_id ||= $caserun->env_id; - # Result is modified test case run on success, otherwise an exception will be thrown - return $test_case_run; + # Check to see what has changed then use set methods + # The order is important. We need to check if the build or environment has + # Changed so that we can switch to the right record first. + if ($new_values->{'build_id'} && $new_values->{'environment_id'}){ + $caserun = $caserun->switch($new_values->{'build_id'}, $new_values->{'environment_id'}, $run_id, $case_id); + } + elsif ($new_values->{'build_id'}){ + $caserun = $caserun->switch($new_values->{'build_id'}, $env_id, $run_id, $case_id); + } + elsif ($new_values->{'environment_id'}){ + $caserun = $caserun->switch($build_id, $new_values->{'environment_id'}, $run_id, $case_id); + } + + if ($new_values->{'assignee'}){ + $caserun->set_assignee($new_values->{'assignee'}); + } + + if ($new_values->{'case_run_status_id'}){ + $caserun->set_status($new_values->{'case_run_status_id'}, $new_values->{'update_bugs'}); + } + + if ($new_values->{'sortkey'}){ + $caserun->set_sortkey($new_values->{'sortkey'}); + } + + if ($new_values->{'notes'}){ + $caserun->append_note($new_values->{'notes'}); + } + + # Remove assignee user object and replace with just assignee id + if (ref $caserun{'assignee'} eq 'Bugzilla::User'){ + $caserun{assignee} = $caserun{assignee}->id(); + } + + # Result is modified test case run on success, otherwise an exception will be thrown + push @results, $caserun; + } + return @results; } -sub lookup_status_id_by_name -{ - my $self =shift; +sub lookup_status_id_by_name { + my $self = shift; my ($name) = @_; - $self->login; - - my $result = Bugzilla::Testopia::TestCaseRun::lookup_status_by_name($name); - - $self->logout; + Bugzilla->login(LOGIN_REQUIRED); # Result is test case run status id for the given test case run status name - return $result; + return Bugzilla::Testopia::TestCaseRun::lookup_status_by_name($name); } -sub lookup_status_name_by_id -{ - my $self =shift; +sub lookup_status_name_by_id { + my $self = shift; my ($id) = @_; - $self->login; + Bugzilla->login(LOGIN_REQUIRED); my $test_case_run = new Bugzilla::Testopia::TestCaseRun({}); - - my $result = $test_case_run->lookup_status($id); - $self->logout; - - if (!defined $result) - { - $result = 0; - }; - # Result is test case run status name for the given test case run status id - return $result; + return $test_case_run->lookup_status($id); +} + +sub get_history { + my $self = shift; + my ($run_id, $case_id, $build_id, $env_id) = @_; + + Bugzilla->login(LOGIN_REQUIRED); + + #Result is a test case run hash map + my $caserun = new Bugzilla::Testopia::TestCaseRun($run_id, $case_id, $build_id, $env_id); + + ThrowUserError('invalid-test-id-non-existent', {type => 'Test Case Run', id => $run_id}) unless $caserun; + ThrowUserError('testopia-permission-denied', {'object' => $caserun}) unless $caserun->canview; + + return $caserun->get_case_run_list; + +} + +sub attach_bug { + my $self = shift; + my ($run_id, $case_id, $build_id, $env_id, $bug_ids) = @_; + + Bugzilla->login(LOGIN_REQUIRED); + + #Result is a test case run hash map + my $caserun = new Bugzilla::Testopia::TestCaseRun($run_id, $case_id, $build_id, $env_id); + + # If we have just the id, the third arg will not be set. + $bug_ids = $case_id unless $build_id; + + ThrowUserError('invalid-test-id-non-existent', {type => 'Test Case Run', id => $run_id}) unless $caserun; + ThrowUserError('testopia-read-only', {'object' => $caserun}) unless $caserun->canedit; + + $caserun->attach_bug($bug_ids); + + return undef; +} + +sub detach_bug { + my $self = shift; + my ($run_id, $case_id, $build_id, $env_id, $bug_id) = @_; + + Bugzilla->login(LOGIN_REQUIRED); + + #Result is a test case run hash map + my $caserun = new Bugzilla::Testopia::TestCaseRun($run_id, $case_id, $build_id, $env_id); + + # If we have just the id, the third arg will not be set. + $bug_id = $case_id unless $build_id; + + ThrowUserError('invalid-test-id-non-existent', {type => 'Test Case Run', id => $run_id}) unless $caserun; + ThrowUserError('testopia-read-only', {'object' => $caserun}) unless $caserun->canedit; + + $caserun->detach_bug($bug_ids); + + # Result 0 on success, otherwise an exception will be thrown + return 0; +} + +sub get_bugs { + my $self = shift; + my ($run_id, $case_id, $build_id, $env_id) = @_; + + Bugzilla->login(LOGIN_REQUIRED); + + #Result is a test case run hash map + my $caserun = new Bugzilla::Testopia::TestCaseRun($run_id, $case_id, $build_id, $env_id); + + ThrowUserError('invalid-test-id-non-existent', {type => 'Test Case Run', id => $run_id}) unless $caserun; + ThrowUserError('testopia-permission-denied', {'object' => $caserun}) unless $caserun->canview; + + return $caserun->bugs; +} + +sub get_completion_time { + my $self = shift; + my ($run_id, $case_id, $build_id, $env_id) = @_; + + Bugzilla->login(LOGIN_REQUIRED); + + #Result is a test case run hash map + my $caserun = new Bugzilla::Testopia::TestCaseRun($run_id, $case_id, $build_id, $env_id); + + ThrowUserError('invalid-test-id-non-existent', {type => 'Test Case Run', id => $run_id}) unless $caserun; + ThrowUserError('testopia-permission-denied', {'object' => $caserun}) unless $caserun->canview; + + return $caserun->completion_time; } 1; + +__END__ + +=head1 NAME + +Bugzilla::Testopia::Webservice::TestCaseRun + +=head1 EXTENDS + +Bugzilla::Webservice + +=head1 DESCRIPTION + +Provides methods for automated scripts to manipulate Testopia TestCaseRuns. + +=head1 SYNOPSIS + +Test case-runs are the mapping of a test case in a given run for a particular +build and environment. There are therefore two ways to refer to a given +case-run: + + By ID: The unique case_run_id + By Combination: $run_id, $case_id, $build_id, $environment_id + +TestCaseRun methods are therefore overloaded to support either of these two +methods of looking up the case-run you are interested in. + +B + +TestCaseRun->get($caserun_id) +TestCaseRun->get($run_id, $case_id, $build_id, $environment_id) + +=head1 METHODS + +=over + +=item C + + Description: Add one or more bugs to the selected test case-runs. + + Params: $case_run_id - Integer: An integer representing the ID in the database. + + $bug_ids - Integer/Array/String: An integer or alias representing the ID in the database, + an array of bug_ids or aliases, or a string of comma separated bug_ids. + + Returns: undef. + +=item C + + Description: Add one or more bugs to the selected test case-runs. + + Params: $case_id - Integer: An integer representing the ID of the test case in the database. + $run_id - Integer: An integer representing the ID of the test run in the database. + $build_id - Integer: An integer representing the ID of the test build in the database. + $environment_id - Integer: An integer representing the ID of the environment in the database. + + $bug_ids - Integer/Array/String: An integer or alias representing the ID in the database, + an array of bug_ids or aliases, or a string of comma separated bug_ids. + + Returns: undef. + +=item C + + Description: Creates a new Test Case Run object and stores it in the database. + + Params: $values - Hash: A reference to a hash with keys and values + matching the fields of the test case to be created. + + Returns: The newly created object hash. + +=item C + + Description: Remove a bug from a test case-run. + + Params: $caserun_id - Integer: An integer representing the ID in the database. + + $bug_ids - Integer/Array/String: An integer or alias representing the ID in the database, + an array of bug_ids or aliases, or a string of comma separated bug_ids. + + Returns: undef. + +=item C + + Description: Remove a bug from a test case-run. + + Params: $case_id - Integer: An integer representing the ID of the test case in the database. + $run_id - Integer: An integer representing the ID of the test run in the database. + $build_id - Integer: An integer representing the ID of the test build in the database. + $environment_id - Integer: An integer representing the ID of the environment in the database. + + $bug_id - Integer: An integer or alias representing the ID of + the bug in the database, + + Returns: undef. + +=item C + + Description: Used to load an existing test case-run from the database. + + Params: $caserun_id - Integer: An integer representing the ID in + the database for this case-run. + + Returns: A blessed Bugzilla::Testopia::TestCase object hash + +=item C + + Description: Used to load an existing test case from the database. + + Params: $case_id - Integer: An integer representing the ID of the test case in the database. + $run_id - Integer: An integer representing the ID of the test run in the database. + $build_id - Integer: An integer representing the ID of the test build in the database. + $environment_id - Integer: An integer representing the ID of the environment in the database. + + Returns: A blessed Bugzilla::Testopia::TestCase object hash + +=item C + + Description: Get the list of bugs that are associated with this test case. + + Params: $caserun_id - Integer: An integer representing the ID in + the database for this case-run. + + Returns: Array: An array of bug object hashes. + +=item C + + Description: Get the list of bugs that are associated with this test case. + + Params: $case_id - Integer: An integer representing the ID of the test case in the database. + $run_id - Integer: An integer representing the ID of the test run in the database. + $build_id - Integer: An integer representing the ID of the test build in the database. + $environment_id - Integer: An integer representing the ID of the environment in the database. + + Returns: Array: An array of bug object hashes. + +=item C + + Description: Get the list of components attached to this case. + + Params: $caserun_id - Integer: An integer representing the ID in + the database for this case-run. + + Returns: Array: An array of component object hashes. + +=item C + + Description: Get the list of components attached to this case. + + Params: $case_id - Integer: An integer representing the ID of the test case in the database. + $run_id - Integer: An integer representing the ID of the test run in the database. + $build_id - Integer: An integer representing the ID of the test build in the database. + $environment_id - Integer: An integer representing the ID of the environment in the database. + + Returns: Array: An array of component object hashes. + +=item C + + Description: Get the list of case-runs for all runs this case appears in. + To limit this list by build or other attribute, see TestCaseRun::list. + + Params: $caserun_id - Integer: An integer representing the ID in + the database for this case-run. + + Returns: Array: An array of case-run object hashes. + +=item C + + Description: Get the list of case-runs for all runs this case appears in. + To limit this list by build or other attribute, see TestCaseRun::list. + + Params: $case_id - Integer: An integer representing the ID of the test case in the database. + $run_id - Integer: An integer representing the ID of the test run in the database. + $build_id - Integer: An integer representing the ID of the test build in the database. + $environment_id - Integer: An integer representing the ID of the environment in the database. + + Returns: Array: An array of case-run object hashes. + +=item C + + Description: Performs a search and returns the resulting list of test cases. + + Params: $query - Hash: keys must match valid search fields. + + +--------------------------------------------------------+ + | Case-Run Search Parameters | + +--------------------------------------------------------+ + | Key | Valid Values | + | andor | 1: Author AND tester, 0: OR | + | assignee | A bugzilla login (email address) | + | assignee_type | (select from email_variants) | + | build | String | + | build_id | Integer | + | case_id | comma separated integers | + | case_run_status | String: Status | + | case_run_status_id | Integer: Status | + | case_summary | String: Requirement | + | case_summary_type | (select from query_variants) | + | category | String: Category Name | + | category_id | Integer | + | component | String: Component Name | + | environment | String | + | environment_id | Integer | + | isactive | 0: Only show current 1: show all | + | isautomated | 1: true 0: false | + | milestone | String | + | notes | String | + | notes_type | (select from query_variants) | + | plan_id | comma separated integers | + | priority | String: Priority | + | priority_id | Integer | + | product | String | + | product_id | Integer | + | requirement | String: Requirement | + | requirement_type | (select from query_variants) | + | run_id | comma separated integers | + | run_product_version | String | + | run_status | 1: RUNNING 0: STOPPED | + | tags | String | + | tags_type | (select from tag_variants) | + | testedby | A bugzilla login (email address) | + | testedby_type | (select from email_variants) | + +--------------------------------------------------------+ + + +---------------------------------------------------+ + | Paging and Sorting | + +---------------------------------------------------+ + | Key | Description | + | dir | "ASC" or "DESC" | + | order | field to sort by | + +---------------------------------------------------+ + | page_size | integer: how many per page | + | page | integer: page number | + | +++++++ OR +++++++ | + | start | integer: Start with which record | + | limit | integer: limit to how many | + +---------------------------------------------------+ + | viewall | 1: returns all records | + +---------------------------------------------------+ + + +----------------------------------------------------+ + | query_variants | + +----------------+-----------------------------------+ + | Key | Description | + | allwordssubstr | contains all of the words/strings | + | anywordssubstr | contains any of the words/strings | + | substring | contains the string | + | casesubstring | contains the string (exact case) | + | allwords | contains all of the words | + | anywords | contains any of the words | + | regexp | matches the regexp | + | notregexp | doesn't match the regexp | + +----------------+-----------------------------------+ + + +-------------------------------------+ + | email_variants | + +--------------+----------------------+ + | Key | Description | + | substring | contains | + | exact | is | + | regexp | matches regexp | + | notregexp | doesn't match regexp | + +--------------+----------------------+ + + +----------------------------------------------------+ + | tag_variants | + +----------------+-----------------------------------+ + | Key | Description | + | anyexact | is tagged with | + | allwordssubstr | contains all of the words/strings | + | anywordssubstr | contains any of the words/strings | + | substring | contains the string | + | casesubstring | contains the string (exact case) | + | regexp | matches the regexp | + | notregexp | doesn't match the regexp | + | allwords | contains all of the words | + | anywords | contains any of the words | + | nowords | contains none of the words | + +----------------------------------------------------+ + + Returns: Array: Matching test cases are retuned in a list of hashes. + +=item C + + Params: $id - Integer: ID of the case status to return + + Returns: String: the status name. + +=item C + + Params: $name - String: the status name. + + Returns: Integer: ID of the case status. + +=item C + + Description: Updates the fields of the selected case-runs. + + Params: $caserun_ids - Integer/String/Array + Integer: A single TestCaseRun ID. + String: A comma separates string of TestCaseRun IDs for batch + processing. + Array: An array of TestCaseRun IDs for batch mode processing + + $values - Hash of keys matching TestCaseRun fields and the new values + to set each field to. + + Returns: Hash/Array: In the case of a single object, it is returned. If a + list was passed, it returns an array of object hashes. If the + update on any particular object failed, the hash will contain a + FAILED key and the message as to why it failed. + +=item C + + Description: Updates the fields of the selected case-run. + + Params: $case_id - Integer: An integer representing the ID of the test case in the database. + $run_id - Integer: An integer representing the ID of the test run in the database. + $build_id - Integer: An integer representing the ID of the test build in the database. + $environment_id - Integer: An integer representing the ID of the environment in the database. + + $values - Hash of keys matching TestCaseRun fields and the new values + to set each field to. + + Returns: Hash/Array: In the case of a single object, it is returned. If a + list was passed, it returns an array of object hashes. If the + update on any particular object failed, the hash will contain a + FAILED key and the message as to why it failed. + +=back + +=head1 SEE ALSO + +=over + +L +L + +=back + +=head1 AUTHOR + +Greg Hendricks \ No newline at end of file diff --git a/mozilla/webtools/testopia/Bugzilla/WebService/Testopia/TestPlan.pm b/mozilla/webtools/testopia/Bugzilla/WebService/Testopia/TestPlan.pm index ae5126e1d67..71c6140eb8c 100644 --- a/mozilla/webtools/testopia/Bugzilla/WebService/Testopia/TestPlan.pm +++ b/mozilla/webtools/testopia/Bugzilla/WebService/Testopia/TestPlan.pm @@ -10,10 +10,14 @@ # implied. See the License for the specific language governing # rights and limitations under the License. # -# The Original Code is the Bugzilla Bug Tracking System. +# The Original Code is the Bugzilla Testopia System. # -# Contributor(s): Marc Schumann -# Dallas Harken +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Dallas Harken +# Greg Hendricks package Bugzilla::WebService::Testopia::TestPlan; @@ -28,402 +32,486 @@ use Bugzilla::Testopia::TestPlan; use Bugzilla::Testopia::Search; use Bugzilla::Testopia::Table; -# Utility method called by the list method -sub _list -{ + +sub get { + my $self = shift; + my ($plan_id) = @_; + + Bugzilla->login(LOGIN_REQUIRED); + + # Result is a plan object hash + my $plan = new Bugzilla::Testopia::TestPlan($plan_id); + + ThrowUserError('invalid-test-id-non-existent', {type => 'Build', id => $plan_id}) unless $plan; + ThrowUserError('testopia-permission-denied', {'object' => $plan}) unless $plan->canview; + + $plan->test_run_count(); + $plan->test_case_count(); + + return $plan; +} + +sub list { + my $self = shift; my ($query) = @_; + + Bugzilla->login(LOGIN_REQUIRED); my $cgi = Bugzilla->cgi; - + $cgi->param("current_tab", "plan"); - foreach (keys(%$query)) - { + foreach (keys(%$query)){ $cgi->param($_, $$query{$_}); } my $search = Bugzilla::Testopia::Search->new($cgi); - # Result is an array of test plan hash maps - return Bugzilla::Testopia::Table->new('plan', - 'tr_xmlrpc.cgi', - $cgi, - undef, - $search->query() - )->list(); + return Bugzilla::Testopia::Table->new('plan','tr_xmlrpc.cgi',$cgi,undef,$search->query())->list(); } -sub get -{ - my $self = shift; - my ($test_plan_id) = @_; - - $self->login; - - #Result is a test plan hash map - my $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); - - if (not defined $test_plan) - { - $self->logout; - die "Testplan, " . $test_plan_id . ", not found"; - } - - if (not $test_plan->canview) - { - $self->logout; - die "User Not Authorized"; - } - - $self->logout; - - return $test_plan; -} - -sub list -{ - my $self = shift; - my ($query) = @_; - - $self->login; - - my $list = _list($query); - - $self->logout; - - return $list; -} - -sub create -{ +sub create { my $self =shift; my ($new_values) = @_; - $self->login; + Bugzilla->login(LOGIN_REQUIRED); + + my $product = Bugzilla::Testopia::Product->new($new_values->{'product_id'}); + ThrowUserError('testopia-read-only', {'object' => $product}) unless $product->canedit; - my $test_plan = Bugzilla::Testopia::TestPlan->create($new_values); + my $plan = Bugzilla::Testopia::TestPlan->create($new_values); - $self->logout; - - return $test_plan->id; + return $plan; } -sub update -{ +sub update { my $self =shift; - my ($test_plan_id, $new_values) = @_; + my ($plan_id, $new_values) = @_; - $self->login; + Bugzilla->login(LOGIN_REQUIRED); - my $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); + my $plan = new Bugzilla::Testopia::TestPlan($plan_id); - if (not defined $test_plan) - { - $self->logout; - die "Testplan, " . $test_plan_id . ", not found"; - } + ThrowUserError('invalid-test-id-non-existent', {type => 'Test Plan', id => $plan_id}) unless $plan; + ThrowUserError('testopia-read-only', {'object' => $plan}) unless $plan->canedit; + + $plan->set_name(trim($new_values->{'name'})); + $plan->set_default_product_version($new_values->{'default_product_version'}); + $plan->set_type($new_values->{'type_id'}); + $plan->set_isactive($new_values->{'isactive'}); - if (not $test_plan->canedit) - { - $self->logout; - die "User Not Authorized"; - } + $plan->update(); - $test_plan->set_name(trim($new_values->{'name'})); - $test_plan->set_default_product_version($new_values->{'default_product_version'}); - $test_plan->set_type($new_values->{'type_id'}); - $test_plan->set_isactive($new_values->{'isactive'}); - - $test_plan->update(); - - $self->logout; - # Result is modified test plan, otherwise an exception will be thrown - return $test_plan; + return $plan; } -sub get_test_cases -{ - my $self =shift; - my ($test_plan_id) = @_; +sub get_text { + my $self = shift; + my ($plan_id, $version) = @_; - $self->login; - - my $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); - - if (not defined $test_plan) - { - $self->logout; - die "Testplan, " . $test_plan_id . ", not found"; - } + Bugzilla->login(LOGIN_REQUIRED); - if (not $test_plan->canview) - { - $self->logout; - die "User Not Authorized"; - } - - my $result = $test_plan->test_cases(); - - $self->logout; + my $plan = new Bugzilla::Testopia::TestPlan($plan_id); + ThrowUserError('invalid-test-id-non-existent', {type => 'Test Plan', id => $plan_id}) unless $plan; + ThrowUserError('testopia-permission-denied', {'object' => $plan}) unless $plan->canview; + + #Result is the latest test plan doc hash map + return $plan->text($version); +} + +sub store_text { + my $self = shift; + my ($plan_id, $author_id, $text) = @_; + + Bugzilla->login(LOGIN_REQUIRED); + + my $plan = new Bugzilla::Testopia::TestPlan($plan_id); + + ThrowUserError('invalid-test-id-non-existent', {type => 'Test Plan', id => $plan_id}) unless $plan; + ThrowUserError('testopia-read-only', {'object' => $plan}) unless $plan->canedit; + + my $version = $plan->store_text($plan_id, $author_id); + + # Result is new test plan doc version on success, otherwise an exception will be thrown + return $version; +} + +sub get_test_cases { + my $self = shift; + my ($plan_id) = @_; + + Bugzilla->login(LOGIN_REQUIRED); + + # Result is a plan object hash + my $plan = new Bugzilla::Testopia::TestPlan($plan_id); + + ThrowUserError('invalid-test-id-non-existent', {type => 'Build', id => $plan_id}) unless $plan; + ThrowUserError('testopia-permission-denied', {'object' => $plan}) unless $plan->canview; + # Result is list of test cases for the given test plan - return $result; + return $plan->test_cases; } -sub get_test_runs -{ - my $self =shift; - my ($test_plan_id) = @_; - - $self->login; - - my $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); - - if (not defined $test_plan) - { - $self->logout; - die "Testplan, " . $test_plan_id . ", not found"; - } +sub get_test_runs { + my ($plan_id) = @_; - if (not $test_plan->canview) - { - $self->logout; - die "User Not Authorized"; - } + Bugzilla->login(LOGIN_REQUIRED); - my $result = $test_plan->test_runs(); + # Result is a plan object hash + my $plan = new Bugzilla::Testopia::TestPlan($plan_id); - $self->logout; + ThrowUserError('invalid-test-id-non-existent', {type => 'Build', id => $plan_id}) unless $plan; + ThrowUserError('testopia-permission-denied', {'object' => $plan}) unless $plan->canview; # Result is list of test runs for the given test plan - return $result; + return $plan->test_runs; } -sub get_categories -{ - my $self =shift; - my ($test_plan_id) = @_; +sub get_change_history { + my $self = shift; + my ($plan_id) = @_; - $self->login; - - my $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); - - if (not defined $test_plan) - { - $self->logout; - die "Testplan, " . $test_plan_id . ", not found"; - } + Bugzilla->login(LOGIN_REQUIRED); - if (not $test_plan->canview) - { - $self->logout; - die "User Not Authorized"; - } - - my $result = $test_plan->product->categories(); + my $plan = new Bugzilla::Testopia::TestPlan($plan_id); - $self->logout; - - # Result is list of categories for the given test plan - return $result; + ThrowUserError('invalid-test-id-non-existent', {type => 'Test Plan', id => $plan_id}) unless $plan; + ThrowUserError('testopia-permission-denied', {'object' => $plan}) unless $plan->canview; + + # Result list of changes otherwise an exception will be thrown + return $plan->history; } -sub get_components -{ - my $self =shift; - my ($test_plan_id) = @_; - - $self->login; - - my $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); - - if (not defined $test_plan) - { - $self->logout; - die "Testplan, " . $test_plan_id . ", not found"; - } +sub get_product { + my $self = shift; + my ($plan_id) = @_; - if (not $test_plan->canview) - { - $self->logout; - die "User Not Authorized"; - } + Bugzilla->login(LOGIN_REQUIRED); - my $result = $test_plan->product->components; + # Result is a plan object hash + my $plan = new Bugzilla::Testopia::TestPlan($plan_id); - $self->logout; - - # Result is list of components for the given test plan - return $result; + ThrowUserError('invalid-test-id-non-existent', {type => 'Product', id => $plan_id}) unless $plan; + ThrowUserError('testopia-permission-denied', {'object' => $plan}) unless $plan->canview; + + # Result is list of test cases for the given test plan + return $plan->product; } -sub get_builds -{ - my $self =shift; - my ($test_plan_id) = @_; - - $self->login; - - my $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); - - if (not defined $test_plan) - { - $self->logout; - die "Testplan, " . $test_plan_id . ", not found"; - } - - if (not $test_plan->canview) - { - $self->logout; - die "User Not Authorized"; - } - - my $result = $test_plan->product->builds(); - - $self->logout; - - # Result is list of builds for the given test plan - return $result; -} - -sub lookup_type_name_by_id -{ +sub lookup_type_name_by_id { my $self =shift; my ($id) = @_; - $self->login; + Bugzilla->login(LOGIN_REQUIRED); my $test_plan = new Bugzilla::Testopia::TestPlan({}); - my $result = $test_plan->lookup_type($id); - - $self->logout; - # Result is test plan type name for the given test plan type id - return $result; + return $test_plan->lookup_type($id); } -sub lookup_type_id_by_name -{ +sub lookup_type_id_by_name { my $self =shift; my ($name) = @_; - $self->login; + Bugzilla->login(LOGIN_REQUIRED); my $test_plan = new Bugzilla::Testopia::TestPlan({}); - my $result = $test_plan->lookup_type_by_name($name); - - $self->logout; - - if (!defined $result) - { - $result = 0; - }; - # Result is test plan type id for the given test plan type name - return $result; + return $test_plan->lookup_type_by_name($name); } -sub add_tag -{ - my $self =shift; - my ($test_plan_id, $tag_name) = @_; +sub add_tag { + my $self = shift; + my ($plan_ids, $tags) = @_; - $self->login; - - my $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); - - if (not defined $test_plan) - { - $self->logout; - die "Testplan, " . $test_plan_id . ", not found"; + Bugzilla->login(LOGIN_REQUIRED); + + my @ids = Bugzilla::Testopia::Util::process_list($plan_ids); + my @results; + foreach my $id (@ids){ + my $plan = new Bugzilla::Testopia::TestPlan($id); + unless ($plan){ + push @results, {FAILED => 1, message => "TestPlan $id does not exist"}; + next; + } + unless ($plan->canedit){ + push @results, {FAILED => 1, message => "You do not have rights to edit this test plan"}; + next; + } + eval { + $plan->add_tag($tags); + } + if ($@){ + push @results, {FAILED => 1, message => $@}; + } } - - if (not $test_plan->canedit) - { - $self->logout; - die "User Not Authorized"; - } - - my $result = $test_plan->add_tag($tag_name); - - if ($result == 1) - { - $self->logout; - die "Tag, " . $tag_name . ", already exists for Testplan, " . $test_plan_id; - } - - $self->logout; - - # Result 0 on success, otherwise an exception will be thrown - return $result; + # @results will be empty if successful + return @results; } -sub remove_tag -{ - my $self =shift; - my ($test_plan_id, $tag_name) = @_; +sub remove_tag { + my $self = shift; + my ($plan_id, $tag_name) = @_; - $self->login; - - my $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); - - if (not defined $test_plan) - { - $self->logout; - die "Testplan, " . $test_plan_id . ", not found"; - } + Bugzilla->login(LOGIN_REQUIRED); - if (not $test_plan->canedit) - { - $self->logout; - die "User Not Authorized"; - } + my $plan = new Bugzilla::Testopia::TestPlan($plan_id); - my $test_tag = Bugzilla::Testopia::TestTag->check_tag($tag_name); - if (not defined $test_tag) - { - $self->logout; - die "Tag, " . $tag_name . ", does not exist"; - } - - my $result = $test_plan->remove_tag($test_tag->name); + ThrowUserError('invalid-test-id-non-existent', {type => 'Test Plan', id => $plan_id}) unless $plan; + ThrowUserError('testopia-read-only', {'object' => $plan}) unless $plan->canedit; + + $plan->remove_tag($tag_name); - $self->logout; - # Result 0 on success, otherwise an exception will be thrown return 0; } -sub get_tags -{ - my $self =shift; - my ($test_plan_id) = @_; +sub get_tags { + my $self = shift; + my ($plan_id) = @_; - $self->login; - - my $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); - - if (not defined $test_plan) - { - $self->logout; - die "Testplan, " . $test_plan_id . ", not found"; - } + Bugzilla->login(LOGIN_REQUIRED); - if (not $test_plan->canview) - { - $self->logout; - die "User Not Authorized"; - } + my $plan = new Bugzilla::Testopia::TestPlan($plan_id); - my $result = $test_plan->tags; + ThrowUserError('invalid-test-id-non-existent', {type => 'Test Plan', id => $plan_id}) unless $plan; + ThrowUserError('testopia-permission-denied', {'object' => $plan}) unless $plan->canview; - $self->logout; - # Result list of tags otherwise an exception will be thrown - return $result; + return $plan->tags; } -1; \ No newline at end of file +1; + +__END__ + +=head1 NAME + +Bugzilla::Testopia::Webservice::TestPlan + +=head1 EXTENDS + +Bugzilla::Webservice + +=head1 DESCRIPTION + +Provides methods for automated scripts to manipulate Testopia TestPlans + +=head1 METHODS + +=over + +=item C + + Description: Add one or more tags to the selected test plans. + + Params: $plan_ids - Integer/Array/String: An integer or alias representing the ID in the database, + an arry of plan_ids or aliases, or a string of comma separated plan_ids. + + $tags - String/Array - A single tag, an array of tags, + or a comma separated list of tags. + + Returns: undef/Array: undef on success or an array of hashes with failure + codes if a failure occured. + +=item C + + Description: Creates a new Test Plan object and stores it in the database. + + Params: $values - Hash: A reference to a hash with keys and values + matching the fields of the test plan to be created. + + + Returns: The newly created object hash. + +=item C + + Description: Used to load an existing test plan from the database. + + Params: $id - Integer/String: An integer representing the ID in the database + for this plan. + + Returns: A blessed Bugzilla::Testopia::TestPlan object hash + +=item C + + Description: Get the list of changes to the fields of this plan. + + Params: $plan_id - Integer/String: An integer representing the ID in the database + or a string representing the unique alias for this plan. + + Returns: Array: An array of hashes with changed fields and their details. + +=item C + + Description: Get the list of tags attached to this plan. + + Params: $plan_id - Integer/String: An integer representing the ID in the database + or a string representing the unique alias for this plan. + + Returns: Array: An array of tag object hashes. + +=item C + + Description: Get the list of cases that this plan is linked to. + + Params: $plan_id - Integer/String: An integer representing the ID in the database + for this plan. + + Returns: Array: An array of test case object hashes. + +=item C + + Description: Get the list of runs in this plan. + + Params: $plan_id - Integer/String: An integer representing the ID in the database + for this plan. + + Returns: Array: An array of test run object hashes. + +=item C + + Description: The associated large text fields: Action, Expected Results, Setup, Breakdown + for a given version. + + Params: $plan_id - Integer/String: An integer representing the ID in the database + or a string representing the unique alias for this plan. + + $version - Integer: (OPTIONAL) The version of the text you want returned. + Defaults to the latest. + + Returns: Hash: Text fields and values. + +=item C + + Description: Performs a search and returns the resulting list of test plans. + + Params: $query - Hash: keys must match valid search fields. + + +--------------------------------------------------------+ + | Plan Search Parameters | + +--------------------------------------------------------+ + | Key | Valid Values | + | author | A bugzilla login (email address) | + | author_type | (select from email_variants) | + | plan_id | comma separated integers | + | plan_text | String | + | plan_text_type | (select from query_variants) | + | plan_type | String: Product Name | + | product | String: Product Name | + | product_id | Integer | + | tags | String | + | tags_type | (select from tag_variants) | + | type_id | Integer | + | version | String: Product version | + +--------------------------------------------------------+ + + +--------------------------------------------------------+ + | Paging and Sorting | + +--------------------------------------------------------+ + | Key | Description | + | dir | "ASC" or "DESC" | + | order | field to sort by | + +--------------------------------------------------------+ + | page_size | integer: how many per page | + | page | integer: page number | + | +++++++ OR +++++++ | + | start | integer: Start with which record | + | limit | integer: limit to how many | + +--------------------------------------------------------+ + | viewall | 1: returns all records 0: first 25 | + +--------------------------------------------------------+ + + +----------------------------------------------------+ + | query_variants | + +----------------+-----------------------------------+ + | Key | Description | + | allwordssubstr | contains all of the words/strings | + | anywordssubstr | contains any of the words/strings | + | substring | contains the string | + | casesubstring | contains the string (exact case) | + | allwords | contains all of the words | + | anywords | contains any of the words | + | regexp | matches the regexp | + | notregexp | doesn't match the regexp | + +----------------+-----------------------------------+ + + +-------------------------------------+ + | email_variants | + +--------------+----------------------+ + | Key | Description | + | substring | contains | + | exact | is | + | regexp | matches regexp | + | notregexp | doesn't match regexp | + +--------------+----------------------+ + + +----------------------------------------------------+ + | tag_variants | + +----------------+-----------------------------------+ + | Key | Description | + | anyexact | is tagged with | + | allwordssubstr | contains all of the words/strings | + | anywordssubstr | contains any of the words/strings | + | substring | contains the string | + | casesubstring | contains the string (exact case) | + | regexp | matches the regexp | + | notregexp | doesn't match the regexp | + | allwords | contains all of the words | + | anywords | contains any of the words | + | nowords | contains none of the words | + +----------------------------------------------------+ + + Returns: Array: Matching test plans are retuned in a list of hashes. + +=item C + + Params: $name - String: the status name. + + Returns: Integer: ID of the plan type. + +=item C + + Params: $id - Integer: ID of the plan stype to return + + Returns: String: the type name. + +=item C + + Description: Remove a tag from a plan. + + Params: $plan_id - Integer/String: An integer or alias representing the ID in the database. + + $tag - String - A single tag to be removed. + + Returns: 0 on success. + +=item C + + Description: Updates the fields of the selected test plan. + + Params: $ids - Integer: A single TestPlan ID. + + $values - Hash of keys matching TestPlan fields and the new values + to set each field to. + + Returns: Hash: The updated test plan object. + +=back + +=head1 SEE ALSO + +=over + +L +L + +=back + +=head1 AUTHOR + +Greg Hendricks \ No newline at end of file diff --git a/mozilla/webtools/testopia/Bugzilla/WebService/Testopia/TestRun.pm b/mozilla/webtools/testopia/Bugzilla/WebService/Testopia/TestRun.pm index 3640f34981c..e19aa838bda 100644 --- a/mozilla/webtools/testopia/Bugzilla/WebService/Testopia/TestRun.pm +++ b/mozilla/webtools/testopia/Bugzilla/WebService/Testopia/TestRun.pm @@ -10,10 +10,14 @@ # implied. See the License for the specific language governing # rights and limitations under the License. # -# The Original Code is the Bugzilla Bug Tracking System. +# The Original Code is the Bugzilla Testopia System. # -# Contributor(s): Marc Schumann -# Dallas Harken +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Dallas Harken +# Greg Hendricks package Bugzilla::WebService::Testopia::TestRun; @@ -21,6 +25,7 @@ use strict; use base qw(Bugzilla::WebService); +use Bugzilla::Constants; use Bugzilla::Product; use Bugzilla::User; use Bugzilla::Testopia::TestRun; @@ -28,338 +33,462 @@ use Bugzilla::Testopia::Search; use Bugzilla::Testopia::Table; # Utility method called by the list method -sub _list -{ +sub get { + my $self = shift; + my ($run_id) = @_; + + Bugzilla->login(LOGIN_REQUIRED); + + # Result is a run object hash + my $run = new Bugzilla::Testopia::TestRun($run_id); + + ThrowUserError('invalid-test-id-non-existent', {type => 'Build', id => $run_id}) unless $run; + ThrowUserError('testopia-permission-denied', {'object' => $run}) unless $run->canview; + + $run->test_run_count(); + $run->test_case_count(); + + return $run; +} + +sub list { + my $self = shift; my ($query) = @_; + + Bugzilla->login(LOGIN_REQUIRED); my $cgi = Bugzilla->cgi; - + $cgi->param("current_tab", "run"); - foreach (keys(%$query)) - { + foreach (keys(%$query)){ $cgi->param($_, $$query{$_}); } my $search = Bugzilla::Testopia::Search->new($cgi); - # Result is an array of test run hash maps - return Bugzilla::Testopia::Table->new('run', - 'tr_xmlrpc.cgi', - $cgi, - undef, - $search->query() - )->list(); + return Bugzilla::Testopia::Table->new('run','tr_xmlrpc.cgi',$cgi,undef,$search->query())->list(); } -sub get -{ - my $self = shift; - my ($test_run_id) = @_; - - $self->login; - - #Result is a test run hash map - my $test_run = new Bugzilla::Testopia::TestRun($test_run_id); - - if (not defined $test_run) - { - $self->logout; - die "Testrun, " . $test_run_id . ", not found"; - } - - if (not $test_run->canview) - { - $self->logout; - die "User Not Authorized"; - } - - $self->logout; - - return $test_run; -} - -sub list -{ - my $self = shift; - my ($query) = @_; - - $self->login; - - my $list = _list($query); - - $self->logout; - - return $list; -} - -sub create -{ +sub create { my $self =shift; my ($new_values) = @_; - $self->login; + Bugzilla->login(LOGIN_REQUIRED); + + my $product = Bugzilla::Testopia::Product->new($new_values->{'product_id'}); + ThrowUserError('testopia-read-only', {'object' => $product}) unless $product->canedit; - my $test_run = Bugzilla::Testopia::TestRun->create($new_values); + my $run = Bugzilla::Testopia::TestRun->create($new_values); - $self->logout; - - return $test_run->id; + return $run; } -sub update -{ +sub update { my $self =shift; - my ($test_run_id, $new_values) = @_; + my ($run_id, $new_values) = @_; - $self->login; + Bugzilla->login(LOGIN_REQUIRED); - my $test_run = new Bugzilla::Testopia::TestRun($test_run_id); - - if (not defined $test_run) - { - $self->logout; - die "Testrun, " . $test_run_id . ", not found"; - } + my $run = new Bugzilla::Testopia::TestRun($run_id); - if (not $test_run->canedit) - { - $self->logout; - die "User Not Authorized"; - } - - $test_run->set_environment($new_values->{'environment_id'}); - $test_run->set_build($new_values->{'build_id'}); - $test_run->set_summary($new_values->{'summary'}); - $test_run->set_manager($new_values->{'manager_id'}); - $test_run->set_plan_text_version($new_values->{'plan_text_version'}); - $test_run->set_notes($new_values->{'notes'}); - $test_run->set_product_version($new_values->{'product_version'}); - - $test_run->update(); - - $self->logout; + ThrowUserError('invalid-test-id-non-existent', {type => 'Test Run', id => $run_id}) unless $run; + ThrowUserError('testopia-read-only', {'object' => $run}) unless $run->canedit; + + my $timestamp; + $timestamp = $run->stop_date; + $timestamp = undef if $new_values->{'status'}; + $timestamp = get_time_stamp() if $new_values->{'status'} == 0 && !$run->stop_date; + + $run->set_summary(trim($new_values->{'summary'})) if exists $new_values->{'summary'}; + $run->set_product_version($new_values->{'product_version')) if $new_values->{'product_version'}; + $run->set_plan_text_version($new_values->{'plan_text_version')) if $new_values->{'plan_text_version'}; + $run->set_build($new_values->{'build_id')) if $new_values->{'build_id'}; + $run->set_environment($new_values->{'environment_id')) if $new_values->{'environment_id'}; + $run->set_manager($new_values->{'manager_id')) if $new_values->{'manager_id'}; + $run->set_notes($new_values->{'notes')} if exists $cgi->{'notes'}; + $run->set_stop_date($timestamp) if $new_values->{'status'}; - # Result is modified test run on success, otherwise an exception will be thrown - return $test_run; + $run->update(); + + # Result is modified test run, otherwise an exception will be thrown + return $run; } -sub get_test_cases -{ - my $self =shift; - my ($test_run_id) = @_; +sub get_change_history { + my $self = shift; + my ($run_id) = @_; - $self->login; - - my $test_run = new Bugzilla::Testopia::TestRun($test_run_id); - - if (not defined $test_run) - { - $self->logout; - die "Testrun, " . $test_run_id . ", not found"; - } + Bugzilla->login(LOGIN_REQUIRED); - if (not $test_run->canview) - { - $self->logout; - die "User Not Authorized"; - } - - my $result = $test_run->cases(); + my $run = new Bugzilla::Testopia::TestRun($run_id); - $self->logout; + ThrowUserError('invalid-test-id-non-existent', {type => 'Test Run', id => $run_id}) unless $run; + ThrowUserError('testopia-permission-denied', {'object' => $run}) unless $run->canview; + + # Result list of changes otherwise an exception will be thrown + return $run->history; +} + +sub get_test_cases { + my $self = shift; + my ($run_id) = @_; + Bugzilla->login(LOGIN_REQUIRED); + + # Result is a run object hash + my $run = new Bugzilla::Testopia::TestRun($run_id); + + ThrowUserError('invalid-test-id-non-existent', {type => 'Build', id => $run_id}) unless $run; + ThrowUserError('testopia-permission-denied', {'object' => $run}) unless $run->canview; + # Result is list of test cases for the given test run - return $result; + return $run->cases; } -sub get_test_case_runs -{ - my $self =shift; - my ($test_run_id) = @_; - - $self->login; - - my $test_run = new Bugzilla::Testopia::TestRun($test_run_id); - - if (not defined $test_run) - { - $self->logout; - die "Testrun, " . $test_run_id . ", not found"; - } +sub get_test_case_runs { + my $self = shift; + my ($run_id, $current) = @_; - if (not $test_run->canview) - { - $self->logout; - die "User Not Authorized"; - } + Bugzilla->login(LOGIN_REQUIRED); - my $result = $test_run->caseruns(); + # Result is a run object hash + my $run = new Bugzilla::Testopia::TestRun($run_id); - $self->logout; - - # Result is list of test case runs for the given test run - return $result; + ThrowUserError('invalid-test-id-non-existent', {type => 'Build', id => $run_id}) unless $run; + ThrowUserError('testopia-permission-denied', {'object' => $run}) unless $run->canview; + + # Result is list of test cases for the given test run + return $run->current_caseruns if $current; + return $run->caseruns; } -sub get_test_plan -{ - my $self =shift; - my ($test_run_id) = @_; - - $self->login; - - my $test_run = new Bugzilla::Testopia::TestRun($test_run_id); - - if (not defined $test_run) - { - $self->logout; - die "Testrun, " . $test_run_id . ", not found"; - } +sub get_test_plan { + my $self = shift; + my ($run_id) = @_; - if (not $test_run->canview) - { - $self->logout; - die "User Not Authorized"; - } + Bugzilla->login(LOGIN_REQUIRED); - my $result = $test_run->plan(); + # Result is a run object hash + my $run = new Bugzilla::Testopia::TestRun($run_id); - $self->logout; - - # Result is test plan for the given test run - return $result; + ThrowUserError('invalid-test-id-non-existent', {type => 'Build', id => $run_id}) unless $run; + ThrowUserError('testopia-permission-denied', {'object' => $run}) unless $run->canview; + + # Result is list of test cases for the given test run + return $run->plan; } -sub lookup_environment_id_by_name -{ - my $self =shift; - my ($name) = @_; - - $self->login; - - my $result = Bugzilla::Testopia::TestRun::lookup_environment_by_name($name); - - $self->logout; - - # Result is test run environment id for the given test run environment name - return $result; +sub lookup_environment_id_by_name { + return { FAILED => 1, message => 'This method is considered harmful and has been depricated. Please use Environment::check_environment instead'}; } -sub lookup_environment_name_by_id -{ - my $self =shift; - my ($id) = @_; - - $self->login; - - my $test_run = new Bugzilla::Testopia::TestRun({}); - - my $result = $test_run->lookup_environment($id); - - $self->logout; - - if (!defined $result) - { - $result = 0; - }; - - # Result is test run environment name for the given test run environment id - return $result; +sub lookup_environment_name_by_id { + return { FAILED => 1, message => 'This method is considered harmful and has been depricated. Please use Environment::get instead'}; } -sub add_tag -{ - my $self =shift; - my ($test_run_id, $tag_name) = @_; +sub add_tag { + my $self = shift; + my ($run_ids, $tags) = @_; - $self->login; - - my $test_run = new Bugzilla::Testopia::TestRun($test_run_id); - - if (not defined $test_run) - { - $self->logout; - die "Testrun, " . $test_run_id . ", not found"; + Bugzilla->login(LOGIN_REQUIRED); + + my @ids = Bugzilla::Testopia::Util::process_list($run_ids); + my @results; + foreach my $id (@ids){ + my $run = new Bugzilla::Testopia::TestRun($id); + unless ($run){ + push @results, {FAILED => 1, message => "TestRun $id does not exist"}; + next; + } + unless ($run->canedit){ + push @results, {FAILED => 1, message => "You do not have rights to edit this test run"}; + next; + } + eval { + $run->add_tag($tags); + } + if ($@){ + push @results, {FAILED => 1, message => $@}; + } } - - if (not $test_run->canedit) - { - $self->logout; - die "User Not Authorized"; - } - - $test_run->add_tag($tag_name); + # @results will be empty if successful + return @results; +} - $self->logout; +sub remove_tag { + my $self = shift; + my ($run_id, $tag_name) = @_; + + Bugzilla->login(LOGIN_REQUIRED); + my $run = new Bugzilla::Testopia::TestRun($run_id); + + ThrowUserError('invalid-test-id-non-existent', {type => 'Test Run', id => $run_id}) unless $run; + ThrowUserError('testopia-read-only', {'object' => $run}) unless $run->canedit; + + $run->remove_tag($tag_name); + # Result 0 on success, otherwise an exception will be thrown return 0; } -sub remove_tag -{ - my $self =shift; - my ($test_run_id, $tag_name) = @_; +sub get_tags { + my $self = shift; + my ($run_id) = @_; - $self->login; - - my $test_run = new Bugzilla::Testopia::TestRun($test_run_id); - - if (not defined $test_run) - { - $self->logout; - die "Testrun, " . $test_run_id . ", not found"; - } + Bugzilla->login(LOGIN_REQUIRED); - if (not $test_run->canedit) - { - $self->logout; - die "User Not Authorized"; - } + my $run = new Bugzilla::Testopia::TestRun($run_id); - my $test_tag = Bugzilla::Testopia::TestTag->check_tag($tag_name); - if (not defined $test_tag) - { - $self->logout; - die "Tag, " . $tag_name . ", does not exist"; - } - - my $result = $test_run->remove_tag($test_tag->name); + ThrowUserError('invalid-test-id-non-existent', {type => 'Test Run', id => $run_id}) unless $run; + ThrowUserError('testopia-permission-denied', {'object' => $run}) unless $run->canview; - $self->logout; - - # Result 0 on success, otherwise an exception will be thrown - return 0; -} - -sub get_tags -{ - my $self =shift; - my ($test_run_id) = @_; - - $self->login; - - my $test_run = new Bugzilla::Testopia::TestRun($test_run_id); - - if (not defined $test_run) - { - $self->logout; - die "Testrun, " . $test_run_id . ", not found"; - } - - if (not $test_run->canview) - { - $self->logout; - die "User Not Authorized"; - } - - my $result = $test_run->tags; - - $self->logout; - # Result list of tags otherwise an exception will be thrown - return $result; + return $run->tags; } -1; \ No newline at end of file +1; + +__END__ + +=head1 NAME + +Bugzilla::Testopia::Webservice::TestRun + +=head1 EXTENDS + +Bugzilla::Webservice + +=head1 DESCRIPTION + +Provides methods for automated scripts to manipulate Testopia TestRuns + +=head1 METHODS + +=over + +=item C + + Description: Add one or more tags to the selected test runs. + + Params: $run_ids - Integer/Array/String: An integer or alias representing the ID in the database, + an arry of run_ids or aliases, or a string of comma separated run_ids. + + $tags - String/Array - A single tag, an array of tags, + or a comma separated list of tags. + + Returns: undef/Array: undef on success or an array of hashes with failure + codes if a failure occured. + +=item C + + Description: Creates a new Test Run object and stores it in the database. + + Params: $values - Hash: A reference to a hash with keys and values + matching the fields of the test run to be created. + + + Returns: The newly created object hash. + +=item C + + Description: Used to load an existing test run from the database. + + Params: $id - Integer/String: An integer representing the ID in the database + for this run. + + Returns: A blessed Bugzilla::Testopia::TestRun object hash + +=item C + + Description: Get the list of changes to the fields of this run. + + Params: $run_id - Integer/String: An integer representing the ID in the database + or a string representing the unique alias for this run. + + Returns: Array: An array of hashes with changed fields and their details. + +=item C + + Description: Get the list of tags attached to this run. + + Params: $run_id - Integer/String: An integer representing the ID in the database + or a string representing the unique alias for this run. + + Returns: Array: An array of tag object hashes. + +=item C + + Description: Get the list of cases that this run is linked to. + + Params: $run_id - Integer/String: An integer representing the ID in the database + for this run. + + $current - Boolean: 1 to only include the current set (what is displayed + in the web page) 0: to return all, current and historical. + + Returns: Array: An array of test case object hashes. + +=item C + + Description: Get the list of cases that this run is linked to. + + Params: $run_id - Integer/String: An integer representing the ID in the database + for this run. + + Returns: Array: An array of test case object hashes. + +=item C + + Description: Get the plan that this run is associated with. + + Params: $run_id - Integer/String: An integer representing the ID in the database + for this run. + + Returns: Hash: A plan object hash. + +=item C + + Description: Performs a search and returns the resulting list of test runs. + + Params: $query - Hash: keys must match valid search fields. + +build A fine Build indeed +ctype json +current_tab run +environment 1183153988 PerlUnit Test for Testopia API -- Environment.create -- PLEASE IGNORE +limit 25 +manager +manager_type substring +milestone 3.0 +notes +notes_type allwordssubstr +plan_id +product_id 2 +run_id +run_status 0 +summary +summary_type allwordssubstr +tags +tags_type anyexact +version 2.20 + +--------------------------------------------------------+ + | Run Search Parameters | + +--------------------------------------------------------+ + | Key | Valid Values | + | build | String: Product Name | + | build_id | Integer | + | environment | String: Product Name | + | environment_id | Integer | + | manager | A bugzilla login (email address) | + | manager_type | (select from email_variants) | + | milestone | String | + | notes | String | + | notes_type | (select from query_variants) | + | plan_id | comma separated integers | + | product | String: Product Name | + | product_id | Integer | + | run_id | comma separated integers | + | run_status | 1: RUNNING 0: STOPPED | + | summary | String | + | summary_type | (select from query_variants) | + | tags | String | + | tags_type | (select from tag_variants) | + | type_id | Integer | + | version | String: Product version | + +--------------------------------------------------------+ + + +--------------------------------------------------------+ + | Paging and Sorting | + +--------------------------------------------------------+ + | Key | Description | + | dir | "ASC" or "DESC" | + | order | field to sort by | + +--------------------------------------------------------+ + | page_size | integer: how many per page | + | page | integer: page number | + | +++++++ OR +++++++ | + | start | integer: Start with which record | + | limit | integer: limit to how many | + +--------------------------------------------------------+ + | viewall | 1: returns all records 0: first 25 | + +--------------------------------------------------------+ + + +----------------------------------------------------+ + | query_variants | + +----------------+-----------------------------------+ + | Key | Description | + | allwordssubstr | contains all of the words/strings | + | anywordssubstr | contains any of the words/strings | + | substring | contains the string | + | casesubstring | contains the string (exact case) | + | allwords | contains all of the words | + | anywords | contains any of the words | + | regexp | matches the regexp | + | notregexp | doesn't match the regexp | + +----------------+-----------------------------------+ + + +-------------------------------------+ + | email_variants | + +--------------+----------------------+ + | Key | Description | + | substring | contains | + | exact | is | + | regexp | matches regexp | + | notregexp | doesn't match regexp | + +--------------+----------------------+ + + +----------------------------------------------------+ + | tag_variants | + +----------------+-----------------------------------+ + | Key | Description | + | anyexact | is tagged with | + | allwordssubstr | contains all of the words/strings | + | anywordssubstr | contains any of the words/strings | + | substring | contains the string | + | casesubstring | contains the string (exact case) | + | regexp | matches the regexp | + | notregexp | doesn't match the regexp | + | allwords | contains all of the words | + | anywords | contains any of the words | + | nowords | contains none of the words | + +----------------------------------------------------+ + + Returns: Array: Matching test runs are retuned in a list of hashes. + +=item C + + Description: Remove a tag from a run. + + Params: $run_id - Integer/String: An integer or alias representing the ID in the database. + + $tag - String - A single tag to be removed. + + Returns: 0 on success. + +=item C + + Description: Updates the fields of the selected test run. + + Params: $ids - Integer: A single TestRun ID. + + $values - Hash of keys matching TestRun fields and the new values + to set each field to. + + Returns: Hash: The updated test run object. + +=back + +=head1 SEE ALSO + +=over + +L +L + +=back + +=head1 AUTHOR + +Greg Hendricks \ No newline at end of file diff --git a/mozilla/webtools/testopia/tr_caserun.cgi b/mozilla/webtools/testopia/tr_caserun.cgi index 0b0b565a0b0..d2f38b440de 100755 --- a/mozilla/webtools/testopia/tr_caserun.cgi +++ b/mozilla/webtools/testopia/tr_caserun.cgi @@ -52,9 +52,9 @@ my $action = $cgi->param('action') || ''; if ($cgi->param('caserun_id')){ $caserun = Bugzilla::Testopia::TestCaseRun->new($cgi->param('caserun_id')); } -elsif ($cgi->param('case_id')){ - $caserun = Bugzilla::Testopia::TestCaseRun->new($cgi->param('case_id'), - $cgi->param('run_id'), +elsif ($cgi->param('run_id')){ + $caserun = Bugzilla::Testopia::TestCaseRun->new($cgi->param('run_id'), + $cgi->param('case_id'), $cgi->param('build_id'), $cgi->param('env_id')); }