App-FuguWeb
view release on metacpan or search on metacpan
t/fuguweb/site.t view on Meta::CPAN
.Sh NAME
.Nm tool
.Nd a tool
.Sh DESCRIPTION
Words.
MDOC
'lib/Thing/Depot.pod' => <<'POD',
=head1 NAME
Thing::Depot - the persistence contract
=head1 DESCRIPTION
Words.
POD
);
for my $relative ( sort keys %file ) {
my $path = "$root/$relative";
make_path( $path =~ s{/[^/]+$}{}r );
open my $fh, '>', $path or die "Cannot write $path: $!";
print {$fh} $file{$relative};
close $fh;
}
return $root;
}
# site($root, $out):
# A site over the project, with a quiet log.
sub site ( $root, $out )
{
my $config =
App::FuguWeb::Config->load( root => $root, error => \my $reason );
die "$reason\n" unless $config;
return App::FuguWeb::Site->new(
config => $config,
out => $out,
log => Fugu::Log->new( mode => Fugu::Log::MODE_QUIET() ),
);
}
my $ROOT = project();
my $OUT = tempdir( CLEANUP => 1 ) . '/out';
subtest 'the build makes the site and nothing else' => sub {
my $site = site( $ROOT, $OUT );
ok( $site->build, 'the build succeeds' );
is( $site->missing_tool, undef, 'and records no missing tool' );
# The probe is the first step, so the failure names the tool
# that is missing. Without it the build reaches the lint and
# reports that a manual source was rejected, which sends the
# reader to the wrong place.
my $absent = tempdir( CLEANUP => 1 ) . '/out';
my $config = site( $ROOT, $absent )->config;
my $said = '';
open my $saved, '>&', \*STDERR or die "Cannot save stderr: $!";
close STDERR;
open STDERR, '>', \$said or die 'Cannot capture stderr';
my $broken = App::FuguWeb::Site->new(
config => $config,
out => $absent,
render => App::FuguWeb::Render->new(
config => $config,
mandoc => '/nonexistent/mandoc',
),
);
my $failed = $broken->build;
close STDERR;
open STDERR, '>&', $saved or die "Cannot restore stderr: $!";
ok( !$failed, 'a build with no mandoc fails' );
is( $broken->missing_tool, '/nonexistent/mandoc',
'and the build records the missing tool' );
like( $said, qr{/nonexistent/mandoc is not installed},
'and names the tool that is missing' );
unlike( $said, qr/rejected a manual source/,
'and does not blame a manual for it' );
ok( !-e $absent, 'and writes nothing' );
# The pages of the description, one page per manual, the base
# stylesheet, and the assets.
my @expected = qw(
index.html readme.html manuals.html
tool.1.html Thing::Depot.3p.html
style.css robots.txt
);
ok( -s "$OUT/$_", "$_ exists and is not empty" ) for @expected;
# Staging is a build detail and never part of the published
# tree.
ok( !-e "$OUT/.man", 'the staging directory is gone' );
opendir my $dh, $OUT or die "Cannot read $OUT: $!";
my @entries = grep { $_ ne '.' && $_ ne '..' } readdir $dh;
closedir $dh;
my %expected = map { $_ => 1 } @expected;
my @extra = grep { !$expected{$_} } sort @entries;
is( scalar @extra, 0, 'the output holds the site only' )
or diag "unexpected: @extra";
};
subtest 'each source reaches its page' => sub {
open my $fh, '<', "$OUT/readme.html" or die "Cannot read: $!";
my $readme = do { local $/; <$fh> };
close $fh;
like( $readme, qr/A paragraph\./, 'lowdown rendered the Markdown' );
open $fh, '<', "$OUT/manuals.html" or die "Cannot read: $!";
my $index = do { local $/; <$fh> };
close $fh;
like( $index, qr{href="\./tool\.1\.html"}, 'the index lists the page' );
like( $index, qr/a tool/, 'with the description of its source' );
like( $index, qr{href="\./Thing::Depot\.3p\.html"},
'and the sidecar' );
open $fh, '<', "$OUT/Thing::Depot.3p.html" or die "Cannot read: $!";
my $module = do { local $/; <$fh> };
close $fh;
like( $module, qr/the persistence contract/,
'pod2man and mandoc rendered the sidecar' );
like( $module, qr{<title>Thing::Depot\(3p\) },
'and the chrome carries the title' );
};
subtest 'the site is a pure function of the project' => sub {
my $second = tempdir( CLEANUP => 1 ) . '/out';
ok( site( $ROOT, $second )->build, 'the second build succeeds' );
( run in 1.769 second using v1.01-cache-2.11-cpan-5c0b1e786e0 )