The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl 
use 5.012;
use Cwd ;
use Config::Std;
use Config::General;
use IhasQuery ;
use DBIx::Simple ;
use File::Copy ;

use Test::More tests => 17;
#use Test::More 'no_plan' ;

diag( "Testing Pg::BulkCopy $Pg::BulkCopy::VERSION, Perl $], $^X" );
BEGIN {
    use_ok( 'Pg::BulkCopy' ) || print "Bail out!";
    }
  
########################################################################
# COMMON CODE. CUT AND PASTE TO ALL TESTS.
#######

# get pwd, should be distribution directory where harness.sh was invoked from.
my $pwd = getcwd;

my $tdata = "$pwd/tdata" ;

# Load named config file into specified hash...
#read_config  => my %config;
my $conf = new Config::General( "$pwd/t2/test.conf" );
my %config = $conf->getall;

# Extract the value of a key/value pair from a specified section...
my $dbistring  = $config{DBI}{dbistring};
my $dbiuser  = $config{DBI}{dbiuser};
my $dbipass = $config{DBI}{dbipass};

# Change this value to choose your own temp directory.
# Make sure that both the script user and the postgres user
# have rights to the directory and to each other's files.
my $tmpdir = $config{OTHER}{'tmpdir'} || '/tmp' ;
my $table = 'testing' ;
 
# Suppress Errors from the console.
# Comment to see all the debug and dbi errors as your test runs.
open STDERR, ">>/dev/null" or die ;

# reusable variables.
my $testing = undef ; my $Q = undef ; my $A = undef ; my @AA = () ; my %B = () ;
my $Simple = DBIx::Simple->new( $dbistring, $dbiuser, $dbipass ) ;

my $QCount = sub {
    my $table = shift ;
    $Simple->query( "SELECT COUNT(*) FROM $table" )->into( my $A ) ;
    return $A ;
} ;

########################################################################
# END OF THE COMMON CODE
#######

unlink "$tdata/blob1.tsv.REJECTS" ;
unlink "$tdata/pg_BulkCopy.ERR" ;
unlink "$tdata/blob2.csv.REJECTS" ;
unlink "$tdata/DUMP1.tsv" ;
unlink "$tdata/DUMP1.csv" ;
unlink "$tdata/DUMP1.csv.REJECTS" ;
unlink "$tdata/DUMP1.tsv.REJECTS" ;
unlink "$tdata/t133992.tsv.REJECTS" ;

# t157a and t157b are similar files, a is not quoted b is quoted with ".
# b also has a header record. batchsize is set down to 10.

my $filename = "t157a.csv" ;
my $table = 'testing' ;

TODO: {
    local $TODO = qq / CSV problems CSV tests not requried for release / ;
my $PG_Test = Pg::BulkCopy->new(
    dbistring => $dbistring,
    dbiuser   => $dbiuser,
    dbipass   => $dbipass,
    filename  => $filename,
    workingdir => "$tdata/",
    tmpdir 		=> $tmpdir ,
    iscsv       => 1,
    debug       => 2 ,
    batchsize   => 10, 
    table     => $table, );

$PG_Test->TRUNC() ;
$PG_Test->LOAD() ;
is ( $PG_Test->errcode() , 1 , 'Return Status should be 1' ) ;

is ( $PG_Test->errstr() , '' , 'Return string should be empty' ) ;

#my $IhQ_testing = IhasQuery->new( $PG_Test->CONN() , 'testing' ) ;

is ( $QCount->( 'testing' ) , 156 , "Should load 156" ) ;

open FHL, "<$tdata/pg_BulkCopy.ERR" or die $!;
my (@FHL) = (<FHL>) ;
close FHL ;
say ( @FHL ) ;
my $found = 0 ;
for ( @FHL ) { if ( $_ =~ m/Processing Batch\: 16/ ) { $found++ } }
is ( $found, 1, 'Found Batch 16 in log.' ) ;
$found = 0 ;
for ( @FHL ) { if ( $_ =~ m/Processing Batch\: 17/ ) { $found++ } }
is ( $found, 0, 'Did not find Batch 17 in log. There should have been 16 batches.' ) ;


$PG_Test->TRUNC() ;



# The file with the " and the header is failing. figure out why and implement header support.

    # Set file name to t157b.csv
    $PG_Test->filename( 't157b.csv' ) ;
# Test::More has an issue with the BulkCopy object exiting when LOAD has a critical failure
# commented instead of SKIP inside TODO.
#SKIP: {    $PG_Test->LOAD() ; }
    is ( $PG_Test->errcode() , 1 , 'Return Status should be 1' ) ;
    is ( $PG_Test->errstr() , '' , 'Return string should be empty' ) ;
    is ( $QCount->( 'testing' ) , 156 , "Should load 156" ) ;
}  


#Now test for maxerrrors.
$filename = 'large_5_errors.tsv' ;
#my $filename = 'errors_25.tsv' ;
$table = 'millions' ;
my $MaxErrors = Pg::BulkCopy->new(
    dbistring => $dbistring,
    dbiuser   => $dbiuser,
    dbipass   => $dbipass,
    filename  => $filename,
    workingdir => "$tdata/",
    tmpdir 		=> $tmpdir ,
    iscsv       => 0,
    debug       => 2 ,
    batchsize   => 5000, 
    maxerrors   => 6,
    table     => $table, );
 
$MaxErrors->TRUNC() ;
$MaxErrors->LOAD() ;

is ( $MaxErrors->errcode() , 1 , 'Return Status should be 1' ) ;
is ( $MaxErrors->errstr() , '' , 'Return string should be empty' ) ;
my $IhQ_Max = IhasQuery->new( $MaxErrors->CONN() , $table  ) ;
is ( $IhQ_Max->count() , 33989 , "Should load 33989" ) ;  
 
# It should have worked with max errors at 6. now we chop max errors to 5, so the last error should kill it.
$MaxErrors->TRUNC() ;
$MaxErrors->maxerrors( 5 ) ;
$MaxErrors->LOAD() ;
is ( $MaxErrors->errcode() , -1 , 'Return Status should be -1 because the load failed.' ) ;
like ( $MaxErrors->errstr() , qr/Max Errors 5 reached/, 'Return string should tell us Max Errors was reached.' ) ;
$MaxErrors->maxerrors( 0 ) ;
is ( $MaxErrors->maxerrors(), 99999, "Setting maxerrors to 0 should set it to 99999" ) ;
$MaxErrors->maxerrors( 1 ) ;
is ( $MaxErrors->maxerrors(), 1, "Now maxerrors is set to 1." ) ;
$MaxErrors->TRUNC() ;
$MaxErrors->LOAD() ;
like ( $MaxErrors->errstr() , qr/Max Errors 1 reached/, 'Return string should tell us 1 Max Errors was reached.' ) ;