App-Project-Doctor
view release on metacpan or search on metacpan
t/function.t view on Meta::CPAN
is scalar($r->errors), 2, 'errors() count';
is scalar($r->warnings), 1, 'warnings() count';
is scalar($r->passes), 1, 'passes() count';
is scalar($r->fixable), 1, 'fixable() count -- only error-with-fix';
ok $r->has_errors, 'has_errors true';
ok $r->has_warnings, 'has_warnings true';
};
subtest 'Report::exit_code -- 0 clean, 1 errors' => sub {
my $clean = _make_report(
_make_finding(severity => $WARN_SEV, message => 'w', check_name => 'X'),
);
is $clean->exit_code, 0, 'warnings alone do not set exit_code to 1';
my $dirty = _make_report(
_make_finding(severity => $ERR_SEV, message => 'e', check_name => 'Y'),
);
is $dirty->exit_code, 1, 'error sets exit_code to 1';
};
subtest 'Report::render_text -- groups by check_name, shows worst icon' => sub {
my $r = _make_report(
_make_finding(severity => $PASS_SEV, message => 'clean', check_name => 'Tests'),
_make_finding(severity => $ERR_SEV, message => 'broke', check_name => 'Tests'),
);
my $text = $r->render_text;
# Both findings belong to 'Tests'; the icon must reflect the worst (error).
like $text, qr/\[X\].*Tests/, 'error icon shown for Tests group';
like $text, qr/1 error\(s\)/, 'error count in summary';
};
subtest 'Report::render_text -- verbose shows per-finding detail' => sub {
my $r = _make_report(
_make_finding(
severity => $ERR_SEV,
message => 'Bad thing',
detail => 'Detailed explanation',
check_name => 'Pod',
),
);
my $plain = $r->render_text(verbose => 0);
my $verbose = $r->render_text(verbose => 1);
unlike $plain, qr/Detailed explanation/, 'detail hidden in plain mode';
like $verbose, qr/Detailed explanation/, 'detail shown in verbose mode';
};
subtest 'Report::render_text -- fix list present only when fixable findings exist' => sub {
my $with_fix = _make_report(
_make_finding(
severity => $ERR_SEV,
message => 'Fixable problem',
check_name => 'CI',
fix => sub {},
),
);
like $with_fix->render_text,
qr/Suggested fixes:/,
'fix list appears when fixable findings present';
like $with_fix->render_text,
qr/Would you like me to apply them/,
'prompt appears';
my $no_fix = _make_report(
_make_finding(severity => $PASS_SEV, message => 'ok', check_name => 'CI'),
);
unlike $no_fix->render_text,
qr/Suggested fixes:/,
'no fix list when all findings are non-fixable';
};
subtest 'Report::render_text -- summary line formatting' => sub {
my $r_err = _make_report(_make_finding(severity => $ERR_SEV, message => 'e', check_name => 'A'));
my $r_warn = _make_report(_make_finding(severity => $WARN_SEV, message => 'w', check_name => 'A'));
my $r_both = _make_report(
_make_finding(severity => $ERR_SEV, message => 'e', check_name => 'A'),
_make_finding(severity => $WARN_SEV, message => 'w', check_name => 'B'),
);
my $r_none = _make_report(_make_finding(severity => $PASS_SEV, message => 'p', check_name => 'A'));
like $r_err->render_text, qr/1 error\(s\)/, 'error count';
like $r_warn->render_text, qr/1 warning\(s\)/, 'warning count';
like $r_both->render_text, qr/error.*warning/, 'both counts';
like $r_none->render_text, qr/No errors or warnings/, 'clean message';
};
subtest 'Report::render_json -- parseable and excludes fix' => sub {
my $r = _make_report(
_make_finding(
severity => $INFO_SEV,
message => 'note',
check_name => 'Meta',
fix => sub {},
),
);
my $json = $r->render_json;
returns_ok($json, { type => 'scalar' }, 'render_json returns a scalar');
require JSON::MaybeXS;
my $decoded = JSON::MaybeXS->new->decode($json);
is ref $decoded, 'ARRAY', 'decodes to arrayref';
ok !exists $decoded->[0]{fix}, 'fix not serialised';
is $decoded->[0]{check_name}, 'Meta', 'check_name present';
};
subtest 'Report::render_tap -- plan and ok/not-ok lines' => sub {
my $r = _make_report(
_make_finding(severity => $PASS_SEV, message => 'good', check_name => 'A'),
_make_finding(severity => $INFO_SEV, message => 'info', check_name => 'B'),
_make_finding(severity => $ERR_SEV, message => 'bad', check_name => 'C'),
_make_finding(severity => $WARN_SEV, message => 'warn', check_name => 'D'),
);
my $tap = $r->render_tap;
returns_ok($tap, { type => 'scalar' }, 'render_tap returns a scalar');
like $tap, qr/^1\.\.4/m, 'plan line';
like $tap, qr/^ok 1/m, 'pass is ok';
like $tap, qr/^ok 2/m, 'info is ok';
like $tap, qr/^not ok 3/m, 'error is not ok';
like $tap, qr/^not ok 4/m, 'warning is not ok';
};
subtest 'Report::_worst_severity -- rank order' => sub {
# Directly exercise the private helper since it is non-trivial logic.
( run in 1.605 second using v1.01-cache-2.11-cpan-0b5f733616e )