The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use FindBin;
use lib "$FindBin::Bin/../lib";
use Pithub::Test::Factory;
use Test::Most;

BEGIN {
    use_ok('Pithub');
}

# These tests may break very easily because data on Github can and will change, of course.
# And they also might fail once the ratelimit has been reached.
SKIP: {
    skip 'Set PITHUB_TEST_LIVE_DATA to true to run these tests', 1 unless $ENV{PITHUB_TEST_LIVE_DATA};

    my $p = Pithub->new;

    # Pithub::Orgs->get
    {
        my $result = $p->orgs->get( org => 'CPAN-API' );
        is $result->success, 1, 'Pithub::Orgs->get successful';
        is $result->content->{type},  'Organization', 'Pithub::Orgs->get: Attribute type';
        is $result->content->{login}, 'CPAN-API',     'Pithub::Orgs->get: Attribute login';
        is $result->content->{name},  'MetaCPAN',     'Pithub::Orgs->get: Attribute name';
        is $result->content->{id},    460239,         'Pithub::Orgs->get: Attribute id';
    }

    # Pithub::Orgs->list
    {
        my $result = $p->orgs->list( user => 'plu' );
        is $result->success, 1, 'Pithub::Orgs->list successful';
        is $result->content->[1]{login}, 'CPAN-API', 'Pithub::Orgs->get: Attribute login';
        is $result->content->[1]{id},    460239,     'Pithub::Orgs->get: Attribute id';
    }

    # Pithub::Orgs::Members->list_public
    {
        my $result = $p->orgs->members->list_public( org => 'CPAN-API' );
        is $result->success, 1, 'Pithub::Orgs::Members->list_public successful';
        ok $result->count > 0, 'Pithub::Orgs::Members->list_public has some rows';
        while ( my $row = $result->next ) {
            ok $row->{id},    "Pithub::Orgs::Members->list_public: Attribute id ($row->{id})";
            ok $row->{login}, "Pithub::Orgs::Members->list_public: Attribute login ($row->{login})";
        }
    }
}

