diff options
author | Hakim Cassimally <hakim@mysociety.org> | 2014-05-15 15:53:34 +0000 |
---|---|---|
committer | Hakim Cassimally <hakim@mysociety.org> | 2014-10-16 16:56:26 +0000 |
commit | 06a69fa7a7e9fae205df36ddc68d131d91533792 (patch) | |
tree | 202a8451cc6539ff8f15652d0e15f53dedfa614c /t | |
parent | d1fee928f02dbc30d3a38b746155ce5b12be4a1b (diff) |
Open311 Endpoint mySociety extensions role
* Get Service Request Updates
This requires a new object ::Service::Request::Update, which of course
is not part of standard spec. So, in order to make the core not too
contaminated by :
* the endpoint should instantiate ::Service::Request::mySociety objects
which know about updates
* have added a learn_additional_types callback from Schema to Endpoint,
so that core doesn't need to know about /open311/service_request_update
* (but ::Spark knows about the exception for updates... meh, but is 1-line)
Diffstat (limited to 't')
-rw-r--r-- | t/open311/endpoint/Endpoint1.pm | 5 | ||||
-rw-r--r-- | t/open311/endpoint/Endpoint2.pm | 29 | ||||
-rw-r--r-- | t/open311/endpoint/ServiceType1.pm | 2 | ||||
-rw-r--r-- | t/open311/endpoint/mysociety.t | 161 |
4 files changed, 194 insertions, 3 deletions
diff --git a/t/open311/endpoint/Endpoint1.pm b/t/open311/endpoint/Endpoint1.pm index ccd16c238..257a94b64 100644 --- a/t/open311/endpoint/Endpoint1.pm +++ b/t/open311/endpoint/Endpoint1.pm @@ -7,6 +7,9 @@ use MooX::HandlesVia; use Open311::Endpoint::Service; use t::open311::endpoint::ServiceType1; use Open311::Endpoint::Service::Attribute; +use Open311::Endpoint::Service::Request; + +use constant request_class => 'Open311::Endpoint::Service::Request'; sub services { return ( @@ -73,7 +76,7 @@ sub services { sub post_service_request { my ($self, $service, $args) = @_; - my $request = Open311::Endpoint::Service::Request->new( + my $request = $self->request_class->new( # NB: possible race condition between next_request_id and _add_request # (this is fine for synchronous test-cases) diff --git a/t/open311/endpoint/Endpoint2.pm b/t/open311/endpoint/Endpoint2.pm new file mode 100644 index 000000000..2b55b1e10 --- /dev/null +++ b/t/open311/endpoint/Endpoint2.pm @@ -0,0 +1,29 @@ +package t::open311::endpoint::Endpoint2; +use Web::Simple; +extends 't::open311::endpoint::Endpoint1'; +with 'Open311::Endpoint::Role::mySociety'; + +use Open311::Endpoint::Service::Request::mySociety; + +use constant request_class => 'Open311::Endpoint::Service::Request::mySociety'; + +sub get_service_request_updates { + my ($self, $args) = @_; + + my $start_date = $self->maybe_inflate_datetime($args->{start_date}); + my $end_date = $self->maybe_inflate_datetime($args->{end_date}); + + my @requests = $self->filter_requests( sub { $_[0]->has_updates } ); + + return map { + $_->filter_updates( sub { + my $update = shift; + my $updated_datetime = $update->updated_datetime or return; + if ($start_date) { return unless $updated_datetime >= $start_date } + if ($end_date) { return unless $updated_datetime <= $end_date } + return 1; + }); + } @requests; +} + +1; diff --git a/t/open311/endpoint/ServiceType1.pm b/t/open311/endpoint/ServiceType1.pm index e73b15b7d..e35e44fda 100644 --- a/t/open311/endpoint/ServiceType1.pm +++ b/t/open311/endpoint/ServiceType1.pm @@ -3,8 +3,6 @@ use Moo; extends 'Open311::Endpoint::Service'; use DateTime; -use Open311::Endpoint::Service::Request; - has '+default_service_notice' => ( default => 'This is a test service', ); diff --git a/t/open311/endpoint/mysociety.t b/t/open311/endpoint/mysociety.t new file mode 100644 index 000000000..ea4f72820 --- /dev/null +++ b/t/open311/endpoint/mysociety.t @@ -0,0 +1,161 @@ +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::Endpoint2; + +my $endpoint = t::open311::endpoint::Endpoint2->new; +my $json = JSON->new; + +subtest "POST OK" => sub { + diag "Serves as sanity test of subclassing, as well as preparing our data"; + # TODO, refactor repeated code lifted from t/open311/endpoint.t + + 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; +}; + +subtest "GET Service Request Updates" => sub { + + my $empty_xml = <<CONTENT; +<?xml version="1.0" encoding="utf-8"?> +<service_request_updates> +</service_request_updates> +CONTENT + + my $update_0_xml = <<CONTENT; +<?xml version="1.0" encoding="utf-8"?> +<service_request_updates> + <request_updates> + <description>Fixed</description> + <media_url></media_url> + <service_request_id>0</service_request_id> + <status>closed</status> + <update_id>1</update_id> + <updated_datetime>2014-01-01T13:00:00Z</updated_datetime> + </request_updates> +</service_request_updates> +CONTENT + +my $updates_xml = <<CONTENT; +<?xml version="1.0" encoding="utf-8"?> +<service_request_updates> + <request_updates> + <description>Fixed</description> + <media_url></media_url> + <service_request_id>0</service_request_id> + <status>closed</status> + <update_id>1</update_id> + <updated_datetime>2014-01-01T13:00:00Z</updated_datetime> + </request_updates> + <request_updates> + <description>Have investigated. Looks tricky!</description> + <media_url></media_url> + <service_request_id>1</service_request_id> + <status>open</status> + <update_id>2</update_id> + <updated_datetime>2014-03-01T13:00:00Z</updated_datetime> + </request_updates> +</service_request_updates> +CONTENT + + subtest 'No updates' => sub { + my $res = $endpoint->run_test_request( GET => '/servicerequestupdates.xml', ); + ok $res->is_success, 'valid request' or diag $res->content; + + is_string $res->content, $empty_xml, 'xml string ok' + or diag $res->content; + }; + + subtest 'Updated 1 ticket' => sub { + # an agent updates the first ticket + set_fixed_time('2014-01-01T13:00:00Z'); + my $request = $endpoint->get_request(0); + $request->add_update( + update_id => 1, + status => 'closed', + description => 'Fixed', + ); + + is $request->status, 'closed', 'Status updated'; + + my $before='2014-01-01T12:00:00Z'; + my $after ='2014-01-01T14:00:00Z'; + + for my $scenario ( + [ '', $update_0_xml, 'Basic test', ], + [ "?start_date=$before", $update_0_xml, 'start date' ], + [ "?end_date=$after", $update_0_xml, 'end_date' ], + [ "?start_date=$before&end_date=$after", $update_0_xml, 'both dates' ], + [ "?start_date=$after", $empty_xml, 'Not found if start date after update' ], + [ "?end_date=$before", $empty_xml, 'Not found if end date before update' ] + ) { + my ($query, $xml, $description) = @$scenario; + + my $res = $endpoint->run_test_request( GET => '/servicerequestupdates.xml' . $query, ); + ok $res->is_success, 'valid request' or diag $res->content; + is_string $res->content, $xml, $description; + } + }; + + subtest 'Updated another ticket' => sub { + set_fixed_time('2014-03-01T13:00:00Z'); + my $request = $endpoint->get_request(1); + $request->add_update( + update_id => 2, + description => 'Have investigated. Looks tricky!', + ); + + for my $scenario ( + [ '', $updates_xml, 'Both reports', ], + [ "?end_date=2014-01-01T14:00:00Z", $update_0_xml, 'end_date before second update' ], + ) { + my ($query, $xml, $description) = @$scenario; + + my $res = $endpoint->run_test_request( GET => '/servicerequestupdates.xml' . $query, ); + ok $res->is_success, 'valid request' or diag $res->content; + is_string $res->content, $xml, $description or diag $res->content; + } + }; +}; + +restore_time(); +done_testing; |