Config-Abstraction
view release on metacpan or search on metacpan
t/function.t view on Meta::CPAN
subtest '_load_driver() - returns false for nonexistent module' => sub {
my $cfg = _make_cfg();
my $result = $cfg->_load_driver('No::Such::Module::XYZ');
ok(!$result, '_load_driver returns false for missing module');
};
subtest '_load_driver() - caches failed load' => sub {
my $cfg = _make_cfg();
$cfg->_load_driver('No::Such::Module::XYZ');
ok($cfg->{failed}{'No::Such::Module::XYZ'}, 'failed load cached in {failed}');
};
subtest '_load_driver() - skips reload of already-loaded module' => sub {
my $cfg = _make_cfg();
$cfg->{loaded}{'Scalar::Util'} = 1;
my $result = $cfg->_load_driver('Scalar::Util');
is($result, 1, 'returns 1 from cache without re-requiring');
};
subtest '_load_driver() - skips retry of already-failed module' => sub {
my $cfg = _make_cfg();
$cfg->{failed}{'No::Such::Module::XYZ'} = 1;
my $result = $cfg->_load_driver('No::Such::Module::XYZ');
ok(!$result, 'returns false from cache without re-attempting');
};
# ===========================================================================
# Environment variable merging (via _load_config internals)
# ===========================================================================
subtest 'ENV vars with prefix override data values' => sub {
local %ENV = %ENV;
$ENV{'TESTAPP_RETRIES'} = '99';
my $cfg = Config::Abstraction->new(
data => { TESTAPP => { retries => $EXPECTED_RETRIES } },
config_dirs => [],
env_prefix => $ENV_PREFIX,
);
is($cfg->get('TESTAPP.retries'), '99', 'ENV var stored under prefix namespace');
};
subtest 'ENV vars with double-underscore create nested keys' => sub {
local %ENV = %ENV;
$ENV{'TESTAPP_DATABASE__USER'} = 'env_user';
my $cfg = Config::Abstraction->new(
data => {
database => { user => $EXPECTED_USER, pass => $EXPECTED_PASS },
retries => $EXPECTED_RETRIES,
},
config_dirs => [],
env_prefix => $ENV_PREFIX,
);
is($cfg->get('database.user'), 'env_user', 'double-underscore ENV creates nested key');
};
# ===========================================================================
# Command-line argument merging (via _load_config internals)
# ===========================================================================
subtest 'CLI args override data values' => sub {
local @ARGV = ("--TESTAPP_RETRIES=77");
my $cfg = Config::Abstraction->new(
data => { retries => $EXPECTED_RETRIES },
config_dirs => [],
env_prefix => $ENV_PREFIX,
);
is($cfg->get('retries'), '77', 'CLI arg overrides data value');
};
subtest 'CLI args with double-underscore create nested keys' => sub {
# \%NESTED_DATA must not be used here - the CLI merge path modifies nested
# hashrefs in-place via shared references from the shallow copy of 'data',
# which would attempt to modify the Readonly nested hashrefs and die.
# Use a fresh anonymous hash instead so the merge can write freely.
local @ARGV = ('--TESTAPP_DATABASE__USER=cli_user');
my $cfg = Config::Abstraction->new(
data => {
database => { user => $EXPECTED_USER, pass => $EXPECTED_PASS },
retries => $EXPECTED_RETRIES,
},
config_dirs => [],
env_prefix => $ENV_PREFIX,
);
is($cfg->get('database.user'), 'cli_user', 'CLI double-underscore creates nested key');
};
# ===========================================================================
# Coderef / blessed-object protection (regression for corruption bug)
# ===========================================================================
subtest 'coderef in data not corrupted by _load_config' => sub {
my $cb = sub { $EXPECTED_CB_RESULT };
my $cfg = Config::Abstraction->new(
data => { callback => $cb, tags => 'alpha,beta' },
config_dirs => [],
);
my $got = $cfg->get('callback');
is(reftype($got), 'CODE', 'coderef type intact after load');
is($got->(), $EXPECTED_CB_RESULT, 'coderef callable after load');
};
subtest 'blessed object in data not corrupted by _load_config' => sub {
my $obj = bless { v => $EXPECTED_PORT }, '_BlessedVal';
my $cfg = Config::Abstraction->new(
data => { handler => $obj },
config_dirs => [],
);
my $got = $cfg->get('handler');
ok(blessed($got), 'blessed object intact after load');
is(blessed($got), '_BlessedVal', 'class name unchanged after load');
};
done_testing();
( run in 0.638 second using v1.01-cache-2.11-cpan-5a3173703d6 )