#!/usr/bin/perl
# This test tests that the arguments are correctly
# passed from CAP::FiF to H::FiF
# To do this we create a mock H::FiF object
use strict;
use Test::More 'no_plan';
$ENV{'CGI_APP_RETURN_ONLY'} = 1;
my $FiF_Fill_Args;
{
# Create a dummy HTML::FillInForm object by
# loading it and then clobbering its new and fill methods with
# methods of our own
use HTML::FillInForm;
package HTML::FillInForm;
no warnings;
sub new {
my $class = shift;
return bless {};
}
sub fill {
my $self = shift;
$FiF_Fill_Args = \@_;
}
}
{
package Dummy_Param;
sub new {
my $class = shift;
my %data = @_;
return bless \%data, $class;
}
sub param {
my $self = shift;
if (@_) {
return unless exists $self->{$_[0]};
return $self->{$_[0]};
}
else {
return keys %$self;
}
}
}
{
package WebApp;
use vars qw(@ISA);
use Test::More;
use CGI::Application;
use CGI::Application::Plugin::FillInForm qw/fill_form/;
@ISA = ('CGI::Application');
sub setup {
my $self = shift;
$self->header_type('none');
$self->run_modes(['start']);
}
sub start {
my $self = shift;
my $html = 'test html';
my (%fif_params);
$self->mode_param('rm_bar') ;
$self->query->param('rm_bar' => 'bubba');
# Test filling with hashref (\%data)
my %data = (
'data_var1' => 'value1',
'data_var2' => 'value2',
);
my %options = (
'dopt1' => 'doptvalue1',
'dopt2' => 'doptvalue2',
);
$self->fill_form(\$html, \%data, %options);
%fif_params = @$FiF_Fill_Args;
my $fdat = delete $fif_params{'fdat'};
my $ignore_fields = delete $fif_params{'ignore_fields'};
ok(eq_hash($fdat, \%data), '[data] fdat');
ok(eq_array($ignore_fields, ['rm_bar']), '[obj] ignore_fields ');
is(delete $fif_params{'scalarref'}, \$html, '[data] scalarref');
is(delete $fif_params{'dopt1'}, 'doptvalue1', '[data] dopt1');
is(delete $fif_params{'dopt2'}, 'doptvalue2', '[data] dopt2');
ok(!keys %fif_params, '[data] no params unaccounted for');
# Same, but use a reference to the reference of the input $html
%data = (
'data_var1' => 'value1',
'data_var2' => 'value2',
);
%options = (
'dopt1' => 'doptvalue1',
'dopt2' => 'doptvalue2',
);
my $html_ref = \$html;
$self->fill_form(\$html_ref, \%data, %options);
%fif_params = @$FiF_Fill_Args;
$fdat = delete $fif_params{'fdat'};
$ignore_fields = delete $fif_params{'ignore_fields'};
ok(eq_hash($fdat, \%data), '[data (html ref)] fdat');
ok(eq_array($ignore_fields, ['rm_bar']), '[obj (html ref)] ignore_fields ');
is(delete $fif_params{'scalarref'}, \$html, '[data (html ref)] scalarref');
is(delete $fif_params{'dopt1'}, 'doptvalue1', '[data (html ref)] dopt1');
is(delete $fif_params{'dopt2'}, 'doptvalue2', '[data (html ref)] dopt2');
ok(!keys %fif_params, '[data (html ref)] no params unaccounted for');
# Test filling with object ($param_obj)
my $param_obj = Dummy_Param->new(
'param_var1' => 'value1',
'param_var2' => 'value2',
'param_var3' => 'value3',
);
%options = (
'popt1' => 'poptvalue1',
'popt2' => 'poptvalue2',
);
$self->fill_form(\$html, $param_obj, %options);
%fif_params = @$FiF_Fill_Args;
my $fobject = delete $fif_params{'fobject'};
$ignore_fields = delete $fif_params{'ignore_fields'};
$fobject = $fobject->[0] if ref $fobject eq 'ARRAY';
is(delete $fif_params{'scalarref'}, \$html, '[obj] scalarref');
is($fobject, $param_obj, '[obj] fobj');
ok(eq_array($ignore_fields, ['rm_bar']), '[obj] ignore_fields ');
is(delete $fif_params{'popt1'}, 'poptvalue1', '[obj] popt1');
is(delete $fif_params{'popt2'}, 'poptvalue2', '[obj] popt2');
ok(!keys %fif_params, '[obj] no params unaccounted for');
# Test filling with a list (mixed data and objects)
my $param_obj1 = Dummy_Param->new(
'param_varA1' => 'valueA1',
'param_varA2' => 'valueA2',
'param_varA3' => 'valueA3',
);
my $param_obj2 = Dummy_Param->new(
'param_varB1' => 'valueB1',
'param_varB2' => 'valueB2',
'param_varB3' => 'valueB3',
);
my $param_obj3 = Dummy_Param->new(
'param_varA1' => 'valueC1x',
'param_varC1' => 'valueC1',
'param_varC2' => 'valueC2',
'param_varC3' => 'valueC3',
);
my %data1 = (
'data_varB1' => 'valueA1x',
'data_varA1' => 'valueA1',
'data_varA2' => 'valueA2',
);
my %data2 = (
'data_varB1' => 'valueB1',
'data_varB2' => 'valueB2',
);
%options = (
'lopt1' => 'loptvalue1',
'lopt2' => 'loptvalue2',
);
$self->fill_form(\$html, [$param_obj3, \%data2, \%data2, $param_obj1, $param_obj2, \%data1], %options);
%fif_params = @$FiF_Fill_Args;
$fobject = delete $fif_params{'fobject'};
$fdat = delete $fif_params{'fdat'};
$ignore_fields = delete $fif_params{'ignore_fields'};
ok(eq_array($fobject, [$param_obj3, $param_obj1, $param_obj2]), '[list] fobject list');
ok(eq_hash($fdat, {%data2, %data1}), '[list] fdat merged hash');
ok(eq_array($ignore_fields, ['rm_bar']), '[obj] ignore_fields ');
is(delete $fif_params{'scalarref'}, \$html, '[list] scalarref');
is(delete $fif_params{'lopt1'}, 'loptvalue1', '[list] lopt1');
is(delete $fif_params{'lopt2'}, 'loptvalue2', '[list] lopt2');
ok(!keys %fif_params, '[list] no params unaccounted for');
# Test filling with no data sources - should default to query, but
# not override the run mode param ('rm_foo')
$self->mode_param('rm_foo') ;
$self->query->param('rm_foo' => 'bubbles');
$self->fill_form(\$html);
%fif_params = @$FiF_Fill_Args;
$fobject = delete $fif_params{'fobject'};
$fdat = delete $fif_params{'fdat'};
$ignore_fields = delete $fif_params{'ignore_fields'};
ok(eq_array($fobject, $self->query), '[none] fobject is query');
ok(eq_array($ignore_fields, ['rm_foo']), '[none] ignore_fields');
is(delete $fif_params{'scalarref'}, \$html, '[none] scalarref');
ok(!keys %fif_params, '[none] no params unaccounted for');
}
}
WebApp->new->run;