#!/usr/bin/env perl use strict; use warnings; use Test::More; use URI::Split qw(uri_split); use FixMyStreet; use FixMyStreet::DB; use_ok( 'Open311::GetUpdates' ); use_ok( 'Open311' ); my $user = FixMyStreet::DB->resultset('User')->find_or_create( { email => 'system_user@example.com' } ); my $body = FixMyStreet::DB->resultset('Body')->new( { name => 'Test Body', } ); my $updates = Open311::GetUpdates->new( system_user => $user ); ok $updates, 'created object'; my $requests_xml = qq{ 638344 open This is a note. Sidewalk and Curb Issues 006 2010-04-14T06:37:38-08:00 UPDATED_DATETIME 2010-04-15T06:37:38-08:00 37.762221815 -122.4651145 }; my $problem_rs = FixMyStreet::DB->resultset('Problem'); my $problem = $problem_rs->new( { postcode => 'EH99 1SP', latitude => 1, longitude => 1, areas => 1, title => '', detail => '', used_map => 1, name => '', state => 'confirmed', cobrand => 'default', 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 => '', comment_count => 0, }, { desc => 'element with no content', updated_datetime => '', comment_count => 0, }, { desc => 'element with old content', updated_datetime => sprintf( '%s', DateTime->now->subtract( days => 3 ) ), comment_count => 0, }, { desc => 'element with new content', updated_datetime => sprintf( '%s', 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, $body ), 'Updated reports'; my @parts = uri_split($o->test_uri_used); is $parts[2], '/requests.xml', 'path matches'; my @qs = sort split '&', $parts[3]; is_deeply(\@qs, [ 'jurisdiction_id=mysociety', 'service_request_id=638344' ], 'query string matches'); is $problem->comments->count, $test->{comment_count}, 'added a comment'; }; } $requests_xml = qq{ 638344 open This is a note. Sidewalk and Curb Issues 006 2010-04-14T06:37:38-08:00 UPDATED_DATETIME 2010-04-15T06:37:38-08:00 37.762221815 -122.4651145 638345 open This is a for a different issue. Sidewalk and Curb Issues 006 2010-04-14T06:37:38-08:00 UPDATED_DATETIME2 2010-04-15T06:37:38-08:00 37.762221815 -122.4651145 }; my $problem2 = $problem_rs->create( { postcode => 'EH99 1SP', latitude => 1, longitude => 1, areas => 1, title => '', detail => '', used_map => 1, name => '', state => 'confirmed', cobrand => 'default', 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, $body ), 'Updated reports'; my @parts = uri_split($o->test_uri_used); is $parts[2], '/requests.xml', 'path matches'; my @qs = sort split '&', $parts[3]; is_deeply(\@qs, [ 'jurisdiction_id=mysociety', 'service_request_id=638344%2C638345' ], 'query string matches'); is $problem->comments->count, 1, 'added a comment to first problem'; is $problem2->comments->count, 1, 'added a comment to second problem'; }; # No status_notes field now, so that static string in code is used. $requests_xml = qq{ 638346 closed Sidewalk and Curb Issues 006 2010-04-14T06:37:38-08:00 UPDATED_DATETIME 2010-04-15T06:37:38-08:00 37.762221815 -122.4651145 }; my $problem3 = $problem_rs->create( { postcode => 'EH99 1SP', latitude => 1, longitude => 1, areas => 1, title => 'Title', detail => 'Details', used_map => 1, name => '', state => 'confirmed', cobrand => 'fixamingata', user => $user, created => DateTime->now()->subtract( days => 1 ), lastupdate => DateTime->now()->subtract( days => 1 ), anonymous => 1, external_id => 638346, } ); subtest 'test translation of auto-added comment from old-style Open311 update' => sub { my $dt = sprintf( '%s', DateTime->now ); $requests_xml =~ s/UPDATED_DATETIME/$dt/; my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'requests.xml' => $requests_xml } ); FixMyStreet::override_config { ALLOWED_COBRANDS => [ 'fixamingata' ], }, sub { ok $updates->update_reports( [ 638346 ], $o, $body ), 'Updated reports'; }; my @parts = uri_split($o->test_uri_used); is $parts[2], '/requests.xml', 'path matches'; my @qs = sort split '&', $parts[3]; is_deeply(\@qs, [ 'jurisdiction_id=mysociety', 'service_request_id=638346' ], 'query string matches'); is $problem3->comments->count, 1, 'added a comment'; is $problem3->comments->first->text, "St\xe4ngd av kommunen", 'correct comment text'; }; END { if ($user) { $user->comments->delete; $user->problems->delete; $user->delete; } done_testing(); }