Dave Cross: Still Munging Data With Perl: Online event - Mar 27 Learn more

#! perl -I. -w
BEGIN { $ENV{DANCER_APPDIR} = 't' }
use JSON;
route_exists([POST => '/jsonrpc/api'], "/api exists");
route_exists([POST => '/jsonrpc/admin'], "/jsonrpc/admin exists");
route_doesnt_exist([GET => '/'], "no GET /");
{
my $old_log = read_logs(); # clean up for this test
my $response = dancer_response(
POST => '/jsonrpc/api',
{
headers => [
'Content-Type' => 'application/json',
],
body => encode_json(
{
jsonrpc => '2.0',
method => 'api.uppercase',
id => 42,
params => {argument => 'Alles grote letters'}
}
),
}
);
is_deeply(
from_json($response->{content})->{result},
{uppercase => 'ALLES GROTE LETTERS'},
"system.version"
) or diag(explain($response));
my @expected_logs = (
{
level => 'debug',
message => qr{^\Q[handle_jsonrpc_request] Processing:}
},
{
level => 'debug',
message => qr{^\Q[handle_jsonrpc_call(api.uppercase)]}
},
{
level => 'debug',
message => qr{^\Q[uppercase] {'argument' => 'Alles grote letters'}}
},
{
level => 'debug',
message => qr{^\Q[handled_jsonrpc_request(api.uppercase)]}
},
{
level => 'info',
message => qr{^\Q[RPC::JSONRPC]\E request for api.uppercase took 0\.\d+s},
},
{
level => 'debug',
message => qr{^\Q[jsonrpc_response] }
},
);
my $read_logs = read_logs();
for my $line (@$read_logs) {
my $test = shift @expected_logs;
is($line->{level}, $test->{level}, " Level ");
like($line->{message}, $test->{message}, " Message ") or diag($line->{message});
}
}
{
my $response = dancer_response(
POST => '/jsonrpc/api',
{
headers => [
'Content-Type' => 'application/json',
],
body => encode_json(
{argument => 'uppercase'}
),
}
);
is($response->{status}, 404, "Not found (not jsonrpc-body)")
or diag(explain($response));
}
{
my $response = dancer_response(
POST => '/jsonrpc/api',
{
headers => [
'Content-Type' => 'application/xmlrpc',
],
body => encode_json(
{
jsonrpc => '2.0',
method => 'api.uppercase',
id => 42,
params => {argument => 'uppercase'}
}
),
}
);
is($response->{status}, 404, "Not found (not jsonrpc-content-type)")
or diag(explain($response));
}
{
my $response = dancer_response(
POST => '/jsonrpc/api',
{
headers => [
'Content-Type' => 'application/json',
],
body => encode_json(
{
jsonrpc => '2.0',
method => 'api.lowercase',
id => 42,
params => {argument => 'uppercase'}
}
),
}
);
is($response->{status}, 200, "Transport OK");
is_deeply(
from_json($response->{content})->{error},
{code => -32601, message => "Method 'api.lowercase' not found"},
"Unknown jsonrpc-method"
) or diag(explain($response));
}
abeltje_done_testing();