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

use strict;
use warnings;

use Test::More;    # last test to print

use lib 't/lib';

use PubApiTest ();

my $pubapi = PubApiTest->new(
    'ip'        => '127.0.0.1',
    'usessl'    => 1,
    'user'      => 'someuser',
    'pass'      => 'somepass',
    'error_log' => '/dev/null',
);

# test WHM
$PubApiTest::test_config = {
    'service'       => 'whostmgr',
    'uri'           => '/json-api/loadavg',
    'method'        => 'POST',
    'call'          => 'whm_api-noform',
    'return_format' => 'json',
};
my $res = $pubapi->whm_api('loadavg');
is( ref $res, 'HASH', 'Returned format ok for ' . $PubApiTest::test_config->{'call'} );

$PubApiTest::test_config->{'test_formdata'} = 'hash';
$PubApiTest::test_config->{'formdata'}      = { 'key' => 'value', 'api.version' => 1 };
$PubApiTest::test_config->{'call'}          = 'whm_api-refform';
$res = $pubapi->whm_api( 'loadavg', { 'key' => 'value' } );
is( ref $res, 'HASH', 'Returned format ok for ' . $PubApiTest::test_config->{'call'} );

$PubApiTest::test_config->{'test_formdata'} = 'hash';
$PubApiTest::test_config->{'formdata'}      = { 'key' => 'value', 'api.version' => 0 };
$PubApiTest::test_config->{'call'}          = 'whm_api-refapi0';
$res = $pubapi->whm_api( 'loadavg', $PubApiTest::test_config->{'formdata'} );
is( ref $res, 'HASH', 'Returned format ok for ' . $PubApiTest::test_config->{'call'} );

$PubApiTest::test_config->{'test_formdata'} = 'hash';
$PubApiTest::test_config->{'formdata'}      = { 'key' => 'value', 'api.version' => 1 };
$PubApiTest::test_config->{'call'}          = 'whm_api-refapi1';
$res = $pubapi->whm_api( 'loadavg', $PubApiTest::test_config->{'formdata'} );
is( ref $res, 'HASH', 'Returned format ok for ' . $PubApiTest::test_config->{'call'} );

$PubApiTest::test_config->{'test_formdata'} = 'string';
$PubApiTest::test_config->{'formdata'}      = 'api.version=1&one&two';
$PubApiTest::test_config->{'call'}          = 'whm_api-stringform';
$res = $pubapi->whm_api( 'loadavg', 'one&two' );
is( ref $res, 'HASH', 'Returned format ok for ' . $PubApiTest::test_config->{'call'} );

$PubApiTest::test_config->{'test_formdata'} = 'string';
$PubApiTest::test_config->{'formdata'}      = 'api.version=0&one&two';
$PubApiTest::test_config->{'call'}          = 'whm_api-stringapi0';
$res = $pubapi->whm_api( 'loadavg', 'api.version=0&one&two' );
is( ref $res, 'HASH', 'Returned format ok for ' . $PubApiTest::test_config->{'call'} );

delete $PubApiTest::test_config->{'formdata'};
delete $PubApiTest::test_config->{'test_formdata'};
$PubApiTest::test_config->{'return_format'} = 'json';
$res = $pubapi->whm_api( 'loadavg', undef, 'json' );
is( $res, '{"something":"somethinglese"}', 'raw JSON data returned raw correctly from whm_api' );

$PubApiTest::test_config->{'test_format'}   = 'xml';
$PubApiTest::test_config->{'return_format'} = 'xml';
$PubApiTest::test_config->{'uri'}           = '/xml-api/loadavg';
$res = $pubapi->whm_api( 'loadavg', undef, 'xml' );
is( $res, '<node><something>somethingelse</something></node>', 'raw XML data returned raw correctly from whm_api' );

# test API1
$PubApiTest::test_config = {
    'service'       => 'cpanel',
    'uri'           => '/json-api/cpanel',
    'method'        => 'GET',
    'call'          => 'api1-noargs',
    'return_format' => 'json',
    'test_formdata' => 'hash',

};

# Without arguments
$PubApiTest::test_config->{'formdata'} = {
    'cpanel_jsonapi_module'     => 'Test',
    'cpanel_jsonapi_func'       => 'test',
    'cpanel_jsonapi_apiversion' => 1,
};

my $call_config = {
    'module' => 'Test',
    'func'   => 'test',
};

$res = $pubapi->cpanel_api1_request( 'cpanel', $call_config );
is( ref $res, 'HASH', 'Returned format ok for ' . $PubApiTest::test_config->{'call'} );

# with arguments
$PubApiTest::test_config->{'call'}                = 'api1-args';
$PubApiTest::test_config->{'formdata'}->{'arg-0'} = 'one';
$PubApiTest::test_config->{'formdata'}->{'arg-1'} = 'two';
$res = $pubapi->cpanel_api1_request( 'cpanel', $call_config, [ 'one', 'two' ] );
is( ref $res, 'HASH', 'Returned format ok for ' . $PubApiTest::test_config->{'call'} );

# WHM

# with arguments
$PubApiTest::test_config->{'call'}                              = 'whm-api1-args';
$PubApiTest::test_config->{'formdata'}->{'cpanel_jsonapi_user'} = 'someuser';
$PubApiTest::test_config->{'service'}                           = 'whostmgr';
$call_config->{'user'}                                          = 'someuser';
$res = $pubapi->cpanel_api1_request( 'whostmgr', $call_config, [ 'one', 'two' ] );
is( ref $res, 'HASH', 'Returned format ok for ' . $PubApiTest::test_config->{'call'} );

