#
#===============================================================================
#
# DESCRIPTION: unit test LIMS::Local::QueryMailer.pm
#
#===============================================================================
package TestsFor::LIMS::Local::QueryMailer;
use Modern::Perl;
use utf8;
use Test::Class::Moose;
use DDP caller_info => 1;
use Try::Tiny;
with 'Test::Class::Moose::Role::AutoUse';
sub test_some : Tests {
my $test = shift;
my $class = $test->test_class;
my $outfile_name = "dlbcl2_test.xlsx";
reset_database();
#
note "test create object";
#
my $query = LIMS::Local::QueryMailer->new( testing => 1 );
ok( defined($query), 'create object' );
$query->dbix->query('use lims_test');
is $query->dbix->query('select database()')->list, 'lims_test',
'Using test database';
#
note "test 'run' method";
#
is( scalar @{ $query->results() }, 0, "initialised with no results" );
my $sql = "select * from requests limit 5";
$query->run( sql => $sql, sheet_name => 'requests' );
is( scalar @{ $query->results() }, 1, "has 1st result" );
ok( $query->results->[0]{db_output}->isa('DBIx::Simple::Result'),
'run produced a DBIx::Simple::Result' );
$sql = "select * from patients limit 5";
$query->run( sql => $sql, sheet_name => 'patients' );
is( scalar @{ $query->results() }, 2, "has 2nd result" );
#
# "test bad sql";
#
try {
$query->run( sql => 'sql' );
}
catch {
like $_, qr/error in your SQL syntax/, 'caught error in bad sql string';
};
is( scalar @{ $query->results() }, 2, "still only has 2 results" );
# type of result
# note explain $query->results->[0]->{db_output}->arrays;
# $query->run($sql);
# is( scalar @{ $query->results() }, 2, "has 2 results" );
# # type of result
# note explain $query->results->[1]->{db_output}->hashes;
#
note "test 'make_excel' method";
#
$query->make_excel($outfile_name);
lives_ok { check_xlsx($query) } "Excel file contains correct headers";
my $query_blank = LIMS::Local::QueryMailer->new( testing => 1 );
$query_blank->dbix->query('use lims_test');
dies_ok { $query_blank->make_excel($outfile_name) }
"Excel file not created if there are no DB results";
my @recipients = ('garry.quested@nhs.net');
lives_ok {
$query->mail_results(
recipients => \@recipients,
subject => "DLBCL data this week"
)
}
'sends mail (subject to HILIS testing rules) successfully';
#
note "test 'save_file' method";
#
lives_ok { $query->save_file('/tmp/') } 'saves file to /tmp';
ok -f "/tmp/$outfile_name", 'Excel file created';
#unlink "/tmp/$outfile_name";
throws_ok { $query->save_file('/') } qr/Permission denied/,
'dies when it doesnt have write permission';
throws_ok { $query->save_file('/tmp_doesnt_exist/') }
qr/No such file or directory/, 'dies when directory doesnt exist';
return 1;
}
# creates a file and tests validity using Spreadsheet::Read if available
# doesnt break if module not available because its only used in testing.
# should be recommended though
sub check_xlsx {
SKIP: {
my $res = eval { require Spreadsheet::Read };
skip 'need to install Spreadsheet::Read to run these tests', 2, if $@;
my $data = $_[0]->excel->{workbook};
my $results = $_[0]->results;
#create an excel file from data
my $filename = "/tmp/testfile$$.xlsx";
open my $fh, '>:raw', $filename
or die "could not open $filename for writing";
binmode($fh);
print $fh $data;
close $fh or die "could not close $filename ";
# test file by comparing each header cell in each sheet with it's corresponding result column name from DBIx::Simple::Result->column
my $workbook = Spreadsheet::Read::ReadData($filename);
foreach my $sheet ( 1 .. $workbook->[0]{sheets} )
{ # sheets numbered 1..n
my @columns =
$results->[ $sheet - 1 ]{db_output}->columns; # DBIC method
foreach my $i ( 0 .. $#columns ) {
# is $columns[$i] , $workbook->[$sheet]{cell}[ $i + 1 ][1];
die if $columns[$i] ne $workbook->[$sheet]{cell}[ $i + 1 ][1];
}
}
# tidy up
unlink $filename || die;
}
return;
}
sub reset_database {
return 1;
}
1;