The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More;
use Net::Twitter;
use URI;

sub test_uris {
    my ( $nt, $urls ) = @_;

    for my $attr ( keys %$urls ) {
        my $uri = $nt->$attr;
        ok $uri->isa('URI'), "$attr isa URI";
        is "$uri", $urls->{$attr}, "$attr is expected url";
    }
};

subtest 'default URL attributes' => sub {

    my %urls = (
        authentication_url => 'https://api.twitter.com/oauth/authenticate',
        authorization_url  => 'https://api.twitter.com/oauth/authorize',
        request_token_url  => 'https://api.twitter.com/oauth/request_token',
        access_token_url   => 'https://api.twitter.com/oauth/access_token',
        xauth_url          => 'https://api.twitter.com/oauth/access_token',
    );

    my $nt = Net::Twitter->new(
        traits          => [ qw/API::RESTv1_1 OAuth/ ],
        consumer_key    => 'key',
        consumer_secret => 'secret',
    );

    test_uris($nt, \%urls);
};

subtest 'explicit URL attributes' => sub {

    my %urls = (
        authentication_url => 'https://example.com/authenticate',
        authorization_url  => 'https://example.com/authorize',
        request_token_url  => 'https://example.com/request',
        access_token_url   => 'https://example.com/access',
        xauth_url          => 'https://example.com/xauth',
    );

    my $nt = Net::Twitter->new(
        traits          => [ qw/API::RESTv1_1 OAuth/ ],
        consumer_key    => 'key',
        consumer_secret => 'secret',
        %urls,
    );

    test_uris($nt, \%urls);
};

subtest 'with URIs' => sub {

    my %urls = (
        authentication_url => URI->new('https://example.com/authenticate'),
        authorization_url  => URI->new('https://example.com/authorize'),
        request_token_url  => URI->new('https://example.com/request'),
        access_token_url   => URI->new('https://example.com/access'),
        xauth_url          => URI->new('https://example.com/xauth'),
    );

    my $nt = Net::Twitter->new(
        traits          => [ qw/API::RESTv1_1 OAuth/ ],
        consumer_key    => 'key',
        consumer_secret => 'secret',
        %urls,
    );

    test_uris($nt, \%urls);
};

subtest 'oauth_urls pseudo attribute' => sub {

    my %urls = (
        authentication_url => 'https://example.com/authenticate',
        authorization_url  => 'https://example.com/authorize',
        request_token_url  => 'https://example.com/request',
        access_token_url   => 'https://example.com/access',
        xauth_url          => 'https://example.com/xauth',
    );

    my $nt = Net::Twitter->new(
        traits => [ qw/API::RESTv1_1 OAuth/ ],
        consumer_key    => 'key',
        consumer_secret => 'secret',
        oauth_urls      => \%urls,
    );

    test_uris($nt, \%urls);
};

subtest 'AppAuth URLs' => sub {

    my %urls = (
        request_token_url    => "https://api.twitter.com/oauth2/token",
        invalidate_token_url => "https://api.twitter.com/oauth2/invalidate_token",
    );

    my $nt = Net::Twitter->new(
        traits => [ qw/API::RESTv1_1 AppAuth/ ],
        consumer_key    => 'key',
        consumer_secret => 'secret',
    );

    test_uris($nt, \%urls);
};

done_testing;