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 )