summaryrefslogtreecommitdiffstats
path: root/t/004template.t
blob: 5296564ae3f56efad7be870bac7682e2fed4c1ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# 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 blacklisted constructs: href='...'");
        }
        else {
            ok(1, "$path contains no blacklisted 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;