epic-ts
[kivitendo-erp.git] / t / controllers / base / render.t
1 use strict;
2 use Test::Exception;
3 use Test::More;
4 use Test::Output;
5
6 use lib 't';
7 use Support::TestSetup;
8
9 use SL::Presenter;
10 use SL::Controller::Base;
11 use SL::Layout::Javascript;
12
13 no warnings 'uninitialized';
14
15 Support::TestSetup::login();
16
17 if (!Support::TestSetup::templates_cache_writable()) {
18   plan skip_all => 'Cache dir not writable for this test';
19 } else {
20   plan tests => 19;
21 }
22
23 sub reset_test_env {
24   $ENV{HTTP_USER_AGENT} = 'Perl Tests';
25
26   $::request       = SL::Request->new(
27     cgi => CGI->new({}),
28     layout => SL::Layout::Javascript->new,
29   );
30
31   $::myconfig{menustyle} = 'javascript';
32
33   delete @{ $::form }{qw(header footer)};
34 }
35
36 my $ctrl = SL::Controller::Base->new;
37
38 # Passing invalid parameters:
39 throws_ok { $ctrl->render(\'dummy', { unknown => 1 }) }    qr/unsupported option/i,                     'string ref, unknown parameter';
40 throws_ok { $ctrl->render(\'dummy', { type => "excel" }) } qr/unsupported type/i,                       'string ref, unsupported "type"';
41 throws_ok { $ctrl->render({}) }                            qr/unsupported.*template.*reference.*type/i, 'string ref, unsupported template argument reference type';
42 throws_ok { $ctrl->render('does/not/exist') }              qr/template.*file.*not.*found/i,             'non-existing template file name';
43
44 # No output:
45 stdout_is { $ctrl->render(\'Hallo', { output => 0 }) } '', 'no output';
46
47 # Type of return value:
48 is(ref($ctrl->render(\'Hallo', { output => 0 })), 'SL::Presenter::EscapedText', 'render returns SL::Presenter::EscapedText');
49
50 # Actual return value for string ref parameters (enforce stringification from SL::Presenter::EscapedText before comparison):
51 is("" . $ctrl->render(\'Hallo [% world %]', { output => 0 }, world => 'Welt'),               'Hallo Welt',        'render string ref, no output');
52 is("" . $ctrl->render(\'Hallo [% world %]', { output => 0, process => 0 }, world => 'Welt'), 'Hallo [% world %]', 'render string ref, no output, no processing');
53 is("" . $ctrl->render(\'Hallo [% world %]', { output => 0, type => 'js' }, world => 'Welt'), 'Hallo Welt',        'render string ref, no output, different type');
54
55 # Actual return value for template file name parameters (enforce stringification from SL::Presenter::EscapedText before comparison):
56 is("" . $ctrl->render('t/render', { output => 0 }, world => 'Welt'),                      "Hallo Welt\n",                                       'render template file, no args');
57 is("" . $ctrl->render('t/render', { output => 0, process => 0 }, world  => 'Welt'),   "[\% USE HTML \%]Hallo [\% HTML.escape(world) \%]\n", 'render template file, no processing');
58 is("" . $ctrl->render('t/render', { output => 0, type => 'js' }, thingy => 'jungle'), "Welcome to the jungle\n",                            'render template file, different type');
59
60 # No HTTP header in screen output:
61 reset_test_env();
62 stdout_unlike { $ctrl->render(\'Hallo [% world %]', { header => 0 }, world => 'Welt') } qr/content-type/i, 'no HTTP header with header=0';
63
64 reset_test_env();
65 stdout_unlike { $ctrl->render(\'Hallo [% world %]', { header => 0 }, world => 'Welt') } qr/<html>/i,       'no HTML header with header=0';
66
67 # With HTTP header in screen output:
68 reset_test_env();
69 stdout_like { $ctrl->render(\'Hallo [% world %]', world => 'Welt') } qr/content-type/i, 'HTTP header with header=1';
70
71 reset_test_env();
72 stdout_like { $ctrl->render(\'Hallo [% world %]', world => 'Welt') } qr/<html>/i,       'HTML header with header=1';
73
74 # Menu yes/no:
75 reset_test_env();
76 stdout_like { $ctrl->render(\'Hallo [% world %]', world => 'Welt') } qr/<div.*id="main_menu_div".*<ul.*id="main_menu_model"/is, 'HTML header & menu with header=1';
77
78 reset_test_env();
79 stdout_unlike { $ctrl->render(\'Hallo [% world %]', { header => 0 }, world => 'Welt') } qr/<div.*id="main_menu_div".*<ul.*id="main_menu_model"/is, 'HTML header & menu with header=0';
80
81 reset_test_env();
82 stdout_unlike { $ctrl->render(\'Hallo [% world %]', { layout => 0 }, world => 'Welt') } qr/<div.*id="main_menu_div".*<ul.*id="main_menu_model"/is, 'HTML header & menu with layout=0';
83
84 done_testing;
85
86 1;