From: <pau...@us...> - 2008-07-12 11:56:54
|
Revision: 1011 http://everydevel.svn.sourceforge.net/everydevel/?rev=1011&view=rev Author: paul_the_nomad Date: 2008-07-12 04:56:47 -0700 (Sat, 12 Jul 2008) Log Message: ----------- Nodeball response type Added Paths: ----------- trunk/ebase/lib/Everything/HTTP/Response/Nodeball.pm trunk/ebase/lib/Everything/HTTP/Response/Test/Nodeball.pm trunk/ebase/t/nodeball-responder.t Added: trunk/ebase/lib/Everything/HTTP/Response/Nodeball.pm =================================================================== --- trunk/ebase/lib/Everything/HTTP/Response/Nodeball.pm (rev 0) +++ trunk/ebase/lib/Everything/HTTP/Response/Nodeball.pm 2008-07-12 11:56:47 UTC (rev 1011) @@ -0,0 +1,106 @@ +package Everything::HTTP::Response::Nodeball; + +use Everything::Storage::Nodeball; +use Apache2::Const qw/FORBIDDEN OK/; +use File::Temp qw/ :seekable /; +use strict; + +use base 'Class::Accessor::Fast'; +__PACKAGE__->follow_best_practice; +__PACKAGE__->mk_accessors( + qw/request headers/); +use strict; +use warnings; + +sub new { + my $class = shift; + my $self = bless {}, $class; + $self->init(@_); +} + +sub init { + my ( $self, $args ) = @_; + $self->set_request( $args->{ request } ); + $self->authorise; + $self->{ headers } = {}; + return $self; +} + +sub authorise { + my $self = shift; + my $e = $self->get_request; + my $user = $e->get_user; + my $node = $e->get_node; + return $self->allowed( 1 ) if $node->hasAccess( $user, 'r' ); + return $self->allowed( undef ); + +} + +sub content { + + my $self = shift; + return unless $self->allowed; + my $e = $self->get_request; + my $nb = $e->get_nodebase; + my $node = $e->get_node; + my $file = File::Temp->new; + + my $ball_title = $node->get_title; + + my $storage = Everything::Storage::Nodeball->new ( nodebase => $nb ); + + $storage->cleanup( 1 ); + $storage->export_nodeball_to_file( $ball_title, "$file" ); + + $ball_title =~ s/[^\w\.\-]/-/g; + $self->add_header( 'Content-Disposition', "attachment; filename=" . $ball_title . '.nbz' ); + + $file->seek( SEEK_SET, 0 ); + local $/; + return <$file>; +} + +sub headers { + + return %{ $_[0]->get_headers }; + +} + +sub content_type { + +'application/x-gzip'; + +} + +sub status_code { + my $self = shift; + return OK if $self->allowed; + return FORBIDDEN; + +} + +sub allowed { + + my $self = shift; + + if ( ! @_ ) { + return $self->{allowed}; + } else { + return $self->{allowed} = $_[0]; + } + +} + +=head2 add_header + +Adds a header to the headers attribute. Takes two arguments. The first is the name of the header, the second is the header value. + +=cut + +sub add_header { + my ( $self, $key, $value ) =@_; + $self->get_headers->{ $key } = $value; + +} + +1; Property changes on: trunk/ebase/lib/Everything/HTTP/Response/Nodeball.pm ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/ebase/lib/Everything/HTTP/Response/Test/Nodeball.pm =================================================================== --- trunk/ebase/lib/Everything/HTTP/Response/Test/Nodeball.pm (rev 0) +++ trunk/ebase/lib/Everything/HTTP/Response/Test/Nodeball.pm 2008-07-12 11:56:47 UTC (rev 1011) @@ -0,0 +1,94 @@ +package Everything::HTTP::Response::Test::Nodeball; + +use base 'Everything::Test::Abstract'; +use Test::MockObject; +use Test::More; +use IO::File; +use SUPER; +use strict; +use warnings; + +sub startup : Test(startup => +0) { + + my $self = shift; + my $class = $self->module_class; + + Test::MockObject->fake_module( + 'Apache2::Const', + import => sub { + no strict 'refs'; + *{ $class . '::OK' } = sub { 'ok status code' }; + *{ $class . '::FORBIDDEN' } = sub { 'forbidden status code' }; + use strict 'refs'; + } + ); + + $self->SUPER; + +} + +sub setup :Test(setup) { + my $self = shift; + my $mock = Test::MockObject->new; + $mock->set_always( get_user => $mock ); + $mock->set_always( get_node => $mock ); + $mock->set_true(qw/hasAccess/); + $self->{ mock } = $mock; + $self->{instance} = $self->{class}->new( { request => $mock } ); + +} + +sub test_status_code : Test(2) { + my $self = shift; + my $i = $self->{instance}; + $i->allowed( 1 ); + is ( $i->status_code, 'ok status code', '...returns OK if download allowed.'); + $i->allowed( 0 ); + is ( $i->status_code, 'forbidden status code', '...returns FORBIDDEN if download allowed.'); + +} + +sub test_content : Test(3) { + my $self = shift; + + my $mock = $self->{ mock }; + $mock->set_always( get_request => $mock ); + $mock->set_always( get_nodebase => $mock ); + $mock->set_always( get_node => $mock ); + $mock->set_always( get_title => 'a nodeball title' ); + + my @args = (); + + local *Everything::Storage::Nodeball::export_nodeball_to_file; + *Everything::Storage::Nodeball::export_nodeball_to_file = sub { + push @args, @_; + my $file = $_[2]; + my $fh = IO::File->new( $file, 'w' ); + print $fh "nodeball contents"; + return 1; + }; + + my $i = $self->{ instance }; + $i->allowed( 1 ); + + is( my $rv = $i->content, 'nodeball contents', '... returns contents written to file.' ); + is ( $args[1], 'a nodeball title', '...title of a nodeball.' ); + my %headers = $i->headers; + is_deeply( \%headers, { 'Content-Disposition' => 'attachment; filename=a-nodeball-title.nbz' }, '...sets the Content-Disposition header' ); +} + +sub test_headers :Test(2) { + + my $self = shift; + my $i = $self->{instance}; + my %headers = $i->headers; + is_deeply( \%headers, {}, '...returns an empty list when initialised.' ); + + $i->add_header( Foo => 'Bar' ); + %headers = $i->headers; + is_deeply( \%headers, { Foo => 'Bar' }, '...returns one header when added.' ); + + +} + +1; Property changes on: trunk/ebase/lib/Everything/HTTP/Response/Test/Nodeball.pm ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/ebase/t/nodeball-responder.t =================================================================== --- trunk/ebase/t/nodeball-responder.t (rev 0) +++ trunk/ebase/t/nodeball-responder.t 2008-07-12 11:56:47 UTC (rev 1011) @@ -0,0 +1,11 @@ +#!/usr/bin/perl -w + +use lib 'blib/lib', 'lib/'; +use Everything::HTTP::Response::Test::Nodeball; + +use strict; + + + + +Everything::HTTP::Response::Test::Nodeball->runtests; Property changes on: trunk/ebase/t/nodeball-responder.t ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |