aboutsummaryrefslogtreecommitdiffstats
path: root/t
diff options
context:
space:
mode:
Diffstat (limited to 't')
-rw-r--r--t/app/controller/open311.t10
-rw-r--r--t/app/controller/open311_updates.t99
-rw-r--r--t/open311/getservicerequestupdates.t98
3 files changed, 176 insertions, 31 deletions
diff --git a/t/app/controller/open311.t b/t/app/controller/open311.t
index 79fe159a3..c052605c7 100644
--- a/t/app/controller/open311.t
+++ b/t/app/controller/open311.t
@@ -14,7 +14,7 @@ $mech->content_contains('<status>open</status>');
$mech->get_ok('/open311/v2/requests.json?jurisdiction_id=foo&status=open&agency_responsible=2237');
my $json = decode_json($mech->content);
-my $problems = $json->{requests}[0]{request};
+my $problems = $json->{service_requests};
is @$problems, 2;
like $problems->[0]{description}, qr/Around page Test/;
@@ -25,7 +25,7 @@ subtest "non_public reports aren't available" => sub {
});
$mech->get_ok('/open311/v2/requests.json?jurisdiction_id=foo');
$json = decode_json($mech->content);
- $problems = $json->{requests}[0]{request};
+ $problems = $json->{service_requests};
is @$problems, 1;
like $problems->[0]{description}, qr/Around page Test/;
$mech->content_lacks('This report is now private');
@@ -33,7 +33,7 @@ subtest "non_public reports aren't available" => sub {
my $problem_id = $problem1->id;
$mech->get_ok("/open311/v2/requests/$problem_id.json?jurisdiction_id=foo");
$json = decode_json($mech->content);
- $problems = $json->{requests}[0]{request};
+ $problems = $json->{service_requests};
is @$problems, 0;
};
@@ -45,7 +45,7 @@ subtest "hidden reports aren't available" => sub {
});
$mech->get_ok('/open311/v2/requests.json?jurisdiction_id=foo');
$json = decode_json($mech->content);
- $problems = $json->{requests}[0]{request};
+ $problems = $json->{service_requests};
is @$problems, 1;
like $problems->[0]{description}, qr/Around page Test/;
$mech->content_lacks('This report is now hidden');
@@ -53,7 +53,7 @@ subtest "hidden reports aren't available" => sub {
my $problem_id = $problem1->id;
$mech->get_ok("/open311/v2/requests/$problem_id.json?jurisdiction_id=foo");
$json = decode_json($mech->content);
- $problems = $json->{requests}[0]{request};
+ $problems = $json->{service_requests};
is @$problems, 0;
};
diff --git a/t/app/controller/open311_updates.t b/t/app/controller/open311_updates.t
new file mode 100644
index 000000000..f2db0a02b
--- /dev/null
+++ b/t/app/controller/open311_updates.t
@@ -0,0 +1,99 @@
+use XML::Simple;
+use FixMyStreet::TestMech;
+my $mech = FixMyStreet::TestMech->new;
+
+my $user = $mech->create_user_ok('commentuser@example.com');
+my $body = $mech->create_body_ok(2237, 'Oxfordshire County Council', {
+ comment_user => $user,
+ api_key => 'sending-key',
+ jurisdiction => 'none',
+ endpoint => 'endpoint',
+});
+my ($problem) = $mech->create_problems_for_body(1, $body->id, 'Open311 updates', { external_id => 'p123' });
+
+subtest 'bad requests do not get through' => sub {
+ $mech->get('/open311/v2/servicerequestupdates.xml');
+ is $mech->response->code, 400, 'Is bad request';
+ $mech->content_contains('<description>Bad request: POST</description>');
+
+ $mech->post('/open311/v2/servicerequestupdates.xml');
+ is $mech->response->code, 400, 'Is bad request';
+ my $xml = _get_xml_object($mech->content);
+ is $xml->{error}[0]{description}, 'Bad request: jurisdiction_id';
+};
+
+subtest 'cobrand gets jurisdiction, but needs a token' => sub {
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => 'oxfordshire',
+ }, sub {
+ $mech->post('/open311/v2/servicerequestupdates.xml');
+ is $mech->response->code, 400, 'Is bad request';
+ my $xml = _get_xml_object($mech->content);
+ is $xml->{error}[0]{description}, 'Bad request: api_key';
+ };
+
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => 'oxfordshire',
+ COBRAND_FEATURES => { open311_token => { oxfordshire => 'wrong-token' } },
+ }, sub {
+ $mech->post('/open311/v2/servicerequestupdates.xml');
+ is $mech->response->code, 400, 'Is bad request';
+ my $xml = _get_xml_object($mech->content);
+ is $xml->{error}[0]{description}, 'Bad request: api_key';
+ };
+};
+
+subtest 'With all data, an update is added' => sub {
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => 'oxfordshire',
+ COBRAND_FEATURES => { open311_token => { oxfordshire => 'receiving-token' } },
+ }, sub {
+ $mech->post_ok('/open311/v2/servicerequestupdates.xml', {
+ api_key => 'receiving-token',
+ service_request_id => $problem->external_id,
+ update_id => 'c123',
+ updated_datetime => $problem->confirmed->clone->add(hours => 2),
+ status => 'CLOSED',
+ description => 'This report has been fixed',
+ });
+ };
+
+ $problem->discard_changes;
+ is $problem->state, 'fixed - council', 'problem updated';
+ is $problem->comments->count, 1, 'One comment created';
+
+ my $comment = $problem->comments->first;
+ is $comment->text, 'This report has been fixed', 'correct text';
+ is $comment->user_id, $user->id, 'correct user';
+ is $comment->problem_state, 'fixed - council', 'correct state';
+ is $comment->external_id, 'c123', 'correct external id';
+
+ my $xml = _get_xml_object($mech->content);
+ my $response = $xml->{request_update};
+ is $response->[0]->{update_id}, $comment->id, 'correct id in response';
+};
+
+done_testing();
+
+sub _get_xml_object {
+ my ($xml) = @_;
+
+ # Of these, services/service_requests/service_request_updates are root
+ # elements, so GroupTags has no effect, but this is used in ForceArray too.
+ my $group_tags = {
+ services => 'service',
+ attributes => 'attribute',
+ values => 'value',
+ service_requests => 'request',
+ errors => 'error',
+ service_request_updates => 'request_update',
+ };
+ my $simple = XML::Simple->new(
+ ForceArray => [ values %$group_tags ],
+ KeyAttr => {},
+ GroupTags => $group_tags,
+ SuppressEmpty => undef,
+ );
+ my $obj = $simple->parse_string($xml);
+ return $obj;
+}
diff --git a/t/open311/getservicerequestupdates.t b/t/open311/getservicerequestupdates.t
index 32f1ec2ee..d58855122 100644
--- a/t/open311/getservicerequestupdates.t
+++ b/t/open311/getservicerequestupdates.t
@@ -510,8 +510,13 @@ for my $test (
$problemB->state( $test->{start_state} );
$problemB->update;
- my $update = Open311::GetServiceRequestUpdates->new( system_user => $user );
- $update->update_comments( $o, $bodies{2237} );
+ my $update = Open311::GetServiceRequestUpdates->new(
+ system_user => $user,
+ current_open311 => $o,
+ current_body => $bodies{2237},
+ );
+ $update->process_body;
+
is $problemB->comments->count, 1, 'comment count';
$problemB->discard_changes;
@@ -530,11 +535,16 @@ subtest 'Marking report as fixed closes it for updates (Bexley)' => sub {
$problemB->update( { bodies_str => $bodies{2494}->id } );
- my $update = Open311::GetServiceRequestUpdates->new( system_user => $user );
+ my $update = Open311::GetServiceRequestUpdates->new(
+ system_user => $user,
+ current_open311 => $o,
+ current_body => $bodies{2494},
+ current_cobrand => $bodies{2494}->get_cobrand_handler,
+ );
FixMyStreet::override_config {
ALLOWED_COBRANDS => 'bexley',
}, sub {
- $update->update_comments( $o, $bodies{2494} );
+ $update->process_body;
};
$problemB->discard_changes;
@@ -562,8 +572,12 @@ subtest 'Update with media_url includes image in update' => sub {
$problem->state('confirmed');
$problem->update;
- my $update = Open311::GetServiceRequestUpdates->new( system_user => $user );
- $update->update_comments( $o, $bodies{2482} );
+ my $update = Open311::GetServiceRequestUpdates->new(
+ system_user => $user,
+ current_open311 => $o,
+ current_body => $bodies{2482},
+ );
+ $update->process_body;
is $problem->comments->count, 1, 'comment count';
my $c = $problem->comments->first;
@@ -585,8 +599,12 @@ subtest 'Update with customer_reference adds reference to problem' => sub {
$problem->state('confirmed');
$problem->update;
- my $update = Open311::GetServiceRequestUpdates->new( system_user => $user );
- $update->update_comments( $o, $bodies{2482} );
+ my $update = Open311::GetServiceRequestUpdates->new(
+ system_user => $user,
+ current_open311 => $o,
+ current_body => $bodies{2482},
+ );
+ $update->process_body;
$problem->discard_changes;
is $problem->comments->count, 1, 'comment count';
@@ -600,11 +618,15 @@ 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 );
+ my $update = Open311::GetServiceRequestUpdates->new(
+ system_user => $user,
+ current_open311 => $o,
+ current_body => $bodies{2482},
+ );
FixMyStreet::override_config {
TIME_ZONE => 'Australia/Sydney',
}, sub {
- $update->update_comments( $o, $bodies{2482} );
+ $update->process_body;
};
my $comment = $problem->comments->first;
@@ -639,8 +661,12 @@ for my $test (
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}} );
+ my $update = Open311::GetServiceRequestUpdates->new(
+ system_user => $user,
+ current_open311 => $o,
+ current_body => $bodies{$test->{area_id}},
+ );
+ $update->process_body;
is $problem->comments->count, $test->{p1_comments}, 'comment count for first problem';
is $problem2->comments->count, $test->{p2_comments}, 'comment count for second problem';
@@ -658,26 +684,30 @@ subtest 'using start and end date' => sub {
my $update = Open311::GetServiceRequestUpdates->new(
system_user => $user,
start_date => $start_dt,
+ current_open311 => $o,
);
- my $res = $update->update_comments( $o );
+ my $res = $update->process_body;
is $res, 0, 'returns 0 if start but no end date';
$update = Open311::GetServiceRequestUpdates->new(
system_user => $user,
end_date => $end_dt,
+ current_open311 => $o,
);
- $res = $update->update_comments( $o );
+ $res = $update->process_body;
is $res, 0, 'returns 0 if end but no start date';
$update = Open311::GetServiceRequestUpdates->new(
system_user => $user,
start_date => $start_dt,
end_date => $end_dt,
+ current_open311 => $o,
+ current_body => $bodies{2482},
);
- $update->update_comments( $o, $bodies{2482} );
+ $update->process_body;
my $start = $start_dt . '';
my $end = $end_dt . '';
@@ -735,19 +765,21 @@ subtest 'check that existing comments are not duplicated' => sub {
my $update = Open311::GetServiceRequestUpdates->new(
system_user => $user,
+ current_open311 => $o,
+ current_body => $bodies{2482},
);
- $update->update_comments( $o, $bodies{2482} );
+ $update->process_body;
$problem->discard_changes;
is $problem->comments->count, 2, 'two comments after fetching updates';
- $update->update_comments( $o, $bodies{2482} );
+ $update->process_body;
$problem->discard_changes;
is $problem->comments->count, 2, 're-fetching updates does not add comments';
$problem->comments->delete;
- $update->update_comments( $o, $bodies{2482} );
+ $update->process_body;
$problem->discard_changes;
is $problem->comments->count, 2, 'if comments are deleted then they are added';
};
@@ -826,9 +858,11 @@ subtest 'check that external_status_code is stored correctly' => sub {
my $update = Open311::GetServiceRequestUpdates->new(
system_user => $user,
+ current_open311 => $o,
+ current_body => $bodies{2482},
);
- $update->update_comments( $o, $bodies{2482} );
+ $update->process_body;
$problem->discard_changes;
is $problem->comments->count, 2, 'two comments after fetching updates';
@@ -871,9 +905,11 @@ subtest 'check that external_status_code triggers auto-responses' => sub {
my $update = Open311::GetServiceRequestUpdates->new(
system_user => $user,
+ current_open311 => $o,
+ current_body => $bodies{2482},
);
- $update->update_comments( $o, $bodies{2482} );
+ $update->process_body;
$problem->discard_changes;
is $problem->comments->count, 1, 'one comment after fetching updates';
@@ -925,9 +961,11 @@ foreach my $test ( {
my $update = Open311::GetServiceRequestUpdates->new(
system_user => $user,
+ current_open311 => $o,
+ current_body => $bodies{2482},
);
- $update->update_comments( $o, $bodies{2482} );
+ $update->process_body;
$problem->discard_changes;
is $problem->comments->count, 2, 'two comments after fetching updates';
@@ -990,9 +1028,11 @@ foreach my $test ( {
my $update = Open311::GetServiceRequestUpdates->new(
system_user => $user,
suppress_alerts => $test->{suppress_alerts},
+ current_open311 => $o,
+ current_body => $bodies{2482},
);
- $update->update_comments( $o, $bodies{2482} );
+ $update->process_body;
$problem->discard_changes;
my $alerts_sent = FixMyStreet::DB->resultset('AlertSent')->search(
@@ -1052,12 +1092,14 @@ foreach my $test ( {
my $update = Open311::GetServiceRequestUpdates->new(
system_user => $user,
blank_updates_permitted => $test->{blank_updates_permitted},
+ current_open311 => $o,
+ current_body => $bodies{2482},
);
if ( $test->{blank_updates_permitted} ) {
- stderr_is { $update->update_comments( $o, $bodies{2482} ) } '', 'No error message'
+ stderr_is { $update->process_body } '', 'No error message'
} else {
- stderr_like { $update->update_comments( $o, $bodies{2482} ) } qr/Couldn't determine update text for/, 'Error message displayed'
+ stderr_like { $update->process_body } qr/Couldn't determine update text for/, 'Error message displayed'
}
$problem->discard_changes;
$problem->comments->delete;
@@ -1106,9 +1148,11 @@ subtest 'check matching on fixmystreet_id overrides service_request_id' => sub {
my $update = Open311::GetServiceRequestUpdates->new(
system_user => $user,
+ current_open311 => $o,
+ current_body => $bodies{2482},
);
- $update->update_comments( $o, $bodies{2482} );
+ $update->process_body;
$problem->discard_changes;
is $problem->comments->count, 2, 'two comments after fetching updates';
@@ -1141,10 +1185,12 @@ subtest 'check bad fixmystreet_id is handled' => sub {
my $update = Open311::GetServiceRequestUpdates->new(
system_user => $user,
+ current_open311 => $o,
+ current_body => $bodies{2482},
);
warning_like {
- $update->update_comments( $o, $bodies{2482} )
+ $update->process_body
}
qr/skipping bad fixmystreet id in updates for Bromley: \[123456 654321\], external id is 8888888888888/,
"warning emitted for bad fixmystreet id";