#!/usr/bin/perl
use Test::WWW::Mechanize::CGIApp;
use strict;
use warnings;
use Test::More;
use constant TESTS => 261;
use Data::Printer alias => 'ddp';
=begin: tests:
=cut
BEGIN {
require 't/test-lib.pl';
}
print_msg('Setting up');
my $mech = get_mech();
my $dbh;
eval {
$dbh = get_dbh() or die 'no database handle received from get_dbh';
};
warn $@ if $@;
my $dbix = get_dbix();
my $validation_profiles = get_validation_profiles(); # ddp $validation_profiles;
{ # create new HMRN parent:
my %h = (
parent_code => 'RR8',
description => 'LTH',
referral_type_id => 3,
);
$dbix->insert('parent_organisations', \%h) or die $dbix->error;
}
{ # create new HMRN source of new parent:
$dbix->select('parent_organisations', 'id',
{ parent_code => 'RR8' })->into(my $id);
my %h = (
parent_organisation_id => $id,
organisation_code => 'RR813',
referral_type_id => 3,
display_name => 'SJUH',
);
$dbix->insert('referral_sources', \%h) or die $dbix->error;
}
{ # create hmrn permission:
my %h = (
function_name => 'edit_clinical_data',
function_detail =>'view & edit HMRN data',
);
$dbix->insert('user_functions', \%h);
}
{ # update user access permissions:
$dbix->select('user_functions', 'id',
{ function_name => 'edit_clinical_data' })->into(my $id);
$dbix->insert('user_group_function', { group_id => 1, function_id => $id });
}
do_hmrn_data();
print_msg('Log in');
do_login();
print_msg('Registering new patient');
# register new patient_case + request:
$mech->get_ok('/patient/select_patient/2');
{
$mech->submit_form(
fields => {
unit_number => 2233,
referral_source_id => 5,
},
); # print_and_exit();
$mech->submit_form(
fields => {
request_number => 3,
referrer_code => 'C9999998',
specimen => 'PB',
},
); # print_and_exit();
$mech->has_tag(
h3 => 'New request successful',
);
}
# screen it:
print_msg('Screening');
$mech->get_ok('/screen/do_initial_screen/3?screen_id=1;option_id=1');# print_and_exit();
# report it:
print_msg('Reporting');
$mech->get_ok('/report/=/3'); # print_and_exit();
{
# test missing:
my %report = (
status => 'default',
confirm_outstanding_tests => 1,
clinical_details => 'some details here',
gross_description => 'gross description here',
specimen_quality => 'adequate',
diagnosis_id => 1,
);
$mech->form_name('reportForm');
$mech->submit_form(fields => \%report); # print_and_exit();
$mech->submit_form(form_name =>'reportForm') if is_spell_check_required();
lacks_dfv_errors(); # print_and_exit();
}
# authorise it:
print_msg('Authorising');
{
# manually change reporter's id:
$dbix->update( 'request_history',
{ user_id => 2 }, { action => 'reported', request_id => 3 },
);
$mech->get_ok('/report/=/3?pre-authorisation-check=1'); # print_and_exit();
$mech->form_name('reportForm');
$mech->field( confirm_outstanding_tests => 1 );
$mech->field( authorise => 1 );
$mech->submit_form(); # print_and_exit();
$mech->submit_form(form_name =>'reportForm') if is_spell_check_required();
lacks_dfv_errors(); # print_and_exit();
}
# =========================== MAIN TESTS ========================================
# add some HMRN data:
my %precursor_values = (
#Unique data: -----
#..no unique data
#Shared data: -----
ecog => 1,
wbc => 6.0,
hb => 20.0,
plts => 300,
lymphs => 5.0,
pcv => 65,
neutrophils => 2.0,
monocytes => 1.0,
);
my $precursor_required = $validation_profiles->hmrn_precursor->{required};
my %myeloid_values = ( # *** excluding fields shared with precursor **** :
#Unique data: -----
pcv => 60.0,
epo => 'low',
splenomegaly => 'Y',
hepatomegaly => 'N',
detection_spleen => 'both',
detection_liver => 'both',
karyotype => 'good',
cd34 => 12.0,
transfusion => 'N',
cytopenias => 1,
#Shared data: -----
ecog => 1,
wbc => 6.0,
hb => 20.0,
pcv => 65.0,
lymphs => 5.0,
neutrophils => 2.0,
monocytes => 1.0,
plts => 300,
);
my $myeloid_required = $validation_profiles->hmrn_myeloid->{required};
my %lymphoid_values = (
#Unique data: -----
bm => 'N',
sweats => 'N',
fever => 'N',
wt_loss => 'N',
ct => 'N',
binet => 'A',
stage => 'I',
ldh => 'low',
#Shared data: -----
ecog => 1,
pcv => 65.0,
monocytes => 1.0,
wbc => 6.0,
hb => 20.0,
lymphs => 5.0,
plts => 300,
neutrophils => 2.0,
paraprotein => 'IgA',
albumin => '60',
b2m => '45.0',
pp_level => 60.0,
igs => 'normal',
);
my $lymphoid_required = $validation_profiles->hmrn_lymphoid->{required};
my %plasmacell_values = (
#Unique data: -----
bence_jones => 'both',
serum_flc => 'both',
bone_disease => 'equivocal',
bone_lesions => 'multiple',
mri => 'N',
skeletal_survey => 'N',
serum_kappa => 40.0,
serum_lambda => 45.0,
kappa_lambda_ratio => 50.0,
creatinine => 55,
calcium => 65.0,
#Shared data: -----
paraprotein => 'IgA',
igs => 'normal',
ecog => 1,
plts => 300,
neutrophils => 2.0,
monocytes => 1.0,
pp_level => 60,
b2m => '45',
hb => 20.0,
albumin => '60',
wbc => 6.0,
pcv => 65.0,
lymphs => 5.0,
);
my $plasmacell_required = $validation_profiles->hmrn_plasmacell->{required};
{ # tests to add full data to each category, one at a time,
# after adding the data category, test deleting it
clear_params_for_request(3); # clear all existing parameters
$mech->get_ok('/hmrn_data/=/3'); # open the data entry page
my %category_parm_values = (
precursor => \%precursor_values,
myeloid => \%myeloid_values,
lymphoid => \%lymphoid_values,
plasmacell => \%plasmacell_values,
);
while (my ($category_name, $params_vals_ref) = each(%category_parm_values)) {
print_msg("TEST - Adding full data to $category_name");
$mech->form_name( $category_name );
$mech->submit_form( fields => $params_vals_ref );
test_edited_msg( $category_name );
print_msg("TEST - Params all exist for $category_name");
my @params = get_params_for_category( $category_name );
test_form_has_param_values( $category_name, \@params);
# test delete category
print_msg("TEST - Deleting params from $category_name");
test_delete_category_simple($category_name);
test_form_ismissing_param_values($category_name, \@params);
}
}
{ # testing deleting precursor category, warning against deleting unique data from
# the myloid category that shares data with it.
print_msg("Prepare to test deleteing shared data - clear data now");
clear_params_for_request(3); # clear all existing parameters
{ # populate myloid category, which also populates precursor category
# due to shared data
print_msg("TEST - Submit full myeloid data");
$mech->form_name('myeloid');
$mech->submit_form(fields => \%myeloid_values);
test_edited_msg('myeloid');
}
print_msg("TEST - Try to delete precursor section with shared data in myeloid");
$mech->get_ok('/hmrn_data/delete_section_data/3/precursor'); # print_and_exit;
{ # warn $mech->text;
$mech->text_contains(
'deleting data items from the PRECURSOR section will also remove them from other sections',
'OK: warning 1 located',
);
$mech->text_contains(
'sections highlighted in red also contain additional (non-shared) data ',
'OK: warning 2 located',
);
}
# provide confirmation:
{
print_msg("Provide delete confirmation");
$mech->tick(confirm_delete => 1);
$mech->submit(); # print_and_exit();
print_msg("TEST - Delete confirmed");
test_deleted_msg('precursor');
}
{ # check all precursor data gone and non-shared still exists:
# precursor fields:
print_msg("TEST - Ensure all precursor data has gone");
$mech->form_name('precursor');
my @precursor_params = get_params_for_category('precursor'); # p \@precursor_params;
for my $param(@precursor_params) { # p [ $param, $mech->value($param) ];
my $result = $mech->value($param) ? 1 : 0; # just need existance
is($result, 0, "OK: precursors.$param value deleted");
}
# myeloid fields:
print_msg("TEST - Ensure all myloid data shared with precursor data has gone");
$mech->form_name('myeloid');
for my $param(@precursor_params) { # p [ $param, $mech->value($param) ];
my $result = $mech->value($param) ? 1 : 0; # just need existance
is($result, 0, "OK: shared myeloid.$param value deleted");
}
print_msg("TEST - Ensure all myloid's unique data has been retained");
my @myeloid_params = get_params_for_category('myeloid'); # p \@myeloid_params; # didn't add all
for my $param(@myeloid_params) {
next if (grep {$_ eq $param} @precursor_params); # skip precursor parametets
my $result = $mech->value($param) ? 1 : 0; # just need existance
is($result, 1, "OK: unique myeloid.$param value retained");
}
}
}
{ # test required values
print_msg("TEST - Test submitting with each required field missing");
test_form_required_values('precursor', \%precursor_values, $precursor_required);
test_form_required_values('myeloid', \%myeloid_values, $myeloid_required);
test_form_required_values('lymphoid', \%lymphoid_values, $lymphoid_required);
test_form_required_values('plasmacell', \%plasmacell_values, $plasmacell_required);
}
#####################################################
## IN PROGRESS #
#####################################################
#{ # test ranges and defaults
#
# print_msg("TEST (IN PROGRESS) - Test myeloid ranges...");
#
# my $category = 'myeloid';
# my %modified_values = %myeloid_values;
#
# my $sql = "SELECT p.param_name, dr.min_value, dr.max_value,
# dr.not_stated, dr.not_done
# FROM category_parameter cp
# JOIN categories c ON cp.category_id=c.id
# JOIN defaults_and_ranges dr ON cp.parameter_id=dr.param_id
# JOIN parameters p ON cp.parameter_id=p.id
# WHERE c.category=?;";
#
# clear_params_for_request(3); # clear all existing parameters
# $mech->get_ok('/hmrn_data/=/3'); # open the data entry page
#
#
# for my $range_hashref ( $dbix->query($sql, $category)->hashes ) {
#
#p $range_hashref;
#
# my $param_has_range = $range_hashref->{param_name}; # parameter in this category that has a range
# my $original_value = $modified_values{$param_has_range}; # keep orignal value for this param to reset it later
# my $range_string = "[" . $range_hashref->{min_value} . " to " . $range_hashref->{max_value} . "]";
#
# # Modify value to be 0.1 under the minimum acceptable value and submit
# $modified_values{$param_has_range} = $range_hashref->{min_value} - 0.1;
#
# $mech->form_name($category);
# $mech->submit_form(fields => \%modified_values);
# $mech->content_contains('FORM FAILED VALIDATION',
# "OK: $modified_values{$param_has_range} out of range "
# . "$range_string for $category.$param_has_range"); #may need to edit this to check for something different
#### test_edited_msg($category);
#
# # reset to original value after finished testing this param
# $modified_values{$param_has_range} = $original_value;
#
# }
#
#}
#####################################################
## END OF 'IN PROGRESS' #
#####################################################
done_testing(TESTS);
print_msg("END");
sub test_form_required_values {
# Checkes each required field in a form to make sure we get a validation error if it's not there.
my($category_name, $values_href, $req_params_aref) = @_ ;
clear_params_for_request(3); # clear all existing parameters
$mech->get_ok('/hmrn_data/=/3'); # open the data entry page
my %modified_values = %$values_href;
for my $req_param (@$req_params_aref) {
$modified_values{$req_param} = undef;
$mech->form_name($category_name);
$mech->submit_form(fields => \%modified_values);
$mech->content_contains('FORM FAILED VALIDATION',
"OK: form validation failed for missing $category_name.$req_param",);
# reset modified value
$modified_values{$req_param} = $values_href->{$req_param};
}
}
sub test_delete_category_simple {
#deletes a category using the delete URL, doesn't check for confirmation messages
my $category = shift;
$mech->get_ok("/hmrn_data/delete_section_data/3/$category"); # print_and_exit;
$mech->tick(confirm_delete => 1);
$mech->submit();
test_deleted_msg($category);
}
sub test_deleted_msg {
my $deleted_category = shift;
my $msg = get_messages('action')->{delete_success};
$mech->has_tag_like(
p => qr(INFO: $msg),
"OK: delete $deleted_category action succeeded",
);
}
sub test_edited_msg {
my $edited_category = shift;
my $msg = get_messages('action')->{edit_success};
$mech->has_tag_like(
p => qr(INFO: $msg),
"OK: edit $edited_category action succeeded",
);
}
sub test_form_has_param_values {
# Tests if a given array of params have values in the given form
my($form_name, $param_aref) = @_ ;
$mech->form_name($form_name);
for my $param(@$param_aref) {
my $result = $mech->value($param) ? 1 : 0; # just need existance
is($result, 1, "OK: $form_name.$param value loaded");
}
}
sub test_form_ismissing_param_values {
# Tests if a given array of params have values in the given form
my($form_name, $param_aref) = @_ ;
$mech->form_name($form_name);
for my $param(@$param_aref) {
my $result = $mech->value($param) ? 1 : 0; # just need existance
is($result, 0, "OK: $form_name.$param has no value");
}
}
sub clear_params_for_request { # JD - Clears the parameters for a given request
my $request_id = shift;
my $sql = q!select patient_id from patient_case pc join requests r on
r.patient_case_id = pc.id where r.id = ?!;
$dbix->query($sql, $request_id)->into(my $patient_id);
$dbix->delete('hmrn_test.patient_params', { patient_id => $patient_id });
}
sub get_params_for_category {
my $category = shift;
my $sql = q!select param_name from hmrn_test.parameters p join
hmrn_test.category_parameter cp on cp.parameter_id = p.id join
hmrn_test.categories c on cp.category_id = c.id where c.category = ?!;
my @params = $dbix->query($sql, $category)->flat; # \p @params;
return wantarray ? @params : \@params;
}
# Prints out a message
sub print_msg {
my $msg = shift;
print "\n" . '-' x 10 . ' ' . $msg . "\n";
}