The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::RequiresInternet 'en.wikipedia.org' => 80;
use Test::More 0.96 tests => 2;

use MediaWiki::Bot;
my $t = __FILE__;

my $bot = MediaWiki::Bot->new({
    agent   => "MediaWiki::Bot tests (https://metacpan.org/MediaWiki::Bot; $t)",
    host    => 'en.wikipedia.org',
});

subtest 'basic' => sub {
    my $tests_run = 0;

    {   # General structure
        my @rc = $bot->recentchanges();
        my @keys = qw(comment ns old_revid pageid rcid revid timestamp title type user);
        ok exists $rc[0]->{$_}, "$_ present in hashref" for @keys;
        $tests_run += @keys;

        foreach (@rc) {
            is( $_->{ns}, 0, 'ns 0 used by default');
            $tests_run++;
        }
    }

    {   # Test some constraints
        my $rows = 10;
        my $ns   = [0, 1, 4];

        my @rc = $bot->recentchanges($ns, $rows);
        is( scalar @rc, $rows,                                                      'Returned the right number of rows');
        $tests_run++;
        for my $i (0..$rows-1) {
            ok(grep($rc[$i]->{ns} == $_, @$ns),                                     'Right namespaces');
            $tests_run++;
            like($rc[$i]->{timestamp},  qr/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\dZ$/,      'Timestamp validates');
            $tests_run++;
            like($rc[$i]->{type},       qr/^\w+$/,                                  'Type looks vaguely OK');
            $tests_run++;
            cmp_ok(length $rc[$i]->{title}, '>', 0,                                 'Title looks vaguely OK');
            $tests_run++;
        }
    }

    {   # Test using an arrayref of namespace numbers, and the $options_hashref
        my $rows = 10;
        my $ns   = 4;

        my @rc = $bot->recentchanges($ns, $rows, { hook => sub {
            my ($res) = @_;
                foreach my $hashref (@$res) {
                    is($hashref->{ns}, $ns, 'Right namespace returned');
                    $tests_run++;
                }
            }
        });
    }

    done_testing($tests_run);
};

subtest 'new method signature' => sub {
    my @rc = $bot->recentchanges({ ns => 4, limit => 100 });
    foreach my $hashref (@rc) {
        ok exists $hashref->{title} && length $hashref->{title};
    }

    # Or, use a callback for incremental processing:
    $bot->recentchanges( { ns => [0,1], limit => 200 }, { hook => sub {
        my ($res) = @_;
        foreach my $hashref (@$res) {
            ok exists $hashref->{title} && length $hashref->{title}, 'title is there';
            ok exists $hashref->{ns} && ($hashref->{ns} == 0 || $hashref->{ns} == 1), 'ns 1/2';
        }
    }});
};