diff options
Diffstat (limited to 't/open311')
-rw-r--r-- | t/open311/getupdates.t | 198 | ||||
-rw-r--r-- | t/open311/populate-service-list.t | 255 |
2 files changed, 453 insertions, 0 deletions
diff --git a/t/open311/getupdates.t b/t/open311/getupdates.t new file mode 100644 index 000000000..500ac97d2 --- /dev/null +++ b/t/open311/getupdates.t @@ -0,0 +1,198 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use Test::More; + +use FindBin; +use lib "$FindBin::Bin/../perllib"; +use lib "$FindBin::Bin/../commonlib/perllib"; + +use_ok( 'Open311::GetUpdates' ); +use_ok( 'Open311' ); + +my $user = FixMyStreet::App->model('DB::User')->find_or_create( + { + email => 'system_user@example.com' + } +); + + +my $updates = Open311::GetUpdates->new( system_user => $user ); +ok $updates, 'created object'; + +my $requests_xml = qq{<?xml version="1.0" encoding="utf-8"?> +<service_requests> +<request> +<service_request_id>638344</service_request_id> +<status>open</status> +<status_notes>This is a note.</status_notes> +<service_name>Sidewalk and Curb Issues</service_name> +<service_code>006</service_code> +<description></description> +<agency_responsible></agency_responsible> +<service_notice></service_notice> +<requested_datetime>2010-04-14T06:37:38-08:00</requested_datetime> +UPDATED_DATETIME +<expected_datetime>2010-04-15T06:37:38-08:00</expected_datetime> +<lat>37.762221815</lat> +<long>-122.4651145</long> +</request> +</service_requests> +}; + +my $problem_rs = FixMyStreet::App->model('DB::Problem'); +my $problem = $problem_rs->new( + { + postcode => 'EH99 1SP', + latitude => 1, + longitude => 1, + areas => 1, + title => '', + detail => '', + used_map => 1, + user_id => 1, + name => '', + state => 'confirmed', + service => '', + cobrand => 'default', + cobrand_data => '', + user => $user, + created => DateTime->now()->subtract( days => 1 ), + lastupdate => DateTime->now()->subtract( days => 1 ), + anonymous => 1, + external_id => 638344, + } +); + +$problem->insert; + +for my $test ( + { + desc => 'element missing', + updated_datetime => '', + comment_count => 0, + }, + { + desc => 'empty element', + updated_datetime => '<updated_datetime />', + comment_count => 0, + }, + { + desc => 'element with no content', + updated_datetime => '<updated_datetime></updated_datetime>', + comment_count => 0, + }, + { + desc => 'element with old content', + updated_datetime => sprintf( '<updated_datetime>%s</updated_datetime>', DateTime->now->subtract( days => 3 ) ), + comment_count => 0, + }, + { + desc => 'element with new content', + updated_datetime => sprintf( '<updated_datetime>%s</updated_datetime>', DateTime->now ), + comment_count => 1, + }, +) { + subtest $test->{desc} => sub { + $problem->comments->delete; + $problem->lastupdate(DateTime->now()->subtract( days => 1 ) ), + $problem->update; + + my $local_requests_xml = $requests_xml; + $local_requests_xml =~ s/UPDATED_DATETIME/$test->{updated_datetime}/; + + my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'requests.xml' => $local_requests_xml } ); + + ok $updates->update_reports( [ 638344 ], $o, { name => 'Test Council' } ); + is $o->test_uri_used, 'http://example.com/requests.xml?jurisdiction_id=mysociety&service_request_id=638344', 'get url'; + + is $problem->comments->count, $test->{comment_count}, 'added a comment'; + }; +} + +$requests_xml = qq{<?xml version="1.0" encoding="utf-8"?> +<service_requests> +<request> +<service_request_id>638344</service_request_id> +<status>open</status> +<status_notes>This is a note.</status_notes> +<service_name>Sidewalk and Curb Issues</service_name> +<service_code>006</service_code> +<description></description> +<agency_responsible></agency_responsible> +<service_notice></service_notice> +<requested_datetime>2010-04-14T06:37:38-08:00</requested_datetime> +<updated_datetime>UPDATED_DATETIME</updated_datetime> +<expected_datetime>2010-04-15T06:37:38-08:00</expected_datetime> +<lat>37.762221815</lat> +<long>-122.4651145</long> +</request> +<request> +<service_request_id>638345</service_request_id> +<status>open</status> +<status_notes>This is a for a different issue.</status_notes> +<service_name>Sidewalk and Curb Issues</service_name> +<service_code>006</service_code> +<description></description> +<agency_responsible></agency_responsible> +<service_notice></service_notice> +<requested_datetime>2010-04-14T06:37:38-08:00</requested_datetime> +<updated_datetime>UPDATED_DATETIME2</updated_datetime> +<expected_datetime>2010-04-15T06:37:38-08:00</expected_datetime> +<lat>37.762221815</lat> +<long>-122.4651145</long> +</request> +</service_requests> +}; + +my $problem2 = $problem_rs->create( + { + postcode => 'EH99 1SP', + latitude => 1, + longitude => 1, + areas => 1, + title => '', + detail => '', + used_map => 1, + user_id => 1, + name => '', + state => 'confirmed', + service => '', + cobrand => 'default', + cobrand_data => '', + user => $user, + created => DateTime->now()->subtract( days => 1 ), + lastupdate => DateTime->now()->subtract( days => 1 ), + anonymous => 1, + external_id => 638345, + } +); + +$problem->comments->delete; +subtest 'update with two requests' => sub { + $problem->comments->delete; + $problem->lastupdate(DateTime->now()->subtract( days => 1 ) ), + + my $date1 = DateTime::Format::W3CDTF->new->format_datetime( DateTime->now() ); + my $date2 = DateTime::Format::W3CDTF->new->format_datetime( DateTime->now->subtract( hours => 1) ); + my $local_requests_xml = $requests_xml; + $local_requests_xml =~ s/UPDATED_DATETIME2/$date2/; + $local_requests_xml =~ s/UPDATED_DATETIME/$date1/; + + my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'requests.xml' => $local_requests_xml } ); + + ok $updates->update_reports( [ 638344,638345 ], $o, { name => 'Test Council' } ); + is $o->test_uri_used, 'http://example.com/requests.xml?jurisdiction_id=mysociety&service_request_id=638344%2C638345', 'get url'; + + is $problem->comments->count, 1, 'added a comment to first problem'; + is $problem2->comments->count, 1, 'added a comment to second problem'; +}; + +$problem->comments->delete; +$problem->delete; +$user->comments->delete; +$user->problems->delete; +$user->delete; + +done_testing(); diff --git a/t/open311/populate-service-list.t b/t/open311/populate-service-list.t new file mode 100644 index 000000000..bdb7404f9 --- /dev/null +++ b/t/open311/populate-service-list.t @@ -0,0 +1,255 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use Test::More; + +use FixMyStreet::App; + +use FindBin; +use lib "$FindBin::Bin/../perllib"; +use lib "$FindBin::Bin/../commonlib/perllib"; + +use_ok( 'Open311::PopulateServiceList' ); +use_ok( 'Open311' ); + + +my $processor = Open311::PopulateServiceList->new( council_list => [] ); +ok $processor, 'created object'; + + + +subtest 'check basic functionality' => sub { + FixMyStreet::App->model('DB::Contact')->search( { area_id => 1 } )->delete(); + + my $service_list = get_xml_simple_object( get_standard_xml() ); + + my $council = FixMyStreet::App->model('DB::Open311Conf')->new( { + area_id => 1 + } ); + + my $processor = Open311::PopulateServiceList->new( council_list => [] ); + $processor->_current_council( $council ); + $processor->process_services( $service_list ); + + my $contact_count = FixMyStreet::App->model('DB::Contact')->search( { area_id => 1 } )->count(); + is $contact_count, 3, 'correct number of contacts'; +}; + +subtest 'check non open311 contacts marked as deleted' => sub { + FixMyStreet::App->model('DB::Contact')->search( { area_id => 1 } )->delete(); + + my $contact = FixMyStreet::App->model('DB::Contact')->create( + { + area_id => 1, + email => 'contact@example.com', + category => 'An old category', + confirmed => 1, + deleted => 0, + editor => $0, + whenedited => \'ms_current_timestamp()', + note => 'test contact', + } + ); + + my $service_list = get_xml_simple_object( get_standard_xml() ); + + my $council = FixMyStreet::App->model('DB::Open311Conf')->new( { + area_id => 1 + } ); + + my $processor = Open311::PopulateServiceList->new( council_list => [] ); + $processor->_current_council( $council ); + $processor->process_services( $service_list ); + + my $contact_count = FixMyStreet::App->model('DB::Contact')->search( { area_id => 1 } )->count(); + is $contact_count, 4, 'correct number of contacts'; + + $contact_count = FixMyStreet::App->model('DB::Contact')->search( { area_id => 1, deleted => 1 } )->count(); + is $contact_count, 1, 'correct number of deleted contacts'; +}; + +subtest 'check email changed if matching category' => sub { + FixMyStreet::App->model('DB::Contact')->search( { area_id => 1 } )->delete(); + + my $contact = FixMyStreet::App->model('DB::Contact')->create( + { + area_id => 1, + email => '009', + category => 'Cans left out 24x7', + confirmed => 1, + deleted => 0, + editor => $0, + whenedited => \'ms_current_timestamp()', + note => 'test contact', + } + ); + + ok $contact, 'contact created'; + + my $service_list = get_xml_simple_object( get_standard_xml() ); + + my $council = FixMyStreet::App->model('DB::Open311Conf')->new( { + area_id => 1 + } ); + + my $processor = Open311::PopulateServiceList->new( council_list => [] ); + $processor->_current_council( $council ); + $processor->process_services( $service_list ); + + $contact->discard_changes; + is $contact->email, '001', 'email unchanged'; + is $contact->confirmed, 1, 'contact still confirmed'; + is $contact->deleted, 0, 'contact still not deleted'; + + my $contact_count = FixMyStreet::App->model('DB::Contact')->search( { area_id => 1 } )->count(); + is $contact_count, 3, 'correct number of contacts'; +}; + +subtest 'check category name changed if updated' => sub { + FixMyStreet::App->model('DB::Contact')->search( { area_id => 1 } )->delete(); + + my $contact = FixMyStreet::App->model('DB::Contact')->create( + { + area_id => 1, + email => '001', + category => 'Bins left out 24x7', + confirmed => 1, + deleted => 0, + editor => $0, + whenedited => \'ms_current_timestamp()', + note => 'test contact', + } + ); + + ok $contact, 'contact created'; + + my $service_list = get_xml_simple_object( get_standard_xml() ); + + my $council = FixMyStreet::App->model('DB::Open311Conf')->new( { + area_id => 1 + } ); + + my $processor = Open311::PopulateServiceList->new( council_list => [] ); + $processor->_current_council( $council ); + $processor->process_services( $service_list ); + + $contact->discard_changes; + is $contact->email, '001', 'email unchanged'; + is $contact->category, 'Cans left out 24x7', 'category changed'; + is $contact->confirmed, 1, 'contact still confirmed'; + is $contact->deleted, 0, 'contact still not deleted'; + + my $contact_count = FixMyStreet::App->model('DB::Contact')->search( { area_id => 1 } )->count(); + is $contact_count, 3, 'correct number of contacts'; +}; + +subtest 'check conflicting contacts not changed' => sub { + FixMyStreet::App->model('DB::Contact')->search( { area_id => 1 } )->delete(); + + my $contact = FixMyStreet::App->model('DB::Contact')->create( + { + area_id => 1, + email => 'existing@example.com', + category => 'Cans left out 24x7', + confirmed => 1, + deleted => 0, + editor => $0, + whenedited => \'ms_current_timestamp()', + note => 'test contact', + } + ); + + ok $contact, 'contact created'; + + my $contact2 = FixMyStreet::App->model('DB::Contact')->create( + { + area_id => 1, + email => '001', + category => 'Bins left out 24x7', + confirmed => 1, + deleted => 0, + editor => $0, + whenedited => \'ms_current_timestamp()', + note => 'test contact', + } + ); + + ok $contact2, 'contact created'; + + my $service_list = get_xml_simple_object( get_standard_xml() ); + + my $council = FixMyStreet::App->model('DB::Open311Conf')->new( { + area_id => 1 + } ); + + my $processor = Open311::PopulateServiceList->new( council_list => [] ); + $processor->_current_council( $council ); + $processor->process_services( $service_list ); + + $contact->discard_changes; + is $contact->email, 'existing@example.com', 'first contact email unchanged'; + is $contact->category, 'Cans left out 24x7', 'first contact category unchanged'; + is $contact->confirmed, 1, 'first contact contact still confirmed'; + is $contact->deleted, 0, 'first contact contact still not deleted'; + + $contact2->discard_changes; + is $contact2->email, '001', 'second contact email unchanged'; + is $contact2->category, 'Bins left out 24x7', 'second contact category unchanged'; + is $contact2->confirmed, 1, 'second contact contact still confirmed'; + is $contact2->deleted, 0, 'second contact contact still not deleted'; + + my $contact_count = FixMyStreet::App->model('DB::Contact')->search( { area_id => 1 } )->count(); + is $contact_count, 4, 'correct number of contacts'; +}; + +sub get_standard_xml { + return qq{<?xml version="1.0" encoding="utf-8"?> +<services> + <service> + <service_code>001</service_code> + <service_name>Cans left out 24x7</service_name> + <description>Garbage or recycling cans that have been left out for more than 24 hours after collection. Violators will be cited.</description> + <metadata>false</metadata> + <type>realtime</type> + <keywords>lorem, ipsum, dolor</keywords> + <group>sanitation</group> + </service> + <service> + <service_code>002</service_code> + <metadata>false</metadata> + <type>realtime</type> + <keywords>lorem, ipsum, dolor</keywords> + <group>street</group> + <service_name>Construction plate shifted</service_name> + <description>Metal construction plate covering the street or sidewalk has been moved.</description> + </service> + <service> + <service_code>003</service_code> + <metadata>false</metadata> + <type>realtime</type> + <keywords>lorem, ipsum, dolor</keywords> + <group>street</group> + <service_name>Curb or curb ramp defect</service_name> + <description>Sidewalk curb or ramp has problems such as cracking, missing pieces, holes, and/or chipped curb.</description> + </service> +</services> +}; +} + +sub get_xml_simple_object { + my $xml = shift; + + my $simple = XML::Simple->new(); + my $obj; + + eval { + $obj = $simple->XMLin( $xml ); + }; + + die $@ if $@; + + return $obj; +} + +done_testing(); |