# 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.10.1; use strict; use warnings; use lib qw(. lib 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) + 2 * $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 $_ } , 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 $_; } }, 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 = ; 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"); } } } exit 0;