package WebDAO::Test; #$Id$ =head1 NAME WebDAO::Test - Class for tests =head1 SYNOPSIS use WebDAO::Test; my $eng = WebDAO::Test::make_engine( class => 'MyClass', config => 't/tests.ini', index_file => 'contrib/www/index.xhtml' ) my $tlib = new WebDAO::Test::(eng =>$eng); =head1 DESCRIPTION Class for tests =cut our $VERSION = '0.01'; require Exporter; @WebDAO::Test::ISA = qw(Exporter ); #@WebDAO::Test::EXPORT = qw/ t_get_engine t_get_tlib/; use strict; use warnings; use Data::Dumper; use Test::More; use Digest::MD5 qw(md5 md5_hex md5_base64); use WebDAO::Lex; use WebDAO::SessionSH; use WebDAO::Engine; our $default_engine_class = 'WebDAO::Engine'; =head1 FUNCTIONS =head2 t_get_engine Return Engine my $eng = t_get_engine ('www/index.html', config=>'tests.ini'); =cut sub main::t_get_engine { my $index_file = shift; my %eng_pars = @_; if ( $index_file && -e $index_file ) { my $content = qq!!; my $lex = new WebDAO::Lex:: content => $content; $eng_pars{lexer} = $lex; } else { $eng_pars{source} = ''; } my $session = new WebDAO::SessionSH::; my $eng = $__PACKAGE__::default_engine_class->new( session => $session, %eng_pars ); return $eng; } sub t_get_engine { my $index_file = shift; warn "$index_file" unless -e $index_file; my %eng_pars = @_; if ( $index_file && -e $index_file ) { my $content = qq!!; my $lex = new WebDAO::Lex:: content => $content; $eng_pars{lexer} = $lex; } else { $eng_pars{source} = ''; } my $session = new WebDAO::SessionSH::; my $eng = $__PACKAGE__::default_engine_class->new( session => $session, %eng_pars ); return $eng; } =head2 make_eng [class=>, index_file=>, %other_params_to_engine] Return engine object. Used params: class - Class of engine (default -"WebDAO::Kernel"), index_file - path to index file =cut sub make_engine { my %eng_pars = @_; my $class = delete $eng_pars{class} || 'WebDAO::Kernel'; if ( my $index_file = delete $eng_pars{index_file} ) { warn "$index_file not found!!!" unless -e $index_file; if ( $index_file && -e $index_file ) { open FH, "<$index_file" or die $!; my $content =''; { local $/=undef; $content = ; } close FH; my $lex = new WebDAO::Lex:: tmpl => $content; $eng_pars{lex} = $lex; } } my $session = new WebDAO::SessionSH::; my $eng = $class->new( session => $session, %eng_pars ); return $eng; } =head2 make_test_lib [, ] Return object of test class B (default "WebDAO::Test") =cut sub make_test_lib { my ( $eng, $tclass ) = @_; $tclass ||= "WebDAO::Test"; return $tclass->new( eng => $eng ); } sub import { my $self = shift; my $engine_class = shift || $default_engine_class; $__PACKAGE__::default_engine_class = $engine_class; # $self->export_to_level( 1, 't_get_engine' ); $self->export_to_level( 1, 't_get_tlib' ); } sub t_get_tlib { my $eng = shift || die "need \$eng"; my $tlib = __PACKAGE__->new( eng => $eng ); return $tlib; } =head1 METHODS =cut sub new { my $class = shift; $class = ref($class) || $class; my %args = @_; my $self = bless( \%args, $class ); return $self; } =head2 tree [ $contaner ] return tree of node $contaner . default $engine =cut sub tree { my $self = shift; my $obj = shift || $self->{eng}; my @res = (); foreach my $o ( @{ $obj->_get_childs_ } ) { push @res, $self->tree($o),; } return { $obj->__my_name . ":" . ref($obj) => \@res }; } =head2 xget get object by path (query) $tlib->xget('/page') =cut sub xget { my $self = shift; my $path = shift; # $path =~ s/^\///; my $eng = $self->{eng}; #check if exists args my $pars; ( $path, $pars ) = split /\?/, $path; my %args = (); %args = map { split /\=/, $_ } split /\&/, $pars if $pars; $eng->_session->Params( \%args ); return $self->resolve_path( $path, @_ ); # return $eng->resolve_path( $eng->_session, $path ); } =head2 resolve_path '/path/Path' #[, arg1=>1, arg2=>2] Query path =cut sub resolve_path { my $self = shift; my $path = shift; my $sess = $self->eng->_session(); # return $self if $path eq '/'; #skip root objects my ( undef, @path ) = split( /\//, $path ); my ( $src, $res ) = ( shift || $self->eng)->_traverse_( $sess, @path ); $res; } =head2 get_by_path get object by resolve_path query $tlib->get_by_path('/page') $tlib->get_by_path('/page', $root_object) =cut sub get_by_path { my $self = shift; my $path = shift; my $eng = $self->{eng}; my $root_obj = shift || $eng; #skip root objects my ( undef, @path ) = split( /\//, $path ); my ( $src, $res ) = $root_obj->_traverse_($self->eng->_session() , @path ); $res; } =head2 eng get root object =cut sub eng { return $_[0]->{eng}; } =head2 get_session Get curren Session object =cut sub get_session { return $_[0]->eng->_session; } 1; sub make_cv { my %args = @_; my $out; my $cv = WebDAO::CV->new( env => $args{env}, writer => sub { new Test::Writer:: out => \$out, status => $_[0]->[0], headers => $_[0]->[1]; } ); } package Test::Writer; our $VERSION = '0.01'; use warnings; use strict; sub new { my $class = shift; my $self = bless( ( $#_ == 0 ) ? shift : {@_}, ref($class) || $class ); } sub write { ${ $_[0]->{out} } .= $_[1] ; } sub close { } sub headers { return $_[0]->{headers} } sub output { ${ $_[0]->{out} } } 1; package TestCV; use strict; use warnings; use WebDAO::CV; our $VERSION = '0.01'; use base 'WebDAO::CV'; sub new { my $self = shift; my $buf_ref = shift; my $writer = sub { new Test::Writer:: out => $buf_ref, status => $_[0]->[0], headers => $_[0]->[1]; }; $self->SUPER::new(writer=>$writer, @_ ) } # for skip headers # $cv{SKIP_HEADERS} = 1 sub _init__ { my $self = shift; my $buf_ref = shift; return $self->SUPER::_init(@_); } sub response__ { my $self = shift; my $res = shift || return; unless ( exists( $self->{SKIP_HEADERS} ) ) { $self->SUPER::response($res) } else { $self->print( $res->{data} ); } } sub print__ { my $self = shift; my $out_ref = $self->{ctr}; if ( grep { ! defined $_} @_ ) { warn "NOT DEFINED IN PUT"; } $$out_ref .=join "",grep {defined $_ } @_ if scalar(@_); } 1; __DATA__ =head1 SEE ALSO http://webdao.sourceforge.net =head1 AUTHOR Zahatski Aliaksandr, Ezag@cpan.orgE =head1 COPYRIGHT AND LICENSE Copyright 2002-2009 by Zahatski Aliaksandr This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut