The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use Test::Exception;
use Test::MockObject::Extends;
use Test::MockObject;
use Test::More tests => 7;

use HTTP::Response;

my $m;
BEGIN {
    use_ok( $m = 'Catalyst::Plugin::Authentication::Credential::Flickr' );
}

can_ok( $m, 'authenticate_flickr' );
can_ok( $m, 'authenticate_flickr_url' );

my $flickr   = Test::MockObject->new;
my $auth_url = 'http://example.com/auth/url';
$flickr->mock( request_auth_url => sub {$auth_url} );

my $c = Test::MockObject::Extends->new($m);

my $user_class = Test::MockObject->new;
$user_class->fake_module('Fake::User::Class', new => sub {});

my $config = {
    authentication => {
        flickr => {
            key        => 'my_key',
            secret     => 'my_secret',
            perms      => 'write',
            user_class => 'Fake::User::Class',

            flickr_object => $flickr,
        },
    },
};
$c->mock( config => sub {$config} );

is( $c->authenticate_flickr_url, $auth_url, 'returns auth_url correctly' );

my $req        = Test::MockObject->new;
my $res        = HTTP::Response->new;

my $params     = {};
$res->{success} = 1;
$req->fake_module('Catalyst::Request');
$req->mock( params => sub {$params} );
$c->mock( req                => sub {$req} );
$c->mock( default_auth_store => sub { } );
$c->mock( set_authenticated  => sub { } );
$c->mock( debug => sub { 0 } );

my $method;
$flickr->mock( execute_method => sub { $method = $_[1]; $res } );

ok( !$c->authenticate_flickr, 'auth failes without frob parameter' );

$params->{frob} = 'my_frob';

ok( $c->authenticate_flickr, 'auth successful with frob' );
is( $method, 'flickr.auth.getToken', 'call flickr.auth.getToken');