bugzilla-4intranet/extensions/testopia/t/OBJ_Attachment.pm

340 lines
12 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 fileTestopia::Test::Util
# 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_Attachment;
use lib '.';
use lib '../..';
use strict;
use base qw(Test::Unit::TestCase);
use Bugzilla;
use Bugzilla::Constants;
use Testopia::Attachment;
use Testopia::TestPlan;
use Test;
use Testopia::Test::Constants;
use Testopia::Test::Util;
use Test::More;
use Test::Exception;
use Test::Deep;
Bugzilla->error_mode(ERROR_MODE_DIE);
use constant DB_TABLE => 'test_attachments';
use constant ID_FIELD => 'attachment_id';
our $obj = Test::test_init_from_value(DB_TABLE, ID_FIELD, '3', 'Testopia::Attachment');
our $dbh = Bugzilla->dbh;
sub test_create{
my $obj_hash = {'submitter_id' => 1,
'description' => "It's New",
'filename' => 'MyFile.txt',
'mime_type' => 'text/plain',
'case_id' => 1,
'contents' => 'Textual Contents'};
_bad_creates($obj_hash);
case_id_create($obj_hash);
plan_id_create($obj_hash);
}
sub case_id_create{
my $obj_hash = shift;
my $created_obj = Testopia::Attachment->create($obj_hash);
#Compare data against 3 database tables
delete $obj_hash->{'case_id'};
delete $obj_hash->{'contents'};
my $id = $created_obj->{'attachment_id'};
my $ts = $created_obj->{'creation_ts'};
delete $created_obj->{'attachment_id'};
delete $created_obj->{'creation_ts'};
cmp_deeply($obj_hash, noclass($created_obj), "DB and Created Object Fields Match");
$obj_hash->{'case_id'} = 1;
$obj_hash->{'contents'} = 'Textual Contents';
$created_obj->{'attachment_id'} = $id;
$created_obj->{'creation_ts'} = $ts;
my $db_obj = Testopia::Test::Util::get_rep_by_field('test_attachment_data',
'attachment_id', $created_obj->{'attachment_id'} );
$db_obj = Testopia::Test::Util::get_rep_by_field('test_case_attachments',
'attachment_id', $created_obj->{'attachment_id'});
like($db_obj->{'case_id'}, '/1/', 'Case ID Match');
ok(!defined($db_obj->{'case_run_id'}), 'Case Run ID Not Defind');
#Remove test entries from the Database
#In order to also test creating plans
$dbh->do("DELETE FROM test_attachments WHERE attachment_id = ?", undef, $created_obj->{'attachment_id'});
$dbh->do("DELETE FROM test_attachment_data WHERE attachment_id = ?", undef, $created_obj->{'attachment_id'});
$dbh->do("DELETE FROM test_case_attachments WHERE attachment_id = ?", undef, $created_obj->{'attachment_id'});
}
sub plan_id_create{
my $obj_hash = shift;
$obj_hash->{'plan_id'} = 1;
delete $obj_hash->{'case_id'};
my $created_obj = Testopia::Attachment->create($obj_hash);
delete $obj_hash->{'plan_id'};
delete $obj_hash->{'contents'};
my $id = $created_obj->{'attachment_id'};
my $ts = $created_obj->{'creation_ts'};
delete $created_obj->{'attachment_id'};
delete $created_obj->{'creation_ts'};
cmp_deeply($obj_hash, noclass($created_obj), "DB and Created Object Fields Match");
$obj_hash->{'plan_id'} = 1;
$obj_hash->{'contents'} = 'Textual Contents';
$created_obj->{'attachment_id'} = $id;
$created_obj->{'creation_ts'} = $ts;
my $db_obj = Testopia::Test::Util::get_rep('test_attachment_data',
'attachment_id', $created_obj->{'attachment_id'} );
$db_obj = Test::get_rep('test_plan_attachments',
'attachment_id', $created_obj->{'attachment_id'});
like($db_obj->{'plan_id'}, '/1/', 'Plan ID Match');
#Remove test entries form the Database
$dbh->do("DELETE FROM test_attachments WHERE attachment_id = ?", undef, $created_obj->{'attachment_id'});
$dbh->do("DELETE FROM test_attachment_data WHERE attachment_id = ?", undef, $created_obj->{'attachment_id'});
$dbh->do("DELETE FROM test_plan_attachments WHERE attachment_id = ?", undef, $created_obj->{'attachment_id'});
}
sub _bad_creates{
my $obj_hash = shift;
dies_ok(sub{Testopia::Attachment->create},
"Can't create Attachment with No Parameters");
delete $obj_hash->{'submitter_id'};
dies_ok(sub{Testopia::Attachment->create($obj_hash)},
"Can't create Attachment without submitter_id");
$obj_hash->{'submitter_id'} = 1;
delete $obj_hash->{'description'};
dies_ok(sub{Testopia::Attachment->create($obj_hash)},
"Can't create Attachment without description");
$obj_hash->{'description'} = "It's New";
delete $obj_hash->{'filename'};
dies_ok(sub{Testopia::Attachment->create($obj_hash)},
"Can't create Attachment without filename");
$obj_hash->{'filename'} = 'MyFile.txt';
delete $obj_hash->{'mime_type'};
dies_ok(sub{Testopia::Attachment->create($obj_hash)},
"Can't create Attachment without mime_type");
$obj_hash->{'mime_type'} = 'text/plan';
delete $obj_hash->{'case_id'};
dies_ok(sub{Testopia::Attachment->create($obj_hash)},
"Can't create Attachment without case_id or plan_id");
$obj_hash->{'case_id'} = 1;
}
sub test_is_browser_safe{
use Bugzilla::CGI;
my $cgi = new Bugzilla::CGI();
$obj->{'mime_type'} = 'text/html';
ok($obj->is_browser_safe($cgi) eq 1, 'Accepts Text');
$obj->{'mime_type'} = 'image/jpeg';
ok($obj->is_browser_safe($cgi) eq 1, 'Accepts Images');
}
sub _link_plan{
Test::set_user(1, 'admin@testopia.com', 'admin@testopia.com');
my $id = $dbh->selectrow_array("SELECT MAX(id) FROM products WHERE id <> ?", undef, $obj->id);
my $plan = new Testopia::TestPlan($id);
$obj->link_plan($plan->id);
my $db_obj = $dbh->selectrow_hashref("SELECT * FROM test_plan_attachments WHERE attachment_id = ? AND plan_id = ?", undef, $obj->id, $plan->id);
ok( ($db_obj->{'plan_id'} eq $plan->id) && ($db_obj->{'attachment_id'} eq $obj->id), 'Plan Linked to Attachment');
_unlink_plan($plan);
}
sub _link_case{
Test::set_user(1, 'admin@testopia.com', 'admin@testopia.com');
my @plans;
my $id = $dbh->selectrow_array("SELECT MAX(id) FROM products WHERE id <> ?", undef, $obj->id);
for(my $i=0; $i < 2; $i++){
my $plan = Testopia::TestPlan->new($id);
$id--;
push @plans, $plan;
}
my $case = Testopia::TestCase->create({'case_status_id' => 1,
'category_id' => 1,
'priority_id' => 1,
'author_id' => $obj->id,
'plans' => \@plans,
'summary' => 'SUMMARY'});
$obj->link_case($case->id);
my $db_obj = $dbh->selectrow_hashref("SELECT * FROM test_case_attachments WHERE case_id = ?", undef, $case->id);
delete $case->{'plans'};
ok( ($db_obj->{'case_id'} eq $case->id) && ($db_obj->{'attachment_id'} eq $obj->id), 'Case Linked to Attachment');
_unlink_case($case);
}
sub _unlink_plan{
my $plan = shift;
my $old = $dbh->selectrow_hashref("SELECT * FROM test_plan_attachments WHERE attachment_id = ? AND plan_id = ?", undef, $obj->id, $plan->id);;
$obj->unlink_plan($plan->id);
my $new = $dbh->selectrow_hashref("SELECT * FROM test_plan_attachments WHERE attachment_id = ? AND plan_id = ?", undef, $obj->id, $plan->id);;
ok(defined $old && !defined $new, 'Plan Unlinked')
}
sub _unlink_case{
my $case = shift;
my $old = $dbh->selectrow_hashref("SELECT * FROM test_case_attachments WHERE case_id = ?", undef, $case->id);
$obj->unlink_case($case->id);
my $new = $dbh->selectrow_hashref("SELECT * FROM test_case_attachments WHERE case_id = ?", undef, $case->id);
ok(defined $old && !defined $new, 'Plan Unlinked')
}
sub test_can_view{
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'});
ok($obj->canview, $login->{'login_name'} . ' Can View Attachment');
}
}
sub test_can_edit{
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'});
ok($obj->canedit, $login->{'login_name'} . ' Can Edit Attachment');
}
}
sub test_can_delete{
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($login->{'id'} =~ m/1/ ){ #If user is Admin
ok($obj->candelete, $login->{'login_name'} . ' Can Delete Attachment');
}
else{
ok(! $obj->candelete, $login->{'login_name'} . ' Can Not Delete Attachment');
}
}
}
sub test_datasize{
$obj->{'datasize'} = 3110;
ok($obj->datasize eq 3110, 'Datasize Match');
}
sub test_contents{
$obj->{'contents'} = 'Some Text';
like($obj->contents, '/Some Text/', 'Contents Match');
delete $obj->{'contents'};
# Only checks to match the first of 5 paragraphs
like($obj->contents, '//', 'DB Contents Match');
}
sub test_type{
delete $obj->{'type'};
like($obj->type, '/attachment/', 'Type is Attachment');
like($obj->{'type'}, '/attachment/', 'Type is Attachment');
}
sub test_cases{
Test::set_user(1, 'admin@testopia.com', 'admin@testopia.com');
my $id = $dbh->selectrow_array("SELECT MAX(plan_id) FROM test_plans WHERE plan_id <> ?", undef, $obj->id);
my @plans;
for(my $i=0; $i < 2; $i++){
my $plan = Testopia::TestPlan->new($id);
$id--;
push @plans, $plan;
}
my $case = Testopia::TestCase->create({'case_status_id' => 1,
'category_id' => 1,
'priority_id' => 1,
'author_id' => 1,
'plans' => \@plans,
'summary' => 'SUMMARY'});
$obj->link_case($case->id);
ok(defined $obj->cases, 'TestCase Created');
_link_case;
}
sub test_plans{
Test::set_user(1, 'admin@testopia.com', 'admin@testopia.com');
my $id = $dbh->selectrow_array("SELECT MAX(id) FROM products WHERE id <> ?", undef, $obj->id);
my $plan = Testopia::TestPlan->new($id);
$obj->link_plan($plan->id);
delete $plan->{'version'};
ok( defined $obj->plans, 'TestPlans Linked' );
_link_plan;
}
sub test_obliterate{
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($login->{'id'} =~ m/1/ ){ #If user is Admin
$obj->obliterate;
my $db_data = $dbh->selectrow_hashref("SELECT * FROM test_attachment_data where attachment_id = ?", undef, $obj->id);
my $db_case = $dbh->selectrow_hashref("SELECT * FROM test_case_attachments where attachment_id = ?", undef, $obj->id);
my $db_plan = $dbh->selectrow_hashref("SELECT * FROM test_plan_attachments where attachment_id = ?", undef, $obj->id);
my $db_attach = $dbh->selectrow_hashref("SELECT * FROM test_attachments where attachment_id = ?", undef, $obj->id);
ok( !defined $db_data && !defined $db_case && !defined $db_plan && !defined $db_attach, 'Objected Obliterated');
}
else{
ok(! $obj->obliterate, $obj->{'login_name'} . ' Can Not Obliterate Attachment');
}
}
}
sub new {
my $self = shift()->SUPER::new(@_);
return $self;
}
sub set_up {
my $self = shift;
}
sub tear_down {
my $self = shift;
}
1;