# without arguments
$PubApiTest::test_config->{'call'} = 'whm-api1-noargs';
delete $PubApiTest::test_config->{'formdata'}->{'arg-1'};
delete $PubApiTest::test_config->{'formdata'}->{'arg-0'};
$res = $pubapi->cpanel_api1_request( 'whostmgr', $call_config );
is( ref $res, 'HASH', 'Returned format ok for ' . $PubApiTest::test_config->{'call'} );

# Test JSON
$PubApiTest::test_config->{'call'}          = 'whm-api1-rawjson';
$PubApiTest::test_config->{'return_format'} = 'json';
$res = $pubapi->cpanel_api1_request( 'whostmgr', $call_config, undef, 'json' );
is( $res, '{"something":"somethinglese"}', 'raw JSON data returned raw correctly from cpanel_api1_request' );

# Test XML
$PubApiTest::test_config->{'call'}          = 'whm-api1-rawxml';
$PubApiTest::test_config->{'test_format'}   = 'xml';
$PubApiTest::test_config->{'return_format'} = 'xml';
$PubApiTest::test_config->{'uri'}           = '/xml-api/cpanel';

$PubApiTest::test_config->{'formdata'} = {
    'cpanel_xmlapi_user'       => 'someuser',
    'cpanel_xmlapi_module'     => 'Test',
    'cpanel_xmlapi_func'       => 'test',
    'cpanel_xmlapi_apiversion' => '1',
};

$res = $pubapi->cpanel_api1_request( 'whostmgr', $call_config, [], 'xml' );
is( $res, '<node><something>somethingelse</something></node>', 'raw XML data returned raw correctly from cpanel_api1_request' );

# API2
$PubApiTest::test_config = {
    'service'       => 'cpanel',
    'uri'           => '/json-api/cpanel',
    'method'        => 'GET',
    'call'          => 'api2-noargs',
    'return_format' => 'json',
    'test_formdata' => 'hash',
};

$PubApiTest::test_config->{'formdata'} = {
    'cpanel_jsonapi_func'       => 'test',
    'cpanel_jsonapi_module'     => 'Api2Test',
    'cpanel_jsonapi_apiversion' => '2',
};

$call_config = {
    'module' => 'Api2Test',
    'func'   => 'test',
};

# without args
$res = $pubapi->cpanel_api2_request( 'cpanel', $call_config );
is( ref $res, 'HASH', 'Returned format ok for ' . $PubApiTest::test_config->{'call'} );

# with args
$PubApiTest::test_config->{'call'} = 'whm-api2-args';
my $args = {
    'testing'     => 'one two three',
    'earth below' => 'us',
};

foreach my $key ( keys %{$args} ) {
    $PubApiTest::test_config->{'formdata'}->{$key} = $args->{$key};
}

$res = $pubapi->cpanel_api2_request( 'cpanel', $call_config, $args );
is( ref $res, 'HASH', 'Returned format ok for ' . $PubApiTest::test_config->{'call'} );

# XML/JSON response tests
delete $PubApiTest::test_config->{'formdata'}->{'testing'};
delete $PubApiTest::test_config->{'formdata'}->{'earth below'};

$PubApiTest::test_config->{'call'} = 'api2-rawjson';
$res = $pubapi->cpanel_api2_request( 'cpanel', $call_config, undef, 'json' );
is( $res, '{"something":"somethinglese"}', 'raw JSON data returned raw correctly from cpanel_api2_request' );

#xml

$PubApiTest::test_config->{'call'}     = 'api2-rawxml';
$PubApiTest::test_config->{'formdata'} = {
    'cpanel_xmlapi_module'     => 'Api2Test',
    'cpanel_xmlapi_func'       => 'test',
    'cpanel_xmlapi_apiversion' => '2'
};
$PubApiTest::test_config->{'format'}        = 'xml';
$PubApiTest::test_config->{'return_format'} = 'xml';
$PubApiTest::test_config->{'uri'}           = '/xml-api/cpanel';

$res = $pubapi->cpanel_api2_request( 'cpanel', $call_config, undef, 'xml' );
is( $res, '<node><something>somethingelse</something></node>', 'raw XML data returned raw correctly from cpanel_api2_request' );

# test call failure situations
$PubApiTest::test_config->{'badcall'} = 'whmapi';
$pubapi->whm_api('version');
like( $pubapi->{'error'}, qr/cPanel::PublicAPI::whm_api was called with the invalid API call of/, 'whm_api invalid call checking works' );

$PubApiTest::test_config->{'badcall'} = 'cpanelapi1';
$pubapi->cpanel_api1_request( 'cpanel', { 'module' => 'test', 'func' => 'test' } );
like( $pubapi->{'error'}, qr/cPanel::PublicAPI::cpanel_api1_request was called with the invalid API1 call of:/, 'cpanel_api1_request invalid call checking works' );

$PubApiTest::test_config->{'badcall'} = 'cpanelapi2';
$pubapi->cpanel_api2_request( 'cpanel', { 'module' => 'test', 'func' => 'test' } );
like( $pubapi->{'error'}, qr/cPanel::PublicAPI::cpanel_api2_request was called with the invalid API2 call of:/, 'cpanel_api1_request invalid call checking works' );

done_testing();