JMAP-Tester
view release on metacpan or search on metacpan
t/lib/JMAP/Tester/MockServer.pm view on Meta::CPAN
},
"urn:ietf:params:jmap:vacationresponse" => {}
},
isPersonal => \1,
isReadOnly => \0,
name => 'tester@example.com',
},
},
capabilities => {
"urn:ietf:params:jmap:calendars" => {},
"urn:ietf:params:jmap:contacts" => {},
"urn:ietf:params:jmap:core" => {
collationAlgorithms => [ "i;ascii-numeric", "i;ascii-casemap", "i;octet" ],
maxCallsInRequest => 50,
maxConcurrentRequests => 10,
maxConcurrentUpload => 10,
maxObjectsInGet => 4096,
maxObjectsInSet => 4096,
maxSizeRequest => 10000000,
maxSizeUpload => 250000000
},
"urn:ietf:params:jmap:mail" => {},
"urn:ietf:params:jmap:submission" => {},
"urn:ietf:params:jmap:vacationresponse" => {}
},
primaryAccounts => {
"urn:ietf:params:jmap:calendars" => "ac1234",
"urn:ietf:params:jmap:contacts" => "ac1234",
"urn:ietf:params:jmap:core" => "ac1234",
"urn:ietf:params:jmap:mail" => "ac1234",
"urn:ietf:params:jmap:submission" => "ac1234",
"urn:ietf:params:jmap:vacationresponse" => "ac1234"
},
state => "Pennsylvania",
username => 'tester@example.com'
};
sub authentication_uri { "http://localhost:5627/jmap/session/" }
sub _error ($code, $data={}) {
return [
$code,
[ 'Content-Type' => 'application/json' ],
[ JSON::XS->new->encode($data) ],
];
}
sub _psgi_app ($env) {
my $req = Plack::Request->new($env);
my $path = $req->path_info;
return index($path, '/jmap/session/') == 0 ? _handle_session_req($req)
: index($path, '/jmap/api/') == 0 ? _handle_api_req($req)
: index($path, '/jmap/download/') == 0 ? _handle_download_req($req)
: index($path, '/jmap/upload/') == 0 ? _handle_upload_req($req)
: _error(404);
}
sub _handle_download_req ($req) {
my (undef, undef, undef, $accountid, $blob_id, $name) = split m{/}, $req->path_info;
return [
200,
[
'Content-Type' => $req->parameters->{type},
'Content-Disposition' => qq{attachment; filename="$name"},
],
[ "The blob you requested was $blob_id for $accountid." ],
];
}
sub _handle_upload_req ($req) {
my (undef, undef, undef, $account_id) = split m{/}, $req->path_info;
my $content = $req->raw_body;
my $length = length $content;
my $blob_id = substr($content, 0, 1) . q{-} . $length; # Whatever.
my $result = {
accountId => $account_id,
blobId => $blob_id,
type => scalar $req->header('Content-Type'),
size => $length,
};
return [
200,
[ 'Content-Type' => 'application/json' ],
[ JSON::XS->new->encode($result) ]
];
}
sub _handle_session_req ($req) {
return _error(400) unless $req->method eq 'GET';
return [
200,
[ 'Content-Type' => 'application/json' ],
[ JSON::XS->new->encode($SESSION) ]
];
}
sub _handle_api_req ($req) {
return _error(400) unless $req->method eq 'POST';
my $body = $req->raw_body;
my $data = JSON::XS->new->decode($body);
return [
200,
[
'Content-Type' => 'application/json; charset=utf-8',
'Mock-Server' => 'gorp/1.23',
],
[
JSON::XS->new->encode({
methodResponses => [
[ 'Fake/one', { f => 1 }, 'a' ],
[ 'Fake/echo', { echo => $data }, 'c' ],
],
}),
]
];
}
sub register_handler {
LWP::Protocol::PSGI->register(\&_psgi_app, host => 'localhost:5627');
}
1;
( run in 0.603 second using v1.01-cache-2.11-cpan-71847e10f99 )