The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -T
use strict;
use warnings;

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

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

can_ok( $m, 'authenticate_jugemkey_url' );
can_ok( $m, 'authenticate_jugemkey_get_token' );

my $jugemkey = Test::MockObject->new;
my $auth_url = 'http://jugemkey.jp/api/auth/';
$jugemkey->mock( uri_to_login => 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 { 1 });

my $config = {
    authentication => {
        jugemkey => {
            api_key         => 'dummy_key',
            secret          => 'dummy_secret',
            perms           => 'auth',
            jugemkey_object => $jugemkey,
            user_class      => 'Fake::User::Class',
        },
    },
};

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

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

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

$res->fake_module(
    'WebService::JugemKey::Auth::User',
    name  => sub {'miyashita'},
    token => sub {'dummy_token'}
);
$jugemkey->mock( get_token => sub { $res } );

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

ok( !$c->authenticate_jugemkey_get_token, 'auth failed without frob' );

$params->{frob} = 'dummy_frob';
ok( $c->authenticate_jugemkey_get_token, 'auth succeeded with frob' );