From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

#!/usr/bin/env perl
use v5.12.5;
our $VERSION = '9999.99.99_99'; # VERSION
use Test::More tests => 4;
$::QUIET = 1;
my ( $before, $before_change, $after_change, $after );
my $test_file = File::Temp->new()->filename();
my $test_mode = '600';
my $test_content = 'test content';
my $test_source = 't/commands/file/test.tpl';
register_function_hooks {
before => { file => \&before_hook, },
before_change => { file => \&before_change_hook, },
after_change => { file => \&after_change_hook, },
after => { file => \&after_hook, },
};
my %code_for = (
'file content' => sub { file $test_file, content => $test_content },
'file source' => sub { file $test_file, source => $test_source },
'file absent' => sub { file $test_file, ensure => 'absent' },
);
for my $test_case ( keys %code_for ) {
subtest $test_case => sub {
my $test_code = $code_for{$test_case};
$before = $before_change = $after_change = $after = 0;
stderr_like { $test_code->() } qr{^$}, 'stderr is empty';
is( $before, 1, 'before hook ran' );
is( $before_change, 1, 'before_change hook ran' );
is( $after_change, 1, 'after_change hook ran' );
is( $after, 1, 'after hook ran' );
};
}
sub expected_params {
my $params = shift;
my ( undef, undef, undef, $subroutine ) = caller 1;
my $expected_params = { ensure => 'present', };
if ( exists $params->{content} ) {
$expected_params->{content} = $test_content;
}
elsif ( exists $params->{source} ) {
$expected_params->{source} = $test_source;
}
else {
$expected_params = { ensure => 'absent', };
}
if ( $subroutine ne 'main::before_hook' ) {
$expected_params->{mode} = $test_mode;
}
return $expected_params;
}
sub before_hook {
my ( $file, @options ) = @_;
my $params = {@options};
$before += 1;
is( $file, $test_file, 'before - filename is correct' );
cmp_deeply(
$params,
expected_params($params),
'before - received expected parameters',
);
$params->{mode} = $test_mode;
return $file, %{$params};
}
sub before_change_hook {
my ( $file, @options ) = @_;
my $params = {@options};
$before_change += 1;
is( $file, $test_file, 'before_change - filename is correct' );
cmp_deeply(
$params,
expected_params($params),
'before_change - received expected parameters',
);
}
sub after_change_hook {
my ( $file, @options ) = @_;
my $result = pop @options;
my $params = {@options};
$after_change += 1;
is( $file, $test_file, 'after_change - filename is correct' );
cmp_deeply(
$params,
expected_params($params),
'after_change - received expected parameters',
);
}
sub after_hook {
my ( $file, @options ) = @_;
my $result = pop @options;
my $params = {@options};
$after += 1;
is( $file, $test_file, 'after - filename is correct' );
cmp_deeply(
$params,
expected_params($params),
'after - received expected parameters',
);
}