# -*- Mode: perl; indent-tabs-mode: nil -*- # # The contents of this file are subject to the Mozilla Public # License Version 1.1 (the "License"); you may not use this file # except in compliance with the License. You may obtain a copy of # the License at http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or # implied. See the License for the specific language governing # rights and limitations under the License. # # The Original Code is the Bugzilla Testopia System. # # 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): Greg Hendricks # Jeff Dayley package API_TestCase; use strict; use base qw(Test::Unit::TestCase); use lib "."; use lib "../.."; use Bugzilla; use Testopia::TestCase; use Testopia::Search; use Testopia::Table; use Bugzilla::Extension::Testopia::Test::Constants; use Bugzilla::Extension::Testopia::Test::API::Util; use Bugzilla::Extension::Testopia::Test::Util; use Test::More; use Test::Deep; # The the XMLRPC::Lite proxy handle our $proxy = proxy( LOGIN_CREDENTIALS->{'admin'} ); sub new { my $self = shift()->SUPER::new(@_); return $self; } sub set_up { my $self = shift; } sub tear_down { my $self = shift; } sub test_create_by_arrays { my $self = shift; my $plan = Bugzilla::Extension::Testopia::TestPlan->new( get_rep('test_plans')->{'plan_id'} ); my $plan2 = Bugzilla::Extension::Testopia::TestPlan->new( get_rep('test_plans')->{'plan_id'} ); while ( $plan2->id == $plan->id ) { $plan2 = Bugzilla::Extension::Testopia::TestPlan->new( get_rep('test_plans')->{'plan_id'} ); } my @time = localtime(); my $response = $proxy->call( "TestCase.create", { status => get_rep('test_case_status')->{'case_status_id'}, category => get_rep('test_case_categories')->{'category_id'}, priority => get_rep('priority')->{'id'}, summary => 'API TEST CREATE ' . time(), plans => [ $plan->id, $plan2->id ], default_tester => get_rep('profiles')->{'userid'}, estimated_time => "$time[2]:$time[1]:$time[0]", isautomated => 1, sortkey => 200, script => 'API FOO SCRIPT', arguments => '-A -P -I', requirement => 'API REQUIREMENT', alias => 'API ALIAS ' . rand(), action => 'API ACTON CREATE', effect => 'API RESULT CREATE', setup => 'API SETUP CREATE', breakdown => 'API BREAKDOWN CREATE', dependson => [ get_rep('test_cases')->{'case_id'}, get_rep('test_cases')->{'case_id'} ], blocks => [ get_rep('test_cases')->{'case_id'}, get_rep('test_cases')->{'case_id'} ], tags => [ 'one', 'two', 'three' ], bugs => [ get_rep('bugs')->{'bug_id'}, get_rep('bugs')->{'bug_id'} ], components => [ get_rep('components')->{'id'}, get_rep('components')->{'id'} ], } ); check_fault( $response, $self ); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $response->result->{'case_id'} ); $obj->type; $obj->version; convert_undef($obj); cmp_deeply( $response->result, noclass($obj), "TestCase - test_create_by_arrays" ); } sub test_create_by_strings { my $self = shift; my $plan = Bugzilla::Extension::Testopia::TestPlan->new( get_rep('test_plans')->{'plan_id'} ); my $plan2 = Bugzilla::Extension::Testopia::TestPlan->new( get_rep('test_plans')->{'plan_id'} ); while ( $plan2->id == $plan->id ) { $plan2 = Bugzilla::Extension::Testopia::TestPlan->new( get_rep('test_plans')->{'plan_id'} ); } my @time = localtime(); my $category = get_rep('test_case_categories'); my $component = get_rep('components'); my $response = $proxy->call( "TestCase.create", { status => get_rep('test_case_status')->{'name'}, category => {category => $category->{'name'}, product => Bugzilla::Extension::Testopia::Product->new($category->{'product_id'})->name}, priority => get_rep('priority')->{'value'}, summary => 'API TEST CREATE ' . time(), plans => "" . $plan->id .",". $plan2->id , default_tester => get_rep('profiles')->{'login_name'}, estimated_time => "$time[2]:$time[1]:$time[0]", isautomated => 1, sortkey => 200, script => 'API FOO SCRIPT', arguments => '-A -P -I', requirement => 'API REQUIREMENT', alias => 'API ALIAS ' . rand(), action => 'API ACTON CREATE', effect => 'API RESULT CREATE', setup => 'API SETUP CREATE', breakdown => 'API BREAKDOWN CREATE', dependson => [ get_rep('test_cases')->{'case_id'}, get_rep('test_cases')->{'case_id'} ], blocks => [ get_rep('test_cases')->{'case_id'}, get_rep('test_cases')->{'case_id'} ], tags => 'one, two, three' , bugs => [ get_rep('bugs')->{'bug_id'}, get_rep('bugs')->{'bug_id'} ], components => [ {component => $component->{'name'}, product => Bugzilla::Extension::Testopia::Product->new($component->{'product_id'})->name}, ], } ); check_fault( $response, $self ); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $response->result->{'case_id'} ); $obj->type; $obj->version; convert_undef($obj); # dump_all($response->result, $obj); cmp_deeply( $response->result, noclass($obj), "TestCase - test_create_by_strings" ); } sub test_get { my $self = shift; my $rep = get_rep('test_cases'); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); $obj->text; $obj->version; $obj->dependson_list; $obj->blocked_list; my $response = $proxy->call( "TestCase.get", $rep->{'case_id'} ); check_fault( $response, $self ); convert_undef($obj); # dump_all($obj, $response->result); cmp_deeply( $response->result, noclass($obj), "TestCase - test_get" ); } sub test_update { my $self = shift; my $rep = get_rep('test_cases'); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); my $category = get_rep('test_case_categories'); my $response = $proxy->call( "TestCase.update", $rep->{'case_id'}, { status => get_rep('test_case_status')->{'name'}, category => {category => $category->{'name'}, product => Bugzilla::Extension::Testopia::Product->new($category->{'product_id'})->name}, priority => get_rep('priority')->{'value'}, summary => 'API TEST UPDATE ' . time(), default_tester => get_rep('profiles')->{'login_name'}, estimated_time => "02:02:02", isautomated => 1, sortkey => 200, script => 'API FOO SCRIPT', arguments => '-A -P -I', requirement => 'API REQUIREMENT', alias => 'API ALIAS ' . rand(), dependson => [ get_rep('test_cases')->{'case_id'}, get_rep('test_cases')->{'case_id'} ], blocks => [ get_rep('test_cases')->{'case_id'}, get_rep('test_cases')->{'case_id'} ], } ); # Get the newly updated object to compare with $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); $obj->dependson_list; $obj->blocked_list; check_fault( $response, $self ); convert_undef($obj); # dump_all($obj, $response->result); cmp_deeply( $response->result, noclass($obj), "TestCase - test_update" ); } sub test_list { my $self = shift; my $cgi = Bugzilla->cgi; $cgi->param( 'current_tab', 'case' ); $cgi->param( 'pagesize', 25 ); $cgi->param( 'distinct', 1); $cgi->param("Bugzilla_login", LOGIN_CREDENTIALS->{'admin'}->{'login_name'}); $cgi->param("Bugzilla_password", LOGIN_CREDENTIALS->{'admin'}->{'password'}); Bugzilla->login(); my $search = Bugzilla::Extension::Testopia::Search->new($cgi); my $table = Bugzilla::Extension::Testopia::Table->new( 'case', 'tr_xmlrpc.cgi', $cgi, undef, $search->query() ); my $response = $proxy->call( "TestCase.list", { pagesize => 25, } ); check_fault( $response, $self ); convert_undef($table->list); # dump_all($table->list, $response->result); cmp_deeply( $response->result, noclass( $table->list ), "TestCase - test_list" ); $response = $proxy->call( "TestCase.list_count", { pagesize => 25, } ); ok($response->result == $table->list_count, 'list_count'); } sub test_add_component { my $self = shift; my $rep = get_rep('test_cases'); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); my $orig_size = scalar @{$obj->components}; delete $obj->{'components'}; my $component = get_rep('components'); my $response = $proxy->call( "TestCase.add_component", $rep->{'case_id'}, {component => $component->{'name'}, product => Bugzilla::Extension::Testopia::Product->new($component->{'product_id'})->name} ); check_fault( $response, $self ); # dump_all($component, $obj->components); ok( scalar @{$obj->components} == ($orig_size + 1), "TestCase - test_add_component" ); } sub test_add_tag { my $self = shift; my $rep = get_rep('test_cases'); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); my $orig_size = scalar @{$obj->tags}; delete $obj->{'tags'}; my $tag = get_rep('test_tags'); my $response = $proxy->call( "TestCase.add_tag", $rep->{'case_id'}, $tag->{'tag_name'} ); check_fault( $response, $self ); # dump_all($tag, $obj->tags); ok( scalar @{$obj->tags} == ($orig_size + 1), "TestCase - test_add_tag" ); } sub test_add_to_run { my $self = shift; my $rep = get_rep('test_cases'); while ( $rep->{'case_status_id'} != 2 ){ $rep = get_rep('test_cases'); } my $run = get_rep('test_runs'); while ( $run->{'stop_date'} ){ $run = get_rep('test_runs'); } my $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); my $orig_size = $obj->run_count; my $tag = get_rep('test_tags'); my $response = $proxy->call( "TestCase.add_to_run", $rep->{'case_id'}, $run->{'run_id'} ); check_fault( $response, $self ); # dump_all($tag, $obj->tags); ok( $obj->run_count == ($orig_size + 1), "TestCase - test_add_to_run" ); } sub test_attach_bug { my $self = shift; my $cgi = Bugzilla->cgi; $cgi->param("Bugzilla_login", LOGIN_CREDENTIALS->{'admin'}->{'login_name'}); $cgi->param("Bugzilla_password", LOGIN_CREDENTIALS->{'admin'}->{'password'}); Bugzilla->login(); my $rep = get_rep('test_cases'); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); my $orig_size = scalar @{$obj->bugs}; delete $obj->{'bugs'}; my $bug = get_rep('bugs'); my $response = $proxy->call( "TestCase.attach_bug", $rep->{'case_id'}, $bug->{'bug_id'} ); check_fault( $response, $self ); # dump_all($bug, $obj->bugs); ok( scalar @{$obj->bugs} == ($orig_size + 1), "TestCase - test_attach_bug" ); } sub test_calculate_average_time { my $self = shift; my $rep = get_rep('test_cases'); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); my $response = $proxy->call( "TestCase.calculate_average_time", $rep->{'case_id'} ); check_fault( $response, $self ); # dump_all($obj->calculate_average_time, $response->result); cmp_deeply( $response->result, noclass($obj->calculate_average_time), "TestCase - test_calculate_average_time" ); } sub test_detach_bug { my $self = shift; my $cgi = Bugzilla->cgi; $cgi->param("Bugzilla_login", LOGIN_CREDENTIALS->{'admin'}->{'login_name'}); $cgi->param("Bugzilla_password", LOGIN_CREDENTIALS->{'admin'}->{'password'}); Bugzilla->login(); my $rep = get_rep('test_cases'); my $bug = get_rep('bugs'); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); $obj->attach_bug($bug->{'bug_id'}); delete $obj->{'bugs'}; my $orig_size = scalar @{$obj->bugs}; delete $obj->{'bugs'}; my $response = $proxy->call( "TestCase.detach_bug", $rep->{'case_id'}, $bug->{'bug_id'} ); check_fault( $response, $self ); # dump_all($bug, $obj->bugs); ok( scalar @{$obj->bugs} == ($orig_size - 1), "TestCase - test_detach_bug" ); } sub test_get_bugs { my $self = shift; my $cgi = Bugzilla->cgi; $cgi->param("Bugzilla_login", LOGIN_CREDENTIALS->{'admin'}->{'login_name'}); $cgi->param("Bugzilla_password", LOGIN_CREDENTIALS->{'admin'}->{'password'}); Bugzilla->login(); my $rep = get_rep('test_case_bugs'); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); my $response = $proxy->call( "TestCase.get_bugs", $rep->{'case_id'} ); check_fault( $response, $self ); my $list = $obj->bugs; convert_undef($list); # dump_all($obj->bugs, $response->result); cmp_deeply( $response->result, noclass($list), "TestCase - test_get_bugs" ); } sub test_get_case_run_history { my $self = shift; my $rep = get_rep('test_case_runs'); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); my $response = $proxy->call( "TestCase.get_case_run_history", $rep->{'case_id'} ); check_fault( $response, $self ); my $list = $obj->caseruns; convert_undef($list); # dump_all($obj->get_case_run_history, $response->result); cmp_deeply( $response->result, noclass($list), "TestCase - test_get_case_run_history" ); } sub test_get_change_history { my $self = shift; my $rep = get_rep('test_case_activity'); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); my $response = $proxy->call( "TestCase.get_change_history", $rep->{'case_id'} ); check_fault( $response, $self ); my $list = $obj->history; convert_undef($list); # dump_all($obj->history, $response->result); cmp_deeply( $response->result, noclass($list), "TestCase - test_get_change_history" ); } sub test_get_components { my $self = shift; my $rep = get_rep('test_case_components'); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); my $response = $proxy->call( "TestCase.get_components", $rep->{'case_id'} ); check_fault( $response, $self ); my $list = $obj->components; convert_undef($list); # dump_all($obj->get_components, $response->result); cmp_deeply( $response->result, noclass($list), "TestCase - test_get_components" ); } sub test_get_plans { my $self = shift; my $rep = get_rep('test_case_plans'); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); my $response = $proxy->call( "TestCase.get_plans", $rep->{'case_id'} ); check_fault( $response, $self ); my $list = $obj->plans; convert_undef($list); # dump_all($obj->plans, $response->result); cmp_deeply( $response->result, noclass($list), "TestCase - test_get_plans" ); } sub test_get_tags { my $self = shift; my $rep = get_rep('test_case_tags'); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); my $response = $proxy->call( "TestCase.get_tags", $rep->{'case_id'} ); check_fault( $response, $self ); my @results; foreach my $tag (@{$obj->tags}){ push @results, $tag->name; } # dump_all($obj->get_tags, $response->result); cmp_deeply( $response->result, \@results, "TestCase - test_get_tags" ); } sub test_get_text { my $self = shift; my $rep = get_rep('test_case_texts'); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); my $response = $proxy->call( "TestCase.get_text", $rep->{'case_id'} ); check_fault( $response, $self ); my $list = $obj->text; convert_undef($list); # dump_all($obj->get_text, $response->result); cmp_deeply( $response->result, noclass($list), "TestCase - test_get_text" ); } sub test_link_plan { my $self = shift; my $rep = get_rep('test_cases'); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); my $orig_size = scalar @{$obj->plans}; delete $obj->{'plans'}; my $plan = get_rep('test_plans'); my $response = $proxy->call( "TestCase.link_plan", $rep->{'case_id'}, $plan->{'plan_id'} ); check_fault( $response, $self ); # dump_all($tag, $obj->tags); ok( scalar @{$obj->plans} == ($orig_size + 1), "TestCase - test_link_plan" ); } sub test_lookup_priority_id_by_name { my $self = shift; my $rep = get_rep('priority'); my $response = $proxy->call( "TestCase.lookup_priority_id_by_name", $rep->{'value'} ); check_fault( $response, $self ); # dump_all($rep, $response->result); cmp_deeply( $response->result, lookup_priority_by_value($rep->{'value'}), "TestCase - lookup_priority_id_by_name" ); } sub test_lookup_priority_name_by_id { my $self = shift; my $rep = get_rep('priority'); my $response = $proxy->call( "TestCase.lookup_priority_name_by_id", $rep->{'id'} ); check_fault( $response, $self ); # dump_all($rep, $response->result); cmp_deeply( $response->result, lookup_priority($rep->{'id'}), "TestCase - lookup_priority_name_by_id" ); } sub test_lookup_status_id_by_name { my $self = shift; my $rep = get_rep('test_case_status'); my $response = $proxy->call( "TestCase.lookup_status_id_by_name", $rep->{'name'} ); check_fault( $response, $self ); # dump_all(lookup_status_by_name($rep->{'name'}), $response->result); cmp_deeply( $response->result, lookup_status_by_name($rep->{'name'}), "TestCase - lookup_status_id_by_name" ); } sub test_lookup_status_name_by_id { my $self = shift; my $rep = get_rep('test_case_status'); my $response = $proxy->call( "TestCase.lookup_status_name_by_id", $rep->{'case_status_id'} ); check_fault( $response, $self ); # dump_all($rep, $response->result); cmp_deeply( $response->result, lookup_status($rep->{'case_status_id'}), "TestCase - lookup_status_name_by_id" ); } sub test_remove_component { my $self = shift; my $rep = get_rep('test_case_components'); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); my $orig_size = scalar @{$obj->components}; delete $obj->{'components'}; my $response = $proxy->call( "TestCase.remove_component", $rep->{'case_id'}, $rep->{'component_id'} ); check_fault( $response, $self ); # dump_all($rep, $obj->components); ok( scalar @{$obj->components} == ($orig_size - 1), "TestCase - test_remove_component" ); } sub test_remove_tag { my $self = shift; my $rep = get_rep('test_case_tags'); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); my $tag = Bugzilla::Extension::Testopia::TestTag->new( $rep->{'tag_id'} ); my $orig_size = scalar @{$obj->tags}; delete $obj->{'tags'}; my $response = $proxy->call( "TestCase.remove_tag", $rep->{'case_id'}, $tag->name ); check_fault( $response, $self ); # dump_all($rep, $obj->tags); ok( scalar @{$obj->tags} == ($orig_size - 1), "TestCase - test_remove_tag" ); } sub test_store_text { my $self = shift; my $rep = get_rep('test_cases'); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); my $response = $proxy->call( "TestCase.store_text", $rep->{'case_id'}, "API ACTION UPDATE TEST", "API RESULTS UPDATE TEST", "API SETUP UPDATE TEST", "API BREAKDOWN UPDATE TEST" ); check_fault( $response, $self ); # dump_all($obj->version, $response->result); cmp_deeply( $response->result, noclass($obj->version), "TestCase - test_store_text" ); } sub test_unlink_plan { my $self = shift; my $plan = get_rep('test_plans'); my $rep = get_rep('test_cases'); my $obj = Bugzilla::Extension::Testopia::TestCase->new( $rep->{'case_id'} ); $obj->link_plan($plan->{'plan_id'}); delete $obj->{'plans'}; my $orig_size = scalar @{$obj->plans}; delete $obj->{'plans'}; my $response = $proxy->call( "TestCase.unlink_plan", $rep->{'case_id'}, $plan->{'plan_id'} ); check_fault( $response, $self ); # dump_all($rep, $obj->plans); ok( scalar @{$obj->plans} == ($orig_size - 1), "TestCase - test_unlink_plan" ); } 1; __END__