bugzilla-4intranet/testopia/t/OBJ_TestCase.pm

521 lines
18 KiB
Perl

#!/usr/bin/perl -w
# -*- 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 <ghendricks@novell.com>
# Al Rodriguez <arodriquez@novell.com>
package OBJ_TestCase;
use lib '.';
use lib '../..';
use strict;
use base qw(Test::Unit::TestCase);
use Bugzilla;
use Bugzilla::Constants;
use Bugzilla::Testopia::TestCase;
use Bugzilla::Testopia::TestPlan;
use Bugzilla::Testopia::TestTag;
use Bugzilla::Testopia::TestCaseRun;
use Test;
use Testopia::Test::Util;
use Testopia::Test::Constants;
use Test::Exception;
use Test::Deep;
use Test::More;
Bugzilla->error_mode(ERROR_MODE_DIE);
use constant DB_TABLE => 'test_cases';
use constant ID_FIELD => 'case_id';
our $dbh = Bugzilla->dbh;
our $obj = Test::test_init(DB_TABLE, ID_FIELD, 'Bugzilla::Testopia::TestCase');
sub test_init{
#$obj = Test::test_init(DB_TABLE, ID_FIELD, 'Bugzilla::Testopia::TestCase');
}
sub check_alias{
my $id = $dbh->selectrow_array("SELECT MAX(case_id) FROM test_cases WHERE case_id <> ?", undef, $obj->id);
$dbh->do("UPDATE test_cases SET alias = 'TEST' WHERE case_id = $id");
dies_ok(sub{$obj->_check_alias('TEST')}, 'Alias Must be Unique');
ok($obj->_check_alias('UNIQUE ALIAS'), 'Alias is Unique');
}
sub check_arguments{
# _check_arguments returns the arguments and does no checking
ok($obj->_check_arguments('-a', 'something', 'something else'), 'Arguments Passed');
}
sub check_dependency{
dies_ok(sub{$obj->_check_dependency('DIE')}, 'Unused Alias');
dies_ok(sub{$obj->_check_dependency(50)}, 'Invalid Case ID');
ok($obj->_check_dependency($obj->id), 'Valid Id');
}
sub check_bugs{
my $creds = Testopia::Test::Constants->LOGIN_CREDENTIALS;
foreach (Testopia::Test::Constants->LOGIN_TYPES){
my $login = $creds->{$_};
Test::set_user($login->{'id'}, $login->{'login_name'}, $login->{'password'});
# If the user does not have rights to view the bug, this should die
unless(Bugzilla->user->can_see_bug(2) ){
dies_ok(sub{$obj->_check_bugs(2, 'bugs')}, "User " . Bugzilla->user->{'login_name'} ." does not have rights to view bugs")
}
else{
ok( defined $obj->_check_bugs(2, 'bugs'), "User" . Bugzilla->user->{'login_name'} . " Can see bug 2");
}
}
dies_ok( sub{$obj->_check_bugs(90, 'bugs')}, "Bug with ID 90 does not exist");
}
sub check_status{
dies_ok(sub{$obj->_check_status(999)}, 'Test Case Status Does Not Exist');
ok($obj->_check_status(1), 'Test Case Status 1 Exists');
}
sub check_components{
dies_ok(sub{$obj->_check_components}, 'Missing Parameter Components');
ok($obj->_check_components(1), 'Valid Component');
}
sub check_tester{
my $creds = Testopia::Test::Constants->LOGIN_CREDENTIALS;
foreach (Testopia::Test::Constants->LOGIN_TYPES){
my $login = $creds->{$_};
ok($obj->_check_tester($login->{'login_name'}), 'User '. $login->{'login_name'} .' has a valid Login');
}
}
sub check_time{
dies_ok(sub{$obj->_check_time('2 Hours')}, 'Invalid Time Format');
dies_ok(sub{$obj->_check_time('1:2:3:4')}, 'Invalid Time Format');
dies_ok(sub{$obj->_check_time('2 Hours')}, 'Invalid Time Format');
ok($obj->_check_time eq 0, 'Time Value is Required');
}
sub check_automated{
dies_ok(sub{$obj->_check_automated('INVALID')}, 'Invalid Automated Value');
dies_ok(sub{$obj->_check_automated(undef)}, 'undef Not Valid Automated Value');
ok($obj->_check_automated(1) eq 1, '1 is Valid Value');
ok($obj->_check_automated(0) eq 0, '0 is Valid Value');
}
sub check_sortkey{
dies_ok(sub{$obj->_check_automated('INVALID')}, 'Invalid Sort Key');
ok($obj->_check_automated(1), 'Valid Sort Key');
ok($obj->_check_automated(100000), 'Valid Sort Key');
}
sub check_plans{
my $plan = new Bugzilla::Testopia::TestPlan(1);
# NOTE: The real method checks if the array is greater than 0,
#Not if it actually holds Bugzilla::Testopia::TestPlan objects
dies_ok(sub{$obj->_check_plans}, 'Plans Array Must Not Be Empty');
dies_ok(sub{$obj->_check_plans(2)}, 'Plans Array Must Be An Array');
ok($obj->_check_plans([$plan]), 'Plans Array Not Undef');
}
sub check_priority{
my $pri1 = $obj->_check_priority(1);
my $pri2 = $obj->_check_priority('P1');
cmp_deeply($pri1, $pri2, 'Same Priority Found with Id and Value');
}
sub check_runs{
dies_ok(sub{$obj->_check_runs(1000)}, 'Run ID Does Not Exist');
ok(defined $obj->_check_runs(1), 'Run Exists');
}
sub check_summary{
dies_ok(sub{$obj->_check_summary()}, 'Summary Must Not Be undef');
dies_ok(sub{$obj->_check_summary('')}, 'Summary Must Not Be Empty');
ok($obj->_check_summary('SUMMARY') eq 'SUMMARY', 'Valid Summary');
}
sub check_category{
my $plan = new Bugzilla::Testopia::TestPlan(1);
Bugzilla::Testopia::TestCase->_check_category(1, $plan);
}
sub test_create{
check_alias;
check_arguments;
check_dependency;
check_bugs;
check_status;
check_components;
check_tester;
check_time;
check_automated;
check_plans;
check_priority;
check_runs;
check_sortkey;
check_summary;
check_category;
Test::set_user('1', 'admin@testopia.com', 'admin@testopia.com');
my $plan = new Bugzilla::Testopia::TestPlan(999);
my $hash = {
'case_status_id' => 1,
'priority_id' => 999,
'default_tester_id' => 1,
'isautomated' => 1,
'sortkey' => 1,
'script' => 'SCRIPT',
'arguments' => 'ARGS',
'summary' => 'SUMMARY',
'requirement' => '',
'alias' => '',
'estimated_time' => '1:23:4',
'dependson' => '990',
'blocks' => '999',
'plans' => [$plan],
'runs' => '999',
'tags' => '',
'components' => '999',
'bugs' => '999',
'category_id' => 999,
'author_id' => 999};
my $creds = Testopia::Test::Constants->LOGIN_CREDENTIALS;
foreach (Testopia::Test::Constants->LOGIN_TYPES){
my $login = $creds->{$_};
Test::set_user($login->{'id'}, $login->{'login_name'}, $login->{'password'});
# If the user does not have rights to create a Test Case, this should die
unless(Bugzilla->user->can_see_bug(999)){
dies_ok( sub {Bugzilla::Testopia::TestCase->create($hash)}, "User " . Bugzilla->user->{'login_name'} ." does not have rights to create a Test Case");
}
else{
my $created_obj = Bugzilla::Testopiaj::TestCase->create($hash);
foreach my $field ($created_obj){
delete $created_obj->{$field} unless( defined $hash->{$field});
}
my $db_obj = new Bugzilla::Testopia::TestCase($created_obj->id);
$db_obj->{'plans'} = $db_obj->plans;
$db_obj->{'version'} = 1;
cmp_deeply($created_obj, $db_obj, 'Created Object Matched in DB');
$dbh->do("DELETE FROM test_cases WHERE case_id = " . $created_obj->id);
}
}
}
sub test_update{
$obj->set_alias('SOME ALIAS');
$obj->set_isautomated('1');
delete $obj->{'plans'};
delete $obj->{'version'};
delete $obj->{'type'};
$obj->update;
my $db_obj = new Bugzilla::Testopia::TestCase($obj->id);
cmp_deeply($obj, $db_obj, 'Update TestCase');
}
sub test_get_selectable_components{
my @components;
push @components, {'id' => '0', 'name' => '--Please Select--'};
my @comp_ids;
foreach my $comp (@{$obj->components}){
push @comp_ids, $comp->{'id'};
}
my $ids = $dbh->selectrow_arrayref(
"SELECT id FROM components WHERE product_id IN (?) AND id NOT IN (?) ORDER BY name", undef, join(",", @{$obj->get_product_ids}), join(",", @comp_ids));
foreach my $id (@$ids){
push @components, Bugzilla::Component->new($id);
}
ok( defined $obj->get_selectable_components, 'Selectable Components Match');
}
sub test_get_category_list{
my @categories;
my $cat_ids = $dbh->selectrow_arrayref("SELECT category_id FROM test_case_categories WHERE product_id IN (?)", undef, join(",", @{$obj->get_product_ids}));
foreach my $id (@$cat_ids){
push @categories, Bugzilla::Testopia::Category->new($id);
}
ok($obj->get_category_list, 'Category List Match');
}
sub test_get_product_ids{
my $id = $obj->id;
my @array = [1];
ok($obj->get_product_ids, 'Product Ids Retrieved');
@array = [];
$obj->{'case_id'} = 0;
cmp_deeply($obj->get_product_ids, @array, 'Product Ids Match W/No Case_Id');
$obj->{'case_id'} = $id;
}
sub test_get_caserun_count{
my $id = $obj->{'case_id'};
$obj->{'case_id'} = 4;
ok($obj->get_caserun_count eq 1, '1 Test Case Run Count');
ok($obj->get_caserun_count(1) eq 1, '1 Test Case Run Count W/Status ID');
$obj->{'case_id'} = $id;
}
sub test_add_tag{
my $tags = ['TEST1'];
$obj->add_tag(@$tags);
$obj->add_tag('TEST2', 'TEST2','TEST2','TEST3');
#Get Tags associated with this TestCase
my $query = "SELECT tag_id FROM test_case_tags WHERE case_id = ?";
my $test_tags = $dbh->selectcol_arrayref($query, undef, $obj->id);
for(@$test_tags){
my $tag = new Bugzilla::Testopia::TestTag($_);
ok(defined $tag, $tag->{'tag_name'} . " Tag Added Correctly");
}
}
sub test_remove_tag{
dies_ok(sub{$obj->remove_tag('FAKE_TAG')}, 'Cannot Remove Tag Not Already In DB');
my $tag = 'TEST';
$obj->add_tag($tag);
$obj->remove_tag($tag);
my $tag_id = $dbh->selectcol_arrayref("SELECT tag_id FROM test_tags WHERE tag_name = ?", undef, $tag);
my $id = $dbh->selectcol_arrayref("SELECT tag_id FROM test_case_tags WHERE tag_id = ? and case_id = ?", undef, $tag_id->[0], $obj->id);
ok( scalar @$id eq 0, 'Tag Removed Successfully');
}
sub test_attach_bug{
my $creds = Testopia::Test::Constants->LOGIN_CREDENTIALS;
foreach (Testopia::Test::Constants->LOGIN_TYPES){
my $login = $creds->{$_};
Test::set_user($login->{'id'}, $login->{'login_name'}, $login->{'password'});
# If the user does not have rights to add a bug, this should die
unless(Bugzilla->user->can_see_bug(1)){
dies_ok( sub {$obj->attach_bug(1)}, "User " . Bugzilla->user->{'login_name'} ." does not have rights to add bugs");
}
else{
my $bugs = [1];
$obj->attach_bug($bugs, 1);
my $attached_bugs = $dbh->selectrow_arrayref("SELECT bug_id FROM test_case_bugs WHERE bug_id in (?) AND case_id = ?", undef, (join ",", @$bugs), $obj->id);
cmp_deeply($attached_bugs, $bugs, 'Bugs Added Correctly');
}
}
}
sub test_detach_bug{
my $bug_ids = [1, 2];
$obj->attach_bug(1);
$obj->attach_bug(2);
my $query = "SELECT bug_id FROM test_case_bugs WHERE bug_id in (?)";
my $old_bugs = $dbh->selectrow_arrayref($query, undef, join (",", @$bug_ids));
$obj->detach_bug($bug_ids);
my $new_bugs = $dbh->selectrow_arrayref($query, undef, join (",", @$bug_ids));
ok( $old_bugs && ! defined $new_bugs, "Bugs Detached" );
}
sub test_add_component{
my $comps = [1];
my $query = "SELECT component_id FROM test_case_components WHERE case_id = ?";
my $delete = "DELETE FROM test_case_components WHERE case_id = ". $obj->{'case_id'};
$obj->add_component($comps);
my @db_comps = $dbh->selectrow_arrayref($query, undef, $obj->id);
cmp_deeply($comps, @db_comps, "Components added correctly");
$dbh->do($delete);
$obj->add_component($comps, 1);
@db_comps = $dbh->selectrow_arrayref($query, undef, $obj->id);
cmp_deeply($comps, @db_comps, "Components added correctly");
$dbh->do($delete);
}
sub test_remove_component{
my $comp = 1;
my $query = "SELECT component_id FROM test_case_components WHERE case_id = ?";
$obj->add_component($comp);
my $db_comps = $dbh->selectcol_arrayref($query, undef, $comp);
$obj->remove_component($comp);
my $new_db_comps = $dbh->selectcol_arrayref($query, undef, $comp);
ok( $new_db_comps ne $db_comps, 'Components Removed');
}
sub test_add_to_run{
my $run = 1;
my $before_adding = $dbh->selectrow_hashref("SELECT case_run_id, run_id, case_id, case_run_status_id, case_text_version, build_id, iscurrent, environment_id FROM test_case_runs WHERE run_id = $run");
$obj->add_to_run($run);
my $db_obj = $dbh->selectrow_hashref("SELECT * FROM test_case_runs WHERE run_id = $run");
my $object = new Bugzilla::Testopia::TestCaseRun($db_obj->{'case_run_id'});
cmp_deeply($db_obj, noclass($object), 'Test Case Added to Run');
}
sub test_add_blocks{
my $blocks = 2;
$obj->add_blocks($blocks);
my $dep = $dbh->selectrow_arrayref("SELECT blocked FROM test_case_dependencies WHERE dependson = ?", undef, $obj->id);
ok ( defined $dep , "Block Added");
_remove_blocks();
}
sub _remove_blocks{
my $block = 2;
my $id = $dbh->selectrow_array("SELECT MAX(blocked) FROM test_case_dependencies");
my $query = "SELECT blocked FROM test_case_dependencies WHERE dependson = ?";
my $db_deps = $dbh->selectrow_arrayref($query, undef, $obj->id);
$obj->remove_blocks($block);
my $new_db_deps = $dbh->selectrow_arrayref($query, undef, $obj->id);
ok($db_deps ne $new_db_deps, 'Block Removed');
}
sub test_add_dependson{
dies_ok ( sub{$obj->add_dependson($obj->id)}, "Cannot Be Dependant on Self");
$obj->add_dependson(10);
my $dep = $dbh->selectcol_arrayref("SELECT dependson FROM test_case_dependencies WHERE blocked = ?", undef, $obj->id);
ok ( $dep->[0] eq 10, "Dependency Added");
_remove_dependson();
}
sub _remove_dependson{
my $id = $dbh->selectrow_array("SELECT MAX(dependson) FROM test_case_dependencies");
my $query = "SELECT dependson FROM test_case_dependencies WHERE dependson = ?";
my $db_deps = $dbh->selectcol_arrayref($query, undef, $id);
$obj->remove_dependson($id);
my $new_db_deps = $dbh->selectcol_arrayref($query, undef, $id);
ok(@$db_deps ne @$new_db_deps, 'Dependency Removed');
}
sub test_compare_doc_versions{
my $same = {
'breakdown' => '',
'setup' => '',
'effect' => '',
'action' => ''
};
my $id = $dbh->selectrow_array("SELECT MAX(plan_id) FROM test_plans ", undef);
cmp_deeply($obj->compare_doc_versions($obj->id, $obj->id), $same, 'Same Documents');
$dbh->do("DELETE FROM test_case_texts WHERE case_id = $id");
$obj->store_text($id, $obj->id, 'ACTION2', 'EFFECT', 'SETUP', 'BREAKDOWN');
ok($obj->compare_doc_versions($obj->id, $id) ne $same, 'Different Documents');
}
sub test_diff_case_doc{
my $vals = $dbh->selectcol_arrayref("SELECT action, effect, setup, breakdown FROM test_case_texts WHERE case_id = ?", undef, $obj->id);
ok($obj->diff_case_doc('ACTION1', $vals->[1], $vals->[2], $vals->[3]), 'Case Docs are Different');
delete $obj->{'version'};
}
sub test_store_text{
my $dbh = Bugzilla->dbh;
my $text = {
'breakdown' => 'BREAKDOWN',
'setup' => 'SETUP',
'case_text_version' => '1',
'who' => '999',
'effect' => 'EFFECT',
'action' => 'ACTION',
'creation_ts' => '2008-06-04 14:57:00',
'case_id' => '999'
};
ok($obj->store_text('999', '999', 'ACTION', 'EFFECT', 'SETUP', 'BREAKDOWN', 1, '2008-06-04 14:57:00') eq 1, 'Version Updated');
my $db_text = $dbh->selectrow_hashref('SELECT * FROM test_case_texts WHERE case_id = 999');
cmp_deeply($text, $db_text, 'Text Stored Correctly');
}
sub test_link_plan{
my $id = $obj->id;
$obj->link_plan(1, $id);
my $db_plan = $dbh->selectrow_hashref("SELECT * FROM test_case_plans WHERE case_id = $id AND plan_id = 1");
my $known_plan = {'case_id' => $id, 'plan_id' => '1'};
cmp_deeply($db_plan, $known_plan, 'Plan Linked To Test Case');
}
sub _unlink_plan{
my $id = $obj->id;
my $max_id = $dbh->selectrow_array("SELECT MAX(plan_id) FROM test_plans ", undef);
$obj->link_plan($max_id, $id);
$obj->link_plan($max_id-1, $id);
my $query = "SELECT * FROM test_case_plans WHERE case_id = $id AND plan_id = 1";
my $old_db_plan = $dbh->selectrow_hashref($query);
$obj->unlink_plan($max_id);
my $new_db_plan = $dbh->selectrow_hashref($query);
ok(defined $old_db_plan && !defined $new_db_plan, 'Plan Unlinked');
}
sub test_copy{
my $copy_id = $obj->copy($obj->{'author_id'}, $obj->{'default_tester_id'}, 0);
my $copy = {
'case_id' => $copy_id,
'case_status_id' => $obj->{'case_status_id'},
'category_id' => $obj->{'category_id'},
'priority_id' => $obj->{'priority_id'},
'author_id' => $obj->{'author_id'},
'default_tester_id' => $obj->{'default_tester_id'},
'estimated_time' => $obj->{'estimated_time'},
'isautomated' => $obj->{'isautomated'},
'sortkey' => $obj->sortkey,
'script' => $obj->{'script'},
'arguments' => $obj->{'arguments'},
'summary' => $obj->{'summary'},
'requirement' => $obj->{'requirement'}};
my $db_copy = $dbh->selectrow_hashref("SELECT * FROM test_cases WHERE case_id = ?", undef, $copy_id);
delete $db_copy->{'creation_date'};
delete $db_copy->{'alias'};
delete $db_copy->{'version'};
cmp_deeply($db_copy, $copy, 'Copy Created Successfully');
}
sub test_class_check_alias{
my $no = $obj->class_check_alias('FAKE');
ok( ! defined $no, 'Alias not in DB');
}
sub test_history{
ok(defined $obj->history, "History Exists");
}
sub test_obliterate{
my $id = $dbh->selectrow_array("SELECT MAX(case_id) FROM test_cases WHERE case_id <> ?", undef, $obj->id);
my $dead_obj = new Bugzilla::Testopia::TestCase($id);
$dead_obj->obliterate;use base qw(Exporter Test::Unit::TestCase);
my $db_dead = $dbh->selectrow_arrayref("SELECT * FROM test_cases WHERE case_id = ?", undef, $id);
ok( !defined $db_dead, 'Test Case Deleted');
}
sub new {
my $self = shift()->SUPER::new(@_);
return $self;
}
sub set_up {
my $self = shift;
}
sub tear_down {
my $self = shift;
}
1;