#######################################################################
# 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'; }