some URL fixes and removing some uses of PseudoRequest

This commit is contained in:
Graham Knop 2010-06-10 08:18:43 -05:00
parent 169218abf7
commit e063818e2d
5 changed files with 62 additions and 76 deletions

View file

@ -196,11 +196,12 @@ sub make_urlmap_work {
if (! $self->session->request) { if (! $self->session->request) {
return $url; return $url;
} }
my $uri = $self->session->request->base; if (URI->new($url, 'http')->host) {
return $url;
}
my $uri = $self->session->request->base;
$uri->path($uri->path . $url); $uri->path($uri->path . $url);
my $path = $uri->path; return $uri->path;
$path =~ s{^//}{/};
return $path;
} }
#------------------------------------------------------------------- #-------------------------------------------------------------------

View file

@ -17,7 +17,6 @@ use strict;
use lib "$FindBin::Bin/../lib"; use lib "$FindBin::Bin/../lib";
use Test::More; use Test::More;
use WebGUI::Test; # Must use this before any other WebGUI modules use WebGUI::Test; # Must use this before any other WebGUI modules
use WebGUI::PseudoRequest;
use WebGUI::Session; use WebGUI::Session;
use WebGUI::Asset; use WebGUI::Asset;

View file

@ -38,52 +38,40 @@ plan tests => 3; # Increment this number for each test you create
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
# Test createAccountSave and returnUrl together # Test createAccountSave and returnUrl together
# Set up request # Set up request
$oldRequest = $session->request; my $createAccountSession = WebGUI::Test->newSession(0, {
$request = WebGUI::PseudoRequest->new;
$request->setup_param({
returnUrl => 'REDIRECT_URL', returnUrl => 'REDIRECT_URL',
}); });
$session->{_request} = $request;
$auth = WebGUI::Auth->new( $session, $AUTH_METHOD ); $auth = WebGUI::Auth->new( $createAccountSession, $AUTH_METHOD );
my $username = $session->id->generate; my $username = $createAccountSession->id->generate;
push @cleanupUsernames, $username; push @cleanupUsernames, $username;
$output = $auth->createAccountSave( $username, { }, "PASSWORD" ); $output = $auth->createAccountSave( $username, { }, "PASSWORD" );
is( is(
$session->http->getRedirectLocation, 'REDIRECT_URL', $createAccountSession->http->getRedirectLocation, 'REDIRECT_URL',
"returnUrl field is used to set redirect after createAccountSave", "returnUrl field is used to set redirect after createAccountSave",
); );
# Session Cleanup
$session->{_request} = $oldRequest;
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
# Test login and returnUrl together # Test login and returnUrl together
# Set up request # Set up request
$oldRequest = $session->request;
$request = WebGUI::PseudoRequest->new; my $loginSession = WebGUI::Test->newSession(0, {
$request->setup_param({
returnUrl => 'REDIRECT_LOGIN_URL', returnUrl => 'REDIRECT_LOGIN_URL',
}); });
$session->{_request} = $request;
$auth = WebGUI::Auth->new( $session, $AUTH_METHOD, 3 ); $auth = WebGUI::Auth->new( $loginSession, $AUTH_METHOD, 3 );
my $username = $session->id->generate; my $username = $loginSession->id->generate;
push @cleanupUsernames, $username; push @cleanupUsernames, $username;
$session->setting->set('showMessageOnLogin', 0); $session->setting->set('showMessageOnLogin', 0);
$output = $auth->login; $output = $auth->login;
is( is(
$session->http->getRedirectLocation, 'REDIRECT_LOGIN_URL', $loginSession->http->getRedirectLocation, 'REDIRECT_LOGIN_URL',
"returnUrl field is used to set redirect after login", "returnUrl field is used to set redirect after login",
); );
is $output, undef, 'login returns undef when showMessageOnLogin is false'; is $output, undef, 'login returns undef when showMessageOnLogin is false';
# Session Cleanup
$session->{_request} = $oldRequest;
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
# Cleanup # Cleanup
END { END {

View file

@ -13,7 +13,6 @@ use strict;
use lib "$FindBin::Bin/../lib"; use lib "$FindBin::Bin/../lib";
use WebGUI::Test; use WebGUI::Test;
use WebGUI::PseudoRequest;
use WebGUI::Session; use WebGUI::Session;
use WebGUI::Asset; use WebGUI::Asset;
@ -51,13 +50,10 @@ my @getRefererUrlTests = (
); );
use Test::More; use Test::More;
use Test::MockObject::Extends; plan tests => 79 + scalar(@getRefererUrlTests);
plan tests => 81 + scalar(@getRefererUrlTests);
my $session = WebGUI::Test->session; my $session = WebGUI::Test->session;
my $request = $session->request;
my $pseudoRequest = WebGUI::PseudoRequest->new();
$session->{_request} = $pseudoRequest;
#disable caching #disable caching
my $preventProxyCache = $session->setting->get('preventProxyCache'); my $preventProxyCache = $session->setting->get('preventProxyCache');
@ -140,17 +136,14 @@ $session->url->setSiteURL('http://webgui.org');
is( $session->url->getSiteURL, 'http://webgui.org', 'override config setting with setSiteURL'); is( $session->url->getSiteURL, 'http://webgui.org', 'override config setting with setSiteURL');
##Create a fake environment hash so we can muck with it. ##Create a fake environment hash so we can muck with it.
my %mockEnv = %ENV; my $env = $session->request->env;
my $env = $session->env;
$env = Test::MockObject::Extends->new($env);
$env->mock('get', sub { return $mockEnv{$_[1]} } );
$mockEnv{HTTPS} = "on"; $env->{'psgi.url_scheme'} = "https";
$session->url->setSiteURL(undef); $session->url->setSiteURL(undef);
is( $session->url->getSiteURL, 'https://'.$sitename, 'getSiteURL from config as http_host with SSL'); is( $session->url->getSiteURL, 'https://'.$sitename, 'getSiteURL from config as http_host with SSL');
$mockEnv{HTTPS} = ""; $env->{'psgi.url_scheme'} = "http";
$mockEnv{HTTP_HOST} = "devsite.com"; $env->{HTTP_HOST} = "devsite.com";
$session->url->setSiteURL(undef); $session->url->setSiteURL(undef);
is( $session->url->getSiteURL, 'http://'.$sitename, 'getSiteURL where requested host is not a configured site'); is( $session->url->getSiteURL, 'http://'.$sitename, 'getSiteURL where requested host is not a configured site');
@ -194,26 +187,29 @@ is( $session->url->makeCompliant($url), $url2, 'language specific URL compliance
# #
####################################### #######################################
my $originalRequest = $session->request; ##Save the original request object my $setUri = sub {
$request->env->{PATH_INFO} = $_[0];
};
$session->{_request} = undef; $session->{_request} = undef;
is($session->url->getRequestedUrl, undef, 'getRequestedUrl returns undef unless it has a request object'); is($session->url->getRequestedUrl, undef, 'getRequestedUrl returns undef unless it has a request object');
$session->{_request} = $originalRequest;
$pseudoRequest->uri('empty'); $session->{_request} = $request;
is($session->request->uri, 'empty', 'Validate Mock Object operation');
$pseudoRequest->uri('full'); $setUri->('empty');
is($session->request->uri, 'full', 'Validate Mock Object operation #2'); is($session->request->uri, 'http://devsite.com/empty', 'Validate Mock Object operation');
$pseudoRequest->uri('/path1/file1'); $setUri->('full');
is($session->request->uri, 'http://devsite.com/full', 'Validate Mock Object operation #2');
$setUri->('/path1/file1');
is($session->url->getRequestedUrl, 'path1/file1', 'getRequestedUrl, fetch'); is($session->url->getRequestedUrl, 'path1/file1', 'getRequestedUrl, fetch');
$pseudoRequest->uri('/path2/file2'); $setUri->('/path2/file2');
is($session->url->getRequestedUrl, 'path1/file1', 'getRequestedUrl, check cache of previous result'); is($session->url->getRequestedUrl, 'path1/file1', 'getRequestedUrl, check cache of previous result');
$session->url->{_requestedUrl} = undef; ##Manually clear cached value $session->url->{_requestedUrl} = undef; ##Manually clear cached value
$pseudoRequest->uri('/path2/file2?param1=one;param2=two'); $setUri->('/path2/file2?param1=one;param2=two');
is($session->url->getRequestedUrl, 'path2/file2', 'getRequestedUrl, does not return params'); is($session->url->getRequestedUrl, 'path2/file2', 'getRequestedUrl, does not return params');
####################################### #######################################
@ -226,7 +222,7 @@ my $sessionAsset = $session->asset;
$session->asset(undef); $session->asset(undef);
$session->url->{_requestedUrl} = undef; ##Manually clear cached value $session->url->{_requestedUrl} = undef; ##Manually clear cached value
$pseudoRequest->uri('/path1/">file1'); $setUri->('/path1/">file1');
is($session->url->page, '/path1/%22%3Efile1', 'page with no args returns getRequestedUrl through gateway, escaping the requested URL for safety'); is($session->url->page, '/path1/%22%3Efile1', 'page with no args returns getRequestedUrl through gateway, escaping the requested URL for safety');
is($session->url->page('op=viewHelpTOC;topic=Article'), '/path1/%22%3Efile1?op=viewHelpTOC;topic=Article', 'page: pairs are appended'); is($session->url->page('op=viewHelpTOC;topic=Article'), '/path1/%22%3Efile1?op=viewHelpTOC;topic=Article', 'page: pairs are appended');
@ -256,12 +252,12 @@ $session->asset($sessionAsset);
# #
####################################### #######################################
$mockEnv{'HTTP_REFERER'} = 'test'; $env->{'HTTP_REFERER'} = 'test';
is($session->env->get('HTTP_REFERER'), 'test', 'testing overridden ENV'); is($session->env->get('HTTP_REFERER'), 'test', 'testing overridden ENV');
foreach my $test (@getRefererUrlTests) { foreach my $test (@getRefererUrlTests) {
$mockEnv{HTTP_REFERER} = $test->{input}; $env->{HTTP_REFERER} = $test->{input};
is($session->url->getRefererUrl, $test->{output}, $test->{comment}); is($session->url->getRefererUrl, $test->{output}, $test->{comment});
} }
@ -321,14 +317,10 @@ is($session->url->extras('/dir1/foo.html'), join('', $cdnCfg->{extrasCdn}, 'dir1
is($session->url->extras('tinymce'), join('', $extras, 'tinymce'), is($session->url->extras('tinymce'), join('', $extras, 'tinymce'),
'extras exclusion from CDN'); 'extras exclusion from CDN');
# Note: env is already mocked above. # Note: env is already mocked above.
$mockEnv{HTTPS} = 'on'; $env->{'psgi.url_scheme'} = "https";
is($session->url->extras('/dir1/foo.html'), join('', $cdnCfg->{extrasSsl}, 'dir1/foo.html'), is($session->url->extras('/dir1/foo.html'), join('', $cdnCfg->{extrasSsl}, 'dir1/foo.html'),
'extras using extrasSsl with HTTPS'); 'extras using extrasSsl with HTTPS');
$mockEnv{HTTPS} = undef; $env->{'psgi.url_scheme'} = "http";
$mockEnv{SSLPROXY} = 1;
is($session->url->extras('/dir1/foo.html'), join('', $cdnCfg->{extrasSsl}, 'dir1/foo.html'),
'extras using extrasSsl with SSLPROXY');
delete $mockEnv{SSLPROXY};
$session->config->set('extrasURL', $origExtras); $session->config->set('extrasURL', $origExtras);
@ -376,7 +368,7 @@ is($session->url->urlize('home/././here'), 'home/here', '... removes
$sessionAsset = $session->asset; $sessionAsset = $session->asset;
$session->{_asset} = undef; $session->{_asset} = undef;
$session->url->{_requestedUrl} = undef; ##Manually clear cached value $session->url->{_requestedUrl} = undef; ##Manually clear cached value
$pseudoRequest->uri('/goBackToTheSite'); $setUri->('/goBackToTheSite');
is($session->url->getBackToSiteURL, '/goBackToTheSite', 'getBackToSiteURL: when session asset is undefined, the method falls back to using page'); is($session->url->getBackToSiteURL, '/goBackToTheSite', 'getBackToSiteURL: when session asset is undefined, the method falls back to using page');
@ -449,19 +441,12 @@ my $origSSLEnabled = $session->config->get('sslEnabled');
##Test all the false cases, first ##Test all the false cases, first
$session->config->set('sslEnabled', 0); $session->config->set('sslEnabled', 0);
$mockEnv{HTTPS} = 'not on'; $env->{'psgi.url_scheme'} = "http";
$mockEnv{SSLPROXY} = 0;
ok( ! $session->url->forceSecureConnection(), 'sslEnabled must be 1 to force SSL'); ok( ! $session->url->forceSecureConnection(), 'sslEnabled must be 1 to force SSL');
$session->config->set('sslEnabled', 1); $session->config->set('sslEnabled', 1);
$mockEnv{HTTPS} = 'on'; $env->{'psgi.url_scheme'} = "https";
$mockEnv{SSLPROXY} = 0;
ok( ! $session->url->forceSecureConnection(), 'HTTPS must not be "on" to force SSL'); ok( ! $session->url->forceSecureConnection(), 'HTTPS must not be "on" to force SSL');
$session->config->set('sslEnabled', 1);
$mockEnv{HTTPS} = 'not on';
$mockEnv{SSLPROXY} = 1;
ok( ! $session->url->forceSecureConnection(), 'SSLPROXY must not be true to force SSL');
ok( ! $session->url->forceSecureConnection('/test/url'), 'all conditions must be met, even if a URL is directly passed in'); ok( ! $session->url->forceSecureConnection('/test/url'), 'all conditions must be met, even if a URL is directly passed in');
##Validate the HTTP object state before we start ##Validate the HTTP object state before we start
@ -469,8 +454,7 @@ $session->http->setStatus('200', 'OK');
is($session->http->getStatus, 200, 'http status is okay, 200'); is($session->http->getStatus, 200, 'http status is okay, 200');
is($session->http->getRedirectLocation, undef, 'redirect location is empty'); is($session->http->getRedirectLocation, undef, 'redirect location is empty');
$mockEnv{HTTPS} = 'not on'; $env->{'psgi.url_scheme'} = "http";
$mockEnv{SSLPROXY} = 0;
my $secureUrl = $session->url->getSiteURL . '/foo/bar/baz/buz'; my $secureUrl = $session->url->getSiteURL . '/foo/bar/baz/buz';
$secureUrl =~ s/http:/https:/; $secureUrl =~ s/http:/https:/;

View file

@ -128,7 +128,7 @@ END {
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
=head2 newSession ( $noCleanup ) =head2 newSession ( $noCleanup, [ $request ] )
Builds a WebGUI session object for testing. Builds a WebGUI session object for testing.
@ -136,14 +136,19 @@ Builds a WebGUI session object for testing.
If true, the session won't be registered for automatic deletion. If true, the session won't be registered for automatic deletion.
=head3 $request
Either a HTTP::Request object to use for this session, or a hash ref of form parameters.
=cut =cut
sub newSession { sub newSession {
shift shift
if eval { $_[0]->isa($CLASS) }; if eval { $_[0]->isa($CLASS) };
my $noCleanup = shift; my $noCleanup = shift;
my $request = shift;
require WebGUI::Session; require WebGUI::Session;
my $session = WebGUI::Session->open( $CLASS->config, newEnv() ); my $session = WebGUI::Session->open( $CLASS->config, newEnv( $request ) );
if ( ! $noCleanup ) { if ( ! $noCleanup ) {
$CLASS->addToCleanup($session); $CLASS->addToCleanup($session);
} }
@ -158,9 +163,18 @@ sub newEnv {
require HTTP::Message::PSGI; require HTTP::Message::PSGI;
require HTTP::Request::Common; require HTTP::Request::Common;
my $config = $CLASS->config; my $config = $CLASS->config;
my $url = 'http://' . $config->get('sitename')->[0]; my $request;
my $env = HTTP::Request->new( $form ? ( POST => $url, [ %$form ] ) : ( GET => $url ) )->to_psgi; if ( try { $form->isa('HTTP::Request') } ) {
return $env; $request = $form;
}
else {
my $url = 'http://' . $config->get('sitename')->[0];
$request = $form
? HTTP::Request::Common::POST( $url, [ %$form ] )
: HTTP::Request::Common::GET( $url )
;
}
return $request->to_psgi;
} }
sub clientTest (&) { sub clientTest (&) {