|
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.
|