The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
eval {
	require Test::More;
};
if ($@) {
	warn "\nTest::More is not available, skipping...\n";
	print "1..1\nok\n";
	exit;
	
}

require Test::More;
import Test::More tests => 7;

require_ok (DBIx::HA);

my $dbname='NONE'; # for checking if callbackfunction was called
my $connect_attributes = {
         syb_flush_finish => 1,
         AutoCommit => 1,
         ChopBlanks => 1,
         PrintError => 0,
         RaiseError => 0,
         RootClass  => 'DBIx::HA'
         };

$DATABASE::conf{'test'} = {
    max_retries => 2,
    db_stack => [
        [ 'dbi:NullP:server=prod1;database=test', 'user1', 'password1', $connect_attributes ],
        [ 'dbi:NullP:server=prod2;database=test', 'user2', 'password2', $connect_attributes ],
        [ 'dbi:NullP:server=prod3;database=test', 'user3', 'password3', $connect_attributes ],
        ],
    pingtimeout     => -1,
    failoverlevel   => 'process',
    connecttimeout  => 1,
    executetimeout  => 8,
    callback_function => \&MyCallbackFunction,
    };

sub MyCallbackFunction {
	my $dbh = shift;
	$dbname = shift;
	1;
}

is (DBIx::HA->initialize(), '', 'initialize()');
my $dbh = DBIx::HA->connect('test');
is (ref($dbh), 'DBIx::HA::db', 'connect()');
    
my $sth = $dbh->prepare("select 1");
is (ref($sth), 'DBIx::HA::st', 'prepare()');

# hard-code a switch to the next handle
$DATABASE::conf{'test'}->{'active_db'} = $DATABASE::conf{'test'}->{'db_stack'}->[1];

is ($sth->execute, 1, 'execute() on failover');
is (DBIx::HA::_isactivedb($DATABASE::conf{'test'}->{'db_stack'}->[1]->[0]), 1, 'failover to secondary db');
is ($dbname, 'test', 'callback function was called');

$sth->fetchall_arrayref;
$dbh->disconnect;

__END__