#!/usr/bin/perl use Time::HiRes qw(gettimeofday tv_interval); use SQL::Abstract::Plugin::InsertMulti; use IPC::System::Simple qw(system); use Test::WWW::Mechanize::CGIApp; use WWW::Mechanize::TreeBuilder; use Data::Printer; use Test::More; use strict; use warnings; use feature 'say'; use lib 't/lib'; # loads t/lib/LIMS/DB/Outreach files in place of lib/LIMS/DB/Outreach =begin # tests: =cut use constant TESTS => 63; BEGIN { # need to copy LIMS/DB/Outreach files and substitute db name: my $t0 = [gettimeofday]; # make new directory t/lib/LIMS/DB/Outreach: system( 'mkdir', '-p', 't/lib/LIMS/DB/Outreach' ); # copy files from lib/LIMS/DB/Outreach (needs to be all 1 command for shell + wild-card): system( 'cp lib/LIMS/DB/Outreach/*.pm t/lib/LIMS/DB/Outreach/' ); # substitute 'outreach' -> 'outreach_test' for all files in new directory # (x27 is hex for apostrophe, otherwise needs ugly escaping; make warnings # fatal so that process dies before any tests can run): system( q!perl -mwarnings=FATAL,all -pi -e \ 's/(schema\s*=>\s*\x27outreach)/$1_test/' \ t/lib/LIMS/DB/Outreach/*.pm! ); # check all files in t/lib/LIMS/DB/Outreach have substitution, or die (0777 # is impossible hex char so line-sep changes to undef so whole file is read): system(q!perl -0777 -ne '/outreach_test/ or die' t/lib/LIMS/DB/Outreach/*.pm!); say sprintf 'copied Outreach DB: %.2f sec', tv_interval $t0, [gettimeofday]; require 't/test-lib.pl'; say sprintf 'finished: %.2f sec', tv_interval $t0, [gettimeofday]; } my $dbix = get_dbix(); my $mech = get_mech(); WWW::Mechanize::TreeBuilder->meta->apply($mech); # need to see if 'require_spell_check' is required: my $spell_check_required = is_spell_check_required(); # warn $spell_check_required; $dbix->dbh->do( qq!TRUNCATE TABLE outreach_test.$_! ) for qw( request_followup request_pack_dispatch ); { # new db entries: # new specimen: $dbix->insert('specimens', { sample_code => 'CMP', description => 'Outreach' }); # new screen category: $dbix->insert('screen_category', { name => 'outreach', is_active => 'yes'}); my $category_id = get_last_insert_id('screen_category'); # new screen: $dbix->insert('screens', { description => 'Outreach', category_id => $category_id, active => 'yes' }); # new test: $dbix->insert('lab_tests', { test_name => 'outreach', field_label => 'Outreach', test_type=> 'panel', lab_section_id => 1, has_results => 'no' }); # new screen_lab_test: my $screen_id = get_last_insert_id('screens'); my $test_id = get_last_insert_id('lab_tests'); $dbix->insert('screen_lab_test', { screen_id => $screen_id, lab_test_id => $test_id }); # patient demographics: $dbix->insert('patient_demographics', { patient_id => 2, # patient for req #3 address => '1 The Drive', post_code => 'AB1 2CD', gp_id => 2, practice_id => 2, status => 'alive' }); # check test data exists, or create it: my $tbl = 'outreach_test.followup_options'; unless ( $dbix->select( $tbl, 'COUNT(*)')->list ) { my @data = ( [ 'zero_month', 'immediately', 1 ], [ 'one_month', 'one month', 2 ], [ 'six_week', 'six weeks', 3 ], [ 'twenty_four_month', 'two years', 4 ], [ 'clinic_return', 'return to clinic', 5 ], [ 'other', 'other', 6 ], ); my @cols = qw( `option` label position ); # option is mysql keyword my ($stmt, @bind) = SQL::Abstract->new ->insert_multi( $tbl, \@cols, \@data ); # p $stmt; p @bind; $dbix->query($stmt, @bind); } } do_login(); my $today = DateTime->today; # check future pack dispatches worklist (should be none: $mech->get_ok('/local_worklist?function_name=outreach_packs_future'); $mech->has_tag( p => 'No Outreach pack dispatches due in future', 'OK: no future pack dispatches' ); # print_and_exit(); $mech->get_ok('/request/add_new/2'); # print_and_exit(); $mech->submit_form( fields => { request_number => 3, specimen => 'pb,cmp', referrer_code => 'C1234567', }, ); # print_and_exit(); $mech->content_contains( q!New request successful!, 'OK: new request entered successfully', ); $mech->get_ok('/search/=/3'); # print_and_exit(); $mech->text_contains( q!Screened as Outreach!, 'OK: screened as expected', ); # print_and_exit(); $mech->follow_link_ok( # {n => 8}, "Logout $_ via eighth link on page", { url_regex => qr(outreach)i, }, 'select "outreach" link', ); # print_and_exit(); $mech->text_contains( q!Report table!, 'OK: report page loaded', ); $mech->form_name('reportForm'); is( $mech->value('clinical_details'), 'Outreach monitoring', 'OK: request details loaded'); # minimal fields required: my %fields = ( # changed for Deb9, needs to submit_form as (fields => \%fields) followup_option_id => 3, # six weeks specimen_quality => 'adequate', diagnosis_id => 2, authorise => 1, ); $mech->submit_form(fields => \%fields); # print_and_exit(); $mech->form_name('reportForm'); # changed for Deb9, needs to re-submit form with args: $mech->submit_form(fields => \%fields) if $spell_check_required; { my $msg = get_messages('action')->{edit_success}; $mech->has_tag_like( p => qr($msg), 'OK: record updated successfully', ); # print_and_exit(); } $mech->get_ok('/report/outreach/3'); # print_and_exit(); $mech->form_name('reportForm'); is( $mech->value('followup_option_id', 1), 3, 'OK: expected followup option'); { # expected pack dispatch due date: my $date = $today->clone->add(weeks => 6)->subtract(days => 14); # p $date; is( $mech->look_down(id => 'pack_due')->attr('value'), $date->strftime('%d.%b.%Y'), 'OK: expected pack dispatch due date' ); # print_and_exit(); } # check future pack dispatches worklist (has request): $mech->get_ok('/local_worklist?function_name=outreach_packs_future'); $mech->has_tag( h3 => 'Outreach pack dispatches due in future', 'OK: worklist loaded' ); $mech->has_tag( td => 2222222222, 'OK: patient listed in future pack dispatches worklist' ); # print_and_exit(); # edit followup option (requires edit_outreach_data permission): $mech->get_ok('/outreach/edit_followup/3'); # print_and_exit(); $mech->content_contains('Permission Denied', 'OK: expected permission denied'); { # new user permission: $dbix->insert('user_functions', { function_name => 'edit_outreach_data', active => 'yes', function_detail => 'edit_outreach_data' }); my $user_function_id = get_last_insert_id('user_functions'); $dbix->insert('user_group_function', { group_id => 1, function_id => $user_function_id }); } # logout and back in again for permission change: do_logout(); do_login(); $mech->get_ok('/outreach/edit_followup/3'); # print_and_exit(); $mech->content_contains('Edit Outreach follow-up', 'OK: function now allowed'); $mech->form_name('followup'); $mech->field(followup_option_id => 4); # two years $mech->submit; # print_and_exit(); { # expected pack dispatch due date: my $date = $today->clone->add(years => 2)->subtract(days => 14); # p $date; is( $mech->look_down(id => 'pack_due')->attr('value'), $date->strftime('%d.%b.%Y'), 'OK: expected new pack dispatch due date' ); # print_and_exit(); } # history: $mech->get_ok('/history/=/3'); # print_and_exit(); $mech->text_contains('from six weeks to two years', 'OK: history log'); # check 'clinic returns' worklist: $mech->get_ok('/local_worklist?function_name=outreach_clinic_returns'); $mech->has_tag( h3 => 'Outreach clinic returns without appointment dates', 'OK: worklist loaded' ); $mech->has_tag( p => 'None', 'OK: patient not listed in clinic returns worklist' ); # print_and_exit(); # return to clinic: $mech->get_ok('/outreach/edit_followup/3'); # print_and_exit(); $mech->form_name('followup'); $mech->field(followup_option_id => 5); # return to clinic $mech->submit; # print_and_exit(); is( $mech->look_down(id => 'pack_due')->attr('value'), '01.Jan.1999', 'OK: default date for no pack dispatch' ); # history: $mech->get_ok('/history/=/3'); # print_and_exit(); $mech->text_contains('from two years to return to clinic', 'OK: history log'); # check 'clinic returns' worklist (has request): $mech->get_ok('/local_worklist?function_name=outreach_clinic_returns'); $mech->has_tag( h3 => 'Outreach clinic returns without appointment dates', 'OK: worklist loaded' ); $mech->has_tag( td => 2222222222, 'OK: patient listed in clinic returns worklist' ); # print_and_exit(); # followup option = other: $mech->get_ok('/outreach/edit_followup/3'); # print_and_exit(); $mech->form_name('followup'); $mech->field(followup_option_id => 6); # other $mech->submit; # print_and_exit(); is( $mech->look_down(id => 'pack_due')->attr('value'), '01.Jan.1999', 'OK: default date for no pack dispatch' ); # print_and_exit(); # history: $mech->get_ok('/history/=/3'); # print_and_exit(); $mech->text_contains('from return to clinic to other', 'OK: history log'); # check 'pack dispatch' worklist (request should not be listed): $mech->get_ok('/local_worklist?function_name=outreach_pack_dispatch'); $mech->has_tag( p => 'No Outreach pack dispatches due', 'OK: patient not listed in pack dispatches worklist' ); # print_and_exit(); # return immediately: $mech->get_ok('/outreach/edit_followup/3'); # print_and_exit(); $mech->form_name('followup'); $mech->field(followup_option_id => 1); # immediately $mech->submit; # print_and_exit(); { # expected pack dispatch due date: my $date = $today->clone->subtract(days => 14); # p $date; is( $mech->look_down(id => 'pack_due')->attr('value'), $date->strftime('%d.%b.%Y'), 'OK: expected new pack dispatch due date' ); # print_and_exit(); } # history: $mech->get_ok('/history/=/3'); # print_and_exit(); $mech->text_contains('from other to immediately', 'OK: history log'); # check 'pack dispatch' worklist (has request): $mech->get_ok('/local_worklist?function_name=outreach_pack_dispatch'); $mech->has_tag( h3 => 'Outreach pack dispatches', 'OK: worklist loaded' ); $mech->has_tag( td => 2222222222, 'OK: patient listed in pack dispatches worklist' ); # print_and_exit(); # record pack dispatch: $mech->tick('request_id', 3); $mech->submit_form(); # print_and_exit(); # check history: $mech->get_ok('/history/=/3'); # print_and_exit(); $mech->text_contains('dispatched CMP pack', 'OK: history log'); # check report for pack sent & return due dates: $mech->get_ok('/report/outreach/3'); # print_and_exit(); { # pack sent date (today): is( $mech->look_down(id => 'pack_sent')->attr('value'), $today->strftime('%a %d.%b.%Y'), 'OK: expected pack dispatch date' ); # print_and_exit(); } { # expected return due date (40 days after dispatch): my $date = $today->clone->add(days => 40); # p $date; is( $mech->look_down(id => 'return_due')->attr('value'), $date->strftime('%a %d.%b.%Y'), 'OK: expected pack return date' ); # print_and_exit(); } # check 'pack dispatch' worklist again (request should not be listed): $mech->get_ok('/local_worklist?function_name=outreach_pack_dispatch'); $mech->has_tag( p => 'No Outreach pack dispatches due', 'OK: patient not listed in pack dispatches worklist' ); # print_and_exit(); done_testing(TESTS);