The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!perl

##!perl -Tw

use strict;

use Test::More qw(no_plan);
use File::Temp qw(tempdir);
use Cwd qw(abs_path cwd);
use PICA::Store;
use PICA::Record;
use Data::Dumper;

if (not $ENV{PICASQL_TEST} ) {
    diag("Set PICASQL_TEST to enable additional tests of PICA::SQLiteStore!");
    ok(1);
    exit;
}

my $tempdir = tempdir( UNLINK => 1 );
my $verbose = 0;

writefile("store.conf","SQLite=$tempdir/picastore.db\n");
writefile("test.pica", slurp("t/files/minimal.pica"));

my @files = (
  abs_path("t/files/cjk.pica"),
  "$tempdir/test.pica"
);

writefile("files", join("\n", @files)."\n");

#my $record = readpicarecord("t/files/minimal.pica");
#$record->delete_field('


my $store = PICA::Store->new( conf => "$tempdir/store.conf" );
isa_ok( $store, 'PICA::Store', 'created a new store via config file' );

my %result = $store->create( PICA::Record->new('021A $aShort Title') );
my $id = $result{id};
ok ( $result{id}, 'created a record' );

# $store->size

# chdir $dir;
#t/files/graveyard.pica

my ($stdout, $stderr) = picaimport();
ok( $stderr, "needs parameters" );

($stdout, $stderr) = picaimport( "-conf $tempdir/store.conf -from $tempdir/files" );
ok( !$stderr, "import looks fine" );

my @lines = $stdout ? split("\n", $stdout) : ('');
my $msg = "^Reading from $tempdir/files";
ok( shift(@lines) =~ /$msg/, "read from file" );
my %records = map { $_ =~ /^([0-9]*[0-9Xx]) (.+)/; ($1=>$2); } @lines;

is( (keys %records), 2, 'imported 2 records' );
is( scalar @{$store->recentchanges}, 2+1, 'imported into store' );

# TODO: check if records are the same
# TODO: move files

# ($stdout, $stderr) = picaimport( "-conf $tempdir/store.conf -delete -force " . join(" ", keys %records) );
# ok( !$stderr, "delete looks fine" );
# is( scalar @{$store->recentchanges}, 2+2+1, 'deleted from store' );

#print "$stderr\n";
# print "$stdout\n";

#print Dumper(\%records) . "\n"; 
#2 /home/voj/svn/picapm/trunk/t/files/cjk.pica
#3 /tmp/9NjveobGae/test.pica

# TODO: use Test::...something for testing scripts
sub picaimport {
    my $args = shift || '';
    my ($stdout, $stderr) = ("$tempdir/stdout", "$tempdir/stderr");
    my $cmd = "perl -Iblib/lib script/picaimport $args";
    $cmd .= " 1>$stdout 2>$stderr";
    print "$cmd\n" if $verbose;
    system($cmd);
    return ( slurp($stdout), slurp($stderr) );
}


# write a file in the temporary directory
sub writefile {
    my ($file, $data) = @_;
    $file = "$tempdir/$file";
    my $fh;
    open $fh, ">$file" or die("failed to open $file");
    print $fh $data;
    close $fh;
}

# read a file into a string
sub slurp {
    my $filename = shift;
    my ($fh, $buffer, $data);
    open( $fh, "<", $filename ) or return "Failed to read file '$filename'";
    binmode($fh);
    while (read ($fh, $buffer, 65536) ) { $data .= $buffer; }
    close $fh;
    return $data;
}