The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# -*- cperl -*-

use strict;
use warnings;
use lib 't';
use Test::More;

require "test-functions.pl";

if (can_svn()) {
    plan tests => 14;
}
else {
    plan skip_all => 'Cannot find or use svn commands.';
}

my $t    = reset_repo();
my $wc   = catdir($t, 'wc');
my $file = catfile($wc, 'file');

set_hook(<<'EOS');
use SVN::Hooks::DenyFilenames;
EOS

set_conf(<<'EOS');
DENY_FILENAMES('string');
EOS

work_nok('cant parse config', 'DENY_FILENAMES: got "string" while expecting a qr/Regex/ or a', <<"EOS");
echo txt >$file
svn add -q --no-auto-props $file
svn ci -mx $file
EOS

set_conf(<<'EOS');
DENY_FILENAMES(qr/[^a-z0-9]/i, qr/substring/, [qr/custommessage/ => 'custom message']);
EOS

work_ok('valid', <<"EOS");
svn ci -mx $file
EOS

work_nok('invalid', 'DENY_FILENAMES: filename not allowed: file', <<"EOS");
echo txt >${file}_
svn add -q --no-auto-props ${file}_
svn ci -mx ${file}_
EOS

my $withsubstringinthemiddle = catfile($wc, 'withsubstringinthemiddle');
work_nok('second invalid', 'DENY_FILENAMES: filename not allowed: withsubstringinthemiddle', <<"EOS");
echo txt >$withsubstringinthemiddle
svn add -q --no-auto-props $withsubstringinthemiddle
svn ci -mx $withsubstringinthemiddle
EOS

my $withcustommessage = catfile($wc, 'withcustommessage');
work_nok('custom message', 'DENY_FILENAMES: custom message: withcustommessage', <<"EOS");
echo txt >$withcustommessage
svn add -q --no-auto-props $withcustommessage
svn ci -mx $withcustommessage
EOS

# PER PATH

set_conf(<<'EOS');
DENY_FILENAMES_PER_PATH('string');
EOS

work_nok('odd config', 'DENY_FILENAMES_PER_PATH: got odd number of arguments', <<"EOS");
svn revert -q ${file}_ $withsubstringinthemiddle $withcustommessage
echo newtxt >$file
svn add -q --no-auto-props $file
svn ci -mx $file
EOS

set_conf(<<'EOS');
DENY_FILENAMES_PER_PATH('bogus' => qr/check/);
EOS

work_nok('no regex', 'DENY_FILENAMES_PER_PATH: rule prefix isn\'t a Regexp.', <<"EOS");
svn ci -mx $file
EOS

set_conf(<<'EOS');
DENY_FILENAMES([qr/c/ => 'no c']);
DENY_FILENAMES_PER_PATH(qr:^A: => qr/a/, qr:^B: => [qr/b/ => 'no b']);
EOS

my $adir = catdir($wc, 'A');
my $bdir = catdir($wc, 'B');
my $cdir = catdir($wc, 'C');
work_ok('valid', <<"EOS");
svn mkdir $adir $bdir $cdir
svn ci -mx -q $wc
svn ci -mx $file
EOS

my $afile = catfile($adir, 'a');
work_nok('invalid a', 'filename not allowed', <<"EOS");
echo txt >$afile
svn add -q --no-auto-props $afile
svn ci -mx $afile
EOS

my $avalid = catfile($adir, 'vld');
work_ok('valid a', <<"EOS");
svn revert $afile
echo txt >$avalid
svn add -q --no-auto-props $avalid
svn ci -mx $avalid
EOS

my $bfile = catfile($bdir, 'b');
work_nok('invalid b', ': no b:', <<"EOS");
echo txt >$bfile
svn add -q --no-auto-props $bfile
svn ci -mx $bfile
EOS

my $bvalid = catfile($bdir, 'vld');
work_ok('valid b', <<"EOS");
svn revert $bfile
echo txt >$bvalid
svn add -q --no-auto-props $bvalid
svn ci -mx $bvalid
EOS

my $cfile = catfile($cdir, 'c');
work_nok('invalid c', ': no c:', <<"EOS");
echo txt >$cfile
svn add -q --no-auto-props $cfile
svn ci -mx $cfile
EOS

my $cvalid = catfile($cdir, 'vld');
work_ok('valid c', <<"EOS");
svn revert $cfile
echo txt >$cvalid
svn add -q --no-auto-props $cvalid
svn ci -mx $cvalid
EOS