The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w
use strict;
use Test::More;
use Data::Dumper;
use DBI;

my $have_sqlite = eval 'require DBD::SQLite; $DBD::SQLite::VERSION >= 1.14 or die "DBD::SQLite::VERSION is $DBD::SQLite::VERSION, we need 1.14+"; 1';
if (! $have_sqlite) {
    plan skip_all => "DBD::SQLite not installed ($@)";
    exit 0;
};

# Monkeypatching!
unless ( defined &DBD::SQLite::db::column_info )
{
    require 't/dbd-sqlite-column-info.pm';
    *DBD::SQLite::db::column_info = \&_sqlite_column_info;
}

plan tests => 4;
use_ok 'DBIx::DataAudit';

# DBI->installed_versions;

my $dbh = DBI->connect('dbi:SQLite:dbname=:memory:', undef, undef);
$/ = ";\n";
while (<DATA>) {
    chomp;
    next unless /\S/; # SQLite ...
    #diag $_;
    $dbh->do($_);
};

my $result = DBIx::DataAudit->audit(dbh => $dbh, table => 'test');
isa_ok $result, 'DBIx::DataAudit';
my $info = $result->template_data;
is_deeply $info, {
    table => 'test',
    headings => [qw[column min max count values null avg blank empty missing ]],
    rows  => [
        ['c_bigint',  '1', '10', '3', '2', '0', '7', 'n/a', 'n/a', 'n/a' ],
        ['c_boolean', 'n/a', 'n/a', '3', '2', '0', 'n/a', 'n/a', 'n/a', 'n/a' ],
	['c_char',    'A', 'Z', '3', '2', '0', 'n/a', '0',   '0',   '0' ],
	['c_character_varying',    'A', 'Z', '3', '2', '0', 'n/a', '0',   '0',   '0' ],
        ['c_datetime', '2008-01-01 00:00:01', '2008-04-01 00:10:01', '3', '2', '0', 'n/a', 'n/a', 'n/a', 'n/a' ],
        ['c_date', '2008-01-01', '2008-04-01', '3', '2', '0', 'n/a', 'n/a', 'n/a', 'n/a' ],
        ['c_decimal', '1', '10', '3', '2', '0', '7', 'n/a', 'n/a', 'n/a' ],
        ['c_inet', 'n/a', 'n/a', '3', '2', '0', 'n/a', 'n/a', 'n/a', 'n/a' ],
        ['c_integer', '1', '10', '3', '2', '0', '7', 'n/a', 'n/a', 'n/a' ],
        ['c_int', '1', '10', '3', '2', '0', '7', 'n/a', 'n/a', 'n/a' ],
        ['c_smallint', '1', '10', '3', '2', '0', '7', 'n/a', 'n/a', 'n/a' ],
        ['c_text', 'A', 'Z', '3', '2', '0', 'n/a', '0', '0', '0' ],
        ['c_time', '00:00:01', '00:10:01', '3', '2', '0', 'n/a', 'n/a', 'n/a', 'n/a' ],
        ['c_timestamp', '2008-01-01 00:00:01', '2008-04-01 00:10:01', '3', '2', '0', 'n/a', 'n/a', 'n/a', 'n/a' ],
        ['c_tinyint', '1', '10', '3', '2', '0', '7', 'n/a', 'n/a', 'n/a' ],
        ['c_varchar', 'A', 'Z', '3', '2', '0', 'n/a', '0', '0', '0' ]
    ]
}, 'Expected information retrieved' or diag Dumper $info;

my $info2 = $result->template_data;
is_deeply $info, $info2, 'Analytics are idempotent';

# diag $result->as_text();

__DATA__
create table test (
    c_bigint BIGINT,
    c_boolean BOOLEAN,
    c_char CHAR,
    c_character_varying CHARACTER VARYING,
    c_datetime DATETIME,
    c_date DATE,
    c_decimal DECIMAL(12,2),
    -- ENUM
    c_inet INET,
    c_integer INTEGER,
    c_int INT,
    c_smallint SMALLINT,
    c_text TEXT,
    c_time TIME,
    -- 'TIMESTAMP WITHOUT TIME ZONE' ,
    c_timestamp TIMESTAMP,
    c_tinyint TINYINT,
    c_varchar VARCHAR(64)
);

-- minima
INSERT INTO test (c_bigint,c_boolean,c_char,c_character_varying,c_datetime,c_date,c_decimal,
    c_inet, c_integer, c_int, c_smallint, c_text, c_time, c_timestamp, c_tinyint, c_varchar
)
VALUES (
    1,1,'A','A','2008-01-01 00:00:01','2008-01-01',1.00,
    '192.168.0.1',1,1,1,'A','00:00:01','2008-01-01 00:00:01',1,'A'
);

-- maxima
INSERT INTO test (c_bigint,c_boolean,c_char,c_character_varying,c_datetime,c_date,c_decimal,
    c_inet, c_integer, c_int, c_smallint, c_text, c_time, c_timestamp, c_tinyint, c_varchar
)
VALUES (
    10,10,'Z','Z','2008-04-01 00:10:01','2008-04-01',10.00,
    '192.168.0.254',10,10,10,'Z','00:10:01','2008-04-01 00:10:01',10,'Z'
);

-- duplicate maxima
INSERT INTO test (c_bigint,c_boolean,c_char,c_character_varying,c_datetime,c_date,c_decimal,
    c_inet, c_integer, c_int, c_smallint, c_text, c_time, c_timestamp, c_tinyint, c_varchar
)
VALUES (
    10,10,'Z','Z','2008-04-01 00:10:01','2008-04-01',10.00,
    '192.168.0.254',10,10,10,'Z','00:10:01','2008-04-01 00:10:01',10,'Z'
);