# #=============================================================================== # # DESCRIPTION: rfc442/443 changes to MLPA. No previous test for specific mlpa # worklist # Other worklists MLPA and MLPA Quantification #=============================================================================== # test that the lab tests exist # qw/myeloma pre_treatment_cll_p038 cd5_diagnostic_p037/; use HMDS::Perl; use Test::WWW::Mechanize::CGIApp; use WWW::Mechanize::TreeBuilder; use HTML::TreeBuilder::XPath; # findnodes() use Test::Most; # tests => 6; # last test to print use Data::Printer; use Module::Find; use LIMS::Local::LIMS; BEGIN { # set default to make script safe to run anywhere $ENV{ROSEDB_DEVINIT} = 'config/rosedb_devinit_test.pl'; Module::Find::useall LIMS::DB; } require 't/test-lib.pl'; my $mech = get_mech(); WWW::Mechanize::TreeBuilder->meta->apply($mech); my $cmyc_test_id; # keep track of test id so it can be removed in last test do_login(); my $dbh; lives_ok { $dbh = get_dbh() or die 'No database handle received from get_dbh'; } 'Database handle received'; #warn $@ if $@; # setup database # needs all the tests and lab_section adding to test database my $section = LIMS::DB::LabSection->new( section_name => 'Multiplex Ligation-dependent Probe Amplification', has_result_summary => 'yes', has_section_notes => 'no', has_foreign_id => 'no', has_results_import => 'no', has_labels => 'no', auto_expand => 'no', is_active => 'no', has_test_sign_out => 'yes' ); $section->save; die unless $section->db->database eq 'lims_test'; #insert panels my @sample_types = ( { specimen_type => 'biopsy - fixed' }, { specimen_type => 'biopsy - unfixed' }, { specimen_type => 'liquid' }, ); my $myeloma_panel = LIMS::DB::LabTest->new( test_type => 'panel', test_name => 'myeloma', field_label => 'Myeloma', lab_section => $section, has_results => 'no', is_active => 'yes', ); $myeloma_panel->sample_types(@sample_types); $myeloma_panel->save(); my $cll_panel = LIMS::DB::LabTest->new( test_type => 'panel', test_name => 'cd5_diagnostic_p037', field_label => 'CD5+ diagnostic (P037)', lab_section => $section, has_results => 'no', is_active => 'yes' ); $cll_panel->sample_types(@sample_types); $cll_panel->save(); my $cd5_panel = LIMS::DB::LabTest->new( test_type => 'panel', test_name => 'pre_treatment_cll_p038', field_label => 'Pre-treatment CLL (P038)', lab_section => $section, has_results => 'no', is_active => 'yes' ); $cd5_panel->sample_types(@sample_types); $cd5_panel->save(); # get lab_section my $mol_section = ( LIMS::DB::LabSection::Manager->get_lab_sections( query => [ section_name => 'Molecular', ] ) )->[0] or die "Can't find Molecular section?!?!?"; # rename test my $quant_selected = LIMS::DB::LabTest->new( test_type => 'test', lab_section => $mol_section, test_name => 'quantification_selected', field_label => 'Quantification (selected)', is_active => 'yes' ); $quant_selected->save(); # get ref to DNA quantification test my $quant_unselected = LIMS::DB::LabTest->new( test_type => 'test', lab_section => $mol_section, field_label => 'DNA quantification', test_name => 'dna_quantification', is_active => 'yes' ); $quant_unselected->save(); my $dna_ext = LIMS::DB::LabTest->new( test_type => 'test', lab_section => $mol_section, field_label => 'DNA extraction', test_name => 'dna_extraction', is_active => 'yes' ); $dna_ext->save(); my $cd138_dna = LIMS::DB::LabTest->new( test_type => 'test', lab_section => $mol_section, field_label => 'CD138+ DNA', test_name => 'cd138_dna', is_active => 'yes' ); $cd138_dna->save(); # $quant_unselected->save(); # RFC link the tests my $link = LIMS::DB::LinkedLabTest->new( parent_lab_test => $myeloma_panel, linked_lab_test => $quant_selected, ); $link = LIMS::DB::LinkedLabTest->new( parent_lab_test => $cd5_panel, linked_lab_test => $quant_unselected, ); $link = LIMS::DB::LinkedLabTest->new( parent_lab_test => $cll_panel, linked_lab_test => $quant_unselected, ); # then needs some requests with tests requested my $requests = LIMS::DB::Request::Manager->get_requests(); for (@$requests) { # panel my $request_lab_test = LIMS::DB::RequestLabTestStatus->new( request => $_, lab_test => $myeloma_panel, user_id => 1, status_option_id => 1, ); $request_lab_test->save(); # quantification $request_lab_test = LIMS::DB::RequestLabTestStatus->new( request => $_, lab_test => $quant_selected, user_id => 1, status_option_id => 1, ); $request_lab_test->save(); # extraction $request_lab_test = LIMS::DB::RequestLabTestStatus->new( request => $_, lab_test => $cd138_dna, user_id => 1, status_option_id => 1, ); $request_lab_test->save(); } { # test 1 # are there 3 requests, all disabled in mlpa worklist $mech->get_ok( '/local_worklist?function_name=mlpa', 'get worksheet' ) ; # print_and_exit; $mech->content_contains( 'MLPA Worksheet Select', 'loaded mlpa worksheet select page' ) ; # print_and_exit(); $mech->text_like( qr/QUANTIFICATION_SELECTED/, '2 requests showing in worksheet' ); # print_and_exit(); $mech->content_like( qr/request_specimen"\s+value="[^"]*"\s+disabled="disabled"/msx, 'disabled' ); # print_and_exit(); my $res = () = $mech->content =~ /request_specimen"\s+value="[^"]*"\s+disabled="disabled"/gmsx; is( $res, 3, 'All 3 disabled' ); # print_and_exit(); } { # test 2 - worklist should show some selectable rows now my $status = LIMS::DB::LabTestStatusOption->new( description => 'complete' ); $status->load; # get all the quant_selected tests from rlts my $request_lab_test = LIMS::DB::RequestLabTestStatus::Manager->get_request_lab_test_status( query => [ 'lab_test.test_name' => 'quantification_selected' ], require_objects => 'lab_test' ); pop @$request_lab_test; # discard one entry so it remains disabled # set the rest to complete so they show up in the worklist for (@$request_lab_test) { $_->status($status); $_->save(); } # are there 3 requests, 1 disabled in mlpa worklist $mech->get_ok( '/local_worklist?function_name=mlpa', 'get worksheet' ) ; # print_and_exit(); $mech->content_contains( 'MLPA Worksheet Select', 'loaded mlpa worksheet select page' ) ; # print_and_exit(); $mech->text_like( qr/QUANTIFICATION_SELECTED/, '2 requests showing in worksheet' ); # print_and_exit(); $mech->content_like( qr/request_specimen"\s+value="[^"]*"\s+disabled="disabled"/msx, 'disabled' ); # print_and_exit(); my $res = () = $mech->content =~ /request_specimen"\s+value="[^"]*"\s+disabled="disabled"/gmsx; is( $res, 1, 'just 1 disabled' ); # print_and_exit(); } #TODO test next page # select all then submit # test that there are 2 rows in output #[$mech->forms->[0]->inputs]->[0]->check; for my $input ($mech->forms->[0]->inputs){ if ($input->type eq 'checkbox'){$input->check();} } $mech->submit; #print_and_exit(); { # only the correct rows set the index column class to index my @nodes = $mech->tree->findnodes( q!//table[@id='pcrWorksheet']/tbody/tr/td[@class='index']! ); # ddp @nodes; is( @nodes, 2, 'two rows in output table' ); # my $expr = '\[0\]'; # naf method but works! # my $c = () = $mech->text =~ /$expr/g; # is( $c, 2, 'OK: expected delta values detected' ); } # print_and_exit(); done_testing(); __END__ # needs mlpa section and panels adding to test #clone_and_reset? my $dbix = get_dbix(); for my $request_id ( 1, 2 ) { for my $lab_test_id ( 1 .. 5 ) { my %args = ( request_id => $request_id, lab_test_id => $lab_test_id, user_id => 1, status_option_id => 1, ); $dbix->insert( 'request_lab_test_status', \%args ); } } my $fish_section_id; { # lab section fish my %args = ( section_name => 'FISH', has_result_summary => 'yes', has_section_notes => 'yes', has_test_sign_out => 'no', has_foreign_id => 'yes', has_results_import => 'no', has_labels => 'no', auto_expand => 'no', is_active => 'yes', ); $dbix->insert( 'lab_sections', \%args ); $fish_section_id = $dbh->last_insert_id( undef, undef, undef, undef ); } { # lab_tests #+----+-----------+-------------+----------------+-----------+-------------+-----------+ #| id | test_name | field_label | lab_section_id | test_type | has_results | is_active | #+----+-----------+-------------+----------------+-----------+-------------+-----------+ #| 1 | pnh | PNH | 1 | panel | no | yes | #+----+-----------+-------------+----------------+-----------+-------------+-----------+ #MYELOMA WORKSHEET #col#1 # cdkn2c # cks1b #col#5 # cmyc # foreach (qw/he cdkn2c cks1b cmyc/) { my %args = ( test_name => $_, field_label => uc, lab_section_id => $fish_section_id, test_type => 'test', has_results => 'no', is_active => 'yes', ); $dbix->insert( 'lab_tests', \%args ); my $fish_test_id = $dbh->last_insert_id( undef, undef, undef, undef ); if ( $_ eq 'cmyc' ) { $cmyc_test_id = $fish_test_id; # for later test } # request_lab_test_status fish #+----+------------+-------------+------------------+---------+---------------------+ #| id | request_id | lab_test_id | status_option_id | user_id | time | #+----+------------+-------------+------------------+---------+---------------------+ #| 1 | 1 | 1 | 1 | 1 | 2018-05-18 13:35:46 | #+----+------------+-------------+------------------+---------+---------------------+ my %status_args = ( request_id => 1, lab_test_id => $fish_test_id, status_option_id => 1, user_id => 1, # time => '2018-05-18 13:35:46', ); $dbix->insert( 'request_lab_test_status', \%status_args ); } } # test that the menu item is in local worklists section # test that selecting it returns the first page $mech->get_ok('/worklist'); # print_and_exit(); $mech->content_like( qr{Other worklists:}, 'Loaded worklists page', ); $mech->content_contains( q(fish_worksheets_custom), 'Worklists yml configured for fish_worksheets_custom', ); # test worklist displays fish custom worklist: { ok $mech->form_name('others'), 'Others formname is in page'; ok $mech->select( function_name => 'fish_worksheets_custom' ), 'custom worksheet is listed'; # force error message by making it look like there are no templates in # local/fish/templates/*.tt # ok glob('/*'), 'glob doesnt returns empty list'; no warnings 'redefine'; local *CORE::GLOBAL::glob = sub { return (); }; my @testglob = glob q{/*}; is @testglob, 0, 'glob disabled for test'; $mech->get('/local_worklist?function_name=fish_worksheets_custom') ; #print_and_exit(); $mech->text_contains( q(no FISH templates are installed), 'FISH function doesnt run when there are no templates', ); } { # reset glob (out of scope) so we can check there are some templates installed ok glob(q{/*}), 'glob function reenabled'; $mech->get('/local_worklist?function_name=fish_worksheets_custom') ; # print_and_exit(); # if there are no templates then the html should explain this and then give up my @templates = glob 'templates/worklist/local/fish/templates/*'; ok( scalar @templates, 'templates available in templates/worklist/local/fish/templates' ); $mech->text_contains( q(Print FISH custom worksheets), 'FISH custom worksheet page displays', ); # get list of templates from filesystem $mech->content_contains( q(Select worksheet template), 'Template selector displayed', ); my $template_form = $mech->form_name('fish_worksheets'); my @options = $template_form->find_input('^template'); # check the template options match the directory listing # +1 because there is a dummy option '---' in select widget is( 1 + scalar @templates, scalar @{ $options[0]->{menu} }, 'all templates displayed in form' ); # loads basic template # select option # submit # non existant template (validation error handling) # $DB::single = 1; $mech->submit_form( form_name => 'fish_worksheets', fields => { template => q{doesntexist}, request_id => 1234 }, ); #print_and_exit(); $mech->content_contains( #q{template doesn't exist}, q(Print FISH custom worksheets), q{template doesn't exist so redisplay form} ); # should really use formvalidation $mech->back; $mech->submit_form( form_name => 'fish_worksheets', fields => { template => 'MYELOMA.tt', request_id => 1 } ); $mech->content_contains( 'MYELOMA Worksheet', 'template contains header text' ); # print_and_exit(); my @mark_count = $mech->content =~ /✔/gms; is( scalar @mark_count, 2, ' 2 probes ticked (✔)' ); $mech->content_like( qr{ &\#10004; # MARK (?!.*.*&\#10004;) # no MARK after .* # stuff &\#10004; # MARK }msx, 'Both MARKS on same table row' ); # cmyc test complete already $dbix->update( 'request_lab_test_status', { status_option_id => 2 }, { lab_test_id => $cmyc_test_id } ); # $dbix->delete('request_lab_test_status', {lab_test_id => $cmyc_test_id}); $mech->back; $mech->reload(); $mech->submit_form( form_name => 'fish_worksheets', fields => { template => 'MYELOMA.tt', request_id => 1 } ); $mech->content_contains( 'MYELOMA Worksheet', 'template contains header text' ); @mark_count = $mech->content =~ /✔/gms; is( scalar @mark_count, 1, ' 1 probe ticked (✔)' ); # print_and_exit(); } { # check all templates are valid chomp( my @fish_tests = ); close DATA; # use Data::Printer; # p \@fish_tests; use Template; my $tt = Template->new( POST_PROCESS => 't/lib/dumper.tt', STRICT => 1 ); foreach my $template_file ( glob 'templates/worklist/local/fish/templates/*' ) { subtest $template_file => sub { return if not ok $tt->process( $template_file, {}, \my $out ), "Processed $template_file"; my $test_data = eval $out; foreach my $col ( @{$test_data} ) { # test basic syntax ok exists $col->{label}, 'Has a label'; ok exists $col->{tests}, 'Has tests'; is scalar keys %{$col}, 2, 'Two keys per column'; # test all fishtests are valid foreach my $test ( @{ $col->{tests} } ) { ok grep( { $test eq $_ } @fish_tests ), "$test is valid fish test"; } } } } } =for comment # if fish tests change then regen this list ~$ echo "select t.test_name from lab_tests t \ join lab_sections s on t.lab_section_id = s.id and \ s.section_name = 'FISH';" \ | mysql -h 127.0.0.1 -D hilis4_clone -u root -p \ >> ~/apps/HILIS4/t/local/worklist_fish_custom.t =cut __DATA__