004template.t 3.83 KB
Newer Older
1 2 3
# 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/.
4
#
5 6
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
7 8 9

#################
#Bugzilla Test 4#
10
####Templates####
11

12
use 5.10.1;
13
use strict;
14
use warnings;
15 16 17 18

use lib 't';

use Support::Templates;
19

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

23
use File::Spec;
24
use Template;
25
use Test::More tests => (scalar(@referenced_files) + 2 * $num_actual_files);
26

27 28 29 30
# Capture the TESTOUT from Test::More or Test::Builder for printing errors.
# This will handle verbosity for us automatically.
my $fh;
{
31 32 33 34 35 36 37 38 39 40
  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;
  }
41 42
}

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

48
foreach my $file (@referenced_files) {
49 50 51 52 53 54
  my $found = 0;
  foreach my $path (@english_default_include_paths) {
    my $pathfile = File::Spec->catfile($path, $file);
    if (-e $pathfile) {
      $found = 1;
      last;
55
    }
56
  }
57

58
  ok($found, "$file found");
59 60
}

61
foreach my $include_path (@include_paths) {
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113

  # 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 $_ },
      inactive       => [
        sub {
          return sub { return $_; }
        },
        1
      ],
      closed => [
        sub {
          return sub { return $_; }
        },
        1
      ],
      obsolete => [
        sub {
          return sub { return $_; }
        },
        1
      ],
      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 $_; }
114
        },
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
        1
      ],
    },
  });

  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 blacklisted constructs: href='...'");
144
    }
145 146
    else {
      ok(1, "$path contains no blacklisted constructs");
147
    }
148
  }
149
}
150 151

exit 0;