The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use strict;
use warnings;

use Test::More tests => 13;
use t::lib::Functions;

my $mcpan = mcpan();
isa_ok( $mcpan, 'MetaCPAN::API::Tiny' );

like(
    exception { $mcpan->post() },
    qr/^First argument of URL must be provided/,
    'Missing arguments',
);

like(
    exception { $mcpan->post( 'release' ) },
    qr/^Second argument of query hashref must be provided/,
    'Missing second argument',
);

like(
    exception { $mcpan->post( 'release', 'bad query' ) },
    qr/^Second argument of query hashref must be provided/,
    'Incorrect second argument',
);

my $url  = 'release/dist';
my $flag = 0;

mock 'HTTP::Tiny'
    => method 'request'
    => should {
        my $self = shift;
        my @args = @_;

        isa_ok( $self, 'HTTP::Tiny' );
        is( $args[0], 'POST', 'Correct request type' );
        is(
            $args[1],
            $mcpan->{base_url} . "/$url",
            'Correct URL',
        );

        if ( $flag++ == 0 ) {
            is_deeply(
                $args[2],
                {
                    headers => { 'Content-Type' => 'application/json' },
                    content => '{}',
                },
                'Correct request hash without content',
            );
        }

        if ( $flag++ == 2 ) {
            is_deeply(
                $args[2],
                {
                    headers => { 'Content-Type' => 'application/json' },
                    content => '{"useful":"query"}',
                },
                'Correct request hash with content',
            );
        }

        return { success => 1, content => '{}' };
    };

is(
    exception { $mcpan->post( $url, {} ) },
    undef,
    'Correct arguments are successful',
);

is(
    exception { $mcpan->post( $url, { useful => 'query' } ) },
    undef,
    'Correct and useful arguments are successful',
);