The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 53;

use URI::Escape;
use OAuth::Lite::Consumer;
use OAuth::Lite::Token;
use OAuth::Lite::Util;
use OAuth::Lite::AuthMethod qw(:all);

my $consumer_key    = "key";
my $consumer_secret = "secret";

my $c1 = OAuth::Lite::Consumer->new(
	consumer_key    => $consumer_key,
	consumer_secret => $consumer_secret,
);


is($c1->consumer_key, $consumer_key, "consumer_key passed collectly");
is($c1->consumer_secret, $consumer_secret, "consumer_secret passed collectly");
is($c1->{auth_method}, AUTH_HEADER, "default auth_method is set collectly.");
is($c1->{http_method}, 'POST', "default http_method is set collectly.");

my $c2 = OAuth::Lite::Consumer->new(
	consumer_key    => $consumer_key,
	consumer_secret => $consumer_secret,
	auth_method     => POST_BODY,
	http_method     => 'GET',
);

is($c2->{auth_method}, POST_BODY, "customized auth_method is set collectly.");
is($c2->{http_method}, 'GET', "customized http_method is set collectly.");


my $c3 = OAuth::Lite::Consumer->new(
	consumer_key       => $consumer_key,
	consumer_secret    => $consumer_secret,
	request_token_path => 'http://example.org/path/to/requesttoken',
	access_token_path  => 'http://example.org/path/to/accesstoken',
	authorize_path     => 'http://example.org/path/to/authorize',
);

