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 )