# Following tests require a token and should only be run on a test
# account since they will create a lot of activity in that account.
SKIP: {
    skip 'PITHUB_TEST_TOKEN required to run this test - DO NOT DO THIS UNLESS YOU KNOW WHAT YOU ARE DOING', 1 unless $ENV{PITHUB_TEST_TOKEN};

    my $org      = Pithub::Test::Factory->test_account->{org};
    my $org_repo = Pithub::Test::Factory->test_account->{org_repo};
    my $repo     = Pithub::Test::Factory->test_account->{repo};
    my $user     = Pithub::Test::Factory->test_account->{user};
    my $p        = Pithub->new(
        user  => $user,
        repo  => $repo,
        token => $ENV{PITHUB_TEST_TOKEN}
    );

    {

        # Pithub::Orgs->update
        ok $p->orgs->update(
            org  => $org,
            data => { location => "somewhere $$" }
          )->success,
          'Pithub::Orgs->update successful';

        # Pithub::Orgs->get
        is $p->orgs->get( org => $org )->content->{location}, "somewhere $$", 'Pithub::Orgs->get location after update';

        # Pithub::Orgs::Members->is_member
        ok $p->orgs->members->is_member(
            org  => $org,
            user => $user,
        )->success, 'Pithub::Orgs::Members->is_member successful';

        # Pithub::Orgs::Members->conceal
        ok $p->orgs->members->conceal(
            org  => $org,
            user => $user,
        )->success, 'Pithub::Orgs::Members->conceal successful';

        # Pithub::Orgs::Members->is_public
        ok !$p->orgs->members->is_public(
            org  => $org,
            user => $user,
        )->success, 'Pithub::Orgs::Members->is_public not successful after conceal';

        # Pithub::Orgs::Members->list_public
        is $p->orgs->members->list_public(
            org  => $org,
            user => $user,
        )->count, 0, 'Pithub::Orgs::Members->list_public no public members';

        # Pithub::Orgs::Members->publicize
        ok $p->orgs->members->publicize(
            org  => $org,
            user => $user,
        )->success, 'Pithub::Orgs::Members->publicize successful';

        # Pithub::Orgs::Members->list_public
        is $p->orgs->members->list_public(
            org  => $org,
            user => $user,
        )->count, 1, 'Pithub::Orgs::Members->list_public one public member after publicize';

        # Pithub::Orgs::Members->is_public
        ok $p->orgs->members->is_public(
            org  => $org,
            user => $user,
        )->success, 'Pithub::Orgs::Members->is_public successful after publicize';

        # Pithub::Orgs::Members->list
        is $p->orgs->members->list(
            org  => $org,
            user => $user,
        )->count, 1, 'Pithub::Orgs::Members->list one member';

        foreach my $team (@{ $p->orgs->teams->list( org => $org )->content }) {
            $p->orgs->teams->delete( team_id => $team->{id} );
        }

        # Pithub::Orgs::Teams->create
        my $team_id = $p->orgs->teams->create(
            org  => $org,
            data => { name => 'Core' }
        )->content->{id};
        like $team_id, qr{^\d+$}, 'Pithub::Orgs::Teams->create successful, returned team id';

        # Pithub::Orgs::Teams->list
        my @teams = splice @{ $p->orgs->teams->list( org => $org )->content }, 0, 2;
        eq_or_diff [ sort map { $_->{name} } @teams ], [sort qw(Core Owners)], 'Pithub::Orgs::Teams->list after create';

        # Pithub::Orgs::Teams->update
        ok $p->orgs->teams->update(
            team_id => $team_id,
            data    => { name => 'CoreTeam' },
        )->success, 'Pithub::Orgs::Teams->update successful';

        # Pithub::Orgs::Teams->get
        is $p->orgs->teams->get( team_id => $team_id )->content->{name}, 'CoreTeam', 'Pithub::Orgs::Teams->get after update';

        # Pithub::Orgs::Teams->is_member
        ok !$p->orgs->teams->is_member(
            team_id => $team_id,
            user    => $user,
        )->success, 'Pithub::Orgs::Teams->is_member not successful yet';

        # Pithub::Orgs::Teams->add_member
        ok $p->orgs->teams->add_member(
            team_id => $team_id,
            user    => $user,
        )->success, 'Pithub::Orgs::Teams->add_member successful';

        # Pithub::Orgs::Teams->is_member
        ok $p->orgs->teams->is_member(
            team_id => $team_id,
            user    => $user,
        )->success, 'Pithub::Orgs::Teams->is_member successful after add_member';

        # Pithub::Orgs::Teams->list_members
        is $p->orgs->teams->list_members( team_id => $team_id )->first->{login}, $user, 'Pithub::Orgs::Teams->list_members after add_member';

        # Pithub::Orgs::Teams->remove_member
        ok $p->orgs->teams->remove_member(
            team_id => $team_id,
            user    => $user,
        )->success, 'Pithub::Orgs::Teams->remove_member successful';

        # Pithub::Orgs::Teams->is_member
        ok !$p->orgs->teams->is_member(
            team_id => $team_id,
            user    => $user,
        )->success, 'Pithub::Orgs::Teams-is_member not successful after remove_member';

        # Pithub::Orgs::Teams->has_repo
        ok !$p->orgs->teams->has_repo(
            team_id => $team_id,
            repo    => "${org}/${org_repo}",
        )->success, 'Pithub::Orgs::Teams->has_repo not successful yet';

        # Pithub::Orgs::Teams->add_repo
        ok $p->orgs->teams->add_repo(
            team_id => $team_id,
            org     => $org,
            repo    => $org_repo,
        )->success, 'Pithub::Orgs::Teams->add_repo successful';

        # Pithub::Orgs::Teams->has_repo
        ok $p->orgs->teams->has_repo(
            team_id => $team_id,
            repo    => "${org}/${org_repo}",
        )->success, 'Pithub::Orgs::Teams->has_repo successful after add_repo';

        # Pithub::Orgs::Teams->list_repos
        is $p->orgs->teams->list_repos( team_id => $team_id )->count, 1, 'Pithub::Orgs::Teams->list_repos one repo';

        # Pithub::Orgs::Teams->remove_repo
        ok $p->orgs->teams->remove_repo(
            team_id => $team_id,
            repo    => "${org}/${org_repo}",
        )->success, 'Pithub::Orgs::Teams->remove_repo successful';

        # Pithub::Orgs::Teams->has_repo
        ok !$p->orgs->teams->has_repo(
            team_id => $team_id,
            repo    => "${org}/${org_repo}",
        )->success, 'Pithub::Orgs::Teams->has_repo not successful after remove_repo';

        # Pithub::Orgs::Teams->delete
        ok $p->orgs->teams->delete( team_id => $team_id )->success, 'Pithub::Orgs::Teams->delete successful';

        # Pithub::Orgs::Teams->get
        ok !$p->orgs->teams->get( team_id => $team_id )->success, 'Pithub::Orgs::Teams->get not successful after delete';
    }
}

done_testing;