is($c3->request_token_url, q{http://example.org/path/to/requesttoken}, qq/request_token_url is called collectly/);
is($c3->access_token_url, q{http://example.org/path/to/accesstoken}, qq/access_token_url is called collectly/);
is($c3->authorization_url, q{http://example.org/path/to/authorize}, qq/authorization_url is called collectly/);

my $c4 = OAuth::Lite::Consumer->new(
	consumer_key       => $consumer_key,
	consumer_secret    => $consumer_secret,
	site               => 'http://example.org',
	request_token_path => '/path/to/requesttoken',
	access_token_path  => '/path/to/accesstoken',
	authorize_path     => '/path/to/authorize',
);

is($c4->request_token_url, q{http://example.org/path/to/requesttoken}, qq/request_token_url is called collectly/);
is($c4->access_token_url, q{http://example.org/path/to/accesstoken}, qq/access_token_url is called collectly/);
is($c4->authorization_url, q{http://example.org/path/to/authorize}, qq/authorization_url is called collectly/);

my $c5 = OAuth::Lite::Consumer->new(
	consumer_key       => $consumer_key,
	consumer_secret    => $consumer_secret,
	site               => 'http://example.org',
	request_token_path => '/path/to/requesttoken',
	access_token_path  => '/path/to/accesstoken',
	authorize_path     => 'http://example2.org/path/to/authorize',
);

is($c5->request_token_url, q{http://example.org/path/to/requesttoken}, qq/request_token_url is called collectly/);
is($c5->access_token_url, q{http://example.org/path/to/accesstoken}, qq/access_token_url is called collectly/);
is($c5->authorization_url, q{http://example2.org/path/to/authorize}, qq/authorization_url is called collectly/);

my $atoken1 = OAuth::Lite::Token->new;
$atoken1->token('foo');

my $auth_url1 = $c5->url_to_authorize;
is ($auth_url1, q{http://example2.org/path/to/authorize}, 'url_to_authorize works as expected.');

my $auth_url2 = $c5->url_to_authorize( token => $atoken1 );
is ($auth_url2, q{http://example2.org/path/to/authorize?oauth_token=foo}, 'url_to_authorize works as expected.');

my $callback_url = q{http://myservice/callback};
my $enc_callback_url = URI::Escape::uri_escape($callback_url);
my $auth_url3 = $c5->url_to_authorize( callback_url => $callback_url );
#is( $auth_url3, qq{http://example2.org/path/to/authorize?oauth_callback=$enc_callback_url} );

my $auth_url4 = $c5->url_to_authorize( token => '' );
is ($auth_url4, q{http://example2.org/path/to/authorize?oauth_token=}, 'url_to_authorize works as expected.');

my $c6 = OAuth::Lite::Consumer->new(
	consumer_key       => $consumer_key,
	consumer_secret    => $consumer_secret,
	site               => 'http://example.org',
	request_token_path => '/path/to/requesttoken',
	access_token_path  => '/path/to/accesstoken',
	authorize_path     => 'http://example2.org/path/to/authorize',
	callback_url       => $callback_url,
);

my $auth_url5 = $c6->url_to_authorize( token => $atoken1 );
is( $auth_url5, qq{http://example2.org/path/to/authorize?oauth_token=foo} );

my $oauth_params1 = $c6->gen_auth_params('GET', 'http://example.org/');
ok(!exists $oauth_params1->{oauth_token}, "oauth_token shouldn't be included");
ok(exists $oauth_params1->{oauth_signature}, 'signature is set');
is($oauth_params1->{oauth_consumer_key}, $consumer_key, 'collect consumer_key');
is($oauth_params1->{oauth_signature_method}, 'HMAC-SHA1', 'collect signature method');
#is($oauth_params1->{oauth_signature}, '8vqsDTcMwKNGblxtgmRVrHtn29I=', 'collect signature');
is($oauth_params1->{oauth_version}, '1.0', 'collect version');
like($oauth_params1->{oauth_timestamp}, qr/^\d+$/, 'collect timestamp');
like($oauth_params1->{oauth_nonce}, qr/^[a-fA-F0-9]+$/, 'collect timestamp');
my $oauth_params2 = $c6->gen_auth_params('POST', 'http://example.org/', $atoken1);
ok(exists $oauth_params2->{oauth_token}, "oauth_token should be included");
ok(exists $oauth_params2->{oauth_signature}, 'signature is set');
is($oauth_params2->{oauth_consumer_key}, $consumer_key, 'collect consumer_key');
is($oauth_params2->{oauth_signature_method}, 'HMAC-SHA1', 'collect signature method');
#is($oauth_params2->{oauth_signature}, 'HMAC-SHA1', 'collect signature');
is($oauth_params2->{oauth_token}, 'foo', 'collect token');
is($oauth_params2->{oauth_version}, '1.0', 'collect version');
like($oauth_params2->{oauth_timestamp}, qr/^\d+$/, 'collect timestamp');
like($oauth_params2->{oauth_nonce}, qr/^[a-fA-F0-9]+$/, 'collect timestamp');

my $oauth_params3 = $c6->gen_auth_params('POST', 'http://example.org/', '');
ok(exists $oauth_params3->{oauth_token}, "oauth_token should be included");
ok(exists $oauth_params3->{oauth_signature}, 'signature is set');
is($oauth_params3->{oauth_consumer_key}, $consumer_key, 'collect consumer_key');
is($oauth_params3->{oauth_signature_method}, 'HMAC-SHA1', 'collect signature method');
#is($oauth_params2->{oauth_signature}, 'HMAC-SHA1', 'collect signature');
is($oauth_params3->{oauth_token}, '', 'collect token');
is($oauth_params3->{oauth_version}, '1.0', 'collect version');
like($oauth_params3->{oauth_timestamp}, qr/^\d+$/, 'collect timestamp');
like($oauth_params3->{oauth_nonce}, qr/^[a-fA-F0-9]+$/, 'collect timestamp');

my $oauth_params4 = $c6->gen_auth_params('POST', 'http://example.org/');
ok(!exists $oauth_params4->{oauth_token}, "oauth_token shouldn't be included");
ok(exists $oauth_params4->{oauth_signature}, 'signature is set');
is($oauth_params4->{oauth_consumer_key}, $consumer_key, 'collect consumer_key');
is($oauth_params4->{oauth_signature_method}, 'HMAC-SHA1', 'collect signature method');
#is($oauth_params2->{oauth_signature}, 'HMAC-SHA1', 'collect signature');
is($oauth_params4->{oauth_version}, '1.0', 'collect version');
like($oauth_params4->{oauth_timestamp}, qr/^\d+$/, 'collect timestamp');
like($oauth_params4->{oauth_nonce}, qr/^[a-fA-F0-9]+$/, 'collect timestamp');

my $token2 = OAuth::Lite::Token->new;
$token2->token('foo');
my $auth_query1 = $c6->gen_auth_query('GET', q{http://example.org/});
like($auth_query1, qr{oauth_consumer_key=key&oauth_nonce=[a-fA-F0-9]+&oauth_signature=[^\&]+&oauth_signature_method=HMAC-SHA1&oauth_timestamp=\d+&oauth_version=1.0}, 'gen_auth_query works as expected');
my $auth_query2 = $c6->gen_auth_query('GET', q{http://example.org/}, $token2);
like($auth_query2, qr{oauth_consumer_key=key&oauth_nonce=[a-fA-F0-9]+&oauth_signature=[^\&]+&oauth_signature_method=HMAC-SHA1&oauth_timestamp=\d+&oauth_token=foo&oauth_version=1.0}, 'gen_auth_query works as expected');
my $auth_query3 = $c6->gen_auth_query('GET', q{http://example.org/}, undef, { extra => 'foo' });
like($auth_query3, qr{extra=foo&oauth_consumer_key=key&oauth_nonce=[a-fA-F0-9]+&oauth_signature=[^\&]+&oauth_signature_method=HMAC-SHA1&oauth_timestamp=\d+&oauth_version=1.0}, 'gen_auth_query works as expected');
my $auth_query4 = $c6->gen_auth_query('GET', q{http://example.org/}, $token2, { extra => 'foo' });
like($auth_query4, qr{extra=foo&oauth_consumer_key=key&oauth_nonce=[a-fA-F0-9]+&oauth_signature=[^\&]+&oauth_signature_method=HMAC-SHA1&oauth_timestamp=\d+&oauth_token=foo&oauth_version=1.0}, 'gen_auth_query works as expected');

=pod

my $c7 = OAuth::Lite::Consumer->new(
    consumer_key    => q{consumer},
    consumer_secret => q{dummy},
    _nonce          => q{10369470270925},
    _timestamp      => q{1236874236},
);
my $req7 = $c7->gen_oauth_request(
method  => 'PUT',
url     => q{http://www.example.com},
content => q{Hello World!},
headers => [ 'Content-Type' => q{text/plain} ],
);

=cut