DBIx-TableLoader-CSV
view release on metacpan or search on metacpan
t/csv_error.t view on Meta::CPAN
# vim: set ts=2 sts=2 sw=2 expandtab smarttab:
use strict;
use warnings;
use Test::More 0.96;
use Try::Tiny;
use Test::Fatal;
use lib 't/lib';
use CSVTester;
my $mod = $CSVTester::mod;
use DBI ();
use DBD::Mock ();
sub mock_st {
my ($session, $re, %opts) = @_;
push @$session, {
statement => sub {
my ($sql, $state) = @_;
is_deeply $state->{bound_params}, $opts{bound_params}, 'bound params: ' . join(', ', @{ $opts{bound_params} })
if $opts{bound_params};
return like($sql, $re, "sql matches: $sql");
},
results => [[]],
%opts,
};
}
sub new_csv_loader {
my ($file, $opts) = @_;
my $dbh = DBI->connect('dbi:Mock:', undef, undef, {
RaiseError => 1,
PrintError => 0,
});
return $mod->new(
dbh => $dbh,
file => catfile(qw( t data ), $file),
%$opts,
);
}
sub test_csv {
my ($desc, $file, $opts, $rows, $error_re) = @_;
my ($table) = $file =~ /^(\w+)/;
subtest $desc => sub {
my $loader = new_csv_loader($file, $opts);
isa_ok($loader, $mod);
my $session = [];
mock_st($session, qr/BEGIN/);
mock_st($session, qr/CREATE\s+TABLE\s+"$table"/);
foreach my $row ( @$rows ){
mock_st($session, qr/INSERT\s+INTO\s+"$table"/, bound_params => [ @$row ]);
}
# expect to see COMMIT unless we're expecting an error first
# in which case DBIx::TableLoader 1.100 will issue a rollback
mock_st($session, $error_re ? qr/ROLLBACK/ : qr/COMMIT/);
$loader->{dbh}->{mock_session} = DBD::Mock::Session->new(csv_error => @$session);
my $caught;
( run in 1.201 second using v1.01-cache-2.11-cpan-54e63673c56 )