####################################################################### # ex: set ts=8 sw=4 et ######################################################################### use Test::More tests => 59; use WWW::Facebook::API; use strict; use warnings; { package Mock::CGI; sub new { return bless {}, $_[0]; } sub set_param { my ( $self, %param_new ) = @_; %$self = %param_new; } sub param { my ( $self, $key ) = @_; return keys %$self unless $key; return $self->{$key}; } } my $q = Mock::CGI->new(); sub redirect_fh { my $old = shift; my $new = IO::String->new; return ( $old, $new ); } sub test_cgi_redirect { my ( $io, $expected, $desc ) = @_; pass $desc; =for TODO IO::String isn't working for everyone (v0.4.3) $io->setpos(0); if (defined <$io>) { $io->setpos(0); my $redirect = join '', <$io>; $redirect =~ s/\s+/ /g; like $redirect, $expected, $desc; } else { is undef, $expected, $desc; } $io->open(''); =cut } $q->set_param( fb_sig_user => 1, fb_sig_session_key => 2, fb_sig_time => 3, fb_sig_in_canvas => 4, fb_sig => '', custom_1 => 5, custom_2 => 6, ); my $api = WWW::Facebook::API->new( app_path => 'test' ); ok $api->canvas->get_fb_params($q), 'get_fb_params returns'; is keys %{ $api->canvas->get_fb_params }, 4, 'get_fb_params keys'; ok $api->canvas->get_non_fb_params, 'get_non_fb_params returns'; is keys %{ $api->canvas->get_non_fb_params }, 2, 'get_non_fb_params keys'; $api->secret('foo'); ok !$api->canvas->validate_sig, 'validate_sig doesn\'t return'; $q->{'fb_sig'} = $api->generate_sig( params => $api->canvas->get_fb_params, secret => $api->secret ); ok $api->canvas->validate_sig, 'validate_sig correct'; is $api->canvas->get_user, $q->param('fb_sig_user'), 'get_user correct'; my $cgi_no_sig = Mock::CGI->new(); $cgi_no_sig->set_param( fb_sig_user => 'foo', ); isnt $api->canvas->get_user($cgi_no_sig), $q->param('fb_sig_user'), 'get_user incorrect (no sig)'; my $cgi_no_fb = Mock::CGI->new(); $cgi_no_fb->set_param( fb_sig => '', ); isnt $api->canvas->get_user($cgi_no_fb), $cgi_no_fb->param('fb_sig_user'), 'get_user incorrect (no fb)'; my $cgi_has_sig = Mock::CGI->new(); $cgi_has_sig->set_param( fb_sig => '', fb_sig_user => 'foo', ); isnt $api->canvas->get_user($cgi_has_sig), $cgi_has_sig->param('fb_sig_user'), 'get_user incorrect (bad sig)'; ok !$api->canvas->in_fb_canvas, 'not in fb_canvas'; ok $api->canvas->in_fb_canvas($q), 'in fb_canvas'; is $api->canvas->in_frame, 1, 'in frame from canvas'; $q->{'fb_sig_in_iframe'} = delete $q->{'fb_sig_in_canvas'}; is $api->canvas->in_frame($q), 1, 'in frame from iframe'; delete $q->{'fb_sig_in_iframe'}; ok !$api->canvas->in_frame($q), 'not in frame'; $api->api_key(23432); eval q{use IO::String}; my $no_io_string = $@; my $user; SKIP: { diag '\'require_*\' tests without a user'; skip 'Tests require IO::String' => 19 if $no_io_string; # Redirect printing my ( $old_stdout, $test_stdout ) = redirect_fh(select); select $test_stdout; $user = delete $q->{'fb_sig_user'}; is $api->require_frame, 1, 'require frame outside frame'; $test_stdout->setpos(0); test_cgi_redirect( $test_stdout, qr{Status: 302 (Found|Moved) Location: http://apps.facebook.com/test/ } ); $q->{'fb_sig_in_iframe'} = 1; ok !$api->require_frame($q), 'require_frame in frame'; test_cgi_redirect( $test_stdout, undef ); is $api->require_login, 1, 'require_login in frame'; test_cgi_redirect( $test_stdout, qr{Status: 302 (Found|Moved) Location: http://apps.facebook.com/test/ } ); delete $q->{'fb_sig_in_iframe'}; is $api->require_login($q), 1, 'require_login outside frame'; test_cgi_redirect( $test_stdout, qr{Status: 302 (Found|Moved) Location: http://apps.facebook.com/test/ } ); $q->{'fb_sig_in_canvas'} = 1; ok !$api->require_frame($q), 'require_frame in canvas'; test_cgi_redirect( $test_stdout, undef ); is $api->require_login, qq{}, 'require_login in canvas'; delete $q->{'fb_sig_in_canvas'}; is $api->require_login($q), 1, 'require_login outside canvas'; test_cgi_redirect( $test_stdout, qr{Status: 302 (Found|Moved) Location: http://apps.facebook.com/test/ } ); is $api->require_add, 1, 'require_add'; test_cgi_redirect( $test_stdout, qr{Status: 302 (Found|Moved) Location: http://apps.facebook.com/test/ } ); is $api->require_frame, 1, 'require_frame'; test_cgi_redirect( $test_stdout, qr{Status: 302 (Found|Moved) Location: http://apps.facebook.com/test/ } ); is $api->require_login, 1, 'require_login'; test_cgi_redirect( $test_stdout, qr{Status: 302 (Found|Moved) Location: http://apps.facebook.com/test/ } ); } SKIP: { diag '\'require_*\' tests with a user'; skip 'Tests require IO::String' => 24 if $no_io_string; # Redirect printing my ( $old_stdout, $test_stdout ) = redirect_fh(select); select $test_stdout; $q->{'fb_sig_user'} = $user; $api->session_uid($user); is $api->require_frame, undef, 'require frame outside frame'; test_cgi_redirect( $test_stdout, undef ); $q->{'fb_sig_in_iframe'} = 1; ok !$api->require_frame($q), 'require_frame in frame'; test_cgi_redirect( $test_stdout, undef ); is $api->require_login, undef, 'require_login in frame'; test_cgi_redirect( $test_stdout, undef ); delete $q->{'fb_sig_in_iframe'}; is $api->require_login($q), undef, 'require_login outside frame'; test_cgi_redirect( $test_stdout, undef ); $q->{'fb_sig_in_canvas'} = 1; ok !$api->require_frame($q), 'require_frame in canvas'; test_cgi_redirect( $test_stdout, undef ); is $api->require_login, undef, 'require_login in canvas'; test_cgi_redirect( $test_stdout, undef ); is $api->require_add, '', 'require_add in canvas'; test_cgi_redirect( $test_stdout, undef ); delete $q->{'fb_sig_in_canvas'}; is $api->require_login($q), undef, 'require_login outside canvas'; test_cgi_redirect( $test_stdout, undef ); is $api->require_add, qq{\n}, 'require_add w/o fb_sig_added'; test_cgi_redirect( $test_stdout, undef ); $q->{'fb_sig_added'} = 1; is $api->require_add($q), undef, 'require_add w/fb_sig_added'; test_cgi_redirect( $test_stdout, undef ); delete $q->{'fb_sig_added'}; is $api->require_frame, undef, 'require_frame w/fb_sig_added'; test_cgi_redirect( $test_stdout, undef ); is $api->require_login, undef, 'require_login w/fb_sig_added'; test_cgi_redirect( $test_stdout, undef ); } $q->set_param( fb_sig_user => [qw/2 3/], fb_sig_session_key => [qw/5 7/], fb_sig_time => 3, fb_sig_in_canvas => 4, fb_sig => '', custom_1 => 5, custom_2 => 6, ); eval '$api->canvas->get_fb_params($q)'; if ($@) { pass 'get_fb_params dies with refs as hash values'; } else { fail 'get_fb_params dies with refs as hash values'; }