#!/usr/bin/perl
use Test::WWW::Mechanize::CGIApp;
use Test::Builder::Tester;
use strict;
use warnings;
use Data::Printer;
use DateTime;
use POSIX;
use Test::More;
BEGIN {
require 't/test-lib.pl';
}
my $mech = get_mech();
my $dbh;
eval {
$dbh = get_dbh() or die 'no database handle recieved from get_dbh';
};
warn $@ if $@;
my $dbix = get_dbix();
my $date = DateTime->now(); # p $date; exit;
my $plateId = 'SA01234567'; # test data
do_login();
{ # scan plate request with no vials registered:
scan_plate();
$mech->text_contains(
'Warning: unknown vial(s) present',
'OK: detected unknown or signed-out vial IDs',
);
}
{
# manually add data to request_storage table:
my $data = _plate_data();
my %h = (
sample => 'dna',
volume => 200,
source => 'liquid',
method => 'Qiagen',
vialId => undef, # supplied in loop
request_id => 1,
specimen_id => 1,
part_number => 1,
vial_location => undef, # supplied in loop
concentration => 50,
);
while ( ($h{vial_location}, $h{vialId}) = each %$data ) {
$h{part_number}++; # create unique
$dbix->insert('request_storage', \%h);
}
}
{ # scan new plate:
scan_plate();
import_data();
$mech->text_contains(
'storage location: RealTime/1/1',
'OK: expected storage_location',
);
}
{ # repeat:
scan_plate();
$mech->text_contains(
'Rack exists in storage',
'OK: rack already exists in storage',
);
# void plate:
$mech->form_name('import-data');
$mech->click_button( name => 'void_plate' ); # print_and_exit();
$mech->text_contains(
'Confirm you want to remove all vials from plate',
'OK: confirmation message loaded',
);
$mech->form_name('import-data');
$mech->field( confirm_void_plate => 1 );
$mech->submit(); # print_and_exit();
$mech->text_contains(
'successfully decoupled all vials from plate',
'OK: successfully removed vials from plate',
);
}
# fill RealTime/1/1 location (previous voiding action emptied it):
{
my $location = 'RealTime/1/1';
my $plateId = 'SA00000001'; # starting point
for ( 1 .. 4 ) {
my %h = (
plateId => $plateId++,
storage_location => $location,
);
$dbix->insert('storage_racks', \%h);
}
scan_plate(); # print_and_exit();
import_data(); # print_and_exit();
# auto-allocation selects next available tray (1/2):
$mech->text_contains(
'storage location: RealTime/1/2',
'OK: expected storage_location',
);
}
void_plate(); # do plate voiding action through dbix
{ # add 3 plates to RealTime/1/2 (last action removed solitary plate):
my $location = 'RealTime/1/2';
my $plateId = 'SA00000005'; # starting point
for ( 1 .. 3 ) {
my %h = (
plateId => $plateId++,
storage_location => $location,
);
$dbix->insert('storage_racks', \%h);
}
scan_plate(); # print_and_exit();
import_data(); # print_and_exit();
# auto-allocation selects last space in 1/2:
$mech->text_contains(
'storage location: RealTime/1/2',
'OK: expected storage_location',
);
}
void_plate(); # do plate voiding action through dbix
{ # add more trays, retain empty space in 1/2 due to voiding, check this space re-allocated:
my $location = 'RealTime/1/3';
my $plateId = 'SA00000008'; # starting point
for ( 1 .. 4 ) {
my %h = (
plateId => $plateId++,
storage_location => $location,
);
$dbix->insert('storage_racks', \%h);
}
scan_plate(); # print_and_exit();
import_data(); # print_and_exit();
# auto-allocation selects last space in 1/2 NOT 1/3:
$mech->text_contains(
'storage location: RealTime/1/2',
'OK: expected storage_location',
);
}
# void plate again, remove 1 from 1/1, check space re-allocated:
void_plate(); # do plate voiding action through dbix
{
$dbix->delete('storage_racks', { plateId => 'SA00000001'});
scan_plate(); # print_and_exit();
import_data(); # print_and_exit();
# auto-allocation selects last space in 1/1:
$mech->text_contains(
'storage location: RealTime/1/1',
'OK: expected storage_location',
);
}
{ # sign out plate:
scan_plate(); # print_and_exit();
$mech->text_contains(
'Rack exists in storage',
'OK: rack already exists in storage',
);
# select export all:
$mech->form_name('import-data');
$mech->click_button( name => 'export' ); # print_and_exit();
$mech->text_contains(
'signed out: ' . $date->dmy('.'),
'OK: plate signed out',
);
my $is_active = $dbix->select('storage_racks', 'is_active',
{ plateId => $plateId })->list;
is($is_active, 'no', 'OK: signed-out plate status is inactive');
# re-scan:
scan_plate(); # print_and_exit();
# can't find vials:
$mech->text_contains(
'Warning: unknown vial(s) present',
'OK: detected unknown or signed-out vial IDs',
);
}
done_testing(26);
sub scan_plate {
$mech->get_ok('/storage/read_xtr_96'); # print_and_exit();
$mech->form_name('do_scan');
$mech->submit(); # print_and_exit();
}
sub import_data {
$mech->form_name('import-data');
$mech->field( storage_location => 'RealTime' );
$mech->click_button( name => 'import' ); # print_and_exit();
}
sub void_plate { # do plate voiding action through dbix:
# no need to specify rack_id as all are the same, and change for each scan:
# but probably better to find the actual one:
$dbix->select('storage_racks', 'id', { plateId => $plateId })
->into(my $rack_id); # p $rack_id;
$dbix->update('request_storage',
{ rack_id => undef, vial_location => undef }, { rack_id => $rack_id } );
$dbix->delete('storage_racks', { plateId => $plateId }); # test data plateId
}
sub _plate_data {
my $i = 1000000001; # 10 digit number
my @cells = map { $_ . '01' .. $_ . '12' } ( 'A' .. 'H' ); # p @cells;
my %h = map { $_ => $i++ } @cells; # p %h;
return \%h;
}