fu: Close-up of Fu, bringing a scoop of water to her mouth (Default)
fu ([personal profile] fu) wrote in [site community profile] changelog2011-02-28 10:50 am

[dw-free] Need a way to cleanly call controllers from tests

[commit: http://hg.dwscoalition.org/dw-free/rev/c6ee06c056d3]

http://bugs.dwscoalition.org/show_bug.cgi?id=3547

Create LJ::Test::routing_request, used in tests of controllers under the
routing system.

Patch by [personal profile] exor674.

Files modified:
  • cgi-bin/LJ/Test.pm
  • t/atom-post.t
--------------------------------------------------------------------------------
diff -r b0d94d3528e4 -r c6ee06c056d3 cgi-bin/LJ/Test.pm
--- a/cgi-bin/LJ/Test.pm	Mon Feb 28 18:47:21 2011 +0800
+++ b/cgi-bin/LJ/Test.pm	Mon Feb 28 18:50:22 2011 +0800
@@ -16,6 +16,10 @@ use strict;
 use strict;
 use Carp qw(croak);
 
+use DW::Routing;
+use DW::Request::Standard;
+use HTTP::Request;
+
 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
 #              WARNING! PELIGROSO! ACHTUNG! VNIMANIYE!
 # some fools (aka mischa) try to use this library from web context,
@@ -26,7 +30,7 @@ use DBI;
 use DBI;
 use LJ::ModuleCheck;
 our @ISA = qw(Exporter);
-our @EXPORT = qw(memcache_stress with_fake_memcache temp_user temp_comm temp_feed fake_apache);
+our @EXPORT = qw(memcache_stress with_fake_memcache temp_user temp_comm temp_feed fake_apache routing_request);
 
 my @temp_userids;  # to be destroyed later
 END {
@@ -191,6 +195,30 @@ sub memcache_stress (&) {
     LJ::MemCache::set_memcache($pre_mem);
 }
 
+sub routing_request {
+    my ( $uri, %opts ) = @_;
+
+    my $method = $opts{method} || 'GET';
+    my %routing_data = %{ $opts{routing_data} || {} };
+
+    LJ::start_request();
+
+    my $req = HTTP::Request->new( $method => $uri );
+
+    $opts{setup_http_request}->($req) if $opts{setup_http_request};
+
+    # Just in case, but this shouldn't get set in a non-web context
+    DW::Request->reset;
+    my $r = DW::Request::Standard->new( $req );
+
+    $opts{setup_dw_request}->($r) if $opts{setup_dw_request};
+
+    my $rv = DW::Routing->call( %routing_data );
+    $r->status( $rv ) unless $rv eq $r->OK;
+
+    return $r;
+}
+
 package LJ::Test::FakeMemCache;
 # duck-typing at its finest!
 # this is a fake Cache::Memcached object which implements the
@@ -283,7 +311,6 @@ sub disconnect_all {}
 sub disconnect_all {}
 sub forget_dead_hosts {}
 
-
 package LJ::User;
 
 # post a fake entry in a community journal
diff -r b0d94d3528e4 -r c6ee06c056d3 t/atom-post.t
--- a/t/atom-post.t	Mon Feb 28 18:47:21 2011 +0800
+++ b/t/atom-post.t	Mon Feb 28 18:50:22 2011 +0800
@@ -30,43 +30,33 @@ my $api = XML::Atom::Client->new( Versio
 
 my $r;
 sub do_request {
-    my ( %opts ) = @_;
+    my ( $method, $uri, %opts ) = @_;
 
     my $authenticate = delete $opts{authenticate};
     my $data = delete $opts{data} || {};
     my $remote = delete $opts{remote} || $u;
     my $password = delete $opts{password} || $remote->password;
 
-    my $req = HTTP::Request->new( %opts );
-
-    $req->uri =~ m!http://([^.]+)!;
+    $uri =~ m!http://([^.]+)!;
     my $user_subdomain = $1 eq "www" ? "" : $1;
-
-    # caution: may be fragile
-    # relies upon knowing details of the client's implementation
-    # which are not in the client's public documented API
-    if ( $authenticate ) {
-        $api->username( $remote->username );
-        $api->password( $password );
-        $api->munge_request( $req );
-    }
-
-    # clear request caches
-    DW::Request->reset;
-    $r = $DW::Request::cur_req = DW::Request::Standard->new( $req );
-    $DW::Request::determined = 1;
-
-    LJ::Entry->reset_singletons;
-    %LJ::REQ_CACHE_REL = ();
-
-    # set any additional information
-    $r->pnote( $_ => $data->{$_} ) foreach %$data;
 
     my %routing_data = ();
     $routing_data{username} = $user_subdomain if $user_subdomain;
 
-    my $returned = DW::Routing->call( %routing_data );
-    $r->status( $returned ) unless $returned eq $r->OK;
+    $r = routing_request( $uri,
+        method => $method,
+        setup_http_request => sub {
+            if ( $authenticate ) {
+                $api->username( $remote->username );
+                $api->password( $password );
+                $api->munge_request( $_[0] );
+            }
+        },
+        setup_dw_request => sub {
+            $_[0]->pnote( $_ => $data->{$_} ) foreach %$data;
+        },
+        routing_data => \%routing_data,
+    );
 }
 
 # check subject, etc
--------------------------------------------------------------------------------

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
No Subject Icon Selected
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org