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 )