Developer-Dashboard
view release on metacpan or search on metacpan
t/07-core-units.t view on Meta::CPAN
[ 'dashboard.local', '192.168.88.5', '::1' ],
'web_settings reads the configured HTTPS SAN alias list back from config',
);
is_deeply(
$global_alias_config->save_global_path_alias( 'foo', File::Spec->catdir( $home, 'foo-path-updated' ) ),
{ name => 'foo', path => File::Spec->catdir( $home, 'foo-path-updated' ) },
'save_global_path_alias updates existing aliases idempotently',
);
is_deeply(
$global_alias_config->load_global->{path_aliases},
{ foo => '$HOME/foo-path-updated' },
'save_global_path_alias keeps updated home-relative paths portable in the stored config',
);
is( $global_alias_config->_normalize_home_path($home), '$HOME', '_normalize_home_path rewrites the exact home directory to $HOME' );
is( $global_alias_config->_normalize_home_path('/opt/shared-path'), '/opt/shared-path', '_normalize_home_path leaves non-home absolute paths unchanged' );
is( $global_alias_config->_expand_config_path('$HOME'), $home, '_expand_config_path expands a bare $HOME token' );
is(
$global_alias_config->_expand_config_path('~/tilde-path'),
File::Spec->catdir( $home, 'tilde-path' ),
'_expand_config_path expands tilde-prefixed paths for compatibility',
);
is(
$global_alias_config->_expand_config_path('/opt/shared-path'),
'/opt/shared-path',
'_expand_config_path leaves non-home absolute paths unchanged',
);
is_deeply(
$global_alias_config->_expand_path_aliases(),
{},
'_expand_path_aliases returns an empty hash for missing alias maps',
);
is_deeply(
$global_alias_config->remove_global_path_alias('foo'),
{ name => 'foo', removed => 1 },
'remove_global_path_alias removes existing aliases',
);
is_deeply(
$global_alias_config->remove_global_path_alias('foo'),
{ name => 'foo', removed => 0 },
'remove_global_path_alias is idempotent for missing aliases',
);
is_deeply(
$global_alias_config->remove_global_file_alias('bashrc_copy'),
{ name => 'bashrc_copy', removed => 1 },
'remove_global_file_alias removes existing file aliases',
);
is_deeply(
$global_alias_config->remove_global_file_alias('bashrc_copy'),
{ name => 'bashrc_copy', removed => 0 },
'remove_global_file_alias is idempotent for missing aliases',
);
$config->save_global;
is_deeply( $config->load_global, {}, 'save_global defaults to an empty hash when no config is provided' );
$config->save_global($saved_global);
ok( !defined decode_payload(undef), 'decode_payload ignores undefined token' );
ok( !defined decode_payload(''), 'decode_payload ignores empty token' );
ok( !defined encode_payload(undef), 'encode_payload ignores undefined text' );
my $payload = encode_payload('plain text');
is( decode_payload($payload), 'plain text', 'payload codec round-trips text' );
ok( defined decode_payload('not-gzip'), 'decode_payload returns decoded bytes for arbitrary base64 text' );
my $page = Developer::Dashboard::PageDocument->new(
id => 'page-one',
title => 'Page <One>',
description => 'Desc "here"',
layout => { body => "Hello <world>\n" },
state => {
one => 'first',
two => undef,
},
actions => [
{ id => 'run', label => 'Run <It>' },
'skip-me',
],
);
is( Developer::Dashboard::PageDocument->new->as_hash->{title}, 'Untitled', 'page document defaults title' );
dies_like( sub { Developer::Dashboard::PageDocument->from_hash('bad') }, qr/hash reference/, 'from_hash requires hash refs' );
my $json_page = $page->canonical_json;
my $from_json = Developer::Dashboard::PageDocument->from_json($json_page);
is( $from_json->as_hash->{id}, 'page-one', 'from_json restores page id' );
my $instruction_page = $page->canonical_instruction;
my $from_instruction = Developer::Dashboard::PageDocument->from_instruction($instruction_page);
is( $from_instruction->as_hash->{id}, 'page-one', 'from_instruction restores page id' );
like( $instruction_page, qr/^TITLE:\s+Page <One>/m, 'canonical_instruction emits TITLE section' );
like( $instruction_page, qr/^STASH:\s+one => 'first',/m, 'canonical_instruction emits legacy STASH section' );
$from_json->merge_state('not-a-hash');
is( $from_json->as_hash->{state}{one}, 'first', 'merge_state ignores non-hash input' );
$from_json->merge_state( { three => 'third' } );
is( $from_json->as_hash->{state}{three}, 'third', 'merge_state adds hash values' );
$from_json->with_mode('');
is( $from_json->as_hash->{mode}, 'edit', 'with_mode ignores empty mode' );
$from_json->with_mode(undef);
is( $from_json->as_hash->{mode}, 'edit', 'with_mode ignores undefined mode' );
$from_json->with_mode('source');
is( $from_json->as_hash->{mode}, 'source', 'with_mode updates page mode' );
my $html = $page->render_html;
like( $html, qr/Page <One>/, 'render_html escapes title text' );
like( $html, qr/Desc "here"/, 'render_html includes escaped note text' );
like( $html, qr/Hello <world>/, 'render_html keeps bookmark HTML body intact' );
my $modern_instruction = <<'PAGE';
=== TITLE ===
Modern Page
=== ICON ===
fa-rocket
=== BOOKMARK ===
modern-page
=== NOTE ===
Modern note
=== STASH ===
{"alpha":1}
=== HTML ===
<section>Modern body</section>
=== CODE1 ===
print "code one";
=== CODE2 ===
print "code two";
PAGE
( run in 1.106 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )