The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
use strict;
use warnings;
use Test::More 0.88;
use File::Spec;

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

my $username = $ENV{'PWPUsername'};
my $password = $ENV{'PWPPassword'};
plan $username && $password
    ? (tests => 2)
    : (skip_all => 'upload test requires login with upload permission');

my $bot = MediaWiki::Bot->new({
    agent   => "MediaWiki::Bot tests ($t)",
    host    => 'test.wikipedia.org',
    login_data => { username => $username, password => $password },
});
if(defined($ENV{'PWPMakeTestSetWikiHost'})) {
    $bot->set_wiki($ENV{'PWPMakeTestSetWikiHost'}, $ENV{'PWPMakeTestSetWikiDir'});
}

my $tiny_png_filename = File::Spec->catfile(qw/t tiny.png/);
END { unlink $tiny_png_filename if $tiny_png_filename && -e $tiny_png_filename }

subtest 'file upload' => sub {
    plan skip_all => q{Data::Random and GD needed for generating images}
        unless (eval q{use Data::Random qw(rand_image); use GD; 1 });

    open my $png_out, '>:raw', $tiny_png_filename or die "Couldn't open $tiny_png_filename for writing: $!";
    print $png_out rand_image();
    close $png_out or die "Couldn't close $tiny_png_filename: $!";


    {
        my $status = $bot->upload({
            data => do { local $/; open my $in, '<:raw', $tiny_png_filename or die $!; <$in> },
        });
        is $status, undef or diag explain $status;
        is_deeply $bot->{error}, { code => 6, details => q{You must specify a title to upload to.} } or diag explain $bot;
    }
    {
        my $status = $bot->upload({
            title => rand()
        });
        is $status, undef or diag explain $status;
        is_deeply $bot->{error}, { code => 6, details => q{You must provide either file contents or a filename.} } or diag explain $bot;
    }
    {
        my $filename = rand() . '.png';
        my $status = $bot->upload({
            title => $filename,
            file => $tiny_png_filename,
        });
        ok $status and diag "Uploaded to $filename";
        like $status->{upload}->{result}, qr/Success|Warning/, 'Success or Warning' or diag explain $status;
        is $status->{upload}->{filename}, $filename or diag explain $status if $status->{upload}->{result} eq 'Success';
    }
    {
        my $filename = rand() . '.png';
        my $status = $bot->upload({
            title => $filename,
            data => rand_image(),
        });
        ok $status and diag "Uploaded to $filename";
        like $status->{upload}->{result}, qr/Success|Warning/ or diag explain $status;
        is $status->{upload}->{filename}, $filename or diag explain $status if $status->{upload}->{result} eq 'Success';
    }
};

subtest 'url' => sub {
    plan skip_all => 'Unsupported by testwiki';
    diag explain $bot->upload_from_url({
        url => 'http://farm9.staticflickr.com/8282/7874109806_756828bf0e_b_d.jpg',
        title => rand() . '.png',
        summary => "Testing $t",
        text => "testing $t",
    });
    diag explain $bot->{error};
};