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 )