diff options
-rw-r--r-- | perllib/FixMyStreet/Integrations/ExorRDI.pm | 5 | ||||
-rw-r--r-- | perllib/Open311/GetServiceRequestUpdates.pm | 3 | ||||
-rw-r--r-- | t/cobrand/oxfordshire.t | 23 | ||||
-rw-r--r-- | t/open311/getservicerequestupdates.t | 172 |
4 files changed, 131 insertions, 72 deletions
diff --git a/perllib/FixMyStreet/Integrations/ExorRDI.pm b/perllib/FixMyStreet/Integrations/ExorRDI.pm index 87565767a..4ce888cff 100644 --- a/perllib/FixMyStreet/Integrations/ExorRDI.pm +++ b/perllib/FixMyStreet/Integrations/ExorRDI.pm @@ -139,11 +139,14 @@ sub construct { "","","","","" # empty fields ); + my $m_row_activity_code = $activity_code; + $m_row_activity_code .= 'I' if length $activity_code == 1; + $csv->add_row($body_by_activity_code{$activity_code}, "M", # bill of quantities record "resolve", # permanent repair "","", # empty fields - "/C$activity_code", # /C + activity code + "/C$m_row_activity_code", # /C + activity code + perhaps an "I" "", "" # empty fields ); } diff --git a/perllib/Open311/GetServiceRequestUpdates.pm b/perllib/Open311/GetServiceRequestUpdates.pm index 0751092fb..30db24164 100644 --- a/perllib/Open311/GetServiceRequestUpdates.pm +++ b/perllib/Open311/GetServiceRequestUpdates.pm @@ -143,6 +143,9 @@ sub update_comments { # don't update state unless it's an allowed state and it's # actually changing the state of the problem if ( FixMyStreet::DB::Result::Problem->council_states()->{$state} && $p->state ne $state && + # For Oxfordshire, don't allow changes back to Open from other open states + !( $body->areas->{$AREA_ID_OXFORDSHIRE} && $state eq 'confirmed' && $p->is_open ) && + # Don't let it change between the (same in the front end) fixed states !( $p->is_fixed && FixMyStreet::DB::Result::Problem->fixed_states()->{$state} ) ) { if ($p->is_visible) { $p->state($state); diff --git a/t/cobrand/oxfordshire.t b/t/cobrand/oxfordshire.t index c081f6cbf..89792765c 100644 --- a/t/cobrand/oxfordshire.t +++ b/t/cobrand/oxfordshire.t @@ -89,11 +89,20 @@ subtest 'Exor file looks okay' => sub { $dt->set_extra_metadata(activity_code => 'FC'); $dt->set_extra_metadata(defect_code => 'SFP1'); $dt->update; - my @problems = FixMyStreet::DB->resultset('Problem')->search({}, { rows => 2 })->all; + my $dt2 = FixMyStreet::DB->resultset('DefectType')->create({ + body => $oxon, + name => 'Accidental sign damage', + description => 'Accidental sign damage', + }); + $dt2->set_extra_metadata(activity_code => 'S'); + $dt2->set_extra_metadata(defect_code => 'ACC2'); + $dt2->update; + my @problems = FixMyStreet::DB->resultset('Problem')->search({}, { rows => 3 })->all; my $i = 123; foreach my $problem (@problems) { $problem->update({ state => 'action scheduled', external_id => $i }); $problem->update({ defect_type => $dt }) if $i == 123; + $problem->update({ defect_type => $dt2 }) if $i == 124; FixMyStreet::DB->resultset('AdminLog')->create({ admin_user => $inspector->name, user => $inspector, @@ -110,7 +119,7 @@ subtest 'Exor file looks okay' => sub { user_id => $inspector->id, } }, 'submit download'); (my $rdi = $mech->content) =~ s/\r\n/\n/g; - $rdi =~ s/(I,[FM]C,,)\d+/$1XXX/g; # Remove unique ID figures, unknown order + $rdi =~ s/(I,[FMS]C?,,)\d+/$1XXX/g; # Remove unique ID figures, unknown order is $rdi, <<EOF, "RDI file matches expected"; "1,1.8,1.0.0.0,ENHN," "G,1989169,,,XX,170505,1600,D,INS,N,,,," @@ -121,11 +130,17 @@ subtest 'Exor file looks okay' => sub { "P,0,999999" "G,1989169,,,XX,170505,1600,D,INS,N,,,," "H,MC" -"I,MC,,XXX,"434970E 209683N Nearest postcode: OX28 4DS.",1200,,,,,,,,"TM none","124 "" +"I,MC,,XXX,"434970E 209683N Nearest postcode: OX28 4DS.",1200,,,,,,,,"TM none","125 "" "J,SFP2,2,,,434970,209683,,,,," "M,resolve,,,/CMC,," "P,0,999999" -"X,2,2,2,2,0,0,0,2,0,2,0,0,0" +"G,1989169,,,XX,170505,1600,D,INS,N,,,," +"H,S" +"I,S,,XXX,"434970E 209683N Nearest postcode: OX28 4DS.",1200,,,,,,,,"TM none","124 "" +"J,ACC2,2,,,434970,209683,,,,," +"M,resolve,,,/CSI,," +"P,0,999999" +"X,3,3,3,3,0,0,0,3,0,3,0,0,0" EOF } }; diff --git a/t/open311/getservicerequestupdates.t b/t/open311/getservicerequestupdates.t index a7dd8425b..9a8db4374 100644 --- a/t/open311/getservicerequestupdates.t +++ b/t/open311/getservicerequestupdates.t @@ -19,9 +19,11 @@ my $user = FixMyStreet::DB->resultset('User')->find_or_create( ); my %bodies = ( + 2237 => FixMyStreet::DB->resultset("Body")->create({ name => 'Oxfordshire' }), 2482 => FixMyStreet::DB->resultset("Body")->new({ id => 2482 }), 2651 => FixMyStreet::DB->resultset("Body")->new({ id => 2651 }), ); +$bodies{2237}->body_areas->create({ area_id => 2237 }); my $requests_xml = qq{<?xml version="1.0" encoding="utf-8"?> <service_requests_updates> @@ -277,6 +279,17 @@ for my $test ( end_state => 'confirmed', }, { + desc => 'open status removes action scheduled status', + description => 'This is a note', + external_id => 638344, + start_state => 'action scheduled', + comment_status => 'OPEN', + mark_fixed => 0, + mark_open => 0, + problem_state => 'confirmed', + end_state => 'confirmed', + }, + { desc => 'fixed status leaves fixed - user report as fixed - user', description => 'This is a note', external_id => 638344, @@ -333,16 +346,9 @@ for my $test ( }, ) { subtest $test->{desc} => sub { - my $local_requests_xml = $requests_xml; - my $updated_datetime = sprintf( '<updated_datetime>%s</updated_datetime>', $dt ); - $local_requests_xml =~ s/UPDATED_DATETIME/$updated_datetime/; - $local_requests_xml =~ s#<service_request_id>\d+</service_request_id>#<service_request_id>@{[$problem->external_id]}</service_request_id>#; - $local_requests_xml =~ s#<service_request_id_ext>\d+</service_request_id_ext>#<service_request_id_ext>@{[$problem->id]}</service_request_id_ext>#; - $local_requests_xml =~ s#<status>\w+</status>#<status>$test->{comment_status}</status># if $test->{comment_status}; - + my $local_requests_xml = setup_xml($problem->external_id, $problem->id, $test->{comment_status}); my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'servicerequestupdates.xml' => $local_requests_xml } ); - $problem->comments->delete; $problem->lastupdate( DateTime->now()->subtract( days => 1 ) ); $problem->state( $test->{start_state} ); $problem->update; @@ -360,22 +366,78 @@ for my $test ( is $c->problem_state, $test->{problem_state}, 'problem_state correct'; is $c->mark_open, $test->{mark_open}, 'mark_open correct'; is $problem->state, $test->{end_state}, 'correct problem state'; + $problem->comments->delete; + }; +} + +my $problemOx = $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 => time(), + bodies_str => $bodies{2237}->id, +}); + +for my $test ( + { + desc => 'OPEN status for confirmed problem does not change state (Oxfordshire)', + start_state => 'confirmed', + comment_status => 'OPEN', + problem_state => undef, + end_state => 'confirmed', + }, + { + desc => 'OPEN status for action scheduled problem does not change state (Oxfordshire)', + start_state => 'action scheduled', + comment_status => 'OPEN', + problem_state => undef, + end_state => 'action scheduled', + }, +) { + subtest $test->{desc} => sub { + my $local_requests_xml = setup_xml($problemOx->external_id, $problemOx->id, $test->{comment_status}); + my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'servicerequestupdates.xml' => $local_requests_xml } ); + + $problemOx->lastupdate( DateTime->now()->subtract( days => 1 ) ); + $problemOx->state( $test->{start_state} ); + $problemOx->update; + + my $update = Open311::GetServiceRequestUpdates->new( system_user => $user ); + $update->update_comments( $o, $bodies{2237} ); + + is $problemOx->comments->count, 1, 'comment count'; + $problemOx->discard_changes; + + my $c = FixMyStreet::DB->resultset('Comment')->search( { external_id => 638344 } )->first; + ok $c, 'comment exists'; + is $c->problem_state, $test->{problem_state}, 'problem_state correct'; + is $problemOx->state, $test->{end_state}, 'correct problem state'; + $problemOx->comments->delete; }; } subtest 'Update with media_url includes image in update' => sub { my $guard = LWP::Protocol::PSGI->register(t::Mock::Static->to_psgi_app, host => 'example.com'); - my $local_requests_xml = $requests_xml; - my $updated_datetime = sprintf( '<updated_datetime>%s</updated_datetime>', $dt ); - $local_requests_xml =~ s/UPDATED_DATETIME/$updated_datetime/; - $local_requests_xml =~ s#<service_request_id>\d+</service_request_id># - <service_request_id>@{[$problem->external_id]}</service_request_id> + my $local_requests_xml = setup_xml($problem->external_id, 1, ""); + $local_requests_xml =~ s#</service_request_id>#</service_request_id> <media_url>http://example.com/image.jpeg</media_url>#; - my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'servicerequestupdates.xml' => $local_requests_xml } ); - $problem->comments->delete; $problem->lastupdate( DateTime->now()->subtract( days => 1 ) ); $problem->state('confirmed'); $problem->update; @@ -387,40 +449,23 @@ subtest 'Update with media_url includes image in update' => sub { my $c = $problem->comments->first; is $c->external_id, 638344; is $c->photo, '74e3362283b6ef0c48686fb0e161da4043bbcc97.jpeg', 'photo exists'; + $problem->comments->delete; }; -foreach my $test ( - { - desc => 'date for comment correct', - updated_datetime => sprintf( '<updated_datetime>%s</updated_datetime>', $dt ), - external_id => 638344, - }, -) { - subtest $test->{desc} => sub { - my $dt = DateTime->now(); - $dt->subtract( minutes => 10 ); - my $local_requests_xml = $requests_xml; - - my $updated = sprintf( '<updated_datetime>%s</updated_datetime>', DateTime::Format::W3CDTF->format_datetime( $dt ) ); - - $local_requests_xml =~ s/UPDATED_DATETIME/$updated/; - $local_requests_xml =~ s#<service_request_id>\d+</service_request_id>#<service_request_id>@{[$problem->external_id]}</service_request_id>#; - $local_requests_xml =~ s#<service_request_id_ext>\d+</service_request_id_ext>#<service_request_id_ext>@{[$problem->id]}</service_request_id_ext>#; - - my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'servicerequestupdates.xml' => $local_requests_xml } ); - - $problem->comments->delete; +subtest 'date for comment correct' => sub { + my $local_requests_xml = setup_xml($problem->external_id, $problem->id, ""); + my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'servicerequestupdates.xml' => $local_requests_xml } ); - my $update = Open311::GetServiceRequestUpdates->new( system_user => $user ); - $update->update_comments( $o, $bodies{2482} ); + my $update = Open311::GetServiceRequestUpdates->new( system_user => $user ); + $update->update_comments( $o, $bodies{2482} ); - my $comment = $problem->comments->first; - is $comment->created, $dt, 'created date set to date from XML'; - is $comment->confirmed, $dt, 'confirmed date set to date from XML'; - }; -} + my $comment = $problem->comments->first; + is $comment->created, $dt, 'created date set to date from XML'; + is $comment->confirmed, $dt, 'confirmed date set to date from XML'; + $problem->comments->delete; +}; -my $problem2 = $problem_rs->new( +my $problem2 = $problem_rs->create( { postcode => 'EH99 1SP', latitude => 1, @@ -444,14 +489,9 @@ my $problem2 = $problem_rs->new( } ); -$problem2->insert(); -$problem->comments->delete; -$problem2->comments->delete; - for my $test ( { desc => 'identical external_ids on problem resolved using council', - updated_datetime => sprintf( '<updated_datetime>%s</updated_datetime>', $dt ), external_id => 638344, area_id => 2651, request_id => $problem2->external_id, @@ -461,7 +501,6 @@ for my $test ( }, { desc => 'identical external_ids on comments resolved', - updated_datetime => sprintf( '<updated_datetime>%s</updated_datetime>', $dt ), external_id => 638344, area_id => 2482, request_id => $problem->external_id, @@ -471,14 +510,9 @@ for my $test ( }, ) { subtest $test->{desc} => sub { - my $local_requests_xml = $requests_xml; - $local_requests_xml =~ s/UPDATED_DATETIME/$test->{updated_datetime}/; - $local_requests_xml =~ s#<service_request_id>\d+</service_request_id>#<service_request_id>$test->{request_id}</service_request_id>#; - $local_requests_xml =~ s#<service_request_id_ext>\d+</service_request_id_ext>#<service_request_id_ext>$test->{request_id_ext}</service_request_id_ext>#; - + my $local_requests_xml = setup_xml($test->{request_id}, $test->{request_id_ext}, ""); my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'servicerequestupdates.xml' => $local_requests_xml } ); - my $update = Open311::GetServiceRequestUpdates->new( system_user => $user ); $update->update_comments( $o, $bodies{$test->{area_id}} ); @@ -495,7 +529,6 @@ subtest 'using start and end date' => sub { $start_dt->subtract( days => 1 ); my $end_dt = DateTime->now(); - my $update = Open311::GetServiceRequestUpdates->new( system_user => $user, start_date => $start_dt, @@ -624,7 +657,6 @@ foreach my $test ( { </service_requests_updates> }; - $problem->comments->delete; $problem->state( 'confirmed' ); $problem->lastupdate( $dt->clone->subtract( hours => 3 ) ); $problem->update; @@ -643,6 +675,7 @@ foreach my $test ( { $problem->discard_changes; is $problem->comments->count, 2, 'two comments after fetching updates'; is $problem->state, 'confirmed', 'correct problem status'; + $problem->comments->delete; }; } @@ -680,7 +713,6 @@ foreach my $test ( { </service_requests_updates> }; - $problem->comments->delete; $problem->state( 'confirmed' ); $problem->lastupdate( $dt->clone->subtract( hours => 3 ) ); $problem->update; @@ -723,15 +755,21 @@ foreach my $test ( { for my $alert (@alerts) { $alert->delete; } + $problem->comments->delete; } } -$problem2->comments->delete(); -$problem->comments->delete(); -$problem2->delete; -$problem->delete; -$user->comments->delete; -$user->problems->delete; -$user->delete; - done_testing(); + +sub setup_xml { + my ($id, $id_ext, $status) = @_; + my $xml = $requests_xml; + my $updated_datetime = sprintf( '<updated_datetime>%s</updated_datetime>', $dt ); + $xml =~ s/UPDATED_DATETIME/$updated_datetime/; + $xml =~ s#<service_request_id>\d+</service_request_id>#<service_request_id>$id</service_request_id>#; + $xml =~ s#<service_request_id_ext>\d+</service_request_id_ext>#<service_request_id_ext>$id_ext</service_request_id_ext>#; + $xml =~ s#<status>\w+</status>#<status>$status</status># if $status; + return $xml; + + +} |