Config-Abstraction
view release on metacpan or search on metacpan
t/edge_cases.t view on Meta::CPAN
config_dirs => [],
);
is($cfg->get('count'), 0, 'zero value preserved');
ok(defined($cfg->get('count')), 'zero value is defined');
is($cfg->get('flag'), 0, 'zero flag preserved');
};
subtest 'get() - empty string value preserved and not treated as undef' => sub {
my $cfg = Config::Abstraction->new(
data => { empty => '' },
config_dirs => [],
);
ok(defined($cfg->get('empty')), 'empty string is defined');
is($cfg->get('empty'), '', 'empty string value preserved');
};
subtest 'get() - boolean false value (0) not confused with undef' => sub {
my $cfg = Config::Abstraction->new(
data => { enabled => 0, disabled => 1 },
config_dirs => [],
);
is($cfg->get('enabled'), 0, 'false value 0 preserved');
is($cfg->get('disabled'), 1, 'true value 1 preserved');
};
subtest 'get() - large number of keys' => sub {
my %data = map { ("key$_" => $_) } 1 .. $MANY_KEYS_COUNT;
my $cfg = Config::Abstraction->new(
data => \%data,
config_dirs => [],
);
is($cfg->get('key1'), 1, 'first key correct');
is($cfg->get("key$MANY_KEYS_COUNT"), $MANY_KEYS_COUNT, 'last key correct');
is($cfg->exists("key500"), 1, 'mid-range key exists');
};
subtest 'get() - key containing special regex metacharacters in sep_char' => sub {
my $cfg = Config::Abstraction->new(
data => { 'a.b' => { c => 'val' } },
config_dirs => [],
);
# 'a.b.c' should split on literal dot: parts are 'a', 'b', 'c'
# $data->{'a.b'} would not be found since we look for 'a' first
my $val = $cfg->get('a.b.c');
ok(!$@, 'key with dots in data name does not crash');
};
subtest 'data() - key with undef value distinguished from missing key' => sub {
my $cfg = Config::Abstraction->new(
data => { present_undef => undef, present_val => 'x' },
config_dirs => [],
);
is($cfg->exists('present_undef'), 1, 'key with undef value exists');
is($cfg->exists('truly_absent'), 0, 'truly absent key does not exist');
ok(!defined($cfg->get('present_undef')), 'undef value returns undef from get()');
};
# ===========================================================================
# Unicode and special characters
# ===========================================================================
subtest 'unicode value in data preserved' => sub {
my $cfg = Config::Abstraction->new(
data => { name => $UNICODE_VALUE },
config_dirs => [],
);
is($cfg->get('name'), $UNICODE_VALUE, 'unicode value preserved');
};
subtest 'unicode key in data accessible' => sub {
my $cfg = Config::Abstraction->new(
data => { $UNICODE_VALUE => 'unicode_key_val' },
config_dirs => [],
);
is($cfg->get($UNICODE_VALUE), 'unicode_key_val', 'unicode key accessible');
};
subtest 'value containing newlines preserved' => sub {
my $cfg = Config::Abstraction->new(
data => { multiline => $NEWLINE_VALUE },
config_dirs => [],
);
is($cfg->get('multiline'), $NEWLINE_VALUE, 'newline in value preserved');
};
# ===========================================================================
# Pathological ENV variable edge cases
# ===========================================================================
subtest 'ENV - empty value overrides data' => sub {
local %ENV = %ENV;
$ENV{"${ENV_PREFIX}DATABASE__USER"} = '';
my $cfg = Config::Abstraction->new(
data => {
database => { user => $EXPECTED_USER, pass => 'x' },
},
config_dirs => [],
env_prefix => $ENV_PREFIX,
);
my $val = $cfg->get('database.user');
# Empty string ENV value should override, not be ignored
ok(defined($val), 'empty ENV value is defined');
is($val, '', 'empty ENV value overrides data');
};
subtest 'ENV - prefix match is case-insensitive per POD' => sub {
local %ENV = %ENV;
$ENV{lc("${ENV_PREFIX}DATABASE__USER")} = 'lower_env';
my $cfg = Config::Abstraction->new(
data => {
database => { user => $EXPECTED_USER, pass => 'x' },
},
config_dirs => [],
env_prefix => $ENV_PREFIX,
);
# POD says case-insensitive match
is($cfg->get('database.user'), 'lower_env', 'lowercase ENV key matched case-insensitively');
};
subtest 'ENV - many double-underscore segments create deep nesting' => sub {
local %ENV = %ENV;
$ENV{"${ENV_PREFIX}A__B__C__D"} = 'deep';
my $cfg = Config::Abstraction->new(
data => { a => { b => { c => { d => 'original' } } } },
config_dirs => [],
env_prefix => $ENV_PREFIX,
);
is($cfg->get('a.b.c.d'), 'deep', 'deep double-underscore ENV nesting works');
};
subtest 'ENV - prefix with no matching vars leaves data intact' => sub {
local %ENV = %ENV;
# Remove any accidentally matching vars
( run in 0.605 second using v1.01-cache-2.11-cpan-9581c071862 )