The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# vim: set ts=2 sts=2 sw=2 expandtab smarttab:
use strict;
use warnings;
use Test::More 0.96;

# test an actual use-case

eval 'require DBD::SQLite'
  or plan skip_all => 'DBD::SQLite required for these tests';

use DBIx::TableLoader;
my $dbh = DBI->connect('dbi:SQLite:dbname=:memory:');
my $records;

my $data = [
  [qw(color smell size)],
  [qw(black skunk med i u m)], # invalid: end columns get concatenated
  [qw(bad bad bad bad)],       # invalid: ignored
  [qw(red   apple small)],
  [qw(green Christmas  large)],
  [qw(green frog  small)],
];

my @invalid;
DBIx::TableLoader->new(
  name => 'silly ness',
  dbh  => $dbh,
  data => $data,
  handle_invalid_row => sub {
    my ($loader, $err, $row) = @_;
    if( $row->[0] eq 'bad' ){
      push(@invalid, $_[2]);
      return 0;
    }
    else {
      return [ @$row[0,1], join '', @$row[2 .. $#$row] ];
    }
  },
)->load();

is_deeply
  \@invalid,
  [ [qw(bad bad bad bad)] ],
  'invalid row ignored';

my $table_info = $dbh->table_info('main', '%', '%', 'TABLE')->fetchall_arrayref({})->[0];
is($table_info->{TABLE_NAME}, 'silly ness', 'table name');

$records = $dbh->selectall_arrayref(
  q[SELECT * FROM "silly ness" WHERE color = 'green' ORDER BY size DESC],
  {Slice => {}}
);

is_deeply($records, [
  {color => 'green', smell => 'frog', size => 'small'},
  {color => 'green', smell => 'Christmas', size => 'large'},
  ], 'got expected records'
);

$records = $dbh->selectall_hashref(
  q[SELECT * FROM "silly ness" WHERE color = 'green'],
  'smell'
);

is_deeply($records, {
    frog => {color => 'green', smell => 'frog', size => 'small'},
    Christmas => {color => 'green', smell => 'Christmas', size => 'large'},
  }, 'got expected records'
);

$records = $dbh->selectall_arrayref(q[SELECT smell, color FROM "silly ness" WHERE size = 'small' ORDER BY smell]);

is_deeply($records, [[qw(apple red)], [qw(frog green)]], 'got expected records');

done_testing;