# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.

#################
#Bugzilla Test 4#
####Templates####

use 5.14.0;
use strict;
use warnings;

use lib qw(. lib local/lib/perl5 t);

use Support::Templates;

# Bug 137589 - Disable command-line input of CGI.pm when testing
use CGI qw(-no_debug);

use File::Spec;
use Template;
use Test::More tests => (scalar(@referenced_files) + 3 * $num_actual_files);

# Capture the TESTOUT from Test::More or Test::Builder for printing errors.
# This will handle verbosity for us automatically.
my $fh;
{
  no warnings qw(unopened);    # Don't complain about non-existent filehandles
  if (-e \*Test::More::TESTOUT) {
    $fh = \*Test::More::TESTOUT;
  }
  elsif (-e \*Test::Builder::TESTOUT) {
    $fh = \*Test::Builder::TESTOUT;
  }
  else {
    $fh = \*STDOUT;
  }
}

# Check to make sure all templates that are referenced in Bugzilla
# exist in the proper place in the English template or extension directory.
# All other languages may or may not include any template as Bugzilla will
# fall back to English if necessary.

foreach my $file (@referenced_files) {
  my $found = 0;
  foreach my $path (@english_default_include_paths) {
    my $pathfile = File::Spec->catfile($path, $file);
    if (-e $pathfile) {
      $found = 1;
      last;
    }
  }

  ok($found, "$file found");
}

foreach my $include_path (@include_paths) {

  # Processes all the templates to make sure they have good syntax
  my $provider = Template::Provider->new({
    INCLUDE_PATH => $include_path,

    # Need to define filters used in the codebase, they don't
    # actually have to function in this test, just be defined.
    # See Template.pm for the actual codebase definitions.

    # Initialize templates (f.e. by loading plugins like Hook).
    PRE_PROCESS => "global/variables.none.tmpl",

    FILTERS => {
      html_linebreak  => sub { return $_; },
      js              => sub { return $_ },
      base64          => sub { return $_ },
      url_quote       => sub { return $_ },
      css_class_quote => sub { return $_ },
      xml             => sub { return $_ },
      quoteUrls       => sub { return $_ },
      bug_link        => [
        sub {
          return sub { return $_; }
        },
        1
      ],
      csv          => sub { return $_ },
      unitconvert  => sub { return $_ },
      time         => sub { return $_ },
      wrap_comment => sub { return $_ },
      none         => sub { return $_ },
      ics          => [
        sub {
          return sub { return $_; }
        },
        1
      ],
      markdown => sub { return $_ },
    },
  });

  foreach my $file (@{$actual_files{$include_path}}) {
    my $path = File::Spec->catfile($include_path, $file);

    # These are actual files, so there's no need to check for existence.

    my ($data, $err) = $provider->fetch($file);

    if (!$err) {
      ok(1, "$path syntax ok");
    }
    else {
      ok(0, "$path has bad syntax --ERROR");
      print $fh $data . "\n";
    }

    # Make sure no forbidden constructs are present.
    local $/;
    open(FILE, '<', $path) or die "Can't open $file: $!\n";
    $data = <FILE>;
    close(FILE);

    # Forbid single quotes to delimit URLs, see bug 926085.
    if ($data =~ /href=\\?'/) {
      ok(0, "$path contains blocklisted constructs: href='...'");
    }
    else {
      ok(1, "$path contains no blocklisted constructs");
    }

    # Forbid cgi.param(). cgi_param() must be used instead.
    if ($data =~ /cgi\.param/) {
      ok(0, "$path calls cgi.param() instead of cgi_param()");
    }
    else {
      ok(1, "$path correctly calls CGI parameters");
    }
  }
}

exit 0;
