The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

use strict;
#use MySQL::Hi;
my $class = 'MySQL::Hi';
my $defaults = {
host => 'localhost',
port => 3306,
password => '',
};
my @tests = (
{
name => 'All params in file',
config => [
{
db => 'test_db',
mode => 'rw',
host => 'test_host',
password => 'hunter2',
port => 8080,
},
{
db => 'test_db',
host => 'test_host',
password => 'hunter2',
port => 8080,
},
],
},
{
name => 'Host missing',
config => [
{
db => 'test_db',
mode => 'rw',
password => 'hunter2',
port => 8080,
},
{
db => 'test_db',
password => 'hunter2',
port => 8080,
},
],
},
{
name => 'Password missing',
config => [
{
db => 'test_db',
mode => 'rw',
host => 'test_host',
port => 8080,
},
{
db => 'test_db',
host => 'test_host',
port => 8080,
},
],
},
{
name => 'Port missing',
config => [
{
db => 'test_db',
mode => 'rw',
host => 'test_host',
password => 'hunter2',
},
{
db => 'test_db',
host => 'test_host',
password => 'hunter2',
},
],
},
{
name => 'All missing',
unknown_param => 'foo',
config => [
{
db => 'test_db',
foo => 'bar', # needed to create a file
},
],
},
);
my $test_count = 0;
my $unknown_params = 0;
for my $t ( @tests ) {
$test_count += scalar( @{ $t->{config} } );
$unknown_params += scalar( @{ $t->{config} } )
if $t->{unknown_param};
}
plan tests => 0
+ 1 # use_ok
+ scalar( @tests ) # new_ok
+ $unknown_params # Unknown params warnings
+ $test_count # Test credentials
+ 2 * $test_count # Unknown DB
+ 2 * $test_count # Unknown mode
;
use_ok( $class );
for my $test ( @tests ) {
# Create config file
my $filename = &create_config( $test );
# Create MySQL::Hi object
my $hi;
if ( $test->{unknown_param} ) {
warning_is
{
$hi = new_ok( $class => [ config => $filename ], $test->{name} );
}
{
carped => "Unknown parameter '$test->{unknown_param}' in [$test->{config}[0]{db}]\n"
},
$test->{name} . ": unknown param";
}
else {
$hi = new_ok( $class => [ config => $filename ], $test->{name} );
}
# Run tests
for my $c ( @{ $test->{config} } ) {
# Test get_credentials
my %config = %$c;
my $db = $config{db};
my $mode = exists $config{mode} ? $config{mode} : '';
my $credentials = $hi->get_credentials( $db, $mode );
my $expected = {
host => exists $config{host} ? $config{host} : $hi->default_value('host'),
port => exists $config{port} ? $config{port} : $hi->default_value('port'),
password => exists $config{password} ? $config{password} : $hi->default_value('password'),
};
cmp_deeply( $credentials, $expected, $test->{name} );
# Unknown DB
my $colon_mode = $mode ? ":$mode" : "";
warning_is
{
$credentials = $hi->get_credentials( '[unknown DB]', $mode );
}
{
carped => "No credentials for the '[unknown DB]$colon_mode' in config $filename\n"
},
$test->{name} . ": unknown DB - warning";
cmp_deeply( $credentials, $defaults, $test->{name} . ": unknown DB" );
# Unknown mode
warning_is
{
$credentials = $hi->get_credentials( $db, 'unknown mode' );
}
{
carped => "No credentials for the '$db:unknown mode' in config $filename\n"
},
$test->{name} . ": unknown mode - warning";
cmp_deeply( $credentials, $defaults, $test->{name} . ": unknown mode" );
# The methods get_options and get_dsn return strings that are
# built of whatever get_credentials returns. It does not make
# sense to test these two methods.
}
# Unlink config file
unlink $filename;
}
# Create config file
#
sub create_config {
my ( $test ) = @_;
my $filename = lc $test->{name};
$filename =~ s/[^a-z0-9]/_/ig;
$filename = "/tmp/$filename.cfg";
my $cfg = Config::Simple->new( syntax => 'ini' );
for my $c ( @{ $test->{config} } ) {
my $block = $c->{db}
. ( exists $c->{mode} ? ":" . $c->{mode} : '' );
for my $param ( keys %$c ) {
next
if $param eq 'db' || $param eq 'mode';
$cfg->param( "$block.$param", $c->{ $param } );
}
}
$cfg->write( $filename );
return $filename;
}
1;