Developer-Dashboard

 view release on metacpan or  search on metacpan

t/07-core-units.t  view on Meta::CPAN

}

my $home = tempdir(CLEANUP => 1);
local $ENV{HOME} = $home;
my $state_root_base = tempdir(CLEANUP => 1);
local $ENV{DEVELOPER_DASHBOARD_STATE_ROOT} = $state_root_base;
local $ENV{DEVELOPER_DASHBOARD_BOOKMARKS};
local $ENV{DEVELOPER_DASHBOARD_CONFIGS};
local $ENV{DEVELOPER_DASHBOARD_CHECKERS};
my $original_cwd = getcwd();

my $workspace = File::Spec->catdir( $home, 'workspace' );
my $projects  = File::Spec->catdir( $home, 'projects' );
make_path($workspace, $projects);
make_path( File::Spec->catdir( $workspace, 'Alpha-App', '.git' ) );
make_path( File::Spec->catdir( $workspace, '.hidden' ) );
make_path( File::Spec->catdir( $projects, 'Alpha-App' ) );
make_path( File::Spec->catdir( $projects, 'Beta App' ) );
my $local_repo = File::Spec->catdir( $home, 'projects', 'Local-App' );
make_path( File::Spec->catdir( $local_repo, '.git' ) );
make_path( File::Spec->catdir( $local_repo, '.developer-dashboard' ) );
chdir $home or die $!;

my $paths = Developer::Dashboard::PathRegistry->new(
    home            => $home,
    app_name        => 'dashboard-test',
    workspace_roots => [ $workspace, $projects ],
    project_roots   => [$projects],
    named_paths     => {
        named => '~/named-path',
    },
);

ok( -d $paths->runtime_root, 'runtime root created' );
ok( -d $paths->state_root, 'state root created' );
ok( -d $paths->cache_root, 'cache root created' );
ok( -d $paths->logs_root, 'logs root created' );
ok( -d $paths->dashboards_root, 'dashboards root created' );
ok( -d $paths->cli_root, 'cli root created' );
ok( -d $paths->collectors_root, 'collectors root created' );
ok( -d $paths->indicators_root, 'indicators root created' );
ok( -d $paths->sessions_root, 'sessions root created' );
ok( -d $paths->temp_root, 'temp root created' );
ok( -d $paths->config_root, 'config root created' );
ok( -d $paths->auth_root, 'auth root created' );
ok( -d $paths->users_root, 'users root created' );
ok( !defined $paths->project_root_for( File::Spec->catdir( $home, 'not-a-repo' ) ), 'project_root_for returns undef outside repos' );
is( _mode_octal( File::Spec->catdir( $home, '.developer-dashboard' ) ), '0700', 'home runtime root is owner-only' );
ok( index( $paths->state_root, $state_root_base ) == 0, 'state root is under the configured temporary state base' );
is( _mode_octal( $paths->state_root ), '0700', 'state root is owner-only' );
ok( !-e File::Spec->catdir( $home, '.developer-dashboard', 'state' ), 'state is not created under home runtime root by default' );
is( _mode_octal( File::Spec->catdir( $home, '.developer-dashboard', 'logs' ) ), '0700', 'home runtime logs root is owner-only' );
is( _mode_octal( File::Spec->catdir( $home, '.developer-dashboard', 'dashboards' ) ), '0700', 'home runtime dashboards root is owner-only' );
is( _mode_octal( File::Spec->catdir( $home, '.developer-dashboard', 'config' ) ), '0700', 'home runtime config root is owner-only' );
is( _mode_octal( File::Spec->catdir( $home, '.developer-dashboard', 'config', 'auth' ) ), '0700', 'home runtime auth root is owner-only' );
is( _mode_octal( File::Spec->catdir( $home, '.developer-dashboard', 'config', 'auth', 'users' ) ), '0700', 'home runtime users root is owner-only' );

{
    local $ENV{DEVELOPER_DASHBOARD_STATE_ROOT};
    local $ENV{XDG_RUNTIME_DIR} = tempdir( CLEANUP => 1 );
    my $state_user = $ENV{DD_STATE_ROOT_USER} || $ENV{USER} || $ENV{LOGNAME} || ( getpwuid($<) || 'user' );
    $state_user =~ s{[^A-Za-z0-9._-]}{_}g;
    my $fallback_paths = Developer::Dashboard::PathRegistry->new(
        home            => $home,
        app_name        => 'dashboard-test',
        workspace_roots => [ $workspace, $projects ],
        project_roots   => [$projects],
    );
    is( index( $fallback_paths->state_root, File::Spec->tmpdir ) == 0, 1, 'state root defaults to the temp runtime directory when state root override is missing' );
    like( $fallback_paths->state_root, qr/\Q$state_user\E/, 'state root is namespaced by current username by default' );
    is( _mode_octal( $fallback_paths->state_root ), '0700', 'defaulted state root remains owner-only' );
}

{
    local $ENV{DEVELOPER_DASHBOARD_STATE_ROOT} = $state_root_base;
    my $before = Developer::Dashboard::PathRegistry->new(
        home            => $home,
        app_name        => 'dashboard-test',
        workspace_roots => [ $workspace, $projects ],
        project_roots   => [$projects],
    );
    my $before_collector = Developer::Dashboard::Collector->new( paths => $before );
    my $legacy_status = $before_collector->write_status(
        'reboot-stale',
        {
            last_exit_code => 0,
            last_run       => '2000-01-01T00:00:00Z',
        }
    );
    ok( -f $legacy_status, 'reboot simulation writes legacy collector status' );
    ok( -f File::Spec->catfile( $before->collectors_root, 'reboot-stale', 'status.json' ), 'legacy collector state is present before reboot simulation' );

    my $before_state_root = $before->state_root;
    remove_tree($before_state_root);

    my $after = Developer::Dashboard::PathRegistry->new(
        home            => $home,
        app_name        => 'dashboard-test',
        workspace_roots => [ $workspace, $projects ],
        project_roots   => [$projects],
    );
    my $after_collector = Developer::Dashboard::Collector->new( paths => $after );
    ok( !defined $after_collector->read_status('reboot-stale'), 'stale collector state disappears after state directory is removed' );
}
{
    my $metadata_paths = Developer::Dashboard::PathRegistry->new(
        home            => $home,
        app_name        => 'dashboard-test',
        workspace_roots => [ $workspace, $projects ],
        project_roots   => [$projects],
    );
    my $metadata_state_root = $metadata_paths->state_root;
    my $metadata_file = File::Spec->catfile( $metadata_state_root, 'runtime.json' );
    ok( -f $metadata_file, 'state root metadata exists before forced temp-state removal' );

    remove_tree($metadata_state_root);
    ok( !-d $metadata_state_root, 'forced temp-state removal deletes the hashed state root' );

    my $rewritten_metadata = $metadata_paths->_write_state_metadata( $metadata_state_root, $metadata_paths->runtime_root );
    ok( -d $metadata_state_root, 'write_state_metadata recreates a missing hashed state root before rewriting metadata' );
    ok( -f $rewritten_metadata, 'write_state_metadata rewrites runtime metadata after the hashed state root disappears' );



( run in 2.043 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )