use strict;
use warnings;
use Test::More;
use English qw(-no_match_vars);
use t::util;
use IO::Scalar;
use t::model;
use CGI;
use t::user::admin;
use t::user::basic;
use Test::Trap;
use Carp;
eval {
require DBD::SQLite;
plan tests => 72;
} or do {
plan skip_all => 'DBD::SQLite not installed';
};
use_ok('ClearPress::view');
$ClearPress::view::DEBUG_OUTPUT = 0;
my $util = t::util->new();
{
my $view = ClearPress::view->new({
util => $util,
});
isa_ok($view, 'ClearPress::view', 'constructs ok with ref');
}
{
my $view = ClearPress::view->new();
isa_ok($view, 'ClearPress::view', 'constructs ok without ref');
}
{
$util->username('joe_user');
is($util->username(), 'joe_user', 'username set');
my $view = ClearPress::view->new({
util => $util,
});
isa_ok($view, 'ClearPress::view', 'constructs ok with ref');
$util->username(undef);
is($util->username(), undef, 'username unset');
}
{
my $types = {
_xml => 'text/xml',
_rss => 'text/xml',
_atom => 'text/xml',
_ajax => 'text/xml',
_js => 'application/javascript',
_json => 'application/javascript',
_png => 'image/png',
_jpg => 'image/jpeg',
q[] => 'text/html',
};
for my $k (keys %{$types}) {
my $view = ClearPress::view->new({
util => $util,
aspect => "read$k",
});
is($view->content_type(), $types->{$k}, "$k => $types->{$k} content_type");
}
}
{
my $view = ClearPress::view->new({
util => $util,
});
is($view->decor(), 1, 'decorate when no aspect given');
my $types = {
_xml => 0,
_rss => 0,
_atom => 0,
_ajax => 0,
_js => 0,
_json => 0,
_png => 0,
_jpg => 0,
q[] => 1,
};
for my $k (keys %{$types}) {
my $view = ClearPress::view->new({
util => $util,
aspect => "read$k",
});
is($view->decor(), $types->{$k}, "$k => $types->{$k} decor");
}
}
{
my $view = ClearPress::view->new({
util => $util,
});
is((scalar @{$view->warnings}), 0, 'no warnings present');
$view->add_warning('a warning');
is((scalar @{$view->warnings}), 1, '1 warning present');
is($view->warnings->[0], 'a warning', 'correct warning present');
}
{
my $view = ClearPress::view->new({
util => $util,
});
trap {
is($view->_accessor('key', 'value'), 'value', 'accessor set value');
is($view->_accessor('key'), 'value', 'accessor get value');
};
like($trap->stderr(), qr/deprecated/smx, 'deprecated warn');
}
{
my $view = ClearPress::view->new({
util => $util,
});
my $io = IO::Scalar->new();
my $stdout = select $io;
$view->output_buffer("Content-type: text/html\n\n");
$view->output_reset();
$view->output_buffer("Content-type: text/plain\n\n");
$view->output_end();
$view->output_buffer("Content-type: text/plain\n\n");
select $stdout;
is($io, "Content-type: text/plain\n\n", 'output buffer ok without debugging');
}
{
my $view = ClearPress::view->new({
util => $util,
});
$ClearPress::view::DEBUG_OUTPUT = 1;
my $io = IO::Scalar->new();
my $stdout = select $io;
trap {
$view->output_buffer("Content-type: text/html\n\n");
$view->output_reset();
$view->output_buffer("Content-type: text/plain\n\n");
$view->output_end();
$view->output_buffer("Content-type: text/plain\n\n");
};
like($trap->stderr, qr/output_/mx, 'output buffer debugging');
select $stdout;
is($io, "Content-type: text/plain\n\n", 'output buffer ok with debugging');
}
{
my $model = t::model->new({util=>$util});
my $view = ClearPress::view->new({
util => $util,
model => $model,
action => 'list',
aspect => q(),
});
is($view->template_name(), 'view_list', 'view_list template_name');
}
{
my $model = t::model->new({util=>$util});
my $view = ClearPress::view->new({
util => $util,
model => $model,
action => 'read',
aspect => q(),
});
is($view->template_name(), 'view_list', 'fix read / view_list template_name');
}
{
my $cgi = CGI->new();
$cgi->param('test_field', 'blabla');
$cgi->param('test_pk', 'two');
$util->cgi($cgi);
my $model = t::model->new({
util => $util,
test_pk => 'one',
});
my $view = ClearPress::view->new({
util => $util,
model => $model,
action => 'read',
aspect => q[],
});
is($view->add(), 1, 'add ok');
is($model->test_field(), 'blabla', 'test field');
is($model->test_pk(), 'one', 'test pk remains unmodified');
for my $method (qw(create read update delete)) {
is($view->$method(), 1, "$method ok");
my $method_xml = "${method}_xml";
is($view->$method_xml(), 1, "$method_xml ok");
}
$util->cgi(undef);
}
{
my $model = t::model->new({util=>$util});
my $view = ClearPress::view->new({
util => $util,
model => $model,
action => 'create',
aspect => q(),
});
is($view->authorised(), 1, 'always authorised when authentication unsupported');
}
{
my $model = t::model->new({util=>$util});
my $basic = t::user::basic->new({util=>$util});
is($util->requestor($basic), $basic, 'requestor set');
my $view = ClearPress::view->new({
util => $util,
model => $model,
action => 'create',
aspect => q(),
});
is($view->authorised(), undef, 'basic user cannot create');
}
{
my $model = t::model->new({util=>$util});
my $basic = t::user::basic->new({util=>$util});
is($util->requestor($basic), $basic, 'requestor set');
my $view = ClearPress::view->new({
util => $util,
model => $model,
action => 'read',
aspect => q(),
});
is($view->authorised(), 1, 'basic user can read');
}
{
my $model = t::model->new({util=>$util});
my $basic = t::user::basic->new({util=>$util});
is($util->requestor($basic), $basic, 'requestor set');
my $view = ClearPress::view->new({
util => $util,
model => $model,
action => 'list',
aspect => q(),
});
is($view->authorised(), 1, 'basic user can list');
}
{
my $model = t::model->new({util=>$util});
my $basic = t::user::basic->new({util=>$util});
is($util->requestor($basic), $basic, 'requestor set');
my $view = ClearPress::view->new({
util => $util,
model => $model,
action => 'read',
aspect => q(add),
});
is($view->authorised(), undef, 'basic user cannot add');
}
{
my $model = t::model->new({util=>$util});
my $basic = t::user::basic->new({util=>$util});
is($util->requestor($basic), $basic, 'requestor set');
my $view = ClearPress::view->new({
util => $util,
model => $model,
action => 'create',
aspect => q(update),
});
is($view->authorised(), undef, 'basic user cannot update');
}
{
my $model = t::model->new({util=>$util});
my $basic = t::user::basic->new({util=>$util});
is($util->requestor($basic), $basic, 'requestor set');
my $view = ClearPress::view->new({
util => $util,
model => $model,
action => 'edit',
aspect => q(delete),
});
is($view->authorised(), undef, 'basic user cannot delete');
}
{
my $model = t::model->new({util=>$util});
my $admin = t::user::admin->new({util=>$util});
is($util->requestor($admin), $admin, 'requestor set');
my $view = ClearPress::view->new({
util => $util,
model => $model,
action => 'create',
aspect => q(),
});
is($view->authorised(), 1, 'admin user can create');
}
{
my $pid = $$;
$util->data_path("/tmp/data$pid");
my $model = t::model->new({util=>$util});
my $view = ClearPress::view->new({
util => $util,
model => $model,
action => 'read',
aspect => q[],
});
my $fn = "/tmp/data$pid/templates/$pid.tt2";
mkdir "/tmp/data$pid";
mkdir "/tmp/data$pid/templates";
`cp t/data/templates/cache.tt2 $fn`;
ok(-f $fn, 'test file copied');
my $result1 = q[];
$view->process_template("$pid.tt2", {}, \$result1);
unlink $fn;
like($result1, qr/cached/mx, 'first result');
$util->data_path(q[]);
}
{
my $pid = $$;
$util->data_path("/tmp/data$pid");
my $model = t::model->new({util=>$util});
my $view = ClearPress::view->new({
util => $util,
model => $model,
action => 'read',
aspect => q[],
});
my $fn = "/tmp/data$pid/templates/$pid.tt2";
mkdir "/tmp/data$pid";
mkdir "/tmp/data$pid/templates";
`cp t/data/templates/actions.tt2 $fn`;
ok(-f $fn, 'test file copied');
my $result2 = q[];
$view->process_template("$pid.tt2", {}, \$result2);
like($result2, qr/cached/mx, 'second process used cached template');
`rm -rf /tmp/data`;
$util->data_path(q[]);
}
{
my $cgi = CGI->new();
my $xml = qq[\ntwobar];
$cgi->param('XForms:Model', $xml);
$util->cgi($cgi);
my $model = t::model->new({
test_pk => 'one',
util => $util,
});
my $view = ClearPress::view->new({
util => $util,
model => $model,
action => 'update',
aspect => q[],
});
like($view->render(), qr/Updated/smx, 'submit-xml render ok');
is($model->test_pk(), 'one', 'key population from param not xml');
is($model->test_field(), 'bar', 'field population from xml');
}
{
my $cgi = CGI->new();
my $xml = qq[\ntwobar];
$cgi->param('POSTDATA', $xml);
$util->cgi($cgi);
my $model = t::model->new({
test_pk => 'one',
util => $util,
});
my $view = ClearPress::view->new({
util => $util,
model => $model,
action => 'update',
aspect => q[],
});
like($view->render(), qr/Updated/smx, 'submit-xml render ok');
is($model->test_pk(), 'one', 'key population from param not xml');
is($model->test_field(), 'bar', 'field population from xml');
}