The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package PubApiTest;

use cPanel::PublicAPI;

@PubApiTest::ISA = qw( cPanel::PublicAPI );

use strict;
use warnings;
use Test::More;

# This is used to specify what a specific call be using
our $test_config = {};

# Used to test the actual input to api_request
sub api_request {
    my ( $self, $service, $uri, $method, $formdata ) = @_;

    undef $self->{'error'};
    if ( defined $test_config->{'badcall'} ) {
        my $badcall_return;
        if ( $test_config->{'badcall'} eq 'whmapi' ) {
            $badcall_return = '{"error":"Unknown App Requested: asdf"}';
        }
        elsif ( $test_config->{'badcall'} eq 'cpanelapi2' ) {
            $badcall_return = '{"cpanelresult":{"apiversion":2,"error":"Could not find function \'test\' in module \'Test\'","func":"test","module":"Test"}}';
        }
        elsif ( $test_config->{'badcall'} eq 'cpanelapi1' ) {
            $badcall_return = '{"apiversion":"1","type":"event","module":"Test","func":"test","source":"module","data":{"result":""},"event":{"reason":"Test::test() failed: Undefined subroutine &Cpanel::Test::Test_test called at (eval 21) line 1.\n","result":0}}';
        }
        return 0, 'failed', \$badcall_return;
    }

    is( $service, $test_config->{'service'}, 'Service is correct for ' . $test_config->{'call'} );
    is( $uri,     $test_config->{'uri'},     'URI is correct for ' . $test_config->{'call'} );
    is( $method,  $test_config->{'method'},  'Method is correct for ' . $test_config->{'call'} );
    if ( exists $test_config->{'test_formdata'} && $test_config->{'test_formdata'} eq 'hash' ) {
        is_deeply( $formdata, $test_config->{'formdata'}, 'Formdata is correct for ' . $test_config->{'call'} );
    }
    elsif ( exists $test_config->{'test_formdata'} && $test_config->{'test_formdata'} eq 'string' ) {
        is( $formdata, $test_config->{'formdata'}, 'Fromdata is correct for ' . $test_config->{'call'} );
    }

    my $return_format = 'string';
    if ( $uri =~ /\/json-api\// ) {
        $return_format = 'json';
    }
    elsif ( $uri =~ /\/xml-api\// ) {
        $return_format = 'xml';
    }
    is( $return_format, $test_config->{'return_format'}, 'Serialization format correct for ' . $test_config->{'call'} );

    my $return;
    if ( $return_format eq 'json' ) {
        $return = '{"something":"somethinglese"}';
    }
    elsif ( $return_format eq 'xml' ) {
        $return = '<node><something>somethingelse</something></node>';
    }
    else {
        $return = 'some data goes here';
    }
    return '1', 'ok', \$return;
}

1;