# Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl test.pl' use strict; use Test; BEGIN { plan tests => 57 }; use HTML::Template; ok(1); my ($output, $template, $result); # test a simple template $template = HTML::Template->new( path => 'templates', filename => 'simple.tmpl', debug => 0 ); $template->param('ADJECTIVE', 'very'); $output = $template->output; ok($output !~ /ADJECTIVE/ and $template->param('ADJECTIVE') eq 'very'); # try something a bit larger $template = HTML::Template->new( path => 'templates', filename => 'medium.tmpl', # debug => 1, ); $template->param('ALERT', 'I am alert.'); $template->param('COMPANY_NAME', "MY NAME IS"); $template->param('COMPANY_ID', "10001"); $template->param('OFFICE_ID', "10103214"); $template->param('NAME', 'SAM I AM'); $template->param('ADDRESS', '101011 North Something Something'); $template->param('CITY', 'NEW York'); $template->param('STATE', 'NEw York'); $template->param('ZIP','10014'); $template->param('PHONE','212-929-4315'); $template->param('PHONE2',''); $template->param('SUBCATEGORIES','kfldjaldsf'); $template->param('DESCRIPTION',"dsa;kljkldasfjkldsajflkjdsfklfjdsgkfld\nalskdjklajsdlkajfdlkjsfd\n\talksjdklajsfdkljdsf\ndsa;klfjdskfj"); $template->param('WEBSITE','http://www.assforyou.com/'); $template->param('INTRANET_URL','http://www.something.com'); $template->param('REMOVE_BUTTON', ""); $template->param('COMPANY_ADMIN_AREA', "Manage Office Administrators"); $template->param('CASESTUDIES_LIST', "adsfkljdskldszfgfdfdsgdsfgfdshghdmfldkgjfhdskjfhdskjhfkhdsakgagsfjhbvdsaj hsgbf jhfg sajfjdsag ffasfj hfkjhsdkjhdsakjfhkj kjhdsfkjhdskfjhdskjfkjsda kjjsafdkjhds kjds fkj skjh fdskjhfkj kj kjhf kjh sfkjhadsfkj hadskjfhkjhs ajhdsfkj akj fkj kj kj kkjdsfhk skjhadskfj haskjh fkjsahfkjhsfk ksjfhdkjh sfkjhdskjfhakj shiou weryheuwnjcinuc 3289u4234k 5 i 43iundsinfinafiunai saiufhiudsaf afiuhahfwefna uwhf u auiu uh weiuhfiuh iau huwehiucnaiuncianweciuninc iuaciun iucniunciunweiucniuwnciwe"); $template->param('NUMBER_OF_CONTACTS', "aksfjdkldsajfkljds"); $template->param('COUNTRY_SELECTOR', "klajslkjdsafkljds"); $template->param('LOGO_LINK', "dsfpkjdsfkgljdsfkglj"); $template->param('PHOTO_LINK', "lsadfjlkfjdsgkljhfgklhasgh"); $output = $template->output; ok($output !~ /new( path => 'templates', filename => 'simple-loop.tmpl', # debug => 1, ); $template->param('ADJECTIVE_LOOP', [ { ADJECTIVE => 'really' }, { ADJECTIVE => 'very' } ] ); $output = $template->output; ok($output !~ /ADJECTIVE_LOOP/ and $output =~ /really.*very/s); # test a simple loop template $template = HTML::Template->new( path => 'templates', filename => 'simple-loop-nonames.tmpl', # debug => 1, ); $template->param('ADJECTIVE_LOOP', [ { ADJECTIVE => 'really' }, { ADJECTIVE => 'very' } ] ); $output = $template->output; ok($output !~ /ADJECTIVE_LOOP/ and $output =~ /really.*very/s); # test a long loop template - mostly here to use timing on. $template = HTML::Template->new( path => 'templates', filename => 'long_loops.tmpl', # debug => 1, ); $output = $template->output; ok(1); # test a template with TMPL_INCLUDE $template = HTML::Template->new( path => 'templates', filename => 'include.tmpl', # debug => 1, ); $output = $template->output; ok(not (!($output =~ /5/) || !($output =~ /6/))); # test a template with TMPL_INCLUDE and cacheing. $template = HTML::Template->new( path => 'templates', filename => 'include.tmpl', cache => 1, # cache_debug => 1, # debug => 1, ); $output = $template->output; ok(not (!($output =~ /5/) || !($output =~ /6/))); # stimulates a cache miss # system('touch templates/included2.tmpl'); my $template2 = HTML::Template->new( path => 'templates', filename => 'include.tmpl', cache => 1, # cache_debug => 1, # debug => 1, ); $output = $template->output; ok(not (!($output =~ /5/) || !($output =~ /6/))); # test associate my $template_one = HTML::Template->new( path => 'templates', filename => 'simple.tmpl', # debug => 1, ); $template_one->param('ADJECTIVE', 'very'); my $template_two = HTML::Template->new ( path => 'templates', filename => 'simple.tmpl', associate => $template_one, # debug => 1, ); $output = $template_two->output; ok($output !~ /ADJECTIVE/ and $output =~ /very/); # test a simple loop template my $template_l = HTML::Template->new( path => 'templates', filename => 'other-loop.tmpl', # debug => 1, ); # $template_l->param('ADJECTIVE_LOOP', [ { ADJECTIVE => 'really' }, { ADJECTIVE => 'very' } ] ); $output = $template_l->output; ok($output !~ /INSIDE/); # test a simple if template my $template_i = HTML::Template->new( path => 'templates', filename => 'if.tmpl', # debug => 1, ); # $template_l->param('ADJECTIVE_LOOP', [ { ADJECTIVE => 'really' }, { ADJECTIVE => 'very' } ] ); $output = $template_i->output; ok($output !~ /INSIDE/); # test a simple if template my $template_i2 = HTML::Template->new( path => 'templates', filename => 'if.tmpl', # stack_debug => 1, # debug => 1, ); $template_i2->param(BOOL => 1); $output = $template_i2->output; ok($output =~ /INSIDE/); # test a simple if/else template my $template_ie = HTML::Template->new( path => 'templates', filename => 'ifelse.tmpl', # debug => 1, ); $output = $template_ie->output; ok ($output =~ /INSIDE ELSE/); # test a simple if/else template my $template_ie2 = HTML::Template->new( path => 'templates', filename => 'ifelse.tmpl', # debug => 1, ); $template_ie2->param(BOOL => 1); $output = $template_ie2->output; ok($output =~ /INSIDE IF/ and $output !~ /INSIDE ELSE/); # test a bug involving two loops with the same name $template = HTML::Template->new( path => 'templates', filename => 'double_loop.tmpl', # debug => 1, ); $template->param('myloop', [ { var => 'first'}, { var => 'second' }, { var => 'third' } ] ); $output = $template->output; ok($output =~ /David/); # test escapeing $template = HTML::Template->new( path => 'templates', filename => 'escape.tmpl', # debug => 1, ); $template->param(STUFF => '<>"\''); #" $output = $template->output; ok($output !~ /[<>"']/); #" # test a simple template, using new param() call format $template = HTML::Template->new( path => 'templates', filename => 'simple.tmpl', # debug => 1, ); $template->param( { 'ADJECTIVE' => 'very' } ); $output = $template->output; ok($output !~ /ADJECTIVE/ and $output =~ /very/); # test a recursively including template eval { $template = HTML::Template->new( path => 'templates', filename => 'recursive.tmpl', ); $output = $template->output; }; ok(defined($@) and ($@ =~ /recursive/)); # test a template using unless $template = HTML::Template->new( path => 'templates', filename => 'unless.tmpl', # debug => 1 ); $template->param(BOOL => 1); $output = $template->output; ok($output !~ /INSIDE UNLESS/ and $output =~ /INSIDE ELSE/); # test a template using unless $template = HTML::Template->new( path => 'templates', filename => 'unless.tmpl', #debug => 1, #debug_stack => 1 ); $template->param(BOOL => 0); $output = $template->output; ok($output =~ /INSIDE UNLESS/ and $output !~ /INSIDE ELSE/); # test a template using loop_context_vars $template = HTML::Template->new( path => 'templates', filename => 'context.tmpl', loop_context_vars => 1, #debug => 1, #debug_stack => 1 ); $template->param(FRUIT => [ {KIND => 'Apples'}, {KIND => 'Oranges'}, {KIND => 'Brains'}, {KIND => 'Toes'}, {KIND => 'Kiwi'} ]); $template->param(PINGPONG => [ {}, {}, {}, {}, {}, {} ]); $output = $template->output; ok($output =~ /Apples, Oranges, Brains, Toes, and Kiwi./ and $output =~ /pingpongpingpongpingpong/); $template = HTML::Template->new( path => 'templates', filename => 'loop-if.tmpl', #debug => 1, #debug_stack => 1 ); $output = $template->output; ok($output =~ /Loop not filled in/); $template = HTML::Template->new( path => 'templates', filename => 'loop-if.tmpl', #debug => 1, #debug_stack => 1 ); $template->param(LOOP_ONE => [{VAR => "foo"}]); $output = $template->output; ok($output !~ /Loop not filled in/); # test shared memory - enable by setting the environment variable # TEST_SHARED_MEMORY to 1. if (!exists($ENV{TEST_SHARED_MEMORY}) or !$ENV{TEST_SHARED_MEMORY}) { print "Skipping shared memory cache test. See README to enable\n"; skip(1, 0); skip(1, 0); } else { require 'IPC/SharedCache.pm'; my $template_prime = HTML::Template->new( filename => 'simple-loop.tmpl', path => ['templates/'], shared_cache => 1, ipc_key => 'TEST', #cache_debug => 1, ); my $template = HTML::Template->new( filename => 'simple-loop.tmpl', path => ['templates/'], shared_cache => 1, ipc_key => 'TEST', #cache_debug => 1, ); $template->param('ADJECTIVE_LOOP', [ { ADJECTIVE => 'really' }, { ADJECTIVE => 'very' } ] ); $output = $template->output; ok($output !~ /ADJECTIVE_LOOP/ and $output =~ /really.*very/s); my $template_prime2 = HTML::Template->new( filename => 'simple-loop.tmpl', path => ['templates/'], double_cache => 1, ipc_key => 'TEST', #cache_debug => 1, ); my $template2 = HTML::Template->new( filename => 'simple-loop.tmpl', path => ['templates/'], double_cache => 1, ipc_key => 'TEST', #cache_debug => 1, ); $template->param('ADJECTIVE_LOOP', [ { ADJECTIVE => 'really' }, { ADJECTIVE => 'very' } ] ); $output = $template->output; ok($output !~ /ADJECTIVE_LOOP/ and $output =~ /really.*very/s); IPC::SharedCache::remove('TEST'); } # test CGI associate bug eval { require 'CGI.pm'; }; if ($@) { print "Skipping associate tests, need CGI.pm to test associate\n"; skip(1, 0); } else { my $query = CGI->new(''); $query->param('AdJecTivE' => 'very'); $template = HTML::Template->new( path => 'templates', filename => 'simple.tmpl', debug => 0, associate => $query, ); $output = $template->output; ok($output =~ /very/); } # test subroutine as VAR $template = HTML::Template->new( path => 'templates', filename => 'simple.tmpl', debug => 0, ); $template->param(ADJECTIVE => sub { return 'v' . '1e' . '2r' . '3y'; }); $output = $template->output; ok($output =~ /v1e2r3y/); # test cache - non automated, requires turning on debug watching STDERR! $template = HTML::Template->new( path => ['templates/'], filename => 'simple.tmpl', cache => 1, # cache_debug => 1, debug => 0, ); $template->param(ADJECTIVE => sub { return 'v' . '1e' . '2r' . '3y'; }); $output = $template->output; $template = HTML::Template->new( path => ['templates/'], filename => 'simple.tmpl', cache => 1, # cache_debug => 1, debug => 0, ); ok($output =~ /v1e2r3y/); # test URL escapeing $template = HTML::Template->new( path => 'templates', filename => 'urlescape.tmpl', # debug => 1, # stack_debug => 1, ); $template->param(STUFF => '<>"; %FA'); #" $output = $template->output; ok($output !~ /[<>"]/); #" # test query() $template = HTML::Template->new( path => 'templates', filename => 'query-test.tmpl', ); my %params = map {$_ => 1} $template->query(loop => 'EXAMPLE_LOOP'); my @result; eval { @result = $template->query(loop => ['EXAMPLE_LOOP', 'BEE']); }; ok($@ =~ /error/ and $template->query(name => 'var') eq 'VAR' and $template->query(name => 'EXAMPLE_LOOP') eq 'LOOP' and exists $params{bee} and exists $params{bop} and exists $params{example_inner_loop} and $template->query(name => ['EXAMPLE_LOOP', 'EXAMPLE_INNER_LOOP']) eq 'LOOP' ); # test query() $template = HTML::Template->new( path => 'templates', filename => 'query-test2.tmpl', ); my %p = map {$_ => 1} $template->query(loop => ['LOOP_FOO', 'LOOP_BAR']); ok(exists $p{foo} and exists $p{bar} and exists $p{bash}); # test global_vars $template = HTML::Template->new( path => 'templates', filename => 'globals.tmpl', global_vars => 1, ); $template->param(outer_loop => [{loop => [{'LOCAL' => 'foo'}]}]); $template->param(global => 'bar'); $template->param(hidden_global => 'foo'); $result = $template->output(); ok($result =~ /foobar/); $template = HTML::Template->new( path => 'templates', filename => 'vanguard1.tmpl', vanguard_compatibility_mode => 1, ); $template->param(FOO => 'bar'); $template->param(BAZ => 'bop'); $result = $template->output(); ok($result =~ /bar/ and $result =~ /bop/); $template = HTML::Template->new( path => 'templates', filename => 'loop-context.tmpl', loop_context_vars => 1, ); $template->param(TEST_LOOP => [ { NUM => 1 } ]); $result = $template->output(); ok($result =~ /1:FIRST::LAST:ODD/); # test a TMPL_INCLUDE from a later path directory back up to an earlier one # when using the search_path_on_include option $template = HTML::Template->new( path => ['templates/searchpath/','templates/'], search_path_on_include => 1, filename => 'include.tmpl', ); $output = $template->output; ok($output =~ /9/ and $output =~ /6/); # test no_includes eval { $template = HTML::Template->new( path => ['templates/'], filename => 'include.tmpl', no_includes => 1, ); }; ok(defined $@ and $@ =~ /no_includes/); # test file cache - non automated, requires turning on debug watching STDERR! if (!exists($ENV{TEST_FILE_CACHE}) or !$ENV{TEST_FILE_CACHE}) { print "Skipping file cache test. See README to enable.\n"; skip(1,0); skip(1,0); } else { $template = HTML::Template->new( path => ['templates/'], filename => 'simple.tmpl', file_cache_dir => './blib/temp_cache_dir', file_cache => 1, #cache_debug => 1, #debug => 0, ); $template->param(ADJECTIVE => sub { "3y"; }); $output = $template->output; $template = HTML::Template->new( path => ['templates/'], filename => 'simple.tmpl', file_cache_dir => './blib/temp_cache_dir', file_cache => 1, #cache_debug => 1, #debug => 0, ); ok($output =~ /3y/); my $x; $template = HTML::Template->new(filename => 'templates/simple-loop.tmpl', filter => { sub => sub { $x = 1; for (@{$_[0]}) { $_ = "$x : $_"; $x++; } }, format => 'array', }, file_cache_dir => './blib/temp_cache_dir', file_cache => 1, global_vars => 1, ); $template->param('ADJECTIVE_LOOP', [ { ADJECTIVE => 'really' }, { ADJECTIVE => 'very' } ] ); $output = $template->output; ok($output =~ /very/); } $template = HTML::Template->new(filename => './templates/include_path/a.tmpl'); $output = $template->output; ok($output =~ /Bar/); open(OUT, ">blib/test.out") or die $!; $template = HTML::Template->new(filename => './templates/include_path/a.tmpl'); $template->output(print_to => *OUT); close(OUT); open(OUT, "blib/test.out") or die $!; my $output = join('',); close(OUT); ok($output =~ /Bar/); my $test = 39; # test with case sensitive params on my $template_source = < simple template. END_OF_TMPL $template = HTML::Template->new( scalarref => \$template_source, case_sensitive => 1, debug => 0 ); $template->param('adverb', 'very'); $template->param('ADVERB', 'painfully'); $output = $template->output; ok($output !~ /ADVERB/i and $template->param('ADVERB') eq 'painfully' and $template->param('adverb') eq 'very' and $output =~ /very painfully/); # test with case sensitive params off $template_source = < simple template. END_OF_TMPL $template = HTML::Template->new( scalarref => \$template_source, case_sensitive => 0, debug => 0 ); $template->param('adverb', 'very'); $template->param('ADVERB', 'painfully'); $output = $template->output; ok($output !~ /ADVERB/i and $template->param('ADVERB') eq 'painfully' and $template->param('adverb') eq 'painfully' and $output =~ /painfully painfully/); $template = HTML::Template->new(filename => './templates/include_path/a.tmpl', filter => sub { ${$_[0]} =~ s/Bar/Zanzabar/g; } ); $output = $template->output; ok($output =~ /Zanzabar/); $template = HTML::Template->new(filename => './templates/include_path/a.tmpl', filter => [ { sub => sub { ${$_[0]} =~ s/Bar/Zanzabar/g; }, format => 'scalar' }, { sub => sub { ${$_[0]} =~ s/bar/bar!!!/g; }, format => 'scalar' } ] ); $output = $template->output; ok($output =~ /Zanzabar!!!/); my $x; $template = HTML::Template->new(filename => './templates/include_path/a.tmpl', filter => { sub => sub { $x = 1; for (@{$_[0]}) { $_ = "$x : $_"; $x++; } }, format => 'array', } ); $output = $template->output; ok($output =~ /1 : Foo/); $template = HTML::Template->new( scalarref => \ "\n", ); $template->param(ADJECTIVE => "3y"); $output = $template->output(); ok($output =~ /3y/); $template = HTML::Template->new(path => ['templates'], filename => 'newline_test1.tmpl', filter => sub {}, ); $output = $template->output(); ok($output =~ /STARTincludeEND/); # test multiline tags $template = HTML::Template->new(path => ['templates'], filename => 'multiline_tags.tmpl', global_vars => 1, ); $template->param(FOO => 'foo!', bar => [{}, {}]); $output = $template->output(); ok($output =~ /foo!\n/ && $output =~ /foo!foo!\nfoo!foo!/); # test new() from filehandle open(TEMPLATE, "templates/simple.tmpl"); $template = HTML::Template->new(filehandle => *TEMPLATE); $template->param('ADJECTIVE', 'very'); $output = $template->output; ok($output !~ /ADJECTIVE/ and $template->param('ADJECTIVE') eq 'very'); close(TEMPLATE); # test new_() from filehandle open(TEMPLATE, "templates/simple.tmpl"); $template = HTML::Template->new_filehandle(*TEMPLATE); $template->param('ADJECTIVE', 'very'); $output = $template->output; ok($output !~ /ADJECTIVE/ and $template->param('ADJECTIVE') eq 'very'); close(TEMPLATE); # test case sensitive loop variables $template = HTML::Template->new(path => ['templates'], filename => 'case_loop.tmpl', case_sensitive => 1, ); $template->param(loop => [ { foo => 'bar', FOO => 'BAR' } ]); $output = $template->output(); ok($output =~ /bar BAR/); # test ifs with code refd $template = HTML::Template->new(path => ['templates'], filename => 'if.tmpl'); $template->param(bool => sub { 0 }); $output = $template->output(); ok($output !~ /INSIDE/ and $output =~ /unless/); # test global_vars for loops within loops $template = HTML::Template->new(path => ['templates'], filename => 'global-loops.tmpl', global_vars => 1); $template->param(global => "global val"); $template->param(outer_loop => [ { foo => 'foo val 1', inner_loop => [ { bar => 'bar val 1' }, { bar => 'bar val 2' }, ], }, { foo => 'foo val 2', inner_loop => [ { bar => 'bar val 3' }, { bar => 'bar val 4' }, ], } ]); $output = $template->output; ok($output =~ /inner loop foo: foo val 1/ and $output =~ /inner loop foo: foo val 2/); # test nested include path handling my $template = HTML::Template->new(path => ['templates'], filename => 'include_path/one.tmpl'); $output = $template->output; ok($output =~ /ONE/ and $output =~ /TWO/ and $output =~ /THREE/); # test using HTML_TEMPLATE_ROOT with path { local $ENV{HTML_TEMPLATE_ROOT} = "templates"; $template = HTML::Template->new( path => ['searchpath'], filename => 'three.tmpl', ); $output = $template->output; ok($output =~ /THREE/); } # test __counter__ my $template = HTML::Template->new(path => ['templates'], filename => 'counter.tmpl', loop_context_vars => 1); $template->param(foo => [ {a => 'a'}, {a => 'b'}, {a => 'c'} ]); $template->param(outer => [ {inner => [ {a => 'a'}, {a => 'b'}, {a => 'c'} ] }, {inner => [ {a => 'x'}, {a => 'y'}, {a => 'z'} ] }, ]); $output = $template->output; ok($output =~ /^1a2b3c$/m); ok($output =~ /^11a2b3c21x2y3z$/m); # test default my $template = HTML::Template->new(path => ['templates'], filename => 'default.tmpl'); $template->param(cl => 'clothes'); $template->param(start => 'start'); $output = $template->output; ok($output =~ /cause it's getting hard to think, and my clothes are starting to shrink/); # test invalid eval { my $template = HTML::Template->new(scalarref => \''); }; ok($@ =~ /No NAME given/);