#!/usr/bin/env perl
# tests local billing rules
# so far just requests with HTS myeloid panel
# export DEBUG_ON to see debug output
use LIMS::Local::Billing;
use DateTime::Tiny;
use Clone 'clone'; # or use LLU::clone
use Test::More;
use constant TESTS => 34;
use strict;
use warnings;
use Data::Printer alias => 'p';
# example data - need to add presentation and request_lab_tests, and
# optionally change sample_code in test blocks:
my %data = qw(
id 1
request_number 100
year 2000
last_name billing
first_name phil
unit_number B1010
nhs_number 1111111111
organisation_code RR801
referrer_code C1234567
sample_code PB
category 01
on_call 0
dob 1950-05-29
hospital_department_code 823
); # gender, trial_name, etc optional - handled inside Billing.pm
# created_at requires a DT object:
$data{created_at} = DateTime->today;
=begin
presentation = 'HTS myeloid only'
specimen = BMA
tests = hts_myeloid only (plus 'irrelevant' dna_extraction)
expect 1 BMASEQ with charge code 01 only
=cut
{
my %h = get_data(); # p %h;
$h{presentation} = 'HTS myeloid only';
$h{request_lab_tests} = [ qw/hts_myeloid dna_extraction/ ];
my @samples = (
{ %h, sample_code => 'BMA' }, # override default value,
);
my @rows = get_all_rows(@samples); # p @rows;
# results:
is( scalar @rows, 1, 'got expected 1 row' );
is( content('sample', 1, @rows), 'HMBMASEQ', 'sample code BMASEQ');
is( content('category', 1, @rows), '01', 'charge code 01');
}
=begin
presentation = 'HTS myeloid only'
specimens = BMA & PB
tests = hts_myeloid only (plus 'irrelevant' dna_extraction)
expect 1 BMASEQ with charge code 01 & 1 BMA with charge code ST
=cut
{
my %h = get_data(); # p %h;
$h{presentation} = 'HTS myeloid only';
$h{request_lab_tests} = [ qw/hts_myeloid dna_extraction/ ];
my @samples = ( # one per row:
\%h, # using default PB sample_code
{ %h, sample_code => 'BMA' }, # override default value
);
my @rows = get_all_rows(@samples); # p @rows;
# results:
is( scalar @rows, 2, 'got expected 2 rows' );
is( content('sample', 1, @rows), 'HMBMASEQ', 'sample code BMASEQ');
is( content('category', 1, @rows), '01', 'charge code 01');
is( content('sample', 2, @rows), 'HMBMA', 'sample code BMA');
is( content('category', 2, @rows), 'ST', 'charge code ST');
}
=begin
presentation = 'HTS myeloid only'
specimen = BMA
tests = hts_myeloid + some flow tests
expect 1 BMASEQ with charge code 01
=cut
{
my %h = get_data(); # p %h;
$h{presentation} = 'HTS myeloid only';
$h{request_lab_tests} = [ qw/hts_myeloid flow_test_1 flow_test_2/ ];
my @samples = ( # one per row:
{ %h, sample_code => 'BMA' }, # override default value
);
my @rows = get_all_rows(@samples); # p @rows;
# results:
is( scalar @rows, 1, 'got expected 1 row' );
is( content('sample', 1, @rows), 'HMBMASEQ', 'sample code BMASEQ');
is( content('category', 1, @rows), '01', 'charge code 01');
}
=begin
presentation = 'HTS myeloid only'
specimens = BMA & PB
tests = hts_myeloid + some flow tests
expect 1 BMASEQ with charge code 01
=cut
{
my %h = get_data(); # p %h;
$h{presentation} = 'HTS myeloid only';
$h{request_lab_tests} = [ qw/hts_myeloid flow_test_1 flow_test_2/ ];
my @samples = ( # one per row:
{ %h, sample_code => 'BMA' }, # override default value
);
my @rows = get_all_rows(@samples); # p @rows;
# results:
is( scalar @rows, 1, 'got expected 1 row' );
is( content('sample', 1, @rows), 'HMBMASEQ', 'sample code BMASEQ');
is( content('category', 1, @rows), '01', 'charge code 01');
}
=begin
presentation = 'Cytopenia'
specimen = BMA
tests = hts_myeloid only (plus 'irrelevant' dna_extraction)
expect 1 BMASEQ with charge code 01
=cut
{
my %h = get_data(); # p %h;
$h{presentation} = 'Cytopenia';
$h{request_lab_tests} = [ qw/hts_myeloid dna_extraction/ ];
my @samples = (
{ %h, sample_code => 'BMA' }, # override initial value
);
my @rows = get_all_rows(@samples); # p @rows;
# results:
is( scalar @rows, 1, 'got expected 1 row' );
is( content('sample', 1, @rows), 'HMBMASEQ', 'sample code BMASEQ');
is( content('category', 1, @rows), '01', 'charge code 01');
}
=begin
presentation = 'Cytopenia'
specimens = BMA & PB
tests = hts_myeloid only (plus 'irrelevant' dna_extraction)
expect 1 BMASEQ & 1 BMA, both with charge code 01
=cut
{
my %h = get_data(); # p %h;
$h{presentation} = 'Cytopenia';
$h{request_lab_tests} = [ qw/hts_myeloid dna_extraction/ ];
my @samples = (
\%h, # using default PB sample_code
{ %h, sample_code => 'BMA' }, # override initial value
);
my @rows = get_all_rows(@samples); # p @rows;
# results:
is( scalar @rows, 2, 'got expected 2 rows' );
is( content('sample', 1, @rows), 'HMBMASEQ', 'sample code BMASEQ');
is( content('category', 1, @rows), '01', 'charge code 01');
is( content('sample', 2, @rows), 'HMBMA', 'sample code BMA');
is( content('category', 2, @rows), '01', 'charge code 01');
}
=begin
presentation = 'Cytopenia'
specimen = BMA
tests = hts_myeloid + some flow tests
expect 1 BMASEQ & 1 BMA, both with charge code 01
=cut
{
my %h = get_data(); # p %h;
$h{presentation} = 'Cytopenia';
$h{request_lab_tests} = [ qw/hts_myeloid flow_test_1 flow_test_2/ ];
my @samples = (
{ %h, sample_code => 'BMA' }, # override initial value
);
my @rows = get_all_rows(@samples); # p @rows;
# results:
is( scalar @rows, 2, 'got expected 2 rows' );
is( content('sample', 1, @rows), 'HMBMASEQ', 'sample code BMASEQ');
is( content('category', 1, @rows), '01', 'charge code 01');
is( content('sample', 2, @rows), 'HMBMA', 'sample code BMA');
is( content('category', 2, @rows), '01', 'charge code 01');
}
=begin
presentation = 'Cytopenia'
specimens = BMA & PB
tests = hts_myeloid + some flow tests
expect 1 BMASEQ, 1 BMA & 1 PB, all with charge code 01
=cut
{
my %h = get_data(); # p %h;
$h{presentation} = 'Cytopenia';
$h{request_lab_tests} = [ qw/hts_myeloid flow_test_1 flow_test_2/ ];
my @samples = (
\%h, # using default PB sample_code
{ %h, sample_code => 'BMA' }, # override default value
);
my @rows = get_all_rows(@samples); # p @rows;
# results:
is( scalar @rows, 3, 'got expected 3 rows' );
is( content('sample', 1, @rows), 'HMBMASEQ', 'sample code BMASEQ');
is( content('category', 1, @rows), '01', 'charge code 01');
is( content('sample', 2, @rows), 'HMPB', 'sample code PB');
is( content('category', 2, @rows), '01', 'charge code 01');
is( content('sample', 3, @rows), 'HMBMA', 'sample code BMA');
is( content('category', 3, @rows), '01', 'charge code 01');
}
done_testing(TESTS);
#==============================================================================
sub get_all_rows {
my @requests = @_;
my $llb = LIMS::Local::Billing->new( settings => {} ); # p $llb;
$llb->bone_marrow_requests({}); # required but only need data for FLAIR trial
for my $req (@requests) { # p $req; next;
# apply local rules:
$llb->apply_local_rules($req);
# generate data row:
my $data = $llb->parse_data($req);
$llb->add_row($data);
}
my @rows = $llb->get_all_rows; # p @rows;
return wantarray ? @rows : \@rows;
}
sub content {
my ($str, $row_num, @rows) = @_;
my %cols = ( # col number NOT array number
sample => 12, # duplicated in col 13
category => 14, # charge code
);
my @parts = split '\|', $rows[$row_num - 1]; # p @parts;
return $parts[$cols{$str} - 1];
}
# clone %data for return then auto-increment %data id & request_id values for
# next request:
sub get_data {
my %h = %data;
$data{$_} += 1 for qw(id request_number);
return wantarray ? %h : \%h;
}