The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use File::Path qw(rmtree);
use File::Spec::Functions qw(catdir catfile rel2abs splitdir);

use Test::More tests => 11;

#----------------------------------------------------------------------
# Load package

my @path = splitdir(rel2abs($0));
pop(@path);
pop(@path);

my $lib = catdir(@path, 'lib');
unshift(@INC, $lib);

eval "use App::Followme::FIO";
require App::Followme::EditSections;

my $test_dir = catdir(@path, 'test');

rmtree($test_dir);
mkdir $test_dir;
mkdir catfile($test_dir, "sub");
chdir $test_dir;

my %configuration = (
                    remove_comments => 0,
                    data_pkg => 'App::Followme::WebData',
                    );

#----------------------------------------------------------------------
# Write test pages

do {
   my $page = <<'EOQ';
<html>
<head>
<meta name="robots" content="archive">
<!-- begin meta -->
<title>page %%</title>
<!-- end meta -->
</head>
<body>
<!-- begin content -->
<h1>page %%</h1>
<!-- end content -->
<ul>
<li><a href="">&& link</a></li>
<!-- begin nav -->
<li><a href="">link %%</a></li>
<!-- end nav -->
</ul>
</body>
</html>
EOQ

    my $es = App::Followme::EditSections->new(%configuration);

    foreach my $dir (('sub', '')) {
        foreach my $count (qw(four three two one)) {
            my $output = $page;

            $output =~ s/%%/$count/g;

            my $filename = $dir ? catfile($dir, $count) : $count;
            $filename .= '.html';

            if ($filename eq 'one.html') {
                $output =~ s/begin/section/g;
                $output =~ s/end/endsection/g;
            }

            fio_write_page($filename, $output);
            sleep(2);
        }
    }

#----------------------------------------------------------------------
};
# Test comment removal

do {
    my $es = App::Followme::EditSections->new(%configuration);

    my $output = $es->strip_comments('one.html', 1);
    my $output_ok = fio_read_page('one.html');
    is($output, $output_ok, 'strip comments, keep sections'); # test 1

    $output = $es->strip_comments('one.html', 0);
    $output_ok =~ s/(<!--.*?-->)//g;
    is($output, $output_ok, 'strip comments and sections'); # test 2

    $output = $es->strip_comments('two.html', 0);
    $output_ok = fio_read_page('two.html');
    is($output, $output_ok, 'don\'t strip comments'); # test 3

    $configuration{remove_comments} = 1;
    $es = App::Followme::EditSections->new(%configuration);
    $configuration{remove_comments} = 0;

    $output = $es->strip_comments('two.html', 0);
    $output_ok =~ s/(<!--.*?-->)//g;
    is($output, $output_ok, 'strip comments'); # test 4
};

#----------------------------------------------------------------------
# Test update folder

do {
    my $es = App::Followme::EditSections->new(%configuration);

    my $prototype = $es->strip_comments('one.html', 1);
    $es->update_folder($test_dir);

    my $output_template = <<EOQ;
<html>
<head>
<meta name="robots" content="archive">
<!-- section meta -->
<!-- begin meta -->
<title>page %%</title>
<!-- end meta -->
<!-- endsection meta -->
</head>
<body>
<!-- section content -->
<!-- begin content -->
<h1>page %%</h1>
<!-- end content -->
<!-- endsection content -->
<ul>
<li><a href="">&& link</a></li>
<!-- section nav -->
<!-- begin nav -->
<li><a href="">link %%</a></li>
<!-- end nav -->
<!-- endsection nav -->
</ul>
</body>
</html>
EOQ

    foreach my $dir (('sub', '')) {
        for my $count (qw(one two three four)) {
            my $file = $dir ? catfile($dir, $count) : $count;
            next if $file eq 'one';

            $file .= '.html';
            my $output = fio_read_page($file);

            my $output_ok = $output_template;
            $output_ok =~ s/%%/$count/g;

            is($output, $output_ok, "update file $file"); # test 5-11
        }
    }

};