use strict; use warnings; use Test::More; use Test::LongString; use Test::MockTime ':all'; use Open311::Endpoint; use Data::Dumper; use JSON; use t::open311::endpoint::Endpoint1; my $endpoint = t::open311::endpoint::Endpoint1->new; my $json = JSON->new; subtest "GET Service List" => sub { my $res = $endpoint->run_test_request( GET => '/services.xml' ); ok $res->is_success, 'xml success' or diag $res->content; is_string $res->content, < Pothole Repairs Service highways deep,hole,wow true POT Pothole Repairs realtime Bin Enforcement Service sanitation bin false BIN Bin Enforcement realtime CONTENT $res = $endpoint->run_test_request( GET => '/services.json' ); ok $res->is_success, 'json success'; is_deeply $json->decode($res->content), [ { "keywords" => "deep,hole,wow", "group" => "highways", "service_name" => "Pothole Repairs", "type" => "realtime", "metadata" => "true", "description" => "Pothole Repairs Service", "service_code" => "POT" }, { "keywords" => "bin", "group" => "sanitation", "service_name" => "Bin Enforcement", "type" => "realtime", "metadata" => "false", "description" => "Bin Enforcement Service", "service_code" => "BIN" } ], 'json structure ok'; }; subtest "GET Service Definition" => sub { my $res = $endpoint->run_test_request( GET => '/services/POT.xml' ); ok $res->is_success, 'xml success', or diag $res->content; is_string $res->content, < depth number an integer depth of pothole, in centimetres 1 true true shape singlevaluelist square | circle | triangle shape of the pothole 2 false Triangle triangle Circle circle Square square true POT CONTENT $res = $endpoint->run_test_request( GET => '/services/POT.json' ); ok $res->is_success, 'json success'; is_deeply $json->decode($res->content), { "service_code" => "POT", "attributes" => [ { "order" => 1, "code" => "depth", "required" => "true", "variable" => "true", "datatype_description" => "an integer", "description" => "depth of pothole, in centimetres", "datatype" => "number", }, { "order" => 2, "code" => "shape", "variable" => "true", "datatype_description" => "square | circle | triangle", "description" => "shape of the pothole", "required" => "false", "datatype" => "singlevaluelist", "values" => [ { "name" => "Triangle", "key" => "triangle" }, { "name" => "Circle", "key" => "circle" }, { "name" => "Square", "key" => "square" } ], } ], }, 'json structure ok'; }; subtest "POST Service Request validation" => sub { my $res = $endpoint->run_test_request( POST => '/requests.json', ); ok ! $res->is_success, 'no service_code'; $res = $endpoint->run_test_request( POST => '/requests.json', service_code => 'BIN', ); ok ! $res->is_success, 'no api_key'; $res = $endpoint->run_test_request( POST => '/requests.json', api_key => 'test', service_code => 'BADGER', # has moved the goalposts ); ok ! $res->is_success, 'bad service_code'; $res = $endpoint->run_test_request( POST => '/requests.json', api_key => 'test', service_code => 'POT', address_string => '22 Acacia Avenue', first_name => 'Bob', last_name => 'Mould', ); ok ! $res->is_success, 'no required attributes'; $res = $endpoint->run_test_request( POST => '/requests.json', api_key => 'test', service_code => 'POT', address_string => '22 Acacia Avenue', first_name => 'Bob', last_name => 'Mould', 'attribute[depth]' => 100, 'attribute[shape]' => 'starfish', ); ok ! $res->is_success, 'bad attribute'; }; subtest "POST Service Request valid test" => sub { set_fixed_time('2014-01-01T12:00:00Z'); my $res = $endpoint->run_test_request( POST => '/requests.json', api_key => 'test', service_code => 'POT', address_string => '22 Acacia Avenue', first_name => 'Bob', last_name => 'Mould', 'attribute[depth]' => 100, 'attribute[shape]' => 'triangle', ); ok $res->is_success, 'valid request' or diag $res->content; is_deeply $json->decode($res->content), [ { "service_notice" => "This is a test service", "service_request_id" => 0 } ], 'correct json returned'; set_fixed_time('2014-02-01T12:00:00Z'); $res = $endpoint->run_test_request( POST => '/requests.xml', api_key => 'test', service_code => 'POT', address_string => '22 Acacia Avenue', first_name => 'Bob', last_name => 'Mould', 'attribute[depth]' => 100, 'attribute[shape]' => 'triangle', ); ok $res->is_success, 'valid request' or diag $res->content; is_string $res->content, < This is a test service 1 CONTENT }; subtest "GET Service Requests" => sub { my $res = $endpoint->run_test_request( GET => '/requests.xml', ); ok $res->is_success, 'valid request'; my $xml = <
22 Acacia Avenue
0 0 2014-01-01T12:00:00Z POT Pothole Repairs 0 open 2014-01-01T12:00:00Z
22 Acacia Avenue
0 0 2014-02-01T12:00:00Z POT Pothole Repairs 1 open 2014-02-01T12:00:00Z
CONTENT is_string $res->content, $xml, 'xml string ok'; $res = $endpoint->run_test_request( GET => '/requests.xml?service_code=POT', ); ok $res->is_success, 'valid request'; is_string $res->content, $xml, 'xml string ok POT' or diag $res->content; $res = $endpoint->run_test_request( GET => '/requests.xml?service_code=BIN', ); ok $res->is_success, 'valid request'; is_string $res->content, < CONTENT }; subtest "GET Service Request" => sub { my @req=(<
22 Acacia Avenue
0 0 2014-01-01T12:00:00Z POT Pothole Repairs 0 open 2014-01-01T12:00:00Z
REQ0
22 Acacia Avenue
0 0 2014-02-01T12:00:00Z POT Pothole Repairs 1 open 2014-02-01T12:00:00Z
REQ1 my $res = $endpoint->run_test_request( GET => '/requests/0.xml', ); ok $res->is_success, 'valid request'; is_string $res->content, $req[0], 'Request 0 ok' or diag $res->content;; $res = $endpoint->run_test_request( GET => '/requests/1.xml', ); ok $res->is_success, 'valid request'; is_string $res->content, $req[1], 'Request 1 ok'; }; restore_time(); done_testing;