The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use lib qw(t/lib);
use DBICTest;
use Test::More;
use Test::Exception;

BEGIN { delete @ENV{qw(DBI_DSN DBI_DRIVER)} }

$ENV{DBICTEST_LOCK_HOLDER} = -1;

# pre-populate
my $schema = DBICTest->init_schema(sqlite_use_file => 1);

my $dbname = DBICTest->_sqlite_dbname(sqlite_use_file => 1);

sub count_sheep {
    my $schema = shift;
    scalar $schema->resultset('Artist')->search( { name => "Exploding Sheep" } )
        ->all;
}

$schema = DBICTest::Schema->connect("dbi::$dbname");
throws_ok { count_sheep($schema) } qr{I can't work out what driver to use},
    'Driver in DSN empty';
isa_ok $schema->storage, 'DBIx::Class::Storage::DBI';

$schema = DBICTest::Schema->connect("dbi:Test_NonExistant_DBD:$dbname");
throws_ok { count_sheep($schema) }
    qr{Can't locate DBD/Test_NonExistant_DBD\.pm in \@INC},
    "Driver class doesn't exist";
isa_ok $schema->storage, 'DBIx::Class::Storage::DBI';

$ENV{DBI_DSN} = "dbi::$dbname";
$schema = DBICTest::Schema->connect;
throws_ok { count_sheep($schema) } qr{I can't work out what driver to use},
    "Driver class not defined in DBI_DSN either.";
isa_ok $schema->storage, 'DBIx::Class::Storage::DBI';

$ENV{DBI_DSN} = "dbi:Test_NonExistant_DBD2:$dbname";
$schema = DBICTest::Schema->connect;
throws_ok { count_sheep($schema) }
    qr{Can't locate DBD/Test_NonExistant_DBD2\.pm in \@INC},
    "Driver class defined in DBI_DSN doesn't exist";
isa_ok $schema->storage, 'DBIx::Class::Storage::DBI';

$ENV{DBI_DSN} = "dbi::$dbname";
$ENV{DBI_DRIVER} = 'Test_NonExistant_DBD3';
$schema = DBICTest::Schema->connect;
throws_ok { count_sheep($schema) }
    qr{Can't locate DBD/Test_NonExistant_DBD3\.pm in \@INC},
    "Driver class defined in DBI_DRIVER doesn't exist";
isa_ok $schema->storage, 'DBIx::Class::Storage::DBI';

$ENV{DBI_DSN} = "dbi:Test_NonExistant_DBD4:$dbname";
$schema = DBICTest::Schema->connect;
throws_ok { count_sheep($schema) }
qr{Can't locate DBD/Test_NonExistant_DBD4\.pm in \@INC},
    "Driver class defined in DBI_DSN doesn't exist";
isa_ok $schema->storage, 'DBIx::Class::Storage::DBI';

delete @ENV{qw(DBI_DSN DBI_DRIVER)};

$schema = DBICTest::Schema->connect("dbi:SQLite:$dbname");
lives_ok { count_sheep($schema) } 'SQLite passed to connect_info';
isa_ok $schema->storage, 'DBIx::Class::Storage::DBI::SQLite';

$ENV{DBI_DRIVER} = 'SQLite';
$schema = DBICTest::Schema->connect("dbi::$dbname");
lives_ok { count_sheep($schema) } 'SQLite in DBI_DRIVER';
isa_ok $schema->storage, 'DBIx::Class::Storage::DBI::SQLite';

delete $ENV{DBI_DRIVER};
$ENV{DBI_DSN} = "dbi:SQLite:$dbname";
$schema = DBICTest::Schema->connect;
lives_ok { count_sheep($schema) } 'SQLite in DBI_DSN';
isa_ok $schema->storage, 'DBIx::Class::Storage::DBI::SQLite';

$ENV{DBI_DRIVER} = 'SQLite';
$schema = DBICTest::Schema->connect;
lives_ok { count_sheep($schema) } 'SQLite in DBI_DSN (and DBI_DRIVER)';
isa_ok $schema->storage, 'DBIx::Class::Storage::DBI::SQLite';

$ENV{DBI_DSN} = "dbi::$dbname";
$ENV{DBI_DRIVER} = 'SQLite';
$schema = DBICTest::Schema->connect;
lives_ok { count_sheep($schema) } 'SQLite in DBI_DRIVER (not DBI_DSN)';
isa_ok $schema->storage, 'DBIx::Class::Storage::DBI::SQLite';

done_testing;