Git-Hooks
view release on metacpan or search on metacpan
t/02-check-commit.t view on Meta::CPAN
#!/usr/bin/env perl
use v5.30.0;
use warnings;
use lib qw/t lib/;
use Git::Hooks::Test ':all';
use Test::More tests => 34;
use Test::Requires::Git;
use Path::Tiny;
my ($repo, $file, $clone, $T) = new_repos();
sub setenvs {
my ($aname, $amail, $cname, $cmail) = @_;
## no critic (RequireLocalizedPunctuationVars)
$ENV{GIT_AUTHOR_NAME} = $aname;
$ENV{GIT_AUTHOR_EMAIL} = $amail || "$ENV{GIT_AUTHOR_NAME}\@example.net";
$ENV{GIT_COMMITTER_NAME} = $cname || $ENV{GIT_AUTHOR_NAME};
$ENV{GIT_COMMITTER_EMAIL} = $cmail || $ENV{GIT_AUTHOR_EMAIL};
## use critic
return;
}
sub check_can_commit {
my ($testname, @envs) = @_;
setenvs(@envs);
$file->append($testname);
$repo->run(add => $file);
test_ok($testname, $repo, 'commit', '-m', $testname);
return;
}
sub check_cannot_commit {
my ($testname, $regex, @envs) = @_;
setenvs(@envs);
$file->append($testname);
$repo->run(add => $file);
my $exit = $regex
? test_nok_match($testname, $regex, $repo, 'commit', '-m', $testname)
: test_nok($testname, $repo, 'commit', '-m', $testname);
$repo->run(qw/rm --cached/, $file);
return $exit;
}
sub merge {
my ($git, $testname) = @_;
$git->run(qw/checkout -q -b xpto/);
$git->run(qw/commit --allow-empty -m/, $testname);
$git->run(qw/checkout -q master/);
$git->run(qw/merge --no-ff xpto/);
$git->run(qw/branch -d xpto/);
return;
}
sub check_can_push_merge {
my ($testname) = @_;
merge($repo, $testname);
return test_ok($testname, $repo, 'push', $clone->git_dir(), 'master');
}
sub check_cannot_push_merge {
my ($testname, $regex) = @_;
merge($repo, $testname);
return $regex
? test_nok_match($testname, $regex, $repo, 'push', $clone->git_dir(), 'master')
: test_nok($testname, $repo, 'push', $clone->git_dir(), 'master');
}
sub check_can_push {
my ($testname, $branch, @envs) = @_;
setenvs(@envs);
new_commit($repo, $file, $testname);
test_ok($testname, $repo, 'push', $clone->git_dir(), "HEAD:$branch");
return;
}
sub check_cannot_push {
my ($testname, $regex, $branch, @envs) = @_;
setenvs(@envs);
$repo->run(qw/branch -f mark/);
new_commit($repo, $file, $testname);
my $exit = test_nok_match($testname, $regex, $repo, 'push', $clone->git_dir(), "HEAD:$branch");
$repo->run(qw/reset --hard mark/);
return $exit;
}
# Repo hooks
install_hooks($repo, undef, 'pre-commit');
$repo->run(qw/config githooks.plugin CheckCommit/);
# name
$repo->run(qw/config githooks.checkcommit.name valid1/);
$repo->run(qw/config --add githooks.checkcommit.name valid2/);
check_can_commit('allow positive author name', 'valid2');
check_cannot_commit('deny positive author name', qr/is invalid/, 'none');
$repo->run(qw/config --add githooks.checkcommit.name !invalid/);
check_can_commit('allow negative author name', 'valid1');
check_cannot_commit('deny negative author name', qr/matches some negative/, 'invalid');
$repo->run(qw/config --remove-section githooks.checkcommit/);
# email
$repo->run(qw/config githooks.checkcommit.email valid1/);
$repo->run(qw/config --add githooks.checkcommit.email valid2/);
check_can_commit('allow positive author email', 'valid2');
check_cannot_commit('deny positive author email', qr/is invalid/, 'none');
$repo->run(qw/config --add githooks.checkcommit.email !invalid/);
check_can_commit('allow negative author email', 'valid1');
check_cannot_commit('deny negative author email', qr/matches some negative/, 'invalid');
$repo->run(qw/config --remove-section githooks.checkcommit/);
# canonical
SKIP: {
test_requires_git skip => 4, version_ge => '1.8.5.3';
my $mailmap = path($T)->child('mailmap');
$mailmap->spew(<<'EOS');
Good Name <good@example.net> <bad@example.net>
Proper Name <proper@example.net>
( run in 2.830 seconds using v1.01-cache-2.11-cpan-f56aa216473 )