Developer-Dashboard
view release on metacpan or search on metacpan
t/07-core-units.t view on Meta::CPAN
my $bad_home = tempdir( CLEANUP => 1 );
my $previous_cwd = getcwd();
my $bad_project = File::Spec->catdir( $bad_home, 'projects', 'bad-env-key-project' );
make_path( File::Spec->catdir( $bad_home, '.developer-dashboard' ), File::Spec->catdir( $bad_project, '.git' ) );
open my $fh, '>:raw', File::Spec->catfile( $bad_project, '.env' ) or die "Unable to write invalid-key .env: $!";
print {$fh} "1INVALID=value\n";
close $fh or die "Unable to close invalid-key .env: $!";
local $ENV{HOME} = $bad_home;
chdir $bad_project or die "Unable to chdir to $bad_project: $!";
Developer::Dashboard::EnvAudit->clear();
my $paths = Developer::Dashboard::PathRegistry->new( home => $bad_home );
dies_like(
sub { Developer::Dashboard::EnvLoader->load_runtime_layers( paths => $paths ) },
qr/Invalid env key .*bad-env-key-project\/\.env line 1/,
'EnvLoader rejects invalid environment variable names explicitly',
);
chdir $previous_cwd or die "Unable to chdir back to $previous_cwd: $!";
}
{
my $bad_home = tempdir( CLEANUP => 1 );
my $previous_cwd = getcwd();
my $bad_project = File::Spec->catdir( $bad_home, 'projects', 'bad-env-function-project' );
make_path( File::Spec->catdir( $bad_home, '.developer-dashboard' ), File::Spec->catdir( $bad_project, '.git' ) );
open my $fh, '>:raw', File::Spec->catfile( $bad_project, '.env' ) or die "Unable to write invalid-function .env: $!";
print {$fh} "BROKEN=\${Local::EnvLoader::Functions::missing():-fallback}\n";
close $fh or die "Unable to close invalid-function .env: $!";
local $ENV{HOME} = $bad_home;
chdir $bad_project or die "Unable to chdir to $bad_project: $!";
Developer::Dashboard::EnvAudit->clear();
my $paths = Developer::Dashboard::PathRegistry->new( home => $bad_home );
dies_like(
sub { Developer::Dashboard::EnvLoader->load_runtime_layers( paths => $paths ) },
qr/Invalid env function .*Local::EnvLoader::Functions::missing/,
'EnvLoader rejects undefined static Perl env functions explicitly',
);
chdir $previous_cwd or die "Unable to chdir back to $previous_cwd: $!";
}
{
my $bad_home = tempdir( CLEANUP => 1 );
my $previous_cwd = getcwd();
my $bad_project = File::Spec->catdir( $bad_home, 'projects', 'bad-env-pl-project' );
make_path( File::Spec->catdir( $bad_home, '.developer-dashboard' ), File::Spec->catdir( $bad_project, '.git' ) );
open my $fh, '>:raw', File::Spec->catfile( $bad_project, '.env.pl' ) or die "Unable to write false-return .env.pl: $!";
print {$fh} "0;\n";
close $fh or die "Unable to close false-return .env.pl: $!";
local $ENV{HOME} = $bad_home;
chdir $bad_project or die "Unable to chdir to $bad_project: $!";
Developer::Dashboard::EnvAudit->clear();
my $paths = Developer::Dashboard::PathRegistry->new( home => $bad_home );
dies_like(
sub { Developer::Dashboard::EnvLoader->load_runtime_layers( paths => $paths ) },
qr/did not return a true value/,
'EnvLoader propagates .env.pl execution failures instead of hiding them',
);
chdir $previous_cwd or die "Unable to chdir back to $previous_cwd: $!";
}
{
my $overlay_dir = tempdir( CLEANUP => 1 );
my $env_file = File::Spec->catfile( $overlay_dir, '.env' );
my $env_pl_file = File::Spec->catfile( $overlay_dir, '.env.pl' );
open my $env_fh, '>:raw', $env_file or die "Unable to write overlay env file: $!";
print {$env_fh} "VERSION=leaf\nNEW_ONLY=from-file\n";
close $env_fh or die "Unable to close overlay env file: $!";
open my $env_pl_fh, '>:raw', $env_pl_file or die "Unable to write overlay env.pl file: $!";
print {$env_pl_fh} "\$ENV{PL_ONLY} = \"\$ENV{VERSION}-pl\";\n1;\n";
close $env_pl_fh or die "Unable to close overlay env.pl file: $!";
my $overlay = Developer::Dashboard::EnvLoader->load_files_into_hash(
files => [ undef, $env_file, $env_pl_file, $env_file ],
base_env => {
KEEP => 'keep',
VERSION => 'base',
},
);
is_deeply(
$overlay->{files},
[ $env_file, $env_pl_file ],
'load_files_into_hash reports only unique existing files in load order',
);
is_deeply(
$overlay->{env},
{
DEVELOPER_DASHBOARD_ENV_AUDIT => json_encode(
{
NEW_ONLY => {
envfile => $env_file,
value => 'from-file',
},
PL_ONLY => {
envfile => $env_pl_file,
value => 'leaf-pl',
},
VERSION => {
envfile => $env_file,
value => 'leaf',
},
}
),
NEW_ONLY => 'from-file',
PL_ONLY => 'leaf-pl',
VERSION => 'leaf',
},
'load_files_into_hash returns only added and changed environment values',
);
local $ENV{HOME};
is(
Developer::Dashboard::EnvLoader->_expand_env_value(
value => '~/fallback-home',
file => $env_file,
line_no => 1,
),
'~/fallback-home',
'_expand_env_value preserves leading tilde text when HOME is unavailable',
);
}
{
local $ENV{DEVELOPER_DASHBOARD_ENV_AUDIT};
Developer::Dashboard::EnvAudit->clear();
dies_like(
sub { Developer::Dashboard::EnvAudit->record( undef, 'value', '/tmp/test.env' ) },
qr/Missing env audit key/,
'EnvAudit rejects an undefined audit key explicitly',
);
dies_like(
sub { Developer::Dashboard::EnvAudit->record( '', 'value', '/tmp/test.env' ) },
qr/Missing env audit key/,
'EnvAudit rejects an empty audit key explicitly',
);
dies_like(
sub { Developer::Dashboard::EnvAudit->record( 'FOO', 'value', undef ) },
qr/Missing env audit source file/,
'EnvAudit rejects an undefined audit source file explicitly',
);
dies_like(
sub { Developer::Dashboard::EnvAudit->record( 'FOO', 'value', '' ) },
qr/Missing env audit source file/,
'EnvAudit rejects an empty audit source file explicitly',
);
ok( !defined Developer::Dashboard::EnvAudit->key(undef), 'EnvAudit->key returns undef for an undefined key lookup' );
( run in 0.750 second using v1.01-cache-2.11-cpan-df04353d9ac )