From e063818e2d90b819d1f3e5c7b0fa28d0af7d035c Mon Sep 17 00:00:00 2001 From: Graham Knop Date: Thu, 10 Jun 2010 08:18:43 -0500 Subject: [PATCH] some URL fixes and removing some uses of PseudoRequest --- lib/WebGUI/Session/Url.pm | 9 ++--- t/Asset/AssetExportHtml.t | 1 - t/Auth.t | 34 ++++++------------- t/Session/Url.t | 70 +++++++++++++++------------------------ t/lib/WebGUI/Test.pm | 24 +++++++++++--- 5 files changed, 62 insertions(+), 76 deletions(-) diff --git a/lib/WebGUI/Session/Url.pm b/lib/WebGUI/Session/Url.pm index 2ad0f8e3d..1b5fc6902 100644 --- a/lib/WebGUI/Session/Url.pm +++ b/lib/WebGUI/Session/Url.pm @@ -196,11 +196,12 @@ sub make_urlmap_work { if (! $self->session->request) { 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); - my $path = $uri->path; - $path =~ s{^//}{/}; - return $path; + return $uri->path; } #------------------------------------------------------------------- diff --git a/t/Asset/AssetExportHtml.t b/t/Asset/AssetExportHtml.t index 7d6acfdc3..a0c498ea4 100644 --- a/t/Asset/AssetExportHtml.t +++ b/t/Asset/AssetExportHtml.t @@ -17,7 +17,6 @@ use strict; use lib "$FindBin::Bin/../lib"; use Test::More; use WebGUI::Test; # Must use this before any other WebGUI modules -use WebGUI::PseudoRequest; use WebGUI::Session; use WebGUI::Asset; diff --git a/t/Auth.t b/t/Auth.t index 571011797..001e00016 100644 --- a/t/Auth.t +++ b/t/Auth.t @@ -38,52 +38,40 @@ plan tests => 3; # Increment this number for each test you create #---------------------------------------------------------------------------- # Test createAccountSave and returnUrl together # Set up request -$oldRequest = $session->request; -$request = WebGUI::PseudoRequest->new; -$request->setup_param({ +my $createAccountSession = WebGUI::Test->newSession(0, { returnUrl => 'REDIRECT_URL', }); -$session->{_request} = $request; -$auth = WebGUI::Auth->new( $session, $AUTH_METHOD ); -my $username = $session->id->generate; +$auth = WebGUI::Auth->new( $createAccountSession, $AUTH_METHOD ); +my $username = $createAccountSession->id->generate; push @cleanupUsernames, $username; -$output = $auth->createAccountSave( $username, { }, "PASSWORD" ); +$output = $auth->createAccountSave( $username, { }, "PASSWORD" ); is( - $session->http->getRedirectLocation, 'REDIRECT_URL', + $createAccountSession->http->getRedirectLocation, 'REDIRECT_URL', "returnUrl field is used to set redirect after createAccountSave", ); -# Session Cleanup -$session->{_request} = $oldRequest; - #---------------------------------------------------------------------------- # Test login and returnUrl together # Set up request -$oldRequest = $session->request; -$request = WebGUI::PseudoRequest->new; -$request->setup_param({ + +my $loginSession = WebGUI::Test->newSession(0, { returnUrl => 'REDIRECT_LOGIN_URL', }); -$session->{_request} = $request; -$auth = WebGUI::Auth->new( $session, $AUTH_METHOD, 3 ); -my $username = $session->id->generate; +$auth = WebGUI::Auth->new( $loginSession, $AUTH_METHOD, 3 ); +my $username = $loginSession->id->generate; push @cleanupUsernames, $username; $session->setting->set('showMessageOnLogin', 0); -$output = $auth->login; +$output = $auth->login; is( - $session->http->getRedirectLocation, 'REDIRECT_LOGIN_URL', + $loginSession->http->getRedirectLocation, 'REDIRECT_LOGIN_URL', "returnUrl field is used to set redirect after login", ); is $output, undef, 'login returns undef when showMessageOnLogin is false'; -# Session Cleanup -$session->{_request} = $oldRequest; - - #---------------------------------------------------------------------------- # Cleanup END { diff --git a/t/Session/Url.t b/t/Session/Url.t index d44eb9a0d..46a6dedf0 100644 --- a/t/Session/Url.t +++ b/t/Session/Url.t @@ -13,7 +13,6 @@ use strict; use lib "$FindBin::Bin/../lib"; use WebGUI::Test; -use WebGUI::PseudoRequest; use WebGUI::Session; use WebGUI::Asset; @@ -51,13 +50,10 @@ my @getRefererUrlTests = ( ); use Test::More; -use Test::MockObject::Extends; -plan tests => 81 + scalar(@getRefererUrlTests); +plan tests => 79 + scalar(@getRefererUrlTests); my $session = WebGUI::Test->session; - -my $pseudoRequest = WebGUI::PseudoRequest->new(); -$session->{_request} = $pseudoRequest; +my $request = $session->request; #disable caching 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'); ##Create a fake environment hash so we can muck with it. -my %mockEnv = %ENV; -my $env = $session->env; -$env = Test::MockObject::Extends->new($env); -$env->mock('get', sub { return $mockEnv{$_[1]} } ); +my $env = $session->request->env; -$mockEnv{HTTPS} = "on"; +$env->{'psgi.url_scheme'} = "https"; $session->url->setSiteURL(undef); is( $session->url->getSiteURL, 'https://'.$sitename, 'getSiteURL from config as http_host with SSL'); -$mockEnv{HTTPS} = ""; -$mockEnv{HTTP_HOST} = "devsite.com"; +$env->{'psgi.url_scheme'} = "http"; +$env->{HTTP_HOST} = "devsite.com"; $session->url->setSiteURL(undef); 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; is($session->url->getRequestedUrl, undef, 'getRequestedUrl returns undef unless it has a request object'); -$session->{_request} = $originalRequest; -$pseudoRequest->uri('empty'); -is($session->request->uri, 'empty', 'Validate Mock Object operation'); +$session->{_request} = $request; -$pseudoRequest->uri('full'); -is($session->request->uri, 'full', 'Validate Mock Object operation #2'); +$setUri->('empty'); +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'); -$pseudoRequest->uri('/path2/file2'); +$setUri->('/path2/file2'); is($session->url->getRequestedUrl, 'path1/file1', 'getRequestedUrl, check cache of previous result'); $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'); ####################################### @@ -226,7 +222,7 @@ my $sessionAsset = $session->asset; $session->asset(undef); $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('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'); foreach my $test (@getRefererUrlTests) { - $mockEnv{HTTP_REFERER} = $test->{input}; + $env->{HTTP_REFERER} = $test->{input}; 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'), 'extras exclusion from CDN'); # 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'), 'extras using extrasSsl with HTTPS'); -$mockEnv{HTTPS} = undef; -$mockEnv{SSLPROXY} = 1; -is($session->url->extras('/dir1/foo.html'), join('', $cdnCfg->{extrasSsl}, 'dir1/foo.html'), - 'extras using extrasSsl with SSLPROXY'); -delete $mockEnv{SSLPROXY}; +$env->{'psgi.url_scheme'} = "http"; $session->config->set('extrasURL', $origExtras); @@ -376,7 +368,7 @@ is($session->url->urlize('home/././here'), 'home/here', '... removes $sessionAsset = $session->asset; $session->{_asset} = undef; $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'); @@ -449,19 +441,12 @@ my $origSSLEnabled = $session->config->get('sslEnabled'); ##Test all the false cases, first $session->config->set('sslEnabled', 0); -$mockEnv{HTTPS} = 'not on'; -$mockEnv{SSLPROXY} = 0; +$env->{'psgi.url_scheme'} = "http"; ok( ! $session->url->forceSecureConnection(), 'sslEnabled must be 1 to force SSL'); $session->config->set('sslEnabled', 1); -$mockEnv{HTTPS} = 'on'; -$mockEnv{SSLPROXY} = 0; +$env->{'psgi.url_scheme'} = "https"; 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'); ##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->getRedirectLocation, undef, 'redirect location is empty'); -$mockEnv{HTTPS} = 'not on'; -$mockEnv{SSLPROXY} = 0; +$env->{'psgi.url_scheme'} = "http"; my $secureUrl = $session->url->getSiteURL . '/foo/bar/baz/buz'; $secureUrl =~ s/http:/https:/; diff --git a/t/lib/WebGUI/Test.pm b/t/lib/WebGUI/Test.pm index 966be7a4c..071dd86d5 100644 --- a/t/lib/WebGUI/Test.pm +++ b/t/lib/WebGUI/Test.pm @@ -128,7 +128,7 @@ END { #---------------------------------------------------------------------------- -=head2 newSession ( $noCleanup ) +=head2 newSession ( $noCleanup, [ $request ] ) 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. +=head3 $request + +Either a HTTP::Request object to use for this session, or a hash ref of form parameters. + =cut sub newSession { shift if eval { $_[0]->isa($CLASS) }; my $noCleanup = shift; + my $request = shift; require WebGUI::Session; - my $session = WebGUI::Session->open( $CLASS->config, newEnv() ); + my $session = WebGUI::Session->open( $CLASS->config, newEnv( $request ) ); if ( ! $noCleanup ) { $CLASS->addToCleanup($session); } @@ -158,9 +163,18 @@ sub newEnv { require HTTP::Message::PSGI; require HTTP::Request::Common; my $config = $CLASS->config; - my $url = 'http://' . $config->get('sitename')->[0]; - my $env = HTTP::Request->new( $form ? ( POST => $url, [ %$form ] ) : ( GET => $url ) )->to_psgi; - return $env; + my $request; + if ( try { $form->isa('HTTP::Request') } ) { + $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 (&) {